xref: /openbmc/openpower-vpd-parser/vpd-manager/src/manager_main.cpp (revision c0c007de496f738e9c23e12c5246335c7a1baf49)
1 #include "config.h"
2 
3 #include "bios_handler.hpp"
4 #include "constants.hpp"
5 #include "event_logger.hpp"
6 #include "exceptions.hpp"
7 #include "logger.hpp"
8 #include "manager.hpp"
9 #include "types.hpp"
10 
11 #include <sdbusplus/asio/connection.hpp>
12 #include <sdbusplus/asio/object_server.hpp>
13 
14 #include <iostream>
15 
16 /**
17  * @brief Main function for VPD parser application.
18  */
19 int main(int, char**)
20 {
21     try
22     {
23         auto io_con = std::make_shared<boost::asio::io_context>();
24         auto connection =
25             std::make_shared<sdbusplus::asio::connection>(*io_con);
26         auto server = sdbusplus::asio::object_server(connection);
27 
28         std::shared_ptr<sdbusplus::asio::dbus_interface> interface =
29             server.add_interface(OBJPATH, IFACE);
30 
31         std::shared_ptr<sdbusplus::asio::dbus_interface> progressInf =
32             server.add_interface(OBJPATH,
33                                  vpd::constants::vpdCollectionInterface);
34 
35         auto vpdManager = std::make_shared<vpd::Manager>(
36             io_con, interface, progressInf, connection);
37 
38         try
39         {
40             // TODO: Take this under conditional compilation for IBM
41             auto biosHandler =
42                 std::make_shared<vpd::BiosHandler<vpd::IbmBiosHandler>>(
43                     connection, vpdManager);
44             biosHandler->checkAndListenPldmService();
45         }
46         catch (const std::exception& l_ex)
47         {
48             // Cathcing exception here explicitly to let VPD-Manager service
49             // continue even when bios handler fails.
50             const std::string& l_errMsg =
51                 "Instantiation of BIOS Handler failed. { " +
52                 std::string(l_ex.what()) + std::string(" }");
53 
54             vpd::EventLogger::createSyncPel(
55                 vpd::types::ErrorType::FirmwareError,
56                 vpd::types::SeverityType::Warning, __FILE__, __FUNCTION__, 0,
57                 l_errMsg, std::nullopt, std::nullopt, std::nullopt,
58                 std::nullopt);
59         }
60 
61         interface->initialize();
62         progressInf->initialize();
63 
64         vpd::logging::logMessage("Start VPD-Manager event loop");
65 
66         // Grab the bus name
67         connection->request_name(BUSNAME);
68 
69         // Start event loop.
70         io_con->run();
71 
72         exit(EXIT_SUCCESS);
73     }
74     catch (const std::exception& l_ex)
75     {
76         vpd::logging::logMessage("VPD-Manager service failed to start.");
77         vpd::EventLogger::createSyncPel(
78             vpd::EventLogger::getErrorType(l_ex),
79             vpd::types::SeverityType::Critical, __FILE__, __FUNCTION__, 0,
80             vpd::EventLogger::getErrorMsg(l_ex), std::nullopt, std::nullopt,
81             std::nullopt, std::nullopt);
82     }
83     exit(EXIT_FAILURE);
84 }
85