1e426b589SAndrew Geissler #include "config.h"
2e426b589SAndrew Geissler
3e426b589SAndrew Geissler #include "scheduled_host_transition.hpp"
4e426b589SAndrew Geissler
5211d972dSPatrick Williams #include <getopt.h>
6211d972dSPatrick Williams
7e426b589SAndrew Geissler #include <sdbusplus/bus.hpp>
8e426b589SAndrew Geissler
971230efdSCarol Wang #include <cstdlib>
1071230efdSCarol Wang #include <exception>
111dbbef42SCarol Wang #include <filesystem>
1271230efdSCarol Wang
13*f566c964SAmithash Prasasd using ScheduledHostTransition =
14*f566c964SAmithash Prasasd sdbusplus::server::xyz::openbmc_project::state::ScheduledHostTransition;
15*f566c964SAmithash Prasasd
main(int argc,char ** argv)16211d972dSPatrick Williams int main(int argc, char** argv)
1771230efdSCarol Wang {
18211d972dSPatrick Williams size_t hostId = 0;
19211d972dSPatrick Williams
20211d972dSPatrick Williams int arg;
21211d972dSPatrick Williams int optIndex = 0;
22211d972dSPatrick Williams
23f15b9544SPavithra Barithaya static struct option longOpts[] = {
24f15b9544SPavithra Barithaya {"host", required_argument, nullptr, 'h'}, {nullptr, 0, nullptr, 0}};
25211d972dSPatrick Williams
26211d972dSPatrick Williams while ((arg = getopt_long(argc, argv, "h:", longOpts, &optIndex)) != -1)
27211d972dSPatrick Williams {
28211d972dSPatrick Williams switch (arg)
29211d972dSPatrick Williams {
30211d972dSPatrick Williams case 'h':
31211d972dSPatrick Williams hostId = std::stoul(optarg);
32211d972dSPatrick Williams break;
33211d972dSPatrick Williams default:
34211d972dSPatrick Williams break;
35211d972dSPatrick Williams }
36211d972dSPatrick Williams }
37211d972dSPatrick Williams
381dbbef42SCarol Wang namespace fs = std::filesystem;
391dbbef42SCarol Wang
406a5db3d3SCarol Wang // Get a default event loop
416a5db3d3SCarol Wang auto event = sdeventplus::Event::get_default();
426a5db3d3SCarol Wang
436a5db3d3SCarol Wang // Get a handle to system dbus
4471230efdSCarol Wang auto bus = sdbusplus::bus::new_default();
4571230efdSCarol Wang
4671230efdSCarol Wang // For now, we only have one instance of the host
47a0d7bb84SAndrew Geissler auto objPathInst = std::string{HOST_SCHED_OBJPATH} + std::to_string(hostId);
4871230efdSCarol Wang
491dbbef42SCarol Wang // Check SCHEDULED_HOST_TRANSITION_PERSIST_PATH
501dbbef42SCarol Wang auto dir = fs::path(SCHEDULED_HOST_TRANSITION_PERSIST_PATH).parent_path();
511dbbef42SCarol Wang if (!fs::exists(dir))
521dbbef42SCarol Wang {
531dbbef42SCarol Wang fs::create_directories(dir);
541dbbef42SCarol Wang }
551dbbef42SCarol Wang
5671230efdSCarol Wang // Add sdbusplus ObjectManager.
57f053e6feSPatrick Williams sdbusplus::server::manager_t objManager(bus, objPathInst.c_str());
5871230efdSCarol Wang
5971230efdSCarol Wang phosphor::state::manager::ScheduledHostTransition manager(
60211d972dSPatrick Williams bus, objPathInst.c_str(), hostId, event);
6171230efdSCarol Wang
62960017a4SAndrew Geissler // For backwards compatibility, request a busname without host id if
63960017a4SAndrew Geissler // input id is 0.
64960017a4SAndrew Geissler if (hostId == 0)
65960017a4SAndrew Geissler {
66*f566c964SAmithash Prasasd bus.request_name(ScheduledHostTransition::interface);
67960017a4SAndrew Geissler }
68960017a4SAndrew Geissler
69*f566c964SAmithash Prasasd bus.request_name((std::string{ScheduledHostTransition::interface} +
70211d972dSPatrick Williams std::to_string(hostId))
71211d972dSPatrick Williams .c_str());
7271230efdSCarol Wang
736a5db3d3SCarol Wang // Attach the bus to sd_event to service user requests
746a5db3d3SCarol Wang bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);
756a5db3d3SCarol Wang event.loop();
766a5db3d3SCarol Wang
7771230efdSCarol Wang return 0;
7871230efdSCarol Wang }
79