blob: 42e772902ba310c6ea91c00b003a02bdf7e224f6 [file] [log] [blame]
Saqib Khan7254f0e2017-04-10 21:45:37 -05001#include <string>
2#include <fstream>
Adriana Kobylakb66ac3a2017-03-28 13:33:20 -05003#include <phosphor-logging/log.hpp>
Adriana Kobylak2d8fa222017-03-15 12:34:32 -05004#include "config.h"
5#include "item_updater.hpp"
6
7namespace openpower
8{
9namespace software
10{
Adriana Kobylakbefe5ce2017-04-05 15:57:44 -050011namespace updater
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050012{
13
Adriana Kobylakb66ac3a2017-03-28 13:33:20 -050014using namespace phosphor::logging;
15
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050016int ItemUpdater::createActivation(sd_bus_message* msg,
17 void* userData,
18 sd_bus_error* retErr)
19{
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050020 auto* updater = static_cast<ItemUpdater*>(userData);
Adriana Kobylakb66ac3a2017-03-28 13:33:20 -050021 auto mapper = updater->busItem.new_method_call(
22 MAPPER_BUSNAME,
23 MAPPER_PATH,
24 MAPPER_INTERFACE,
25 "GetSubTreePaths");
26 mapper.append(SOFTWARE_OBJPATH,
27 1, // Depth
28 std::vector<std::string>({VERSION_IFACE}));
29
30 auto mapperResponseMsg = updater->busItem.call(mapper);
31 if (mapperResponseMsg.is_method_error())
32 {
33 log<level::ERR>("Error in mapper call",
34 entry("PATH=%s", SOFTWARE_OBJPATH),
35 entry("INTERFACE=%s", VERSION_IFACE));
36 return -1;
37 }
38
39 std::vector<std::string> mapperResponse;
40 mapperResponseMsg.read(mapperResponse);
41 if (mapperResponse.empty())
42 {
43 log<level::ERR>("Error reading mapper response",
44 entry("PATH=%s", SOFTWARE_OBJPATH),
45 entry("INTERFACE=%s", VERSION_IFACE));
46 return -1;
47 }
48
Saqib Khan7254f0e2017-04-10 21:45:37 -050049 auto extendedVersion = ItemUpdater::getExtendedVersion(MANIFEST_FILE);
Adriana Kobylakb66ac3a2017-03-28 13:33:20 -050050 for (const auto& resp : mapperResponse)
51 {
52 // Version id is the last item in the path
53 auto pos = resp.rfind("/");
54 if (pos == std::string::npos)
55 {
56 log<level::ERR>("No version id found in object path",
57 entry("OBJPATH=%s", resp));
58 return -1;
59 }
60
Adriana Kobylak268616b2017-04-05 15:23:30 -050061 auto versionId = resp.substr(pos + 1);
Adriana Kobylakb66ac3a2017-03-28 13:33:20 -050062 if (updater->activations.find(versionId) == updater->activations.end())
63 {
64 updater->activations.insert(std::make_pair(
65 versionId,
66 std::make_unique<Activation>(
67 updater->busItem,
Adriana Kobylakbc37a4c2017-04-10 09:45:36 -050068 resp,
Saqib Khan7254f0e2017-04-10 21:45:37 -050069 versionId,
70 extendedVersion)));
Adriana Kobylakb66ac3a2017-03-28 13:33:20 -050071 }
72 }
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050073 return 0;
74}
75
Saqib Khan7254f0e2017-04-10 21:45:37 -050076std::string ItemUpdater::getExtendedVersion(const std::string& manifestFilePath)
77{
78 constexpr auto extendedVersionKey = "extended_version=";
79 constexpr auto extendedVersionKeySize = strlen(extendedVersionKey);
80
81 if (manifestFilePath.empty())
82 {
83 log<level::ERR>("Error MANIFESTFilePath is empty");
84 throw std::runtime_error("MANIFESTFilePath is empty");
85 }
86
87 std::string extendedVersion{};
88 std::ifstream efile;
89 std::string line;
90 efile.exceptions(std::ifstream::failbit
91 | std::ifstream::badbit
92 | std::ifstream::eofbit);
93
94 try
95 {
96 efile.open(manifestFilePath);
97 while (getline(efile, line))
98 {
99 if (line.compare(0, extendedVersionKeySize,
100 extendedVersionKey) == 0)
101 {
102 extendedVersion = line.substr(extendedVersionKeySize);
103 break;
104 }
105 }
106 efile.close();
107 }
108 catch (const std::exception& e)
109 {
110 log<level::ERR>("Error in reading Host MANIFEST file");
111 }
112
113 return extendedVersion;
114}
115
Adriana Kobylakbefe5ce2017-04-05 15:57:44 -0500116} // namespace updater
Adriana Kobylak2d8fa222017-03-15 12:34:32 -0500117} // namespace software
118} // namespace openpower
119