1 #include <phosphor-logging/log.hpp> 2 3 #include "config.h" 4 #include "item_updater_helper.hpp" 5 6 namespace phosphor 7 { 8 namespace software 9 { 10 namespace updater 11 { 12 13 using namespace phosphor::logging; 14 15 void Helper::setEntry(const std::string& entryId, uint8_t value) 16 { 17 std::string serviceFile = "obmc-flash-bmc-setenv@" + entryId + "\\x3d" + 18 std::to_string(value) + ".service"; 19 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH, 20 SYSTEMD_INTERFACE, "StartUnit"); 21 method.append(serviceFile, "replace"); 22 bus.call_noreply(method); 23 } 24 25 void Helper::clearEntry(const std::string& entryId) 26 { 27 // Remove the priority environment variable. 28 auto serviceFile = "obmc-flash-bmc-setenv@" + entryId + ".service"; 29 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH, 30 SYSTEMD_INTERFACE, "StartUnit"); 31 method.append(serviceFile, "replace"); 32 bus.call_noreply(method); 33 } 34 35 void Helper::cleanup() 36 { 37 // Remove any volumes that do not match current versions. 38 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH, 39 SYSTEMD_INTERFACE, "StartUnit"); 40 method.append("obmc-flash-bmc-cleanup.service", "replace"); 41 bus.call_noreply(method); 42 } 43 44 void Helper::factoryReset() 45 { 46 // Mark the read-write partition for recreation upon reboot. 47 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH, 48 SYSTEMD_INTERFACE, "StartUnit"); 49 method.append("obmc-flash-bmc-setenv@rwreset\\x3dtrue.service", "replace"); 50 bus.call_noreply(method); 51 } 52 53 void Helper::removeVersion(const std::string& versionId) 54 { 55 auto serviceFile = "obmc-flash-bmc-ubiro-remove@" + versionId + ".service"; 56 57 // Remove the read-only partitions. 58 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH, 59 SYSTEMD_INTERFACE, "StartUnit"); 60 method.append(serviceFile, "replace"); 61 bus.call_noreply(method); 62 } 63 64 void Helper::updateUbootVersionId(const std::string& versionId) 65 { 66 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH, 67 SYSTEMD_INTERFACE, "StartUnit"); 68 auto updateEnvVarsFile = 69 "obmc-flash-bmc-updateubootvars@" + versionId + ".service"; 70 method.append(updateEnvVarsFile, "replace"); 71 auto result = bus.call(method); 72 73 // Check that the bus call didn't result in an error 74 if (result.is_method_error()) 75 { 76 log<level::ERR>("Failed to update u-boot env variables", 77 entry("VERSIONID=%s", versionId.c_str())); 78 } 79 } 80 81 void Helper::enableFieldMode() 82 { 83 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH, 84 SYSTEMD_INTERFACE, "StartUnit"); 85 method.append("obmc-flash-bmc-setenv@fieldmode\\x3dtrue.service", 86 "replace"); 87 bus.call_noreply(method); 88 89 method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH, 90 SYSTEMD_INTERFACE, "StopUnit"); 91 method.append("usr-local.mount", "replace"); 92 bus.call_noreply(method); 93 94 std::vector<std::string> usrLocal = {"usr-local.mount"}; 95 96 method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH, 97 SYSTEMD_INTERFACE, "MaskUnitFiles"); 98 method.append(usrLocal, false, true); 99 bus.call_noreply(method); 100 } 101 void Helper::mirrorAlt() 102 { 103 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH, 104 SYSTEMD_INTERFACE, "StartUnit"); 105 auto mirrorUbootFile = "obmc-flash-bmc-mirroruboot.service"; 106 method.append(mirrorUbootFile, "replace"); 107 auto result = bus.call(method); 108 109 // Check that the bus call didn't result in an error 110 if (result.is_method_error()) 111 { 112 log<level::ERR>("Failed to copy U-Boot to alternate chip"); 113 } 114 } 115 116 } // namespace updater 117 } // namespace software 118 } // namespace phosphor 119