// Copyright (C) 2012-2014 Internet Systems Consortium, Inc. ("ISC") // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR // PERFORMANCE OF THIS SOFTWARE. #ifndef CTRL_DHCPV4_SRV_H #define CTRL_DHCPV4_SRV_H #include #include #include #include #include namespace isc { namespace dhcp { /// @brief Controlled version of the DHCPv4 server /// /// This is a class that is responsible for DHCPv4 server being controllable. /// It does various things, depending on the configuration backend. /// For Bundy backend it establishes a connection with msqg and later receives /// commands over it. For Kea backend, it reads configuration file from disk. /// /// For detailed explanation or relations between main(), ControlledDhcpv4Srv, /// Dhcpv4Srv and other classes, see \ref dhcpv4Session. class ControlledDhcpv4Srv : public isc::dhcp::Dhcpv4Srv { public: /// @brief Constructor /// /// @param port UDP port to be opened for DHCP traffic ControlledDhcpv4Srv(uint16_t port = DHCP4_SERVER_PORT); /// @brief Destructor. ~ControlledDhcpv4Srv(); /// @brief Initializes the server. /// /// Depending on the configuration backend, it establishes msgq session, /// reads the JSON file from disk or may perform any other setup /// operation. For specific details, see actual implementation in /// *_backend.cc /// /// This method may throw if initialization fails. Exception types may be /// specific to used configuration backend. void init(const std::string& config_file); /// @brief Performs cleanup, immediately before termination /// /// This method performs final clean up, just before the Dhcpv4Srv object /// is destroyed. The actual behavior is backend dependent. For Bundy /// backend, it terminates existing session with msgq. After calling /// it, no further messages over msgq (commands or configuration updates) /// may be received. For JSON backend, it is no-op. /// /// For specific details, see actual implementation in *_backend.cc void cleanup(); /// @brief Initiates shutdown procedure for the whole DHCPv4 server. void shutdown(); /// @brief Command processor /// /// This method is uniform for all config backends. It processes received /// command (as a string + JSON arguments). Internally, it's just a /// wrapper that calls process*Command() methods and catches exceptions /// in them. /// /// Currently supported commands are: /// - shutdown /// - libreload /// - config-reload /// /// @note It never throws. /// /// @param command Text represenation of the command (e.g. "shutdown") /// @param args Optional parameters /// /// @return status of the command static isc::data::ConstElementPtr processCommand(const std::string& command, isc::data::ConstElementPtr args); /// @brief Configuration processor /// /// This is a method for handling incoming configuration updates. /// This method should be called by all configuration backends when the /// server is starting up or when configuration has changed. /// /// As pointer to this method is used a callback in ASIO used in /// ModuleCCSession, it has to be static. /// /// @param new_config textual representation of the new configuration /// /// @return status of the config update static isc::data::ConstElementPtr processConfig(isc::data::ConstElementPtr new_config); /// @brief Returns pointer to the sole instance of Dhcpv4Srv /// /// @return server instance (may return NULL, if called before server is spawned) static ControlledDhcpv4Srv* getInstance() { return (server_); } protected: /// @brief Static pointer to the sole instance of the DHCP server. /// /// This is required for config and command handlers to gain access to /// the server static ControlledDhcpv4Srv* server_; /// @brief Callback that will be called from iface_mgr when data /// is received over control socket. /// /// This static callback method is called from IfaceMgr::receive6() method, /// when there is a new command or configuration sent over control socket /// (that was sent from msgq if backend is Bundy, or some yet unspecified /// sender if the backend is JSON file). static void sessionReader(void); /// @brief IOService object, used for all ASIO operations. isc::asiolink::IOService io_service_; /// @brief Handler for processing 'shutdown' command /// /// This handler processes shutdown command, which initializes shutdown /// procedure. /// @param command (parameter ignored) /// @param args (parameter ignored) /// /// @return status of the command isc::data::ConstElementPtr commandShutdownHandler(const std::string& command, isc::data::ConstElementPtr args); /// @brief Handler for processing 'libreload' command /// /// This handler processes libreload command, which unloads all hook /// libraries and reloads them. /// /// @param command (parameter ignored) /// @param args (parameter ignored) /// /// @return status of the command isc::data::ConstElementPtr commandLibReloadHandler(const std::string& command, isc::data::ConstElementPtr args); /// @brief Handler for processing 'config-reload' command /// /// This handler processes config-reload command, which processes /// configuration specified in args parameter. /// /// @param command (parameter ignored) /// @param args configuration to be processed /// /// @return status of the command isc::data::ConstElementPtr commandConfigReloadHandler(const std::string& command, isc::data::ConstElementPtr args); }; }; // namespace isc::dhcp }; // namespace isc #endif