blob: ed831dd42561b72aa1ce4f7d8a36520f3f9ccdd9 [file] [log] [blame]
George Liu073a6532021-10-25 14:40:03 +08001#include "config.h"
2
3#include "usb_manager.hpp"
4
5namespace phosphor
6{
7namespace usb
8{
9
10bool USBManager::run()
11{
12 fs::path dir(usbPath);
13 if (!fs::exists(dir))
14 {
15 return false;
16 }
17
18 for (const auto& p : std::filesystem::directory_iterator(dir))
19 {
20 if (p.path().extension() == ".tar")
21 {
22 fs::path dstPath{IMG_UPLOAD_DIR / p.path().filename()};
23 if (fs::exists(dstPath))
24 {
25 lg2::info(
26 "{DSTPATH} already exists in the /tmp/images directory, exit the upgrade",
27 "DSTPATH", p.path().filename());
28
29 break;
30 }
31
32 try
33 {
34 return fs::copy_file(fs::absolute(p.path()), dstPath);
35 }
36 catch (const std::exception& e)
37 {
38 lg2::error("Error when copying {SRC} to /tmp/images: {ERROR}",
39 "SRC", p.path(), "ERROR", e.what());
40 }
41
42 break;
43 }
44 }
45
46 return false;
47}
48
George Liu5107c452021-11-09 20:06:31 +080049void USBManager::setApplyTime()
50{
51 utils::PropertyValue value =
52 "xyz.openbmc_project.Software.ApplyTime.RequestedApplyTimes.OnReset";
53 constexpr auto objectPath = "/xyz/openbmc_project/software/apply_time";
54 constexpr auto interface = "xyz.openbmc_project.Software.ApplyTime";
55 constexpr auto propertyName = "RequestedApplyTime";
56 try
57 {
58 utils::setProperty(bus, objectPath, interface, propertyName, value);
59 }
60 catch (const std::exception& e)
61 {
62 lg2::error("Failed to set RequestedApplyTime property, ERROR:{ERROR}",
63 "ERROR", e.what());
64 }
65}
66
67void USBManager::setRequestedActivation(const std::string& path)
68{
69 utils::PropertyValue value =
70 "xyz.openbmc_project.Software.Activation.RequestedActivations.Active";
71 constexpr auto interface = "xyz.openbmc_project.Software.Activation";
72 constexpr auto propertyName = "RequestedActivation";
73 try
74 {
75 utils::setProperty(bus, path, interface, propertyName, value);
76 }
77 catch (const std::exception& e)
78 {
79 lg2::error("Failed to set RequestedActivation property, ERROR:{ERROR}",
80 "ERROR", e.what());
81 }
82
83 return;
84}
85
86void USBManager::updateActivation(sdbusplus::message::message& msg)
87{
88 std::map<std::string, std::map<std::string, std::variant<std::string>>>
89 interfaces;
90 sdbusplus::message::object_path path;
91 msg.read(path, interfaces);
92
93 constexpr auto imageInterface = "xyz.openbmc_project.Software.Activation";
94 constexpr auto readyPro =
95 "xyz.openbmc_project.Software.Activation.Activations.Ready";
96 for (auto& interface : interfaces)
97 {
98 if (interface.first != imageInterface)
99 {
100 continue;
101 }
102
103 try
104 {
105 auto propVal =
106 utils::getProperty(bus, path.str, imageInterface, "Activation");
107 const auto& imageProp = std::get<std::string>(propVal);
108 if (imageProp == readyPro && isUSBCodeUpdate)
109 {
110 setApplyTime();
111 setRequestedActivation(path.str);
112 event.exit(0);
113 }
114 }
115 catch (const std::exception& e)
116 {
117 lg2::error("Failed in getting Activation status, ERROR:{ERROR}",
118 "ERROR", e.what());
119 }
120 }
121}
122
George Liu073a6532021-10-25 14:40:03 +0800123} // namespace usb
George Liu5107c452021-11-09 20:06:31 +0800124} // namespace phosphor