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 13211d972dSPatrick Williams int main(int argc, char** argv) 1471230efdSCarol Wang { 15211d972dSPatrick Williams size_t hostId = 0; 16211d972dSPatrick Williams 17211d972dSPatrick Williams int arg; 18211d972dSPatrick Williams int optIndex = 0; 19211d972dSPatrick Williams 20211d972dSPatrick Williams static struct option longOpts[] = {{"host", required_argument, 0, 'h'}, 21211d972dSPatrick Williams {0, 0, 0, 0}}; 22211d972dSPatrick Williams 23211d972dSPatrick Williams while ((arg = getopt_long(argc, argv, "h:", longOpts, &optIndex)) != -1) 24211d972dSPatrick Williams { 25211d972dSPatrick Williams switch (arg) 26211d972dSPatrick Williams { 27211d972dSPatrick Williams case 'h': 28211d972dSPatrick Williams hostId = std::stoul(optarg); 29211d972dSPatrick Williams break; 30211d972dSPatrick Williams default: 31211d972dSPatrick Williams break; 32211d972dSPatrick Williams } 33211d972dSPatrick Williams } 34211d972dSPatrick 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*a0d7bb84SAndrew Geissler auto objPathInst = std::string{HOST_SCHED_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. 54f053e6feSPatrick Williams sdbusplus::server::manager_t objManager(bus, objPathInst.c_str()); 5571230efdSCarol Wang 5671230efdSCarol Wang phosphor::state::manager::ScheduledHostTransition manager( 57211d972dSPatrick Williams bus, objPathInst.c_str(), hostId, event); 5871230efdSCarol Wang 59960017a4SAndrew Geissler // For backwards compatibility, request a busname without host id if 60960017a4SAndrew Geissler // input id is 0. 61960017a4SAndrew Geissler if (hostId == 0) 62960017a4SAndrew Geissler { 63960017a4SAndrew Geissler bus.request_name(SCHEDULED_HOST_TRANSITION_BUSNAME); 64960017a4SAndrew Geissler } 65960017a4SAndrew Geissler 66211d972dSPatrick Williams bus.request_name((std::string{SCHEDULED_HOST_TRANSITION_BUSNAME} + 67211d972dSPatrick Williams std::to_string(hostId)) 68211d972dSPatrick Williams .c_str()); 6971230efdSCarol Wang 706a5db3d3SCarol Wang // Attach the bus to sd_event to service user requests 716a5db3d3SCarol Wang bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL); 726a5db3d3SCarol Wang event.loop(); 736a5db3d3SCarol Wang 7471230efdSCarol Wang return 0; 7571230efdSCarol Wang } 76