diff --git a/tools/flashy/checks_and_remediations/common/05_ensure_flash_writable.go b/tools/flashy/checks_and_remediations/common/05_ensure_flash_writable.go index f1bb8e988cc..2c69a57804b 100644 --- a/tools/flashy/checks_and_remediations/common/05_ensure_flash_writable.go +++ b/tools/flashy/checks_and_remediations/common/05_ensure_flash_writable.go @@ -23,6 +23,7 @@ import ( "fmt" "log" "math/rand" + "regexp" "strings" "time" @@ -63,15 +64,22 @@ func ensureFlashWritable(stepParams step.StepParams) step.StepExitError { // grandteton v2023.25.2 introduced an error whereby mtd0 was set as spi0.1 // this breaks checks and remediations as it thinks flash1 is read-only // let's put in a workaround so we can upgrade all the affected hosts - cmd := []string{"grep", "mtd0:.*spi0.1 /proc/mtd"} - _, _, stdout, _ := utils.RunCommand(cmd, 30*time.Second) - if strings.Contains(stdout, "mtd0") { + buf, err := fileutils.ReadFile("/proc/mtd") + if err != nil { + return step.ExitBadFlashChip{Err: err} + + } + mtdStr := string(buf) + mtdRegex := regexp.MustCompile(`mtd0:\s+\d+\s+\d+\s+"spi0\.1"`) + mtdMatch := mtdRegex.FindStringSubmatch(mtdStr) + if len(mtdMatch) > 0 { log.Printf("Skipping ensure_flash_writable check for this device due to S356523") - return nil + return nil } + // First up check that fw_printenv works okay and produces output. - cmd = []string{"fw_printenv", "bootargs"} + cmd := []string{"fw_printenv", "bootargs"} _, err, stdout, stderr := utils.RunCommand(cmd, 30*time.Second) if err != nil || !strings.Contains(stdout, "bootargs") { log.Printf("fw_printenv doesn't work: %v, stderr: %v", err, stderr) diff --git a/tools/flashy/checks_and_remediations/common/05_ensure_flash_writable_test.go b/tools/flashy/checks_and_remediations/common/05_ensure_flash_writable_test.go index bb6d3306fac..9c885e91bc3 100644 --- a/tools/flashy/checks_and_remediations/common/05_ensure_flash_writable_test.go +++ b/tools/flashy/checks_and_remediations/common/05_ensure_flash_writable_test.go @@ -36,11 +36,13 @@ func TestEnsureFlashWritable(t *testing.T) { // save log output into buf for testing var buf bytes.Buffer log.SetOutput(&buf) + readFileOrig := fileutils.ReadFile fileExistsOrig := fileutils.FileExists runCommandOrig := utils.RunCommand defer func() { log.SetOutput(os.Stderr) + fileutils.ReadFile = readFileOrig fileutils.FileExists = fileExistsOrig utils.RunCommand = runCommandOrig }() @@ -78,7 +80,8 @@ func TestEnsureFlashWritable(t *testing.T) { { name: "s356523 case", vbootUtilExists: true, - s356523: "mtd0: 08000000 00010000 \"spi0.1\"", + s356523: `mtd0: 08000000 00010000 "spi0.1" + mtd1: 00040000 00010000 "romx"`, failPrint: false, failSet: false, failCheck: false, @@ -136,6 +139,9 @@ func TestEnsureFlashWritable(t *testing.T) { fileutils.FileExists = func(filename string) bool { return tc.vbootUtilExists } + fileutils.ReadFile = func(filename string) ([]byte, error) { + return []byte(tc.s356523), nil + } utils.RunCommand = func(cmdArr []string, timeout time.Duration) (int, error, string, string) { if (cmdArr[0] == "fw_printenv") { if (cmdArr[1] == "bootargs") { @@ -158,10 +164,6 @@ func TestEnsureFlashWritable(t *testing.T) { } else { return 0, nil, "bootargs=foo", "" } - } else if (cmdArr[0] == "grep") { - if (cmdArr[1] == "mtd0:.*spi0.1 /proc/mtd") { - return 0, nil, tc.s356523, "" - } } else{ if (tc.failSet) { return 0, errors.Errorf("err2"), "", "err2"