xref: /openbmc/phosphor-state-manager/chassis_state_manager_main.cpp (revision 2eb6029cd9696b1db92c59e85a6752ac4ba4a5a0)
1  #include "config.h"
2  
3  #include "chassis_state_manager.hpp"
4  
5  #include <getopt.h>
6  
7  #include <sdbusplus/bus.hpp>
8  
9  #include <cstdlib>
10  #include <exception>
11  #include <filesystem>
12  #include <format>
13  #include <iostream>
14  
15  constexpr auto LEGACY_POH_COUNTER_PERSIST_PATH =
16      "/var/lib/phosphor-state-manager/POHCounter";
17  constexpr auto LEGACY_STATE_CHANGE_PERSIST_PATH =
18      "/var/lib/phosphor-state-manager/chassisStateChangeTime";
19  
20  using ChassisState = sdbusplus::server::xyz::openbmc_project::state::Chassis;
21  
main(int argc,char ** argv)22  int main(int argc, char** argv)
23  {
24      size_t chassisId = 0;
25      int arg;
26      int optIndex = 0;
27      static struct option longOpts[] = {
28          {"chassis", required_argument, nullptr, 'c'}, {nullptr, 0, nullptr, 0}};
29  
30      while ((arg = getopt_long(argc, argv, "c:", longOpts, &optIndex)) != -1)
31      {
32          switch (arg)
33          {
34              case 'c':
35                  chassisId = std::stoul(optarg);
36                  break;
37              default:
38                  break;
39          }
40      }
41  
42      namespace fs = std::filesystem;
43  
44      auto bus = sdbusplus::bus::new_default();
45  
46      auto chassisBusName = ChassisState::interface + std::to_string(chassisId);
47      const auto* objPath = ChassisState::namespace_path::value;
48      auto chassisName = std::string(ChassisState::namespace_path::chassis) +
49                         std::to_string(chassisId);
50      std::string objPathInst =
51          sdbusplus::message::object_path(objPath) / chassisName;
52  
53      if (chassisId == 0)
54      {
55          // Chassis State Manager was only support single-chassis and there only
56          // two file to store persist values(POH and state change time), to
57          // support multi-chassis state management, each service access new file
58          // paths with prefix 'chassisN', if any legacy persist file is exist,
59          // rename it to the new file format of chassis0.
60  
61          fs::path legacyPohPath{LEGACY_POH_COUNTER_PERSIST_PATH};
62          fs::path legacyStateChangePath{LEGACY_STATE_CHANGE_PERSIST_PATH};
63          fs::path newPohPath{std::format(POH_COUNTER_PERSIST_PATH, chassisId)};
64          fs::path newStateChangePath{
65              std::format(CHASSIS_STATE_CHANGE_PERSIST_PATH, chassisId)};
66          if (fs::exists(legacyPohPath))
67          {
68              fs::rename(legacyPohPath, newPohPath);
69          }
70          if (fs::exists(legacyStateChangePath))
71          {
72              fs::rename(legacyStateChangePath, newStateChangePath);
73          }
74      }
75  
76      // Add sdbusplus ObjectManager.
77      sdbusplus::server::manager_t objManager(bus, objPath);
78      phosphor::state::manager::Chassis manager(bus, objPathInst.c_str(),
79                                                chassisId);
80  
81      // For backwards compatibility, request a busname without chassis id if
82      // input id is 0.
83      if (chassisId == 0)
84      {
85          bus.request_name(ChassisState::interface);
86      }
87  
88      bus.request_name(chassisBusName.c_str());
89      manager.startPOHCounter();
90      return 0;
91  }
92