blob: 855aaf26aa03d0052c756d0285c1f9736031af15 [file] [log] [blame]
Gunnar Millsf6ed5892018-09-07 17:08:02 -05001#include "config.h"
2
Lei YUf3ce4332019-02-21 14:09:49 +08003#ifdef UBIFS_LAYOUT
4#include "ubi/item_updater_ubi.hpp"
Lei YUda6ab6c2019-02-22 14:21:22 +08005#include "ubi/watch.hpp"
Adriana Kobylak8bc2ab42020-07-15 09:16:27 -05006#elif defined MMC_LAYOUT
7#include "mmc/item_updater_mmc.hpp"
Lei YU322f3f42019-02-21 16:10:41 +08008#else
9#include "static/item_updater_static.hpp"
Lei YUf3ce4332019-02-21 14:09:49 +080010#endif
Brad Bishop099543e2020-11-09 15:37:58 -050011#include "functions.hpp"
Gunnar Millsf6ed5892018-09-07 17:08:02 -050012
Brad Bishop099543e2020-11-09 15:37:58 -050013#include <CLI/CLI.hpp>
Gunnar Millsf6ed5892018-09-07 17:08:02 -050014#include <phosphor-logging/log.hpp>
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050015#include <sdbusplus/bus.hpp>
16#include <sdbusplus/server/manager.hpp>
Brad Bishop0283f7c2020-11-09 10:09:26 -050017#include <sdeventplus/event.hpp>
Brad Bishop8facccf2020-11-04 09:44:58 -050018
Brad Bishop099543e2020-11-09 15:37:58 -050019#include <map>
20#include <memory>
21#include <string>
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050022#include <system_error>
Brad Bishop099543e2020-11-09 15:37:58 -050023#include <vector>
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050024
Brad Bishop1ee90952020-11-09 11:57:32 -050025namespace openpower
26{
27namespace software
28{
29namespace updater
30{
Patrick Williams0dea1992022-07-22 19:26:52 -050031void initializeService(sdbusplus::bus_t& bus)
Brad Bishop1ee90952020-11-09 11:57:32 -050032{
Patrick Williams0dea1992022-07-22 19:26:52 -050033 static sdbusplus::server::manager_t objManager(bus, SOFTWARE_OBJPATH);
Brad Bishop1ee90952020-11-09 11:57:32 -050034#ifdef UBIFS_LAYOUT
35 static ItemUpdaterUbi updater(bus, SOFTWARE_OBJPATH);
36 static Watch watch(
37 bus.get_event(),
38 std::bind(std::mem_fn(&ItemUpdater::updateFunctionalAssociation),
39 &updater, std::placeholders::_1));
40#elif defined MMC_LAYOUT
41 static ItemUpdaterMMC updater(bus, SOFTWARE_OBJPATH);
42#else
43 static ItemUpdaterStatic updater(bus, SOFTWARE_OBJPATH);
44#endif
45 bus.request_name(BUSNAME_UPDATER);
46}
47} // namespace updater
48} // namespace software
49} // namespace openpower
50
Brad Bishop099543e2020-11-09 15:37:58 -050051int main(int argc, char* argv[])
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050052{
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050053 using namespace openpower::software::updater;
54 using namespace phosphor::logging;
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050055 auto bus = sdbusplus::bus::new_default();
Brad Bishop0283f7c2020-11-09 10:09:26 -050056 auto loop = sdeventplus::Event::get_default();
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -050057
Brad Bishop1ee90952020-11-09 11:57:32 -050058 bus.attach_event(loop.get(), SD_EVENT_PRIORITY_NORMAL);
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050059
Brad Bishop099543e2020-11-09 15:37:58 -050060 CLI::App app{"OpenPOWER host firmware manager"};
61
Adriana Kobylak53a27392021-06-14 17:42:40 +000062 using namespace std::string_literals;
63 std::map<std::string, std::vector<std::string>> extensionMap{{
64 {"ibm,everest"s, {".EVEREST_XML"s, ".P10"s}},
65 {"ibm,rainier-2u"s, {".RAINIER_2U_XML"s, ".P10"s}},
66 {"ibm,rainier-4u"s, {".RAINIER_4U_XML"s, ".P10"s}},
67 {"ibm,rainier-1s4u"s, {".RAINIER_4U_XML"s, ".P10"s}},
68 }};
69
Brad Bishop099543e2020-11-09 15:37:58 -050070 // subcommandContext allows program subcommand callbacks to add loop event
71 // callbacks (e.g. reception of a dbus signal) and then return to main,
72 // without the loop event callback being destroyed until the loop event
73 // callback has a chance to run and instruct the loop to exit.
Adriana Kobylak53a27392021-06-14 17:42:40 +000074 std::vector<std::shared_ptr<void>> subcommandContext;
Brad Bishop099543e2020-11-09 15:37:58 -050075 static_cast<void>(
76 app.add_subcommand("process-host-firmware",
77 "Point the host firmware at its data.")
Adriana Kobylak53a27392021-06-14 17:42:40 +000078 ->callback([&bus, &loop, &subcommandContext, extensionMap]() {
Brad Bishop099543e2020-11-09 15:37:58 -050079 auto hostFirmwareDirectory = "/media/hostfw/running"s;
80 auto logCallback = [](const auto& path, auto& ec) {
81 std::cerr << path << ": " << ec.message() << "\n";
82 };
Adriana Kobylak53a27392021-06-14 17:42:40 +000083 subcommandContext.push_back(
Brad Bishop099543e2020-11-09 15:37:58 -050084 functions::process_hostfirmware::processHostFirmware(
Adriana Kobylak53a27392021-06-14 17:42:40 +000085 bus, extensionMap, std::move(hostFirmwareDirectory),
86 std::move(logCallback), loop));
Brad Bishop099543e2020-11-09 15:37:58 -050087 }));
Adriana Kobylak53a27392021-06-14 17:42:40 +000088 static_cast<void>(
89 app.add_subcommand("update-bios-attr-table",
90 "Update the bios attribute table with the host "
91 "firmware data details.")
92 ->callback([&bus, &loop, &subcommandContext, extensionMap]() {
Adriana Kobylakae0998f2021-06-16 19:52:24 +000093 auto elementsJsonFilePath = "/usr/share/hostfw/elements.json"s;
Adriana Kobylakebf67bf2021-06-21 18:38:17 +000094 auto subcommands =
Adriana Kobylak53a27392021-06-14 17:42:40 +000095 functions::process_hostfirmware::updateBiosAttrTable(
Adriana Kobylakae0998f2021-06-16 19:52:24 +000096 bus, extensionMap, std::move(elementsJsonFilePath),
Adriana Kobylakebf67bf2021-06-21 18:38:17 +000097 loop);
98 for (const auto& subcommand : subcommands)
99 {
100 subcommandContext.push_back(subcommand);
101 }
Adriana Kobylak53a27392021-06-14 17:42:40 +0000102 }));
103
Brad Bishop099543e2020-11-09 15:37:58 -0500104 CLI11_PARSE(app, argc, argv);
105
106 if (app.get_subcommands().size() == 0)
107 {
108 initializeService(bus);
109 }
Adriana Kobylak2d8fa222017-03-15 12:34:32 -0500110
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -0500111 try
Adriana Kobylak2d8fa222017-03-15 12:34:32 -0500112 {
Brad Bishop0283f7c2020-11-09 10:09:26 -0500113 auto rc = loop.loop();
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -0500114 if (rc < 0)
115 {
116 log<level::ERR>("Error occurred during the sd_event_loop",
117 entry("RC=%d", rc));
118 return -1;
119 }
Adriana Kobylak2d8fa222017-03-15 12:34:32 -0500120 }
Gunnar Mills6bd6d7b2017-09-18 09:22:36 -0500121 catch (const std::system_error& e)
122 {
123 log<level::ERR>(e.what());
124 return -1;
125 }
126
Adriana Kobylak2d8fa222017-03-15 12:34:32 -0500127 return 0;
128}