blob: b05291e8ea5e86d882a5112e7364b3ab7f0f2c06 [file] [log] [blame]
Lei YU56aaf452018-06-21 16:09:44 +08001#include <phosphor-logging/log.hpp>
2
3#include "config.h"
4#include "item_updater_helper.hpp"
5
6namespace phosphor
7{
8namespace software
9{
10namespace updater
11{
12
13using namespace phosphor::logging;
Adriana Kobylakbbcb7be2018-07-17 15:47:34 -050014
15void 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
Lei YU56aaf452018-06-21 16:09:44 +080025void 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
35void 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
44void 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
53void 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
64void 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
81void 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}
101void 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