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