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