item_updater: sort ubi specific code

Add item_updater_helper and implement it in ubi and static layouts.

Tested: Build this repo on both Romulus and Witherspoon OK;
        Tested on Romulus and Witherspoon that code update works fine.

Change-Id: I706cfe63900f89bb41672dcc745b3483e06838c7
Signed-off-by: Lei YU <mine260309@gmail.com>
diff --git a/ubi/item_updater_helper.cpp b/ubi/item_updater_helper.cpp
new file mode 100644
index 0000000..6704c21
--- /dev/null
+++ b/ubi/item_updater_helper.cpp
@@ -0,0 +1,107 @@
+#include <phosphor-logging/log.hpp>
+
+#include "config.h"
+#include "item_updater_helper.hpp"
+
+namespace phosphor
+{
+namespace software
+{
+namespace updater
+{
+
+using namespace phosphor::logging;
+void Helper::clearEntry(const std::string& entryId)
+{
+    // Remove the priority environment variable.
+    auto serviceFile = "obmc-flash-bmc-setenv@" + entryId + ".service";
+    auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
+                                      SYSTEMD_INTERFACE, "StartUnit");
+    method.append(serviceFile, "replace");
+    bus.call_noreply(method);
+}
+
+void Helper::cleanup()
+{
+    // Remove any volumes that do not match current versions.
+    auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
+                                      SYSTEMD_INTERFACE, "StartUnit");
+    method.append("obmc-flash-bmc-cleanup.service", "replace");
+    bus.call_noreply(method);
+}
+
+void Helper::factoryReset()
+{
+    // Mark the read-write partition for recreation upon reboot.
+    auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
+                                      SYSTEMD_INTERFACE, "StartUnit");
+    method.append("obmc-flash-bmc-setenv@rwreset\\x3dtrue.service", "replace");
+    bus.call_noreply(method);
+}
+
+void Helper::removeVersion(const std::string& versionId)
+{
+    auto serviceFile = "obmc-flash-bmc-ubiro-remove@" + versionId + ".service";
+
+    // Remove the read-only partitions.
+    auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
+                                      SYSTEMD_INTERFACE, "StartUnit");
+    method.append(serviceFile, "replace");
+    bus.call_noreply(method);
+}
+
+void Helper::updateUbootVersionId(const std::string& versionId)
+{
+    auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
+                                      SYSTEMD_INTERFACE, "StartUnit");
+    auto updateEnvVarsFile =
+        "obmc-flash-bmc-updateubootvars@" + versionId + ".service";
+    method.append(updateEnvVarsFile, "replace");
+    auto result = bus.call(method);
+
+    // Check that the bus call didn't result in an error
+    if (result.is_method_error())
+    {
+        log<level::ERR>("Failed to update u-boot env variables",
+                        entry("VERSIONID=%s", versionId.c_str()));
+    }
+}
+
+void Helper::enableFieldMode()
+{
+    auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
+                                      SYSTEMD_INTERFACE, "StartUnit");
+    method.append("obmc-flash-bmc-setenv@fieldmode\\x3dtrue.service",
+                  "replace");
+    bus.call_noreply(method);
+
+    method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
+                                 SYSTEMD_INTERFACE, "StopUnit");
+    method.append("usr-local.mount", "replace");
+    bus.call_noreply(method);
+
+    std::vector<std::string> usrLocal = {"usr-local.mount"};
+
+    method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
+                                 SYSTEMD_INTERFACE, "MaskUnitFiles");
+    method.append(usrLocal, false, true);
+    bus.call_noreply(method);
+}
+void Helper::mirrorAlt()
+{
+    auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
+                                      SYSTEMD_INTERFACE, "StartUnit");
+    auto mirrorUbootFile = "obmc-flash-bmc-mirroruboot.service";
+    method.append(mirrorUbootFile, "replace");
+    auto result = bus.call(method);
+
+    // Check that the bus call didn't result in an error
+    if (result.is_method_error())
+    {
+        log<level::ERR>("Failed to copy U-Boot to alternate chip");
+    }
+}
+
+} // namespace updater
+} // namespace software
+} // namespace phosphor