field mode: restore works on all systems
The restoreFieldModeStatus function previously read from a chip
that is not found on all systems. Changed it to read fieldmode
status using fw_printenv. Updated utils::executeCmd to return the
print output of the command it executes.
Tested:
On p10bmc running mmc chip:
- Set the fieldmode env variable to "true" and verified FieldModeEnabled
was set to true:
root@p10bmc:~# fw_setenv fieldmode true
root@p10bmc:~# systemctl restart xyz.openbmc_project.Software.BMC.Updater.service
root@p10bmc:~# busctl introspect xyz.openbmc_project.Software.BMC.Updater /xyz/openbmc_project/software
...
xyz.openbmc_project.Control.FieldMode interface - -
.FieldModeEnabled property b true
- Set the fieldmode env variable to "false" (fw_setenv fieldmode false)
and also clear the variable (fw_setenv fieldmode) and verified
FieldModeEnabled was set to false with no error messages in the
journal:
root@p10bmc:~# fw_setenv fieldmode
root@p10bmc:~# systemctl restart xyz.openbmc_project.Software.BMC.Updater.service
root@p10bmc:~# busctl introspect xyz.openbmc_project.Software.BMC.Updater /xyz/openbmc_project/software
...
xyz.openbmc_project.Control.FieldMode interface - -
.FieldModeEnabled property b false
Change-Id: Ib1b54d83f058015ff5967c445a40318a02baae92
Signed-off-by: Isaac Kurth <blisaac91@gmail.com>
Signed-off-by: Adriana Kobylak <anoo@linux.ibm.com>
diff --git a/item_updater.cpp b/item_updater.cpp
index 96782f2..2fdbc31 100644
--- a/item_updater.cpp
+++ b/item_updater.cpp
@@ -602,11 +602,20 @@
void ItemUpdater::restoreFieldModeStatus()
{
- std::ifstream input("/dev/mtd/u-boot-env");
- std::string envVar;
- std::getline(input, envVar);
+ // The fieldmode u-boot environment variable may not exist since it is not
+ // part of the default environment, run fw_printenv with 2>&1 to ignore the
+ // error message in the journal "Error: "fieldmode" not defined"
+ std::pair<int, std::string> ret =
+ utils::execute("/sbin/fw_printenv", "-n", "fieldmode", "2>&1");
- if (envVar.find("fieldmode=true") != std::string::npos)
+ if (ret.first != 0)
+ {
+ return;
+ }
+
+ // truncate any extra characters off the end to compare against a "true" str
+ std::string result = ret.second.substr(0, 4);
+ if (result == "true")
{
ItemUpdater::fieldModeEnabled(true);
}