1e426b589SAndrew Geissler #include "config.h"
2e426b589SAndrew Geissler 
3e426b589SAndrew Geissler #include "scheduled_host_transition.hpp"
4e426b589SAndrew Geissler 
5*211d972dSPatrick Williams #include <getopt.h>
6*211d972dSPatrick Williams 
7e426b589SAndrew Geissler #include <sdbusplus/bus.hpp>
8e426b589SAndrew Geissler 
971230efdSCarol Wang #include <cstdlib>
1071230efdSCarol Wang #include <exception>
111dbbef42SCarol Wang #include <filesystem>
1271230efdSCarol Wang 
13*211d972dSPatrick Williams int main(int argc, char** argv)
1471230efdSCarol Wang {
15*211d972dSPatrick Williams     size_t hostId = 0;
16*211d972dSPatrick Williams 
17*211d972dSPatrick Williams     int arg;
18*211d972dSPatrick Williams     int optIndex = 0;
19*211d972dSPatrick Williams 
20*211d972dSPatrick Williams     static struct option longOpts[] = {{"host", required_argument, 0, 'h'},
21*211d972dSPatrick Williams                                        {0, 0, 0, 0}};
22*211d972dSPatrick Williams 
23*211d972dSPatrick Williams     while ((arg = getopt_long(argc, argv, "h:", longOpts, &optIndex)) != -1)
24*211d972dSPatrick Williams     {
25*211d972dSPatrick Williams         switch (arg)
26*211d972dSPatrick Williams         {
27*211d972dSPatrick Williams             case 'h':
28*211d972dSPatrick Williams                 hostId = std::stoul(optarg);
29*211d972dSPatrick Williams                 break;
30*211d972dSPatrick Williams             default:
31*211d972dSPatrick Williams                 break;
32*211d972dSPatrick Williams         }
33*211d972dSPatrick Williams     }
34*211d972dSPatrick Williams 
351dbbef42SCarol Wang     namespace fs = std::filesystem;
361dbbef42SCarol Wang 
376a5db3d3SCarol Wang     // Get a default event loop
386a5db3d3SCarol Wang     auto event = sdeventplus::Event::get_default();
396a5db3d3SCarol Wang 
406a5db3d3SCarol Wang     // Get a handle to system dbus
4171230efdSCarol Wang     auto bus = sdbusplus::bus::new_default();
4271230efdSCarol Wang 
4371230efdSCarol Wang     // For now, we only have one instance of the host
44*211d972dSPatrick Williams     auto objPathInst = std::string{HOST_OBJPATH} + std::to_string(hostId);
4571230efdSCarol Wang 
461dbbef42SCarol Wang     // Check SCHEDULED_HOST_TRANSITION_PERSIST_PATH
471dbbef42SCarol Wang     auto dir = fs::path(SCHEDULED_HOST_TRANSITION_PERSIST_PATH).parent_path();
481dbbef42SCarol Wang     if (!fs::exists(dir))
491dbbef42SCarol Wang     {
501dbbef42SCarol Wang         fs::create_directories(dir);
511dbbef42SCarol Wang     }
521dbbef42SCarol Wang 
5371230efdSCarol Wang     // Add sdbusplus ObjectManager.
5471230efdSCarol Wang     sdbusplus::server::manager::manager objManager(bus, objPathInst.c_str());
5571230efdSCarol Wang 
5671230efdSCarol Wang     phosphor::state::manager::ScheduledHostTransition manager(
57*211d972dSPatrick Williams         bus, objPathInst.c_str(), hostId, event);
5871230efdSCarol Wang 
59*211d972dSPatrick Williams     bus.request_name((std::string{SCHEDULED_HOST_TRANSITION_BUSNAME} +
60*211d972dSPatrick Williams                       std::to_string(hostId))
61*211d972dSPatrick Williams                          .c_str());
6271230efdSCarol Wang 
636a5db3d3SCarol Wang     // Attach the bus to sd_event to service user requests
646a5db3d3SCarol Wang     bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);
656a5db3d3SCarol Wang     event.loop();
666a5db3d3SCarol Wang 
6771230efdSCarol Wang     return 0;
6871230efdSCarol Wang }
69