8#include <kea_version.h>
23#include <boost/lexical_cast.hpp>
45const char*
const DHCP6_NAME =
"kea-dhcp6";
52 cerr <<
"Kea DHCPv6 server, "
53 <<
"version " << VERSION
54 <<
" (" << PACKAGE_VERSION_TYPE <<
")"
57 cerr <<
"Usage: " << DHCP6_NAME
58 <<
" -[v|V|W|X] [-d] [-{c|t|T} cfgfile] [-p number] [-P number]" << endl;
59 cerr <<
" -v: print version number and exit" << endl;
60 cerr <<
" -V: print extended version and exit" << endl;
61 cerr <<
" -W: display the configuration report and exit" << endl;
62 cerr <<
" -d: debug mode with extra verbosity (former -v)" << endl;
63 cerr <<
" -c file: specify configuration file" << endl;
64 cerr <<
" -t file: check the configuration file syntax and exit" << endl;
65 cerr <<
" -T file: check the configuration file doing hooks load and extra "
66 <<
"checks and exit" << endl;
67 cerr <<
" -p number: specify non-standard server port number 1-65535 "
68 <<
"(useful for testing only)" << endl;
69 cerr <<
" -P number: specify non-standard client port number 1-65535 "
70 <<
"(useful for testing only)" << endl;
71 cerr <<
" -X: disables security restrictions" << endl;
77main(
int argc,
char* argv[]) {
82 int server_port_number = DHCP6_SERVER_PORT;
84 int client_port_number = 0;
85 bool verbose_mode =
false;
86 bool check_mode =
false;
87 bool load_hooks =
false;
90 std::string config_file(
"");
96 while ((ch = getopt(argc, argv,
"dvVWc:p:P:t:T:X")) != -1) {
104 return (EXIT_SUCCESS);
108 return (EXIT_SUCCESS);
112 return (EXIT_SUCCESS);
117 config_file = optarg;
122 config_file = optarg;
126 config_file = optarg;
131 server_port_number = boost::lexical_cast<int>(optarg);
132 }
catch (
const boost::bad_lexical_cast &) {
133 cerr <<
"Failed to parse server port number: [" << optarg
134 <<
"], 1-65535 allowed." << endl;
137 if (server_port_number <= 0 || server_port_number > 65535) {
138 cerr <<
"Failed to parse server port number: [" << optarg
139 <<
"], 1-65535 allowed." << endl;
146 client_port_number = boost::lexical_cast<int>(optarg);
147 }
catch (
const boost::bad_lexical_cast &) {
148 cerr <<
"Failed to parse client port number: [" << optarg
149 <<
"], 1-65535 allowed." << endl;
152 if (client_port_number <= 0 || client_port_number > 65535) {
153 cerr <<
"Failed to parse client port number: [" << optarg
154 <<
"], 1-65535 allowed." << endl;
174 if (config_file.empty()) {
175 cerr <<
"Configuration file not specified." << endl;
183 setenv(
"KEA_LOCKFILE_DIR",
"none", 0);
192 cerr <<
"No configuration found" << endl;
193 return (EXIT_FAILURE);
196 cerr <<
"Syntax check OK" << endl;
202 cerr <<
"Missing mandatory Dhcp6 element" << endl;
203 return (EXIT_FAILURE);
216 if (status_code == 0) {
217 return (EXIT_SUCCESS);
219 cerr <<
"Error encountered: " << answer->stringValue() << endl;
220 return (EXIT_FAILURE);
222 }
catch (
const std::exception& ex) {
223 cerr <<
"Syntax check failed with: " << ex.what() << endl;
225 return (EXIT_FAILURE);
228 int ret = EXIT_SUCCESS;
239 .arg(server_port_number)
240 .arg(client_port_number)
241 .arg(verbose_mode ?
"yes" :
"no");
245 .arg(PACKAGE_VERSION_TYPE);
247 if (
string(PACKAGE_VERSION_TYPE) ==
"development") {
272 server.
init(config_file);
273 }
catch (
const std::exception& ex) {
291 cerr <<
"Failed to initialize server: " << ex.what() << endl;
294 return (EXIT_FAILURE);
307 cerr << DHCP6_NAME <<
" already running? " << ex.
what()
315 .arg(DHCP6_NAME).arg(ex.
what());
320 }
catch (
const std::exception& ex) {
322 cerr << DHCP6_NAME <<
": Fatal error during start up: " << ex.
what()
335 cerr << DHCP6_NAME <<
": Fatal error during start up"
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
void setFamily(uint16_t family)
Sets address family (AF_INET or AF_INET6).
static CfgMgr & instance()
returns a single instance of Configuration Manager
Controlled version of the DHCPv6 server.
void init(const std::string &config_file)
Initializes the server.
int run()
Main server processing loop.
static std::string getVersion(bool extended)
returns Kea version on stdout and exit.
void setFamily(uint16_t family)
Sets address family (AF_INET or AF_INET6).
static IfaceMgr & instance()
IfaceMgr is a singleton class.
Evaluation context, an interface to the expression evaluation.
isc::data::ElementPtr parseFile(const std::string &filename, ParserType parser_type)
Run the parser on the file specified.
@ PARSER_DHCP6
This parser will parse the content as Dhcp6 config wrapped in a map (that's the regular config file).
void process(T start, T finish)
Process Specifications.
Exception thrown when the PID file points to a live PID.
static void setVerbose(const bool verbose)
Sets or clears verbose mode.
static void loggerInit(const char *log_name, bool verbose)
Initializes logger.
static void setDefaultLoggerName(const std::string &logger)
Sets the default logger name.
static void setProcName(const std::string &proc_name)
Sets the process name.
void createPIDFile(int pid=0)
Creates the PID file.
void setConfigFile(const std::string &config_file)
Sets the configuration file name.
static bool shouldEnforceSecurity()
Indicates security checks should be enforced.
static void enableEnforcement(bool enable)
Enables or disables security enforcement checks.
int main(int argc, char *argv[])
Logging initialization functions.
#define LOG_ERROR(LOGGER, MESSAGE)
Macro to conveniently test error output and log it.
#define LOG_INFO(LOGGER, MESSAGE)
Macro to conveniently test info output and log it.
#define LOG_WARN(LOGGER, MESSAGE)
Macro to conveniently test warn output and log it.
#define LOG_FATAL(LOGGER, MESSAGE)
Macro to conveniently test fatal output and log it.
#define LOG_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
ConstElementPtr parseAnswer(int &rcode, const ConstElementPtr &msg)
Parses a standard config/command level answer and returns arguments or text status code.
boost::shared_ptr< const Element > ConstElementPtr
std::string getConfigReport()
isc::data::ConstElementPtr configureDhcp6Server(Dhcpv6Srv &server, isc::data::ConstElementPtr config_set, bool check_only, bool extra_checks)
Configure DHCPv6 server (Dhcpv6Srv) with a set of configuration values.
const isc::log::MessageID DHCP6_INIT_FAIL
const int DBG_DHCP6_START
Debug level used to log information during server startup.
const isc::log::MessageID DHCP6_SERVER_FAILED
const isc::log::MessageID DHCP6_DEVELOPMENT_VERSION
const isc::log::MessageID DHCP6_SHUTDOWN
const isc::log::MessageID DHCP6_STARTED
const isc::log::MessageID DHCP6_STARTING
const isc::log::MessageID DHCP6_START_INFO
const isc::log::MessageID DHCP6_SECURITY_CHECKS_DISABLED
const isc::log::MessageID DHCP6_ALREADY_RUNNING
const isc::log::MessageID DHCP6_ROOT_USER_SECURITY_WARNING
const char * DHCP6_ROOT_LOGGER_NAME
Defines the name of the root level (default) logger.
isc::log::Logger dhcp6_logger(DHCP6_APP_LOGGER_NAME)
Base logger for DHCPv6 server.
bool amRunningAsRoot()
Indicates if current user is root.
void setUmask()
Set umask (at least 0027 i.e. no group write and no other access).