xref: /openbmc/phosphor-networkd/src/network_manager_main.cpp (revision b740196bd220202cc2dd4f04c4ff409a79338e33)
1  #include "config.h"
2  
3  #ifdef SYNC_MAC_FROM_INVENTORY
4  #include "inventory_mac.hpp"
5  #endif
6  #include "network_manager.hpp"
7  #include "rtnetlink_server.hpp"
8  #include "types.hpp"
9  
10  #include <phosphor-logging/lg2.hpp>
11  #include <sdbusplus/bus.hpp>
12  #include <sdbusplus/server/manager.hpp>
13  #include <sdeventplus/clock.hpp>
14  #include <sdeventplus/event.hpp>
15  #include <sdeventplus/source/signal.hpp>
16  #include <sdeventplus/utility/sdbus.hpp>
17  #include <sdeventplus/utility/timer.hpp>
18  #include <stdplus/pinned.hpp>
19  #include <stdplus/print.hpp>
20  #include <stdplus/signal.hpp>
21  
22  #include <chrono>
23  
24  constexpr char DEFAULT_OBJPATH[] = "/xyz/openbmc_project/network";
25  
26  namespace phosphor::network
27  {
28  
29  class TimerExecutor : public DelayedExecutor
30  {
31    private:
32      using Timer = sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>;
33  
34    public:
TimerExecutor(sdeventplus::Event & event,std::chrono::milliseconds delay)35      TimerExecutor(sdeventplus::Event& event, std::chrono::milliseconds delay) :
36          delay(delay), timer(event, nullptr)
37      {}
38  
schedule()39      void schedule() override
40      {
41          timer.restartOnce(delay);
42      }
43  
setCallback(fu2::unique_function<void ()> && cb)44      void setCallback(fu2::unique_function<void()>&& cb) override
45      {
46          timer.set_callback([cb = std::move(cb)](Timer&) mutable { cb(); });
47      }
48  
49    private:
50      std::chrono::milliseconds delay;
51      Timer timer;
52  };
53  
termCb(sdeventplus::source::Signal & signal,const struct signalfd_siginfo *)54  void termCb(sdeventplus::source::Signal& signal, const struct signalfd_siginfo*)
55  {
56      lg2::notice("Received request to terminate, exiting");
57      signal.get_event().exit(0);
58  }
59  
main()60  int main()
61  {
62      auto event = sdeventplus::Event::get_default();
63      stdplus::signal::block(SIGTERM);
64      sdeventplus::source::Signal(event, SIGTERM, termCb).set_floating(true);
65  
66      stdplus::Pinned bus = sdbusplus::bus::new_default();
67      sdbusplus::server::manager_t objManager(bus, DEFAULT_OBJPATH);
68  
69      stdplus::Pinned<TimerExecutor> reload(event, std::chrono::seconds(3));
70      stdplus::Pinned<Manager> manager(bus, reload, DEFAULT_OBJPATH,
71                                       "/etc/systemd/network");
72      netlink::Server svr(event, manager);
73  
74  #ifdef SYNC_MAC_FROM_INVENTORY
75      auto runtime = inventory::watch(bus, manager);
76  #endif
77  
78      bus.request_name(DEFAULT_BUSNAME);
79      return sdeventplus::utility::loopWithBus(event, bus);
80  }
81  
82  } // namespace phosphor::network
83  
main(int,char **)84  int main(int /*argc*/, char** /*argv*/)
85  {
86      try
87      {
88          return phosphor::network::main();
89      }
90      catch (const std::exception& e)
91      {
92          stdplus::print(stderr, "FAILED: {}", e.what());
93          fflush(stderr);
94          return 1;
95      }
96  }
97