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