| package agent
|
|
|
| import (
|
| "fmt"
|
| "strconv"
|
| "strings"
|
| )
|
|
|
| func isEmmcBlockName(name string) bool {
|
| if !strings.HasPrefix(name, "mmcblk") {
|
| return false
|
| }
|
| suffix := strings.TrimPrefix(name, "mmcblk")
|
| if suffix == "" {
|
| return false
|
| }
|
| for _, c := range suffix {
|
| if c < '0' || c > '9' {
|
| return false
|
| }
|
| }
|
| return true
|
| }
|
|
|
| func parseHexOrDecByte(s string) (uint8, bool) {
|
| s = strings.TrimSpace(s)
|
| if s == "" {
|
| return 0, false
|
| }
|
| base := 10
|
| if strings.HasPrefix(s, "0x") || strings.HasPrefix(s, "0X") {
|
| base = 16
|
| s = s[2:]
|
| }
|
| parsed, err := strconv.ParseUint(s, base, 8)
|
| if err != nil {
|
| return 0, false
|
| }
|
| return uint8(parsed), true
|
| }
|
|
|
| func parseHexBytePair(s string) (uint8, uint8, bool) {
|
| fields := strings.Fields(s)
|
| if len(fields) < 2 {
|
| return 0, 0, false
|
| }
|
| a, okA := parseHexOrDecByte(fields[0])
|
| b, okB := parseHexOrDecByte(fields[1])
|
| if !okA && !okB {
|
| return 0, 0, false
|
| }
|
| return a, b, true
|
| }
|
|
|
| func emmcSmartStatus(preEOL uint8) string {
|
| switch preEOL {
|
| case 0x01:
|
| return "PASSED"
|
| case 0x02:
|
| return "WARNING"
|
| case 0x03:
|
| return "FAILED"
|
| default:
|
| return "UNKNOWN"
|
| }
|
| }
|
|
|
| func emmcPreEOLString(preEOL uint8) string {
|
| switch preEOL {
|
| case 0x01:
|
| return "0x01 (normal)"
|
| case 0x02:
|
| return "0x02 (warning)"
|
| case 0x03:
|
| return "0x03 (urgent)"
|
| default:
|
| return fmt.Sprintf("0x%02x", preEOL)
|
| }
|
| }
|
|
|
| func emmcLifeTimeString(v uint8) string {
|
|
|
| switch {
|
| case v == 0:
|
| return "0x00 (not reported)"
|
| case v >= 0x01 && v <= 0x0A:
|
| low := int(v-1) * 10
|
| high := int(v) * 10
|
| return fmt.Sprintf("0x%02x (%d-%d%% used)", v, low, high)
|
| case v == 0x0B:
|
| return "0x0b (>100% used)"
|
| default:
|
| return fmt.Sprintf("0x%02x", v)
|
| }
|
| }
|
|
|