X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=l7vsd%2Fsrc%2Fl7vsadm.cpp;h=5593c62b8d6d0a73726021c6249b762cb2c6f707;hb=6419f36b67c8bcd1c701f88cc23a3ec7b3f49fc5;hp=90a893f42ee75b58bbcdb482e449ab2ecea1df13;hpb=5c7d6072ca366329164959340a901aaa2f62757b;p=ultramonkey-l7%2Fultramonkey-l7-v3.git diff --git a/l7vsd/src/l7vsadm.cpp b/l7vsd/src/l7vsadm.cpp index 90a893f4..5593c62b 100644 --- a/l7vsd/src/l7vsadm.cpp +++ b/l7vsd/src/l7vsadm.cpp @@ -1,6 +1,6 @@ /*! - * @file l7vsadm.cpp - * @brief l7vsadm command is l7vsd control application + * @file l7vsadm.cpp + * @brief l7vsadm command is l7vsd control application * * L7VSD: Linux Virtual Server for Layer7 Load Balancing * Copyright (C) 2009 NTT COMWARE Corporation. @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -42,2818 +43,3223 @@ #define VS_CONTACT_CLASS_SSL (0x00000001) // global function prototype -static void sig_exit_handler(int sig); -static int set_sighandler(int sig, void (*handler)(int)); -static int set_sighandlers(); +static void sig_exit_handler(int sig); +static int set_sighandler(int sig, void (*handler)(int)); +static int set_sighandlers(); // global variables -static bool signal_flag = false; -static int received_sig = 0; +static bool signal_flag = false; +static int received_sig = 0; // // command functions. // //! list command parsing. -//! @param[in] request command -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_list_func( l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 1, "l7vsadm::parse_list_func", __FILE__, __LINE__ ); - - request.command = cmd; // set command - if( argc < 3 ) return true; // option is none. this pattern is true +//! @param[in] request command +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_list_func(l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 1, "l7vsadm::parse_list_func", __FILE__, __LINE__); + + request.command = cmd; // set command + if (argc < 3) { + return true; // option is none. this pattern is true + } + else if (argc > 3) { + std::stringstream buf; + buf << "Argument argc is illegal for " << argv[1] << " command."; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 117, buf.str(), __FILE__, __LINE__); + return false; + } - if( argc > 3 ){ - std::stringstream buf; - buf << "Argument argc is illegal for " << argv[1] << " command."; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 117, buf.str(), __FILE__, __LINE__ ); - return false; - } - - for( int pos = 2; pos < argc; ++pos ){ //search option function from argv strings - parse_opt_map_type::iterator itr = list_option_dic.find( argv[pos] ); - if( itr != list_option_dic.end() ){ // option string function find. - if( ! itr->second( pos, argc, argv ) ) return false; // option string function error. - } - else{ //option string function don't find. - // print option not found message. - std::stringstream buf; - buf << "list option not found:" << argv[pos]; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 1, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - return true; + for (int pos = 2; pos < argc; ++pos) { //search option function from argv strings + parse_opt_map_type::iterator itr = list_option_dic.find(argv[pos]); + if (itr != list_option_dic.end()) { // option string function find. + if (! itr->second(pos, argc, argv)) { + return false; // option string function error. + } + } else { //option string function not found. + // print option not found message. + std::stringstream buf; + buf << "list option not found: " << argv[pos]; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 1, buf.str(), __FILE__, __LINE__); + return false; + } + } + return true; } // // option list functions. // //! list numeric flag check. -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_list_numeric_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 2, "l7vsadm::parse_opt_list_numeric_func", __FILE__, __LINE__ ); - - numeric_flag = true; //numeric flag on. - return true; +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_list_numeric_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 2, "l7vsadm::parse_opt_list_numeric_func", __FILE__, __LINE__); + + numeric_flag = true; //numeric flag on. + return true; } //! virtualservice command parsing. -//! @param[in] request command -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_vs_func( l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 3, "l7vsadm::parse_vs_func", __FILE__, __LINE__ ); - - request.command = cmd; // set command - if( l7vsadm_request::CMD_FLUSH_VS == cmd ){ - if( argc != 2 ){ - std::stringstream buf; - buf << "Argument argc is illegal for " << argv[1] << " command."; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 118, buf.str(), __FILE__, __LINE__ ); - return false; - } - }else{ - if( argc < 6 ){ - std::stringstream buf; - buf << "Argument argc is illegal for " << argv[1] << " command."; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 119, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - - std::map< std::string, int > count_map; - - for(parse_opt_map_type::iterator itr = vs_option_dic.begin() ; - itr != vs_option_dic.end() ; ++itr ){ - count_map[ itr->first ] = 0; - } - - for( int pos = 2; pos < argc; ++pos ){ // check options. - parse_opt_map_type::iterator itr = vs_option_dic.find( argv[pos] ); - if( itr != vs_option_dic.end() ){ // find option - count_map[ itr->first ]++; - if( ! itr->second( pos, argc, argv ) ) return false; // option function execute. - } - else{ // don't find option function. - std::stringstream buf; - buf << "virtualservice option not found:" << argv[pos]; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 2, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - // check virtualservice on response - // - if( l7vsadm_request::CMD_FLUSH_VS == cmd ){ - // flushvs required no option - return true; - } - if( ( l7vsadm_request::CMD_ADD_VS == cmd ) && ( request.vs_element.schedule_module_name.length() == 0 ) ){ - //scheduler module not specified - //scheduler module check. - std::string scheduler_name = L7VSADM_DEFAULT_SCHEDULER; //default scheduler - schedule_module_control& ctrl = schedule_module_control::getInstance(); - ctrl.initialize( L7VS_MODULE_PATH ); - schedule_module_base* module; - try{ - module = ctrl.load_module( scheduler_name ); - } - catch( ... ){ - std::stringstream buf; - buf << "scheduler module load error:" << scheduler_name; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 3, buf.str(), __FILE__, __LINE__ ); - return false; - } - if( !module ){ - // don't find schedule module - std::stringstream buf; - buf << "scheduler module not found:" << scheduler_name; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 4, buf.str(), __FILE__, __LINE__ ); - return false; - } - ctrl.unload_module( module ); - request.vs_element.schedule_module_name = scheduler_name; - } - if( request.vs_element.protocol_module_name.length() == 0 ){ - //protocol module name error - std::string buf("protocol module not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 5, buf, __FILE__, __LINE__ ); - return false; - } - if( request.vs_element.udpmode ){ - if( request.vs_element.udp_recv_endpoint == boost::asio::ip::udp::endpoint() ){ - // udp mode,but not acceptor endpoint - std::string buf("udp recv endpoint not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 6, buf, __FILE__, __LINE__ ); - return false; - } - } - else{ - if( request.vs_element.tcp_accept_endpoint == boost::asio::ip::tcp::endpoint() ){ - // tcp mode, but not acceptor endpoint - std::string buf("tcp accpeptor endpoint not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 7, buf, __FILE__, __LINE__ ); - return false; - } - } - if( 0 > request.vs_element.sorry_maxconnection ){ - std::string buf("invalid sorry_maxconnection value."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 8, buf, __FILE__, __LINE__ ); - return false; - } +//! @param[in] request command +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_vs_func(l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 3, "l7vsadm::parse_vs_func", __FILE__, __LINE__); + + request.command = cmd; // set command + if (l7vsadm_request::CMD_FLUSH_VS == cmd) { + if (argc != 2) { + std::stringstream buf; + buf << "Argument argc is illegal for " << argv[1] << " command."; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 118, buf.str(), __FILE__, __LINE__); + return false; + } + } else { + if (argc < 6) { + std::stringstream buf; + buf << "Argument argc is illegal for " << argv[1] << " command."; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 119, buf.str(), __FILE__, __LINE__); + return false; + } + } - if( ( l7vsadm_request::CMD_ADD_VS == cmd ) && - ( request.vs_element.access_log_flag == 1 ) && ( request.vs_element.access_log_file_name.length() == 0 ) ){ - std::string buf("access log file is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 89, buf, __FILE__, __LINE__ ); - return false; - } - if( l7vsadm_request::CMD_EDIT_VS == cmd){ - // Existence check of the parameter - if( count_map["-s"] == 0 && - count_map["--scheduler"] == 0 && - count_map["-u"] == 0 && - count_map["--upper"] == 0 && - count_map["-b"] == 0 && - count_map["--bypass"] == 0 && - count_map["-f"] == 0 && - count_map["--flag"] == 0 && - count_map["-Q"] == 0 && - count_map["--qos-up"] == 0 && - count_map["-q"] == 0 && - count_map["--qos-down"] == 0 && - count_map["-L"] == 0 && - count_map["--access-log"] == 0){ - - std::string buf("All option omitted for edit vs command."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 116, buf, __FILE__, __LINE__ ); - return false; - } - } - - //conflict check - std::string conflict_option_name; - bool is_conflict = false; - - for( std::map< std::string, int >::iterator itr = count_map.begin() ; - itr != count_map.end() ; ++itr ){ - if(itr->second > 1){ - conflict_option_name = itr->first; - is_conflict = true; - break; - } - } - - if(is_conflict == false && - count_map["-t"] == 1 && count_map ["--tcp-service"] == 1){ - //-t(--tcp-service) - conflict_option_name = "--tcp-service"; - is_conflict = true; - } - if(is_conflict == false && - count_map["-m"] == 1 && count_map ["--proto-module"] == 1){ - //-m(--proto-module) - conflict_option_name = "--proto-module"; - is_conflict = true; - } - if(is_conflict == false && - count_map["-s"] == 1 && count_map ["--scheduler"] == 1){ - //-s(--scheduler) - conflict_option_name = "--scheduler"; - is_conflict = true; - } - if(is_conflict == false && - count_map["-u"] == 1 && count_map ["--upper"] == 1){ - //-u(--upper) - conflict_option_name = "--upper"; - is_conflict = true; - } - if(is_conflict == false && - count_map["-b"] == 1 && count_map ["--bypass"] == 1){ - //-b(--bypass) - conflict_option_name = "--bypass"; - is_conflict = true; - } - if(is_conflict == false && - count_map["-f"] == 1 && count_map ["--flag"] == 1){ - //-f(--flag) - conflict_option_name = "--flag"; - is_conflict = true; - } - if(is_conflict == false && - count_map["-Q"] == 1 && count_map ["--qos-up"] == 1){ - //-Q(--qos-up) - conflict_option_name = "--qos-up"; - is_conflict = true; - } - if(is_conflict == false && - count_map["-q"] == 1 && count_map ["--qos-down"] == 1){ - //-q(--qos-down) - conflict_option_name = "--qos-down"; - is_conflict = true; - } - if(is_conflict == false && - count_map["-p"] == 1 && count_map ["--udp"] == 1){ - //-p(--udp) - conflict_option_name = "--udp"; - is_conflict = true; - } - if(is_conflict == false && - count_map["-z"] == 1 && count_map ["--ssl"] == 1){ - //-z(--ssl) - conflict_option_name = "--ssl"; - is_conflict = true; - } - if(is_conflict == false && - count_map["-O"] == 1 && count_map ["--sockopt"] == 1){ - //-O(--sockopt) - conflict_option_name = "--sockopt"; - is_conflict = true; - } - if(is_conflict == false && - count_map["-L"] == 1 && count_map ["--access-log"] == 1){ - //-L(--access-log) - conflict_option_name = "--access-log"; - is_conflict = true; - } - if(is_conflict == false && - count_map["-a"] == 1 && count_map ["--access-log-name"] == 1){ - //-a(--access-log-name) - conflict_option_name = "--access-log-name"; - is_conflict = true; - } - - if( is_conflict == true ){ - std::stringstream buf; - buf << "Option " << conflict_option_name << " is conflict."; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 120, buf.str(), __FILE__, __LINE__ ); - return false; - } + std::map count_map; + + for (parse_opt_map_type::iterator itr = vs_option_dic.begin() ; + itr != vs_option_dic.end() ; ++itr) { + count_map[ itr->first ] = 0; + } + + if (l7vsadm_request::CMD_EDIT_VS == cmd) { + request.vs_element.access_log_flag = -1; + } + + for (int pos = 2; pos < argc; ++pos) { // check options. + parse_opt_map_type::iterator itr = vs_option_dic.find(argv[pos]); + if (itr != vs_option_dic.end()) { // find option + count_map[ itr->first ]++; + if (! itr->second(pos, argc, argv)) { + return false; // option function execute. + } + } else { // not found option function. + std::stringstream buf; + buf << "virtualservice option not found: " << argv[pos]; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 2, buf.str(), __FILE__, __LINE__); + return false; + } + } + // check virtualservice on response + if (l7vsadm_request::CMD_FLUSH_VS == cmd) { + // flush vs required no option + return true; + } + if ((l7vsadm_request::CMD_ADD_VS == cmd) && (request.vs_element.schedule_module_name.length() == 0)) { + //scheduler module not specified + //scheduler module check. + std::string scheduler_name = L7VSADM_DEFAULT_SCHEDULER; //default scheduler + schedule_module_control &ctrl = schedule_module_control::getInstance(); + ctrl.initialize(L7VS_MODULE_PATH); + schedule_module_base *module; + try { + module = ctrl.load_module(scheduler_name); + } catch (...) { + std::stringstream buf; + buf << "scheduler module load error(--scheduler): " << scheduler_name; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 3, buf.str(), __FILE__, __LINE__); + return false; + } + if (!module) { + // schedule module not found + std::stringstream buf; + buf << "scheduler module not found(--scheduler): " << scheduler_name; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 4, buf.str(), __FILE__, __LINE__); + return false; + } + ctrl.unload_module(module); + request.vs_element.schedule_module_name = scheduler_name; + } + if (request.vs_element.protocol_module_name.length() == 0) { + //protocol module name error + std::string buf("protocol module is not specified.(--proto-module)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 5, buf, __FILE__, __LINE__); + return false; + } + if (request.vs_element.udpmode) { + if (request.vs_element.udp_recv_endpoint == boost::asio::ip::udp::endpoint()) { + // udp mode, but no receive endpoint + std::string buf("udp recv endpoint is not specified.(--udp-service)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 6, buf, __FILE__, __LINE__); + return false; + } + } else { + if (request.vs_element.tcp_accept_endpoint == boost::asio::ip::tcp::endpoint()) { + // tcp mode, but no acceptor endpoint + std::string buf("tcp accpeptor endpoint is not specified.(--tcp-service)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 7, buf, __FILE__, __LINE__); + return false; + } + } + if (0 > request.vs_element.sorry_maxconnection) { + std::string buf("invalid sorry max connection value.(--upper)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 8, buf, __FILE__, __LINE__); + return false; + } + if ((l7vsadm_request::CMD_ADD_VS == cmd) && + (request.vs_element.sorry_fwdmode == virtualservice_element::FWD_NONE)) { + request.vs_element.sorry_fwdmode = virtualservice_element::FWD_MASQ; + } + + if ((l7vsadm_request::CMD_ADD_VS == cmd) && + (request.vs_element.access_log_flag == 1) && (request.vs_element.access_log_file_name.length() == 0)) { + std::string buf("access log file is not specified.(--access-log-name)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 89, buf, __FILE__, __LINE__); + return false; + } + + if (l7vsadm_request::CMD_EDIT_VS == cmd) { + // Existence check of the parameter + if (count_map["-s"] == 0 && + count_map["--scheduler"] == 0 && + count_map["-u"] == 0 && + count_map["--upper"] == 0 && + count_map["-b"] == 0 && + count_map["--bypass"] == 0 && + count_map["-f"] == 0 && + count_map["--flag"] == 0 && + count_map["-M"] == 0 && + count_map["--masq"] == 0 && + count_map["-T"] == 0 && + count_map["--tproxy"] == 0 && + count_map["-Q"] == 0 && + count_map["--qos-up"] == 0 && + count_map["-q"] == 0 && + count_map["--qos-down"] == 0 && + count_map["-L"] == 0 && + count_map["--access-log"] == 0) { + + std::string buf("All option omitted for edit vs command."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 116, buf, __FILE__, __LINE__); + return false; + } + } + + //conflict check + std::string conflict_option_name; + bool is_conflict = false; - if( l7vsadm_request::CMD_ADD_VS == cmd && - ( count_map["-z"] > 0 || count_map["--ssl"] > 0 ) ) { - protocol_module_control& ctrl + for (std::map::iterator itr = count_map.begin() ; + itr != count_map.end() ; ++itr) { + if (itr->second > 1) { + conflict_option_name = itr->first; + is_conflict = true; + break; + } + } + + if (is_conflict == false && + count_map["-t"] == 1 && count_map["--tcp-service"] == 1) { + //-t(--tcp-service) + conflict_option_name = "--tcp-service"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-m"] == 1 && count_map["--proto-module"] == 1) { + //-m(--proto-module) + conflict_option_name = "--proto-module"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-s"] == 1 && count_map["--scheduler"] == 1) { + //-s(--scheduler) + conflict_option_name = "--scheduler"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-u"] == 1 && count_map["--upper"] == 1) { + //-u(--upper) + conflict_option_name = "--upper"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-b"] == 1 && count_map["--bypass"] == 1) { + //-b(--bypass) + conflict_option_name = "--bypass"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-f"] == 1 && count_map["--flag"] == 1) { + //-f(--flag) + conflict_option_name = "--flag"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-M"] == 1 && count_map["--masq"] == 1) { + //-M(--masq) + conflict_option_name = "--masq"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-T"] == 1 && count_map["--tproxy"] == 1) { + //-T(--tproxy) + conflict_option_name = "--tproxy"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-M"] + count_map["--masq"] + + count_map["-T"] + count_map["--tproxy"] > 1) { + conflict_option_name = "--masq/tproxy"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-Q"] == 1 && count_map["--qos-up"] == 1) { + //-Q(--qos-up) + conflict_option_name = "--qos-up"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-q"] == 1 && count_map["--qos-down"] == 1) { + //-q(--qos-down) + conflict_option_name = "--qos-down"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-p"] == 1 && count_map["--udp"] == 1) { + //-p(--udp) + conflict_option_name = "--udp"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-z"] == 1 && count_map["--ssl"] == 1) { + //-z(--ssl) + conflict_option_name = "--ssl"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-O"] == 1 && count_map["--sockopt"] == 1) { + //-O(--sockopt) + conflict_option_name = "--sockopt"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-L"] == 1 && count_map["--access-log"] == 1) { + //-L(--access-log) + conflict_option_name = "--access-log"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-a"] == 1 && count_map["--access-log-name"] == 1) { + //-a(--access-log-name) + conflict_option_name = "--access-log-name"; + is_conflict = true; + } + + if (is_conflict == true) { + std::stringstream buf; + buf << "Option " << conflict_option_name << " is conflict."; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 120, buf.str(), __FILE__, __LINE__); + return false; + } + + if (l7vsadm_request::CMD_ADD_VS == cmd && + (count_map["-z"] > 0 || count_map["--ssl"] > 0)) { + protocol_module_control &ctrl = protocol_module_control::getInstance(); - ctrl.initialize( L7VS_MODULE_PATH ); - protocol_module_base* module; - try{ - module - = ctrl.load_module( request.vs_element.protocol_module_name ); - } - catch( ... ){ - std::stringstream buf; - buf << "protocol module load error:" - << request.vs_element.protocol_module_name; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( - LOG_CAT_L7VSADM_PARSE, - 108, - buf.str(), - __FILE__, - __LINE__ ); - return false; - } - if( !module ){ - //don't find protocol module. - std::stringstream buf; - buf << "protocol module not found:" - << request.vs_element.protocol_module_name; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( - LOG_CAT_L7VSADM_PARSE, - 109, buf.str(), - __FILE__, - __LINE__ ); - return false; - } - - bool module_used_flag = module->is_exec_OK( VS_CONTACT_CLASS_SSL ); - if( module_used_flag == false ) { - //don't find protocol module. - std::stringstream buf; - buf << "When \"protocol_module sslid\" was designated," - << " it isn't possible to designate \"-z\" option."; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( - LOG_CAT_L7VSADM_PARSE, - 110, - buf.str(), - __FILE__, - __LINE__ ); - return false; - } - } - - - return true; + ctrl.initialize(L7VS_MODULE_PATH); + protocol_module_base *module; + try { + module + = ctrl.load_module(request.vs_element.protocol_module_name); + } catch (...) { + std::stringstream buf; + buf << "protocol module load error(--proto-module): " + << request.vs_element.protocol_module_name; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError( + LOG_CAT_L7VSADM_PARSE, + 108, + buf.str(), + __FILE__, + __LINE__); + return false; + } + if (!module) { + // protocol module not found. + std::stringstream buf; + buf << "protocol module not found(--proto-module): " + << request.vs_element.protocol_module_name; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError( + LOG_CAT_L7VSADM_PARSE, + 109, buf.str(), + __FILE__, + __LINE__); + return false; + } + + bool module_used_flag = module->is_exec_OK(VS_CONTACT_CLASS_SSL); + if (module_used_flag == false) { + // protocol module not found. + std::stringstream buf; + buf << "You cannot set \"-z\" option with \"sslid\" protocol module."; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError( + LOG_CAT_L7VSADM_PARSE, + 110, + buf.str(), + __FILE__, + __LINE__); + return false; + } + } + + return true; } // // option virtualservice functions. // //! target option check -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_vs_target_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 4, "l7vsadm::parse_opt_vs_target_func", __FILE__, __LINE__ ); - - if( ++pos >= argc ){ - //don't target recvaddress:port - std::string buf("target endpoint is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 9, buf, __FILE__, __LINE__ ); - return false; - } - // get host endpoint from string - std::string src_str = argv[pos]; - if( request.vs_element.udpmode ){ - error_code err; - request.vs_element.udp_recv_endpoint = string_to_endpoint( src_str, err ); - if( err ){ - std::stringstream buf; - buf << "target endpoint parse error:" << err.get_message() << src_str; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 10, buf.str(), __FILE__, __LINE__ ); - return false; - } - check_endpoint( request.vs_element.udp_recv_endpoint, true, err ); - if ( err ){ - std::stringstream buf; - buf << "target endpoint parse error:" << err.get_message() << src_str; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 11, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - else{ - error_code err; - request.vs_element.tcp_accept_endpoint = string_to_endpoint( src_str, err ); - if( err ){ - std::stringstream buf; - buf << "target endpoint parse error:" << err.get_message() << src_str; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 12, buf.str(), __FILE__, __LINE__ ); - return false; - } - check_endpoint( request.vs_element.tcp_accept_endpoint, true, err ); - if ( err ){ - std::stringstream buf; - buf << "target endpoint parse error:" << err.get_message() << src_str; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 13, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - return true; +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_vs_target_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 4, "l7vsadm::parse_opt_vs_target_func", __FILE__, __LINE__); + + if (++pos >= argc) { + // target address and port are not specified + std::string buf("target endpoint is not specified.(--tcp-service)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 9, buf, __FILE__, __LINE__); + return false; + } + // get host endpoint from string + std::string src_str = argv[pos]; + if (request.vs_element.udpmode) { + error_code err; + request.vs_element.udp_recv_endpoint = string_to_endpoint(src_str, err); + if (err) { + std::stringstream buf; + buf << "target endpoint parse error(--tcp-service): " << err.get_message() << src_str; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 10, buf.str(), __FILE__, __LINE__); + return false; + } + check_endpoint(request.vs_element.udp_recv_endpoint, true, err); + if (err) { + std::stringstream buf; + buf << "target endpoint parse error(--tcp-service): " << err.get_message() << src_str; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 11, buf.str(), __FILE__, __LINE__); + return false; + } + } else { + error_code err; + request.vs_element.tcp_accept_endpoint = string_to_endpoint(src_str, err); + if (err) { + std::stringstream buf; + buf << "target endpoint parse error(--tcp-service): " << err.get_message() << src_str; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 12, buf.str(), __FILE__, __LINE__); + return false; + } + check_endpoint(request.vs_element.tcp_accept_endpoint, true, err); + if (err) { + std::stringstream buf; + buf << "target endpoint parse error(--tcp-service): " << err.get_message() << src_str; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 13, buf.str(), __FILE__, __LINE__); + return false; + } + } + return true; } //! module option check -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_vs_module_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 5, "l7vsadm::parse_opt_vs_module_func", __FILE__, __LINE__ ); - if( ++pos >= argc ){ - //don't target protomod name. - std::string buf("protomod name is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 14, buf, __FILE__, __LINE__ ); - return false; - } - std::string module_name = argv[pos]; - if( L7VS_MODNAME_LEN < module_name.length() ){ - std::string buf("protomod name is too long."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 15, buf, __FILE__, __LINE__ ); - return false; - } - protocol_module_control& ctrl = protocol_module_control::getInstance(); - ctrl.initialize( L7VS_MODULE_PATH ); - protocol_module_base* module; - try{ - module = ctrl.load_module( module_name ); - } - catch( ... ){ - std::stringstream buf; - buf << "protocol module load error:" << module_name; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 16, buf.str(), __FILE__, __LINE__ ); - return false; - } - if( !module ){ - //don't find protocol module. - std::stringstream buf; - buf << "protocol module not found:" << module_name; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 17, buf.str(), __FILE__, __LINE__ ); - return false; - } - module->init_logger_functions( - boost::bind( &l7vs::Logger::getLogLevel, l7vs::LOG_CAT_PROTOCOL ), - boost::bind( &l7vs::Logger::putLogFatal, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4 ), - boost::bind( &l7vs::Logger::putLogError, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4 ), - boost::bind( &l7vs::Logger::putLogWarn, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4 ), - boost::bind( &l7vs::Logger::putLogInfo, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4 ), - boost::bind( &l7vs::Logger::putLogDebug, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4 ) ); - // create module args. - std::vector< std::string > module_args; - while( true ){ - if( ++pos == argc ) break; //module option end. - parse_opt_map_type::iterator vsitr = vs_option_dic.find( argv[pos] ); - if( vsitr != vs_option_dic.end() ){ - --pos; // back for next option - break; // module option end. - } - parse_opt_map_type::iterator rsitr = rs_option_dic.find( argv[pos] ); - if( rsitr != rs_option_dic.end() ){ - --pos; // back for next option - break; // module option end. - } - module_args.push_back( argv[pos] ); - } - protocol_module_base::check_message_result module_message = module->check_parameter( module_args ); - - if( !module_message.flag ){ - // args is not supported. - std::stringstream buf; - buf << "protocol module argument error: " << module_message.message; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 18, buf.str(), __FILE__, __LINE__ ); - return false; - } - request.vs_element.protocol_module_name = module_name; - BOOST_FOREACH( std::string str, module_args ){ - request.vs_element.protocol_args.push_back( str ); - } - ctrl.unload_module( module ); - - return true; +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_vs_module_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 5, "l7vsadm::parse_opt_vs_module_func", __FILE__, __LINE__); + if (++pos >= argc) { + // target protomod name not specified. + std::string buf("protocol module name is not specified.(--proto-module)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 14, buf, __FILE__, __LINE__); + return false; + } + std::string module_name = argv[pos]; + if (L7VS_MODNAME_LEN < module_name.length()) { + std::string buf("protocol module name is too long.(--proto-module)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 15, buf, __FILE__, __LINE__); + return false; + } + protocol_module_control &ctrl = protocol_module_control::getInstance(); + ctrl.initialize(L7VS_MODULE_PATH); + protocol_module_base *module; + try { + module = ctrl.load_module(module_name); + } catch (...) { + std::stringstream buf; + buf << "protocol module load error(--proto-module): " << module_name; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 16, buf.str(), __FILE__, __LINE__); + return false; + } + if (!module) { + // protocol module not found. + std::stringstream buf; + buf << "protocol module not found(--proto-module): " << module_name; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 17, buf.str(), __FILE__, __LINE__); + return false; + } + module->init_logger_functions( + boost::bind(&l7vs::Logger::getLogLevel, l7vs::LOG_CAT_PROTOCOL), + boost::bind(&l7vs::Logger::putLogFatal, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4), + boost::bind(&l7vs::Logger::putLogError, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4), + boost::bind(&l7vs::Logger::putLogWarn, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4), + boost::bind(&l7vs::Logger::putLogInfo, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4), + boost::bind(&l7vs::Logger::putLogDebug, l7vs::LOG_CAT_PROTOCOL, _1, _2, _3, _4)); + // create module args. + std::vector module_args; + while (true) { + if (++pos == argc) break; //module option end. + parse_opt_map_type::iterator vsitr = vs_option_dic.find(argv[pos]); + if (vsitr != vs_option_dic.end()) { + --pos; // back for next option + break; // module option end. + } + parse_opt_map_type::iterator rsitr = rs_option_dic.find(argv[pos]); + if (rsitr != rs_option_dic.end()) { + --pos; // back for next option + break; // module option end. + } + module_args.push_back(argv[pos]); + } + protocol_module_base::check_message_result module_message = module->check_parameter(module_args); + + if (!module_message.flag) { + // args is not supported. + std::stringstream buf; + buf << "protocol module argument error(--proto-module): " << module_message.message; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 18, buf.str(), __FILE__, __LINE__); + return false; + } + request.vs_element.protocol_module_name = module_name; + BOOST_FOREACH(std::string str, module_args) { + request.vs_element.protocol_args.push_back(str); + } + ctrl.unload_module(module); + + return true; } //! scheduler option check. -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_vs_scheduler_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 6, "l7vsadm::parse_opt_vs_scheduler_func", __FILE__, __LINE__ ); - - if( ++pos >= argc ){ - // don't target scheduler name. - std::string buf("scheduler name is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 19, buf, __FILE__, __LINE__ ); - return false; - } - //schedule module check. - std::string scheduler_name = argv[pos]; - if( L7VS_MODNAME_LEN < scheduler_name.length() ){ - std::string buf("scheduler name is too long."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 20, buf, __FILE__, __LINE__ ); - return false; - } - schedule_module_control& ctrl = schedule_module_control::getInstance(); - ctrl.initialize( L7VS_MODULE_PATH ); - schedule_module_base* module; - try{ - module = ctrl.load_module( scheduler_name ); - } - catch( ... ){ - std::stringstream buf; - buf << "scheduler module load error:" << scheduler_name; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 21, buf.str(), __FILE__, __LINE__ ); - return false; - } - if( !module ){ - // don't find schedule module - std::stringstream buf; - buf << "scheduler module not found:" << scheduler_name; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 22, buf.str(), __FILE__, __LINE__ ); - return false; - } - ctrl.unload_module( module ); - request.vs_element.schedule_module_name = scheduler_name; - return true; +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_vs_scheduler_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 6, "l7vsadm::parse_opt_vs_scheduler_func", __FILE__, __LINE__); + + if (++pos >= argc) { + // target scheduler name not specified. + std::string buf("schedule module name is not specified.(--scheduler)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 19, buf, __FILE__, __LINE__); + return false; + } + //schedule module check. + std::string scheduler_name = argv[pos]; + if (L7VS_MODNAME_LEN < scheduler_name.length()) { + std::string buf("schedule module name is too long.(--scheduler)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 20, buf, __FILE__, __LINE__); + return false; + } + schedule_module_control &ctrl = schedule_module_control::getInstance(); + ctrl.initialize(L7VS_MODULE_PATH); + schedule_module_base *module; + try { + module = ctrl.load_module(scheduler_name); + } catch (...) { + std::stringstream buf; + buf << "scheduler module load error(--scheduler): " << scheduler_name; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 21, buf.str(), __FILE__, __LINE__); + return false; + } + if (!module) { + // schedule module not found + std::stringstream buf; + buf << "scheduler module not found(--scheduler): " << scheduler_name; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 22, buf.str(), __FILE__, __LINE__); + return false; + } + ctrl.unload_module(module); + request.vs_element.schedule_module_name = scheduler_name; + return true; } //! upper flag check -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_vs_upper_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 7, "l7vsadm::parse_opt_vs_upper_func", __FILE__, __LINE__ ); - - if( ++pos >= argc ){ - // don't target maxconnection_num - std::string buf("maxconnection value is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 23, buf, __FILE__, __LINE__ ); - return false; - } - try{ - request.vs_element.sorry_maxconnection = boost::lexical_cast< long long >( argv[pos] ); - if( ( 0LL > request.vs_element.sorry_maxconnection ) || - ( 100000LL < request.vs_element.sorry_maxconnection ) ){ - std::string buf("invalid sorry_maxconnection value."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 24, buf, __FILE__, __LINE__ ); - return false; - } - if( 0LL == request.vs_element.sorry_maxconnection ) - request.vs_element.sorry_maxconnection = LLONG_MAX; // clear value - } - catch( boost::bad_lexical_cast& e ){ - // don't convert argv[pos] is - std::string buf("invalid sorry_maxconnection value."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 25, buf, __FILE__, __LINE__ ); - return false; - } - //check connection limit and zero - return true; +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_vs_upper_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 7, "l7vsadm::parse_opt_vs_upper_func", __FILE__, __LINE__); + + if (++pos >= argc) { + // target max connection number not specified + std::string buf("sorry max connection value is not specified.(--upper)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 23, buf, __FILE__, __LINE__); + return false; + } + try { + request.vs_element.sorry_maxconnection = boost::lexical_cast(argv[pos]); + if ((0LL > request.vs_element.sorry_maxconnection) || + (100000LL < request.vs_element.sorry_maxconnection)) { + std::string buf("invalid sorry max connection value.(--upper)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 24, buf, __FILE__, __LINE__); + return false; + } + if (0LL == request.vs_element.sorry_maxconnection) + request.vs_element.sorry_maxconnection = LLONG_MAX; // clear value + } catch (boost::bad_lexical_cast &e) { + std::string buf("invalid sorry max connection value.(--upper)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 25, buf, __FILE__, __LINE__); + return false; + } + //check connection limit and zero + return true; } //! bypass(SorryServer) option check -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_vs_bypass_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 8, "l7vsadm::parse_opt_vs_bypass_func", __FILE__, __LINE__ ); - - if( ++pos >= argc ){ - //don't target sorryserver:port - std::string buf("sorryserver endpoint is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 26, buf, __FILE__, __LINE__ ); - return false; - } - std::string sorry_endpoint = argv[pos]; - error_code err; - request.vs_element.sorry_endpoint = string_to_endpoint< boost::asio::ip::tcp > ( sorry_endpoint, err ); - if( err ){ - std::stringstream buf; - buf << "sorryserver endpoint parse error:" << err.get_message() << sorry_endpoint; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 27, buf.str(), __FILE__, __LINE__ ); - return false; - } - // clear endpoint check - if( request.vs_element.sorry_endpoint == boost::asio::ip::tcp::endpoint() ){ - std::string clear_endpoint = "255.255.255.255:0"; // clear value - request.vs_element.sorry_endpoint = string_to_endpoint< boost::asio::ip::tcp > ( clear_endpoint, err ); - if( err ){ - std::stringstream buf; - buf << "sorryserver endpoint parse error:" << err.get_message() << clear_endpoint; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 28, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - else{ - check_endpoint( request.vs_element.sorry_endpoint, false, err ); - if( err ){ - std::stringstream buf; - buf << "sorryserver endpoint parse error:" << err.get_message() << sorry_endpoint; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 29, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - return true; // +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_vs_bypass_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 8, "l7vsadm::parse_opt_vs_bypass_func", __FILE__, __LINE__); + + if (++pos >= argc) { + // sorryserver addr and port not specified + std::string buf("sorryserver endpoint is not specified.(--bypass)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 26, buf, __FILE__, __LINE__); + return false; + } + std::string sorry_endpoint = argv[pos]; + error_code err; + request.vs_element.sorry_endpoint = string_to_endpoint(sorry_endpoint, err); + if (err) { + std::stringstream buf; + buf << "sorryserver endpoint parse error(--bypass): " << err.get_message() << sorry_endpoint; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 27, buf.str(), __FILE__, __LINE__); + return false; + } + // clear endpoint check (0.0.0.0:0) + if (request.vs_element.sorry_endpoint == boost::asio::ip::tcp::endpoint()) { + request.vs_element.sorry_endpoint = boost::asio::ip::tcp::endpoint( + boost::asio::ip::address::from_string("255.255.255.255"), 0); + } else { + check_endpoint(request.vs_element.sorry_endpoint, false, err); + if (err) { + std::stringstream buf; + buf << "sorryserver endpoint parse error(--bypass): " << err.get_message() << sorry_endpoint; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 29, buf.str(), __FILE__, __LINE__); + return false; + } + } + return true; } //! virtualservice option flag function -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_vs_flag_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 9, "l7vsadm::parse_opt_vs_flag_func", __FILE__, __LINE__ ); - - if( ++pos >= argc ){ - //don't target sorry flag - std::string buf("sorryflag value is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 30, buf, __FILE__, __LINE__ ); - return false; - } - try{ - int tmp = boost::lexical_cast< int >( argv[pos] ); - if( ( 0 != tmp ) && ( 1 != tmp ) ){ - std::string buf("invalid sorryflag value."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 31, buf, __FILE__, __LINE__ ); - return false; - } - if( 0 == tmp ) - request.vs_element.sorry_flag = INT_MAX; // clear value - else - request.vs_element.sorry_flag = 1; - } - catch( boost::bad_lexical_cast& e ){ - // don't convert argv[pos] is - std::string buf("invalid sorryflag value."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 32, buf, __FILE__, __LINE__ ); - return false; - } - return true; // +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_vs_flag_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 9, "l7vsadm::parse_opt_vs_flag_func", __FILE__, __LINE__); + + if (++pos >= argc) { + // sorry flag is not specified + std::string buf("sorry flag value is not specified.(--flag)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 30, buf, __FILE__, __LINE__); + return false; + } + try { + int tmp = boost::lexical_cast(argv[pos]); + if ((0 != tmp) && (1 != tmp)) { + std::string buf("invalid sorry flag value.(--flag)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 31, buf, __FILE__, __LINE__); + return false; + } + if (0 == tmp) + request.vs_element.sorry_flag = INT_MAX; // clear value + else + request.vs_element.sorry_flag = 1; + } catch (boost::bad_lexical_cast &e) { + std::string buf("invalid sorry flag value.(--flag)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 32, buf, __FILE__, __LINE__); + return false; + } + return true; } -//! virtualservice option qosupstream function -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_vs_qosup_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 10, "l7vsadm::parse_opt_vs_qosup_func", __FILE__, __LINE__ ); - - if( ++pos >= argc ){ - //don't rarget QoS upstream value. - std::string buf("qos_upstream value is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 33, buf, __FILE__, __LINE__ ); - return false; - } - try{ - virtualservice_element& elem = request.vs_element; // request virtualservice element refalence get. - std::string tmp = argv[pos]; - std::string::reverse_iterator ritr = tmp.rbegin(); - if( *ritr == 'G' || *ritr == 'g' ){ - std::string strval = tmp.substr(0, tmp.length() - 1); - unsigned long long ullval = boost::lexical_cast< unsigned long long > ( strval ); - if( ullval > 999 ){ - std::string buf("qos_upstream value is too big."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 34, buf, __FILE__, __LINE__ ); - return false; - } - elem.qos_upstream = ullval * 1000 * 1000 * 1000; // set qos_upstream - } - else if( *ritr == 'M' || *ritr == 'm' ){ - std::string strval = tmp.substr(0, tmp.length() - 1); - unsigned long long ullval = boost::lexical_cast< unsigned long long > ( strval ); - if( ullval > 999 ){ - std::string buf("qos_upstream value is too big."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 35, buf, __FILE__, __LINE__ ); - return false; - } - elem.qos_upstream = ullval * 1000 * 1000; // set qos_upstream - } - else if( *ritr == 'K' || *ritr == 'k' ){ - std::string strval = tmp.substr(0, tmp.length() - 1); - unsigned long long ullval = boost::lexical_cast< unsigned long long > ( strval ); - if( ullval > 999 ){ - std::string buf("qos_upstream value is too big."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 36, buf, __FILE__, __LINE__ ); - return false; - } - elem.qos_upstream = ullval * 1000; // set qos_upstream - } - else{ - unsigned long long ullval = boost::lexical_cast< unsigned long long > ( argv[pos] ); - if( ullval > 999 ){ - std::string buf("qos_upstream value is too big."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 111, buf, __FILE__, __LINE__ ); - return false; - } - elem.qos_upstream = ullval; // set qos_upstream - } - if( 0ULL == elem.qos_upstream ) { - elem.qos_upstream = ULLONG_MAX; // clear value +//! virtualservice option sorry forward mode function +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_vs_fwdmode_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, /*XXX*/999, "l7vsadm::parse_opt_vs_fwdmode_func", __FILE__, __LINE__); + + std::string opt(argv[pos]); + if (opt == "-M" || opt == "--masq") { + request.vs_element.sorry_fwdmode = virtualservice_element::FWD_MASQ; + } else if (opt == "-T" || opt == "--tproxy") { +#ifdef IP_TRANSPARENT + request.vs_element.sorry_fwdmode = virtualservice_element::FWD_TPROXY; +#else + std::stringstream buf("tproxy(IP_TRANSPARENT) not supported on this platform."); + l7vsadm_err.setter(true, buf.str()); + Logger::putLogInfo(LOG_CAT_L7VSADM_PARSE, /*XXX*/999, buf.str(), __FILE__, __LINE__); + return false; +#endif } else { - elem.qos_upstream /= 8; //qos convert to bytes per sec to bit per sec + // should never come here + std::stringstream buf; + buf << boost::format("unknown sorryserver forward mode specified.(%s)") % opt; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, /*XXX*/999, buf.str(), __FILE__, __LINE__); + return false; } + return true; +} +//! virtualservice option qosupstream function +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_vs_qosup_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 10, "l7vsadm::parse_opt_vs_qosup_func", __FILE__, __LINE__); + + if (++pos >= argc) { + // QoS upstream value is not specified. + std::string buf("QoS upstream value is not specified.(--qos-up)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 33, buf, __FILE__, __LINE__); + return false; + } + try { + virtualservice_element &elem = request.vs_element; // request virtualservice element reference get. + std::string tmp = argv[pos]; + std::string::reverse_iterator ritr = tmp.rbegin(); + if (*ritr == 'G' || *ritr == 'g') { + std::string strval = tmp.substr(0, tmp.length() - 1); + unsigned long long ullval = boost::lexical_cast (strval); + if (ullval > 999) { + std::string buf("QoS upstream value is too big.(--qos-up)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 34, buf, __FILE__, __LINE__); + return false; + } + elem.qos_upstream = ullval * 1000 * 1000 * 1000; // set qos_upstream + } else if (*ritr == 'M' || *ritr == 'm') { + std::string strval = tmp.substr(0, tmp.length() - 1); + unsigned long long ullval = boost::lexical_cast (strval); + if (ullval > 999) { + std::string buf("QoS upstream value is too big.(--qos-up)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 35, buf, __FILE__, __LINE__); + return false; + } + elem.qos_upstream = ullval * 1000 * 1000; // set qos_upstream + } else if (*ritr == 'K' || *ritr == 'k') { + std::string strval = tmp.substr(0, tmp.length() - 1); + unsigned long long ullval = boost::lexical_cast (strval); + if (ullval > 999) { + std::string buf("QoS upstream value is too big.(--qos-up)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 36, buf, __FILE__, __LINE__); + return false; + } + elem.qos_upstream = ullval * 1000; // set qos_upstream + } else { + unsigned long long ullval = boost::lexical_cast (argv[pos]); + if (ullval > 999) { + std::string buf("QoS upstream value is too big.(--qos-up)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 111, buf, __FILE__, __LINE__); + return false; + } + elem.qos_upstream = ullval; // set qos_upstream + } + if (0ULL == elem.qos_upstream) { + elem.qos_upstream = ULLONG_MAX; // clear value + } else { + elem.qos_upstream /= 8; //qos convert to bytes per sec to bit per sec + } - } - catch( boost::bad_lexical_cast& ex ){ // don't convert string to qos_upsatream - // don't conv qos upstream - std::string buf("invalid qos_upstream value."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 37, buf, __FILE__, __LINE__ ); - return false; - } - return true; + } catch (boost::bad_lexical_cast &ex) { + std::string buf("invalid QoS upstream value.(--qos-up)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 37, buf, __FILE__, __LINE__); + return false; + } + return true; } -//! virtualservice option qosdownstream functipn -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_vs_qosdown_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 11, "l7vsadm::parse_opt_vs_qosdown_func", __FILE__, __LINE__ ); - - if( ++pos >= argc ){ - // don't target QoS downstream value - std::string buf("qos_downstream value is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 38, buf, __FILE__, __LINE__ ); - return false; - } - try{ - virtualservice_element& elem = request.vs_element; // request virtualservice element refalence get. - std::string tmp = argv[pos]; - std::string::reverse_iterator ritr = tmp.rbegin(); - if( *ritr == 'G' || *ritr == 'g' ){ - std::string strval = tmp.substr(0, tmp.length() - 1); - unsigned long long ullval = boost::lexical_cast< unsigned long long > ( strval ); - if( ullval > 999 ){ - std::string buf("qos_downstream value is too big."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 39, buf, __FILE__, __LINE__ ); - return false; - } - elem.qos_downstream = ullval * 1000 * 1000 * 1000; // set qos_upstream - } - else if( *ritr == 'M' || *ritr == 'm' ){ - std::string strval = tmp.substr(0, tmp.length() - 1); - unsigned long long ullval = boost::lexical_cast< unsigned long long > ( strval ); - if( ullval > 999 ){ - std::string buf("qos_downstream value is too big."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 40, buf, __FILE__, __LINE__ ); - return false; - } - elem.qos_downstream = ullval * 1000 * 1000; // set qos_upstream - } - else if( *ritr == 'K' || *ritr == 'k' ){ - std::string strval = tmp.substr(0, tmp.length() - 1); - unsigned long long ullval = boost::lexical_cast< unsigned long long > ( strval ); - if( ullval > 999 ){ - std::string buf("qos_downstream value is too big."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 41, buf, __FILE__, __LINE__ ); - return false; - } - elem.qos_downstream = ullval * 1000; // set qos_upstream - } - else{ - unsigned long long ullval = boost::lexical_cast< unsigned long long > ( argv[pos] ); - if( ullval > 999 ){ - std::string buf("qos_downstream value is too big."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 115, buf, __FILE__, __LINE__ ); - return false; - } - elem.qos_downstream = boost::lexical_cast< unsigned long long > ( argv[pos] ); // set qos_downstream - } - if( 0ULL == elem.qos_downstream ) { - elem.qos_downstream = ULLONG_MAX; // clear value - } else { - elem.qos_downstream /= 8; //qos convert to bytes per sec to bit per sec - } - } - catch( boost::bad_lexical_cast& ex ){ - // don' conv qos downstream - std::string buf("invalid qos_downstream value."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 42, buf, __FILE__, __LINE__ ); - return false; - } - return true; +//! virtualservice option qosdownstream function +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_vs_qosdown_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 11, "l7vsadm::parse_opt_vs_qosdown_func", __FILE__, __LINE__); + + if (++pos >= argc) { + // QoS downstream value is not specified + std::string buf("QoS downstream value is not specified.(--qos-down)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 38, buf, __FILE__, __LINE__); + return false; + } + try { + virtualservice_element &elem = request.vs_element; // request virtualservice element reference get. + std::string tmp = argv[pos]; + std::string::reverse_iterator ritr = tmp.rbegin(); + if (*ritr == 'G' || *ritr == 'g') { + std::string strval = tmp.substr(0, tmp.length() - 1); + unsigned long long ullval = boost::lexical_cast (strval); + if (ullval > 999) { + std::string buf("QoS downstream value is too big.(--qos-down)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 39, buf, __FILE__, __LINE__); + return false; + } + elem.qos_downstream = ullval * 1000 * 1000 * 1000; // set qos_upstream + } else if (*ritr == 'M' || *ritr == 'm') { + std::string strval = tmp.substr(0, tmp.length() - 1); + unsigned long long ullval = boost::lexical_cast (strval); + if (ullval > 999) { + std::string buf("QoS downstream value is too big.(--qos-down)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 40, buf, __FILE__, __LINE__); + return false; + } + elem.qos_downstream = ullval * 1000 * 1000; // set qos_upstream + } else if (*ritr == 'K' || *ritr == 'k') { + std::string strval = tmp.substr(0, tmp.length() - 1); + unsigned long long ullval = boost::lexical_cast (strval); + if (ullval > 999) { + std::string buf("QoS downstream value is too big.(--qos-down)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 41, buf, __FILE__, __LINE__); + return false; + } + elem.qos_downstream = ullval * 1000; // set qos_upstream + } else { + unsigned long long ullval = boost::lexical_cast (argv[pos]); + if (ullval > 999) { + std::string buf("QoS downstream value is too big.(--qos-down)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 115, buf, __FILE__, __LINE__); + return false; + } + elem.qos_downstream = boost::lexical_cast (argv[pos]); // set qos_downstream + } + if (0ULL == elem.qos_downstream) { + elem.qos_downstream = ULLONG_MAX; // clear value + } else { + elem.qos_downstream /= 8; //qos convert to bytes per sec to bit per sec + } + } catch (boost::bad_lexical_cast &ex) { + // don' conv qos downstream + std::string buf("invalid QoS downstream value.(--qos-down)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 42, buf, __FILE__, __LINE__); + return false; + } + return true; } //! virtualservice option udp func. -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_vs_udp_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 12, "l7vsadm::parse_opt_vs_udp_func", __FILE__, __LINE__ ); - - virtualservice_element& elem = request.vs_element; // request virtualservie element reference get. - elem.udpmode = true; // udpmode on. - boost::asio::ip::tcp::endpoint zeropoint; - if( zeropoint != elem.tcp_accept_endpoint ){ // adddress tcp_acceptor endpoint - std::stringstream sstream; - sstream << elem.tcp_accept_endpoint; - std::string endpoint = sstream.str(); - error_code err; - elem.udp_recv_endpoint = string_to_endpoint( endpoint, err ); - if( err ){ - std::stringstream buf; - buf << "target endpoint parse error:" << err.get_message() << endpoint; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 43, buf.str(), __FILE__, __LINE__ ); - return false; - } - elem.tcp_accept_endpoint = zeropoint; - } - if( elem.realserver_vector.size() != 0 && elem.realserver_vector.front().tcp_endpoint != zeropoint ){ - std::stringstream sstream; - sstream << elem.realserver_vector.front().tcp_endpoint; - std::string endpoint = sstream.str(); - error_code err; - elem.realserver_vector.front().udp_endpoint = string_to_endpoint< boost::asio::ip::udp > ( endpoint, err ); - if( err ){ - std::stringstream buf; - buf << "realserver endpoint parse error:" << err.get_message() << endpoint; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 44, buf.str(), __FILE__, __LINE__ ); - return false; - } - elem.realserver_vector.front().tcp_endpoint = zeropoint; - } - return true; +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_vs_udp_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 12, "l7vsadm::parse_opt_vs_udp_func", __FILE__, __LINE__); + + virtualservice_element &elem = request.vs_element; // request virtualservice element reference get. + elem.udpmode = true; // udpmode on. + boost::asio::ip::tcp::endpoint zeropoint; + if (zeropoint != elem.tcp_accept_endpoint) { // address tcp_acceptor endpoint + std::stringstream sstream; + sstream << elem.tcp_accept_endpoint; + std::string endpoint = sstream.str(); + error_code err; + elem.udp_recv_endpoint = string_to_endpoint(endpoint, err); + if (err) { + std::stringstream buf; + buf << "target endpoint parse error(--udp-service): " << err.get_message() << endpoint; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 43, buf.str(), __FILE__, __LINE__); + return false; + } + elem.tcp_accept_endpoint = zeropoint; + } + if (elem.realserver_vector.size() != 0 && elem.realserver_vector.front().tcp_endpoint != zeropoint) { + std::stringstream sstream; + sstream << elem.realserver_vector.front().tcp_endpoint; + std::string endpoint = sstream.str(); + error_code err; + elem.realserver_vector.front().udp_endpoint = string_to_endpoint (endpoint, err); + if (err) { + std::stringstream buf; + buf << "realserver endpoint parse error(--udp-service): " << err.get_message() << endpoint; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 44, buf.str(), __FILE__, __LINE__); + return false; + } + elem.realserver_vector.front().tcp_endpoint = zeropoint; + } + return true; } //! virtualservice option ssl_file function -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_vs_ssl_file_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 38, "l7vsadm::parse_opt_vs_ssl_file_func", __FILE__, __LINE__ ); - - if( ++pos >= argc ){ - std::string buf("ssl config filename is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 90, buf, __FILE__, __LINE__ ); - return false; - } - // ssl config file check. - std::string conf_file_name = argv[pos]; - if( L7VS_FILENAME_LEN < conf_file_name.length() ){ - std::string buf("ssl config filename is too long."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 91, buf, __FILE__, __LINE__ ); - return false; - } - FILE *fp; - if ((fp = fopen(conf_file_name.c_str(), "r")) == NULL) { - std::string buf("ssl config file cannot open."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 92, buf, __FILE__, __LINE__ ); - return false; - } - fclose(fp); +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_vs_ssl_file_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 38, "l7vsadm::parse_opt_vs_ssl_file_func", __FILE__, __LINE__); + + if (++pos >= argc) { + std::string buf("ssl config file is not specified.(--ssl)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 90, buf, __FILE__, __LINE__); + return false; + } + // ssl config file check. + std::string conf_file_name = argv[pos]; + if (L7VS_FILENAME_LEN < conf_file_name.length()) { + std::string buf("ssl config file name is too long.(--ssl)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 91, buf, __FILE__, __LINE__); + return false; + } + FILE *fp; + if ((fp = fopen(conf_file_name.c_str(), "r")) == NULL) { + std::string buf("ssl config file cannot open.(--ssl)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 92, buf, __FILE__, __LINE__); + return false; + } + fclose(fp); - request.vs_element.ssl_file_name = conf_file_name; - return true; + request.vs_element.ssl_file_name = conf_file_name; + return true; } //! virtualservice option access log function -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_vs_access_log_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 39, "l7vsadm::parse_opt_vs_access_log_func", __FILE__, __LINE__ ); - - if( ++pos >= argc ){ - //don't target access log flag - std::string buf("access log flag value is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 93, buf, __FILE__, __LINE__ ); - return false; - } - try{ - int tmp = boost::lexical_cast< int >( argv[pos] ); - if( ( 0 != tmp ) && ( 1 != tmp ) ){ - std::string buf("invalid access log flag value."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 94, buf, __FILE__, __LINE__ ); - return false; - } - request.vs_element.access_log_flag = tmp; - } - catch( boost::bad_lexical_cast& e ){ - // don't convert argv[pos] is - std::string buf("invalid access log flag value."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 95, buf, __FILE__, __LINE__ ); - return false; - } - return true; // +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_vs_access_log_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 39, "l7vsadm::parse_opt_vs_access_log_func", __FILE__, __LINE__); + + if (++pos >= argc) { + // access log flag is not specified + std::string buf("access log flag value is not specified.(--access-log)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 93, buf, __FILE__, __LINE__); + return false; + } + try { + int tmp = boost::lexical_cast(argv[pos]); + if ((0 != tmp) && (1 != tmp)) { + std::string buf("invalid access log flag value.(--access-log)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 94, buf, __FILE__, __LINE__); + return false; + } + request.vs_element.access_log_flag = tmp; + } catch (boost::bad_lexical_cast &e) { + std::string buf("invalid access log flag value.(--access-log)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 95, buf, __FILE__, __LINE__); + return false; + } + return true; } //! virtualservice option access_log_logrotate function -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_vs_access_log_logrotate_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 40, "l7vsadm::parse_opt_vs_accesslog_logrotate_func", __FILE__, __LINE__ ); +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_vs_access_log_logrotate_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 40, "l7vsadm::parse_opt_vs_accesslog_logrotate_func", __FILE__, __LINE__); + + if (++pos >= argc) { + std::string buf("access log file is not specified.(--access-log-name)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 96, buf, __FILE__, __LINE__); + return false; + } + // access log file check. + std::string access_log_file_name = argv[pos]; + if (L7VS_FILENAME_LEN < access_log_file_name.length()) { + std::string buf("access log file name is too long.(--access-log-name)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 97, buf, __FILE__, __LINE__); + return false; + } + if ("/" != access_log_file_name.substr(0, 1)) { + std::string buf("please specify access log filename in fullpath.(--access-log-name)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 98, buf, __FILE__, __LINE__); + return false; + } - if( ++pos >= argc ){ - std::string buf("access log filename is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 96, buf, __FILE__, __LINE__ ); - return false; - } - // access log file check. - std::string access_log_file_name = argv[pos]; - if( L7VS_FILENAME_LEN < access_log_file_name.length() ){ - std::string buf("access log filename is too long."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 97, buf, __FILE__, __LINE__ ); - return false; - } - if( "/" != access_log_file_name.substr(0, 1) ){ - std::string buf("please specify access log filename in fullpath."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 98, buf, __FILE__, __LINE__ ); - return false; - } - - request.vs_element.access_log_rotate_key_info = ""; - - // create access log args. - std::vector< std::string > arguments_vector; - virtualservice_element::access_log_rotate_arguments_map_type arguments_map; - while( true ){ - if( ++pos == argc ) break; //access log arguments end. - parse_opt_map_type::iterator vsitr = vs_option_dic.find( argv[pos] ); - if( vsitr != vs_option_dic.end() ){ - --pos; // back for next option - break; // module option end. - } - arguments_vector.push_back( argv[pos] ); - - request.vs_element.access_log_rotate_key_info += argv[pos]; - request.vs_element.access_log_rotate_key_info += " "; - - } - boost::algorithm::erase_last( request.vs_element.access_log_rotate_key_info , " " ); - - if( 0 < arguments_vector.size() ){ - if( 0 == ( arguments_vector.size() % 2 ) ){ - for( unsigned int i = 0; i < ( arguments_vector.size() - 1 ); ++i ){ - std::pair< virtualservice_element::access_log_rotate_arguments_map_type::iterator, bool > ret = - arguments_map.insert( - virtualservice_element::access_log_rotate_arguments_pair_type( - arguments_vector[i], arguments_vector[i+1] ) ); - if( !ret.second ){ - std::string buf("access log rotation argument is duplicated."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 99, buf, __FILE__, __LINE__ ); - return false; - } - ++i; - } - } - else{ - std::string buf("access log rotation argument error."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 100, buf, __FILE__, __LINE__ ); - return false; - } - bool ret = logger_access_manager::getInstance().access_log_logrotate_parameter_check( arguments_map ); - if( !ret ){ - std::string buf("access log rotation argument error."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 101, buf, __FILE__, __LINE__ ); - return false; - } - } - - request.vs_element.access_log_file_name = access_log_file_name; - request.vs_element.access_log_rotate_arguments.clear(); - BOOST_FOREACH( virtualservice_element::access_log_rotate_arguments_pair_type pair, arguments_map ){ - request.vs_element.access_log_rotate_arguments.insert( pair ); - } - - return true; + request.vs_element.access_log_rotate_key_info = ""; + + // create access log args. + std::vector arguments_vector; + virtualservice_element::access_log_rotate_arguments_map_type arguments_map; + while (true) { + if (++pos == argc) break; //access log arguments end. + parse_opt_map_type::iterator vsitr = vs_option_dic.find(argv[pos]); + if (vsitr != vs_option_dic.end()) { + --pos; // back for next option + break; // module option end. + } + arguments_vector.push_back(argv[pos]); + + request.vs_element.access_log_rotate_key_info += argv[pos]; + request.vs_element.access_log_rotate_key_info += " "; + + } + boost::algorithm::erase_last(request.vs_element.access_log_rotate_key_info , " "); + + if (0 < arguments_vector.size()) { + if (0 == (arguments_vector.size() % 2)) { + for (unsigned int i = 0; i < (arguments_vector.size() - 1); ++i) { + std::pair ret = + arguments_map.insert( + virtualservice_element::access_log_rotate_arguments_pair_type( + arguments_vector[i], arguments_vector[i+1])); + if (!ret.second) { + std::string buf("access log rotation argument is duplicated.(--access-log-name)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 99, buf, __FILE__, __LINE__); + return false; + } + ++i; + } + } else { + std::string buf("access log rotation argument error.(--access-log-name)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 100, buf, __FILE__, __LINE__); + return false; + } + bool ret = logger_access_manager::getInstance().access_log_logrotate_parameter_check(arguments_map); + if (!ret) { + std::string buf("access log rotation argument error.(--access-log-name)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 101, buf, __FILE__, __LINE__); + return false; + } + } + + request.vs_element.access_log_file_name = access_log_file_name; + request.vs_element.access_log_rotate_arguments.clear(); + BOOST_FOREACH(virtualservice_element::access_log_rotate_arguments_pair_type pair, arguments_map) { + request.vs_element.access_log_rotate_arguments.insert(pair); + } + + return true; } //! virtualservice option socket function -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_vs_socket_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 41, "l7vsadm::parse_opt_vs_socket_func", __FILE__, __LINE__ ); - - if( ++pos >= argc ){ - std::string buf("socket_option is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 102, buf, __FILE__, __LINE__ ); - return false; - } - - bool is_set_defer_accept = false; - bool is_set_nodelay = false; - bool is_set_cork = false; - bool is_set_quickack = false; - - request.vs_element.socket_option_tcp_defer_accept = 0; - request.vs_element.socket_option_tcp_nodelay = 0; - request.vs_element.socket_option_tcp_cork = 0; - request.vs_element.socket_option_tcp_quickack = 0; - - std::string socket_option_string = argv[pos]; - std::vector< std::string > socket_options; - boost::split( socket_options, socket_option_string, boost::algorithm::is_any_of( "," ) ); - - BOOST_FOREACH( std::string option, socket_options ){ - if( option == "deferaccept" ){ - if( !is_set_defer_accept ){ - is_set_defer_accept = true; - request.vs_element.socket_option_tcp_defer_accept = 1; - } - else{ - // defer_accept is duplicated - std::stringstream buf; - buf << "socket option deferaccept is duplicated."; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 103, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - else if(option == "nodelay" ) { - if( !is_set_nodelay ){ - is_set_nodelay = true; - request.vs_element.socket_option_tcp_nodelay = 1; - } - else{ - // nodelay is duplicated - std::stringstream buf; - buf << "socket option nodelay is duplicated."; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 104, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - else if(option == "cork" ) { - if( !is_set_cork ){ - is_set_cork = true; - request.vs_element.socket_option_tcp_cork = 1; - } - else{ - // cork is duplicated - std::stringstream buf; - buf << "socket option cork is duplicated."; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 105, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - else if( option == "quickackon" || option == "quickackoff" ) { - if( !is_set_quickack ){ - is_set_quickack = true; - request.vs_element.socket_option_tcp_quickack = ( ( option == "quickackon" ) ? 1 : 2 ); - } - else{ - // quickack is duplicated - std::stringstream buf; - buf << "socket option quickack is duplicated."; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 106, buf.str(), __FILE__, __LINE__ ); +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_vs_socket_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 41, "l7vsadm::parse_opt_vs_socket_func", __FILE__, __LINE__); + + if (++pos >= argc) { + std::string buf("socket option is not specified.(--sockopt)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 102, buf, __FILE__, __LINE__); return false; - } } - else{ - // unknown socket option - std::stringstream buf; - buf << "unknown socket option."; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 107, buf.str(), __FILE__, __LINE__ ); - return false; + + bool is_set_defer_accept = false; + bool is_set_nodelay = false; + bool is_set_cork = false; + bool is_set_quickack = false; + + request.vs_element.socket_option_tcp_defer_accept = 0; + request.vs_element.socket_option_tcp_nodelay = 0; + request.vs_element.socket_option_tcp_cork = 0; + request.vs_element.socket_option_tcp_quickack = 0; + + std::string socket_option_string = argv[pos]; + std::vector socket_options; + boost::split(socket_options, socket_option_string, boost::algorithm::is_any_of(",")); + + BOOST_FOREACH(std::string option, socket_options) { + if (option == "deferaccept") { + if (!is_set_defer_accept) { + is_set_defer_accept = true; + request.vs_element.socket_option_tcp_defer_accept = 1; + } else { + // defer_accept is duplicated + std::stringstream buf; + buf << "socket option deferaccept is duplicated.(--sockopt)"; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 103, buf.str(), __FILE__, __LINE__); + return false; + } + } else if (option == "nodelay") { + if (!is_set_nodelay) { + is_set_nodelay = true; + request.vs_element.socket_option_tcp_nodelay = 1; + } else { + // nodelay is duplicated + std::stringstream buf; + buf << "socket option nodelay is duplicated.(--sockopt)"; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 104, buf.str(), __FILE__, __LINE__); + return false; + } + } else if (option == "cork") { + if (!is_set_cork) { + is_set_cork = true; + request.vs_element.socket_option_tcp_cork = 1; + } else { + // cork is duplicated + std::stringstream buf; + buf << "socket option cork is duplicated.(--sockopt)"; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 105, buf.str(), __FILE__, __LINE__); + return false; + } + } else if (option == "quickackon" || option == "quickackoff") { + if (!is_set_quickack) { + is_set_quickack = true; + request.vs_element.socket_option_tcp_quickack = ((option == "quickackon") ? 1 : 2); + } else { + // quickack is duplicated + std::stringstream buf; + buf << "socket option quickack is duplicated.(--sockopt)"; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 106, buf.str(), __FILE__, __LINE__); + return false; + } + } else { + // unknown socket option + std::stringstream buf; + buf << "unknown socket option.(--sockopt)"; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 107, buf.str(), __FILE__, __LINE__); + return false; + } } - } - request.vs_element.socket_option_string = socket_option_string; - return true; + request.vs_element.socket_option_string = socket_option_string; + return true; } //! realserver command parsing. -//! @param[in] request command -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_rs_func( l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 13, "l7vsadm::parse_rs_func", __FILE__, __LINE__ ); +//! @param[in] request command +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_rs_func(l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 13, "l7vsadm::parse_rs_func", __FILE__, __LINE__); + + if (argc < 8) { + //argument num err + std::stringstream buf; + buf << "Argument argc is illegal for "; + buf << argv[1]; + buf << " command."; - if( argc < 8 ) { - //argument num err - std::stringstream buf; - buf << "Argument argc is illegal for "; - buf << argv[1]; - buf << " command."; - - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 121, buf.str(), __FILE__, __LINE__ ); - return false; - } - - request.command = cmd; - - request.vs_element.realserver_vector.push_back( realserver_element() ); - - std::map< std::string, int > count_map; - for(parse_opt_map_type::iterator itr = rs_option_dic.begin() ; - itr != rs_option_dic.end() ; ++itr ){ - count_map[ itr->first ] = 0; - } - - for( int pos = 2; pos < argc; ++pos ){ - parse_opt_map_type::iterator itr = rs_option_dic.find( argv[pos] ); - if( itr != rs_option_dic.end() ){ - count_map[ itr->first ]++; - if( ! itr->second( pos, argc, argv ) ) return false; - } - else{ - std::stringstream buf; - buf << "realserver option not found:" << argv[pos]; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 45, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - - if( request.vs_element.protocol_module_name.length() == 0 ){ - //protocol module name error - std::string buf("protocol module not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 46, buf, __FILE__, __LINE__ ); - return false; - } - if( request.vs_element.udpmode ){ - if( request.vs_element.udp_recv_endpoint == boost::asio::ip::udp::endpoint() ){ - // udp mode,but not acceptor endpoint - std::string buf("udp recv endpoint not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 47, buf, __FILE__, __LINE__ ); - return false; - } - if( request.vs_element.realserver_vector.front().udp_endpoint == boost::asio::ip::udp::endpoint() ){ - // udp mode,but not realserver endpoint - std::string buf("realserver udp endpoint not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 48, buf, __FILE__, __LINE__ ); - return false; - } - } - else{ - if( request.vs_element.tcp_accept_endpoint == boost::asio::ip::tcp::endpoint() ){ - // tcp mode, but not acceptor endpoint - std::string buf("tcp accpeptor endpoint not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 49, buf, __FILE__, __LINE__ ); - return false; - } - if( request.vs_element.realserver_vector.front().tcp_endpoint == boost::asio::ip::tcp::endpoint() ){ - // tcp mode,but not realserver endpoint - std::string buf("realserver tcp endpoint not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 50, buf, __FILE__, __LINE__ ); - return false; - } - } - - if( l7vsadm_request::CMD_EDIT_RS != cmd ) { - // realserver weight default value = 1 - if( -1 == request.vs_element.realserver_vector.front().weight ){ - request.vs_element.realserver_vector.front().weight = 1; - } - }else{ - // Existence check of the parameter - if( count_map["-w"] == 0 && - count_map["--weight"] == 0){ - - std::string buf("All option omitted for edit rs command."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 112, buf, __FILE__, __LINE__ ); - return false; - } - } - - //conflict check - std::string conflict_option_name; - bool is_conflict = false; - - for( std::map< std::string, int >::iterator itr = count_map.begin() ; - itr != count_map.end() ; ++itr ){ - if(itr->second > 1){ - conflict_option_name = itr->first; - is_conflict = true; - break; - } - } - - if(is_conflict == false && - count_map["-t"] == 1 && count_map ["--tcp-service"] == 1){ - //-t(--tcp-service) - conflict_option_name = "--tcp-service"; - is_conflict = true; - } - if(is_conflict == false && - count_map["-m"] == 1 && count_map ["--proto-module"] == 1){ - //-m(--proto-module) - conflict_option_name = "--proto-module"; - is_conflict = true; - } - if(is_conflict == false && - count_map["-r"] == 1 && count_map ["--real-server"] == 1){ - //-r(--real-server) - conflict_option_name = "--real-server"; - is_conflict = true; - } - if( (is_conflict == false) && - (count_map["-w"] == 1) && (count_map ["--weight"] == 1) && - (l7vsadm_request::CMD_DEL_RS != cmd) ){ - //-w(--weight) - conflict_option_name = "--weight"; - is_conflict = true; - } - - if( is_conflict == true ){ - std::stringstream buf; - buf << "Option " << conflict_option_name << " is conflict."; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 122, buf.str(), __FILE__, __LINE__ ); - return false; - } + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 121, buf.str(), __FILE__, __LINE__); + return false; + } + + request.command = cmd; - return true; + request.vs_element.realserver_vector.push_back(realserver_element()); + + std::map count_map; + for (parse_opt_map_type::iterator itr = rs_option_dic.begin() ; + itr != rs_option_dic.end() ; ++itr) { + count_map[ itr->first ] = 0; + } + + for (int pos = 2; pos < argc; ++pos) { + parse_opt_map_type::iterator itr = rs_option_dic.find(argv[pos]); + if (itr != rs_option_dic.end()) { + count_map[ itr->first ]++; + if (! itr->second(pos, argc, argv)) return false; + } else { + std::stringstream buf; + buf << "realserver option not found(--real-server): " << argv[pos]; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 45, buf.str(), __FILE__, __LINE__); + return false; + } + } + + if (request.vs_element.protocol_module_name.length() == 0) { + //protocol module name error + std::string buf("protocol module is not specified.(--proto-module)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 46, buf, __FILE__, __LINE__); + return false; + } + if (request.vs_element.udpmode) { + if (request.vs_element.udp_recv_endpoint == boost::asio::ip::udp::endpoint()) { + // udp mode,but not acceptor endpoint + std::string buf("udp receive endpoint is not specified.(--udp-service)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 47, buf, __FILE__, __LINE__); + return false; + } + if (request.vs_element.realserver_vector.front().udp_endpoint == boost::asio::ip::udp::endpoint()) { + // udp mode,but not realserver endpoint + std::string buf("realserver udp endpoint is not specified.(--real-server)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 48, buf, __FILE__, __LINE__); + return false; + } + } else { + if (request.vs_element.tcp_accept_endpoint == boost::asio::ip::tcp::endpoint()) { + // tcp mode, but not acceptor endpoint + std::string buf("tcp accpeptor endpoint not specified.(--tcp-service)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 49, buf, __FILE__, __LINE__); + return false; + } + if (request.vs_element.realserver_vector.front().tcp_endpoint == boost::asio::ip::tcp::endpoint()) { + // tcp mode,but not realserver endpoint + std::string buf("realserver tcp endpoint not specified.(--real-server)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 50, buf, __FILE__, __LINE__); + return false; + } + } + + if (l7vsadm_request::CMD_EDIT_RS != cmd) { + // realserver weight default value = 1 + if (-1 == request.vs_element.realserver_vector.front().weight) { + request.vs_element.realserver_vector.front().weight = 1; + } + // realserver forward mode default value = FWD_MASQ + if (realserver_element::FWD_NONE == request.vs_element.realserver_vector.front().fwdmode) { + request.vs_element.realserver_vector.front().fwdmode = realserver_element::FWD_MASQ; + } + } else { + // Existence check of the parameter + if (count_map["-w"] == 0 && + count_map["--weight"] == 0 && + count_map["-M"] == 0 && + count_map["--masq"] == 0 && + count_map["-T"] == 0 && + count_map["--tproxy"] == 0) { + std::string buf("All option omitted for edit rs command."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 112, buf, __FILE__, __LINE__); + return false; + } + } + + //conflict check + std::string conflict_option_name; + bool is_conflict = false; + + for (std::map::iterator itr = count_map.begin() ; + itr != count_map.end() ; ++itr) { + if (itr->second > 1) { + conflict_option_name = itr->first; + is_conflict = true; + break; + } + } + + if (is_conflict == false && + count_map["-t"] == 1 && count_map["--tcp-service"] == 1) { + //-t(--tcp-service) + conflict_option_name = "--tcp-service"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-m"] == 1 && count_map["--proto-module"] == 1) { + //-m(--proto-module) + conflict_option_name = "--proto-module"; + is_conflict = true; + } + if (is_conflict == false && + count_map["-r"] == 1 && count_map["--real-server"] == 1) { + //-r(--real-server) + conflict_option_name = "--real-server"; + is_conflict = true; + } + if ((is_conflict == false) && + (count_map["-w"] == 1) && (count_map["--weight"] == 1) && + (l7vsadm_request::CMD_DEL_RS != cmd)) { + //-w(--weight) + conflict_option_name = "--weight"; + is_conflict = true; + } + if ((is_conflict == false) && + (count_map["-M"] == 1) && (count_map["--masq"] == 1) && + (l7vsadm_request::CMD_DEL_RS != cmd)) { + //-M(--masq) + conflict_option_name = "--masq"; + is_conflict = true; + } + if ((is_conflict == false) && + (count_map["-T"] == 1) && (count_map["--tproxy"] == 1) && + (l7vsadm_request::CMD_DEL_RS != cmd)) { + //-T(--tproxy) + conflict_option_name = "--tproxy"; + is_conflict = true; + } + if ((is_conflict == false) && + count_map["-M"] + count_map["--masq"] + + count_map["-T"] + count_map["--tproxy"] > 1 && + (l7vsadm_request::CMD_DEL_RS != cmd)) { + //-M/T(--masq/tproxy) + conflict_option_name = "--masq/tproxy"; + is_conflict = true; + } + + if (is_conflict == true) { + std::stringstream buf; + buf << "Option " << conflict_option_name << " is conflict."; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 122, buf.str(), __FILE__, __LINE__); + return false; + } + + return true; } // // realserver option functions. // //! realserver weight set -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_rs_weight_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 14, "l7vsadm::parse_opt_rs_weight_func", __FILE__, __LINE__ ); - - if( ++pos >= argc ){ - //don't target weight value - std::string buf("weight value is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 51, buf, __FILE__, __LINE__ ); - return false; - } - try{ - request.vs_element.realserver_vector.front().weight = boost::lexical_cast( argv[pos] ); - if( ( 0 > request.vs_element.realserver_vector.front().weight ) || - ( 100 < request.vs_element.realserver_vector.front().weight ) ){ - std::string buf("invalid weight value."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 52, buf, __FILE__, __LINE__ ); - return false; - } - } - catch( boost::bad_lexical_cast& ex ){ - // lexical cast error - std::string buf("invalid weight value."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 53, buf, __FILE__, __LINE__ ); - return false; - } - return true; +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_rs_weight_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 14, "l7vsadm::parse_opt_rs_weight_func", __FILE__, __LINE__); + + if (++pos >= argc) { + // weight value is not specified + std::string buf("weight value is not specified.(--weight)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 51, buf, __FILE__, __LINE__); + return false; + } + try { + request.vs_element.realserver_vector.front().weight = boost::lexical_cast(argv[pos]); + if ((0 > request.vs_element.realserver_vector.front().weight) || + (100 < request.vs_element.realserver_vector.front().weight)) { + std::string buf("invalid weight value.(--weight)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 52, buf, __FILE__, __LINE__); + return false; + } + } catch (boost::bad_lexical_cast &ex) { + // lexical cast error + std::string buf("invalid weight value.(--weight)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 53, buf, __FILE__, __LINE__); + return false; + } + return true; +} +//! realserver forward mode set +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_rs_fwdmode_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, /*XXX*/999, "l7vsadm::parse_opt_rs_fwdmode_func", __FILE__, __LINE__); + + std::string opt(argv[pos]); + if (opt == "-M" || opt == "--masq") { + request.vs_element.realserver_vector.front().fwdmode = realserver_element::FWD_MASQ; + } else if (opt == "-T" || opt == "--tproxy") { +#ifdef IP_TRANSPARENT + request.vs_element.realserver_vector.front().fwdmode = realserver_element::FWD_TPROXY; +#else + std::stringstream buf("tproxy(IP_TRANSPARENT) not supported on this platform."); + l7vsadm_err.setter(true, buf.str()); + Logger::putLogInfo(LOG_CAT_L7VSADM_PARSE, /*XXX*/999, buf.str(), __FILE__, __LINE__); + return false; +#endif + } else { + // should never come here + std::stringstream buf; + buf << boost::format("unknown realserver forward mode specified.(%s)") % opt; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, /*XXX*/999, buf.str(), __FILE__, __LINE__); + return false; + } + return true; + } //! realserver target set -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_rs_realserver_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 15, "l7vsadm::parse_opt_rs_realserver_func", __FILE__, __LINE__ ); - - if( ++pos >= argc ){ - // don't target realserver address - std::string buf("realserver address is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 54, buf, __FILE__, __LINE__ ); - return false; - } - std::string src_str = argv[pos]; - if( request.vs_element.udpmode ){ - error_code err; - request.vs_element.realserver_vector.front().udp_endpoint = string_to_endpoint< boost::asio::ip::udp >( src_str, err ); - if ( err ){ - // address string error. - std::stringstream buf; - buf << "realserver endpoint parse error:" << err.get_message() << src_str; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 55, buf.str(), __FILE__, __LINE__ ); - return false; - } - check_endpoint( request.vs_element.realserver_vector.front().udp_endpoint, false, err ); - if ( err ){ - std::stringstream buf; - buf << "realserver endpoint parse error:" << err.get_message() << src_str; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 56, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - else{ - error_code err; - request.vs_element.realserver_vector.front().tcp_endpoint = string_to_endpoint< boost::asio::ip::tcp >( src_str, err ); - if ( err ){ - // address string error. - std::stringstream buf; - buf << "realserver endpoint parse error:" << err.get_message() << src_str; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 57, buf.str(), __FILE__, __LINE__ ); - return false; - } - check_endpoint( request.vs_element.realserver_vector.front().tcp_endpoint, false, err ); - if ( err ){ - std::stringstream buf; - buf << "realserver endpoint parse error:" << err.get_message() << src_str; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 58, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - return true; +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_rs_realserver_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 15, "l7vsadm::parse_opt_rs_realserver_func", __FILE__, __LINE__); + + if (++pos >= argc) { + // realserver address is not specified + std::string buf("realserver address is not specified.(--real-server)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 54, buf, __FILE__, __LINE__); + return false; + } + std::string src_str = argv[pos]; + if (request.vs_element.udpmode) { + error_code err; + request.vs_element.realserver_vector.front().udp_endpoint = string_to_endpoint(src_str, err); + if (err) { + // address string error. + std::stringstream buf; + buf << "realserver endpoint parse error(--real-server): " << err.get_message() << src_str; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 55, buf.str(), __FILE__, __LINE__); + return false; + } + check_endpoint(request.vs_element.realserver_vector.front().udp_endpoint, false, err); + if (err) { + std::stringstream buf; + buf << "realserver endpoint parse error(--real-server): " << err.get_message() << src_str; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 56, buf.str(), __FILE__, __LINE__); + return false; + } + } else { + error_code err; + request.vs_element.realserver_vector.front().tcp_endpoint = string_to_endpoint(src_str, err); + if (err) { + // address string error. + std::stringstream buf; + buf << "realserver endpoint parse error(--real-server): " << err.get_message() << src_str; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 57, buf.str(), __FILE__, __LINE__); + return false; + } + check_endpoint(request.vs_element.realserver_vector.front().tcp_endpoint, false, err); + if (err) { + std::stringstream buf; + buf << "realserver endpoint parse error(--real-server): " << err.get_message() << src_str; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 58, buf.str(), __FILE__, __LINE__); + return false; + } + } + return true; } - + //! replication command parsing. -//! @param[in] request command -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_replication_func( l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 16, "l7vsadm::parse_replication_func", __FILE__, __LINE__ ); +//! @param[in] request command +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_replication_func(l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 16, "l7vsadm::parse_replication_func", __FILE__, __LINE__); + + if (argc < 3 || argc > 4) { + //argument num err + std::stringstream buf; + buf << "Argument argc is illegal for "; + buf << argv[1]; + buf << " command."; - if( argc < 3 || argc > 4 ) { - //argument num err - std::stringstream buf; - buf << "Argument argc is illegal for "; - buf << argv[1]; - buf << " command."; - - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 123, buf.str(), __FILE__, __LINE__ ); - return false; - } - - request.command = cmd; - - for( int pos = 2; pos < argc; ++pos ){ - parse_opt_map_type::iterator itr = replication_option_dic.find( argv[pos] ); - if( itr != replication_option_dic.end() ){ - if( ! itr->second( pos, argc, argv ) ) return false; - } - else{ - std::stringstream buf; - buf << "replication option not found:" << argv[pos]; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 59, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - if( l7vsadm_request::REP_NONE == request.replication_command ){ - // not specified replication command - std::string buf("replication command not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 60, buf, __FILE__, __LINE__ ); - return false; - } + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 123, buf.str(), __FILE__, __LINE__); + return false; + } + + request.command = cmd; + + for (int pos = 2; pos < argc; ++pos) { + parse_opt_map_type::iterator itr = replication_option_dic.find(argv[pos]); + if (itr != replication_option_dic.end()) { + if (! itr->second(pos, argc, argv)) return false; + } else { + std::stringstream buf; + buf << "replication option not found(--replication): " << argv[pos]; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 59, buf.str(), __FILE__, __LINE__); + return false; + } + } + if (l7vsadm_request::REP_NONE == request.replication_command) { + // not specified replication command + std::string buf("replication command not specified.(--replication)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 60, buf, __FILE__, __LINE__); + return false; + } - return true; + return true; } // -// replication option functions. +// replication option functions. // //! replication switch function -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_replication_switch_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 17, "l7vsadm::parse_opt_replication_switch_func", __FILE__, __LINE__ ); - - if( request.replication_command != l7vsadm_request::REP_NONE ){ - // double command target. - std::string buf("replication option is double specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 61, buf, __FILE__, __LINE__ ); - return false; - } - if( ++pos >= argc ){ - // don't target replication switch value - std::string buf("replication switch option is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 62, buf, __FILE__, __LINE__ ); +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_replication_switch_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 17, "l7vsadm::parse_opt_replication_switch_func", __FILE__, __LINE__); + + if (request.replication_command != l7vsadm_request::REP_NONE) { + // double command target. + std::string buf("replication option is double specified.(--switch)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 61, buf, __FILE__, __LINE__); + return false; + } + if (++pos >= argc) { + // replication switch value is not specified + std::string buf("replication switch option is not specified.(--switch)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 62, buf, __FILE__, __LINE__); + return false; + } + parse_opt_map_type::iterator itr = replication_switch_option_dic.find(argv[pos]); + if (itr != replication_switch_option_dic.end()) { // option string function find. + if (! itr->second(pos, argc, argv)) return false; // option string function error. + } else { //option string function not found. + // print option not found message. + std::stringstream buf; + buf << "replication switch option not found(--switch): " << argv[pos]; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 63, buf.str(), __FILE__, __LINE__); + return false; + } + return true; +} +//! replication start function +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_replication_start_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 18, "l7vsadm::parse_opt_replication_start_func", __FILE__, __LINE__); + + request.replication_command = l7vsadm_request::REP_START; + return true; +} +//! replication stop function +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_replication_stop_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 19, "l7vsadm::parse_opt_replication_stop_func", __FILE__, __LINE__); + + request.replication_command = l7vsadm_request::REP_STOP; + return true; +} +//! replication force function +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_replication_force_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 20, "l7vsadm::parse_opt_replication_force_func", __FILE__, __LINE__); + + if (request.replication_command != l7vsadm_request::REP_NONE) { + // double command target. + std::string buf("replication option is double specified.(--force)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 64, buf, __FILE__, __LINE__); + return false; + } + request.replication_command = l7vsadm_request::REP_FORCE; + return true; +} +//! replication dump function +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_replication_dump_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 21, "l7vsadm::parse_opt_replication_dump_func", __FILE__, __LINE__); + + if (request.replication_command != l7vsadm_request::REP_NONE) { + // double command target. + std::string buf("replication option is double specified.(--dump)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 65, buf, __FILE__, __LINE__); + return false; + } + request.replication_command = l7vsadm_request::REP_DUMP; + return true; +} + +//! log command parsing. +//! @param[in] request command +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_log_func(l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 22, "l7vsadm::parse_log_func", __FILE__, __LINE__); + + if (argc != 6) { + //argument num err + std::stringstream buf; + buf << "Argument argc is illegal for "; + buf << argv[1]; + buf << " command."; + + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 124, buf.str(), __FILE__, __LINE__); + return false; + } + + request.command = cmd; + + for (int pos = 2; pos < argc; ++pos) { + parse_opt_map_type::iterator itr = log_option_dic.find(argv[pos]); + if (itr != log_option_dic.end()) { // option string function find. + if (! itr->second(pos, argc, argv)) return false; // option string function error. + } else { //option string function not found. + // print option not found message. + std::stringstream buf; + buf << "log option not found(--log): " << argv[pos]; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 66, buf.str(), __FILE__, __LINE__); + return false; + } + } + if (LOG_CAT_NONE == request.log_category) { + // not specified logcategory + std::string buf("log category is not specified(--category)."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 67, buf, __FILE__, __LINE__); + return false; + } + if (LOG_LV_NONE == request.log_level) { + // not specified loglevel + std::string buf("log level is not specified.(--level)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 68, buf, __FILE__, __LINE__); + return false; + } + + return true; +} +// +// log option function +// +//! log category set function +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_log_category_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 23, "l7vsadm::parse_opt_log_category_func", __FILE__, __LINE__); + + if (request.log_category != LOG_CAT_NONE) { + // double target commands. + std::stringstream buf; + buf << "Option "; + buf << argv[pos]; + buf << " conflict."; + + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 69, buf.str(), __FILE__, __LINE__); + return false; + } + if (++pos >= argc) { + // log category is not specified. + std::string buf("log category is not specified.(--category)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 70, buf, __FILE__, __LINE__); + return false; + } + string_logcategory_map_type::iterator itr = string_logcategory_dic.find(argv[pos]); + if (itr != string_logcategory_dic.end()) { + request.log_category = itr->second; + return true; + } + std::stringstream buf; + buf << "log category not found(--category): " << argv[pos]; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 71, buf.str(), __FILE__, __LINE__); return false; - } - parse_opt_map_type::iterator itr = replication_switch_option_dic.find( argv[pos] ); - if( itr != replication_switch_option_dic.end() ){ // option string function find. - if( ! itr->second( pos, argc, argv ) ) return false; // option string function error. - } - else{ //option string function don't find. - // print option not found message. +} +//! log level set function +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_log_level_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 24, "l7vsadm::parse_opt_log_level_func", __FILE__, __LINE__); + + if (request.log_level != LOG_LV_NONE) { + // double target commands. + std::stringstream buf; + buf << "Option "; + buf << argv[pos]; + buf << " conflict."; + + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 72, buf.str(), __FILE__, __LINE__); + return false; + } + if (++pos >= argc) { + // log level is not specified. + std::string buf("log level is not specified.(--level)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 73, buf, __FILE__, __LINE__); + return false; + } + string_loglevel_map_type::iterator itr = string_loglevel_dic.find(argv[pos]); + if (itr != string_loglevel_dic.end()) { + request.log_level = itr->second; + return true; + } std::stringstream buf; - buf << "replication switch option not found:" << argv[pos]; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 63, buf.str(), __FILE__, __LINE__ ); + buf << "log level not found(--level): " << argv[pos]; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 74, buf.str(), __FILE__, __LINE__); return false; - } - return true; } -//! replication start function -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_replication_start_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 18, "l7vsadm::parse_opt_replication_start_func", __FILE__, __LINE__ ); - request.replication_command = l7vsadm_request::REP_START; - return true; -} -//! replication stop function -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_replication_stop_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 19, "l7vsadm::parse_opt_replication_stop_func", __FILE__, __LINE__ ); +//! snmp command parsing +//! @param[in] request command +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_snmp_func(l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 25, "l7vsadm::parse_snmp_func", __FILE__, __LINE__); + + //Argument argc is illegal + if (argc < 3) { + //argument num err + std::stringstream buf; + buf << "Argument argc is illegal for "; + buf << argv[1]; + buf << " command."; + + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 127, buf.str(), __FILE__, __LINE__); + return false; + } + + request.command = cmd; + + for (int pos = 2; pos < argc; ++pos) { + parse_opt_map_type::iterator itr = snmp_option_dic.find(argv[pos]); + if (itr != snmp_option_dic.end()) { // option string function find. + if (! itr->second(pos, argc, argv)) return false; // option string function error. + } else { //option string function not found. + // print option not found message. + std::stringstream buf; + buf << "snmp option not found(--snmp): " << argv[pos]; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 128, buf.str(), __FILE__, __LINE__); + return false; + } + } + + return true; - request.replication_command = l7vsadm_request::REP_STOP; - return true; -} -//! replication force function -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_replication_force_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 20, "l7vsadm::parse_opt_replication_force_func", __FILE__, __LINE__ ); - - if( request.replication_command != l7vsadm_request::REP_NONE ){ - // double command target. - std::string buf("replication option is double specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 64, buf, __FILE__, __LINE__ ); - return false; - } - request.replication_command = l7vsadm_request::REP_FORCE; - return true; } -//! replication dump function +//! snmp refresh set function //! @param[in] argument position //! @param[in] argument count //! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_replication_dump_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 21, "l7vsadm::parse_opt_replication_dump_func", __FILE__, __LINE__ ); - - if( request.replication_command != l7vsadm_request::REP_NONE ){ - // double command target. - std::string buf("replication option is double specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 65, buf, __FILE__, __LINE__ ); - return false; - } - request.replication_command = l7vsadm_request::REP_DUMP; - return true; -} +bool l7vs::l7vsadm::parse_opt_snmp_refresh_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 42, "l7vsadm::parse_opt_snmp_refresh_func", __FILE__, __LINE__); + if (request.snmpinfo.option_set_flag & snmp_info::SNMP_REFRESH_ALL_OPTION_FLAG + ||request.snmpinfo.option_set_flag & snmp_info::SNMP_REFRESH_OPTION_FLAG) { + // double target commands. + std::stringstream buf; + buf << "Option "; + buf << argv[pos]; + buf << " conflict."; -//! log command parsing. -//! @param[in] request command -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_log_func( l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 22, "l7vsadm::parse_log_func", __FILE__, __LINE__ ); + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 129, buf.str(), __FILE__, __LINE__); + return false; + } - if( argc != 6 ) { - //argument num err - std::stringstream buf; - buf << "Argument argc is illegal for "; - buf << argv[1]; - buf << " command."; - - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 124, buf.str(), __FILE__, __LINE__ ); - return false; - } - - request.command = cmd; - - for( int pos = 2; pos < argc; ++pos ){ - parse_opt_map_type::iterator itr = log_option_dic.find( argv[pos] ); - if( itr != log_option_dic.end() ){ // option string function find. - if( ! itr->second( pos, argc, argv ) ) return false; // option string function error. - } - else{ //option string function don't find. - // print option not found message. - std::stringstream buf; - buf << "log option not found:" << argv[pos]; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 66, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - if( LOG_CAT_NONE == request.log_category ){ - // not specified logcategory - std::string buf("logcategory not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 67, buf, __FILE__, __LINE__ ); - return false; - } - if( LOG_LV_NONE == request.log_level ){ - // not specified loglevel - std::string buf("loglevel not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 68, buf, __FILE__, __LINE__ ); - return false; - } + if (pos != 2) { + // don't target logcategory + std::string buf("Invalid option for -S command."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 130, buf, __FILE__, __LINE__); + return false; + } + + if (argc == 3) { + request.snmpinfo.option_set_flag |= snmp_info::SNMP_REFRESH_ALL_OPTION_FLAG; + return true; + } else if (argc == 7) { + for (pos = 3; pos < argc; ++pos) { + parse_opt_map_type::iterator itr = snmp_vs_option_dic.find(argv[pos]); + if (itr != snmp_vs_option_dic.end()) { + if (!itr->second(pos, argc, argv)) { + return false; + } + } else { + std::string buf("Invalid option value for -r option."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 78, buf, __FILE__, __LINE__); + return false; + } + } + request.snmpinfo.option_set_flag |= snmp_info::SNMP_REFRESH_OPTION_FLAG; + + } else { + std::string buf("Argument argc is illegal for -S command."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 79, buf, __FILE__, __LINE__); + return false; + } - return true; + return true; } -// -// log option function -// -//! log category set function -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_log_category_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 23, "l7vsadm::parse_opt_log_category_func", __FILE__, __LINE__ ); - if( request.log_category != LOG_CAT_NONE ){ - // double target commands. - std::stringstream buf; - buf << "Option "; - buf << argv[pos]; - buf << " conflict."; +//! snmp virtualservice set function +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_snmp_vs_target_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 43, "l7vsadm::parse_opt_vs_target_func", __FILE__, __LINE__); + if (request.snmpinfo.option_set_flag & snmp_info::SNMP_TCP_SERVICE_OPTION_FLAG ) { + std::stringstream buf; + buf << "Option "; + buf << argv[pos]; + buf << " conflict."; + + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 131, buf.str(), __FILE__, __LINE__); + return false; + } + + if (++pos >= argc) { + //don't target recvaddress:port + std::string buf("target endpoint is not specified."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 132, buf, __FILE__, __LINE__); + return false; + } + + // get host endpoint from string + std::string + src_str = argv[pos]; + error_code err; + boost::asio::ip::tcp::endpoint tmp_endpoint; + tmp_endpoint = string_to_endpoint(src_str, err); + if (err) { + std::stringstream buf; + buf << "target endpoint parse error:" << err.get_message() << src_str; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 133, buf.str(), __FILE__, __LINE__); + return false; + } + + request.snmpinfo.vs_endpoint = tmp_endpoint; + request.snmpinfo.option_set_flag |= snmp_info::SNMP_TCP_SERVICE_OPTION_FLAG; + - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 69, buf.str(), __FILE__, __LINE__ ); - return false; - } - if( ++pos >= argc ){ - // don't target logcategory - std::string buf("logcategory is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 70, buf, __FILE__, __LINE__ ); - return false; - } - string_logcategory_map_type::iterator itr = string_logcategory_dic.find( argv[pos] ); - if( itr != string_logcategory_dic.end() ){ - request.log_category = itr->second; return true; - } - std::stringstream buf; - buf << "logcategory not found:" << argv[pos]; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 71, buf.str(), __FILE__, __LINE__ ); - return false; } -//! log level set function +//! snmp module set function //! @param[in] argument position //! @param[in] argument count //! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_log_level_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 24, "l7vsadm::parse_opt_log_level_func", __FILE__, __LINE__ ); +bool l7vs::l7vsadm::parse_opt_snmp_vs_module_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 44, "l7vsadm::parse_opt_snmp_vs_module_func", __FILE__, __LINE__); + + if (request.snmpinfo.option_set_flag & snmp_info::SNMP_PROTOCOL_MODULE_OPTION_FLAG ) { + std::stringstream buf; + buf << "Option "; + buf << argv[pos]; + buf << " conflict."; + + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 134, buf.str(), __FILE__, __LINE__); + return false; + } + + if (++pos >= argc) { + //don't target protomod name. + std::string buf("protomod name is not specified."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 135, buf, __FILE__, __LINE__); + return false; + } + + std::string module_name = argv[pos]; + if (L7VS_MODNAME_LEN < module_name.length()) { + std::string buf("protomod name is too long."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 136, buf, __FILE__, __LINE__); + return false; + } + + protocol_module_control &ctrl = protocol_module_control::getInstance(); + ctrl.initialize(L7VS_MODULE_PATH); + protocol_module_base *module; + + module = ctrl.load_module(module_name); + if (!module) { + //don't find protocol module. + std::stringstream buf; + buf << "protocol module not found:" << module_name; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 137, buf.str(), __FILE__, __LINE__); + return false; + } + + + ctrl.unload_module(module); + + request.snmpinfo.option_set_flag |= snmp_info::SNMP_PROTOCOL_MODULE_OPTION_FLAG ; + request.snmpinfo.protocol = module_name; - if( request.log_level != LOG_LV_NONE ){ - // double target commands. - std::stringstream buf; - buf << "Option "; - buf << argv[pos]; - buf << " conflict."; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 72, buf.str(), __FILE__, __LINE__ ); - return false; - } - if( ++pos >= argc ){ - // don't target loglevel - std::string buf("loglevel is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 73, buf, __FILE__, __LINE__ ); - return false; - } - string_loglevel_map_type::iterator itr = string_loglevel_dic.find( argv[pos] ); - if( itr != string_loglevel_dic.end() ){ - request.log_level = itr->second; return true; - } - std::stringstream buf; - buf << "loglevel not found:" << argv[pos]; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 74, buf.str(), __FILE__, __LINE__ ); - return false; } +//! snmp flag set function +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_snmp_flag_func(int &pos, int argc, char *argv[]) +{ + int tmp = 0; + Logger logger(LOG_CAT_L7VSADM_COMMON, 45, "l7vsadm::parse_opt_snmp_flag_func", __FILE__, __LINE__); + if (request.snmpinfo.option_set_flag & snmp_info::SNMP_ENABLE_OPTION_FLAG ) { + std::stringstream buf; + buf << "Option "; + buf << argv[pos]; + buf << " conflict."; -//! snmp command parsing -//! @param[in] request command + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 138, buf.str(), __FILE__, __LINE__); + return false; + } + if (++pos < argc) { + try { + tmp = boost::lexical_cast< int >(argv[pos]); + } catch (const boost::bad_lexical_cast& ex) { + std::string buf("Invalid option value for -f option."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 139, buf, __FILE__, __LINE__); + return false; + } + + if (tmp == 0 || tmp == 1) { + + request.snmpinfo.enabled = tmp; + request.snmpinfo.option_set_flag |= snmp_info::SNMP_ENABLE_OPTION_FLAG; + + return true; + } else { + std::string buf("Invalid option value for -f option."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 140, buf, __FILE__, __LINE__); + return false; + } + } else { + std::string buf("Need option value for -f option"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 141, buf, __FILE__, __LINE__); + return false; + } +} +//! snmp interval set function +//! @param[in] argument position //! @param[in] argument count //! @param[in] argument value -bool l7vs::l7vsadm::parse_snmp_func( l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 25, "l7vsadm::parse_snmp_func", __FILE__, __LINE__ ); +bool l7vs::l7vsadm::parse_opt_snmp_interval_func(int &pos, int argc, char *argv[]) +{ + int tmp = 0; + Logger logger(LOG_CAT_L7VSADM_COMMON, 46, "l7vs::l7vsadm::parse_opt_snmp_interval_func", __FILE__, __LINE__); - if( argc != 6 ) { - //argument num err - std::stringstream buf; - buf << "Argument argc is illegal for "; - buf << argv[1]; - buf << " command."; - - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 125, buf.str(), __FILE__, __LINE__ ); - return false; - } - - request.command = cmd; - - for( int pos = 2; pos < argc; ++pos ){ - parse_opt_map_type::iterator itr = snmp_option_dic.find( argv[pos] ); - if( itr != snmp_option_dic.end() ){ // option string function find. - if( ! itr->second( pos, argc, argv ) ) return false; // option string function error. - } - else{ //option string function don't find. - // print option not found message. - std::stringstream buf; - buf << "snmp log option not found:" << argv[pos]; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 75, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - if( LOG_CAT_NONE == request.snmp_log_category ){ - // not specified logcategory - std::string buf("snmp logcategory not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 76, buf, __FILE__, __LINE__ ); - return false; - } - if( LOG_LV_NONE == request.snmp_log_level ){ - // not specified loglevel - std::string buf("snmp loglevel not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 77, buf, __FILE__, __LINE__ ); - return false; - } + if (request.snmpinfo.option_set_flag & snmp_info::SNMP_INTERVAL_OPTION_FLAG ) { + std::stringstream buf; + buf << "Option "; + buf << argv[pos]; + buf << " conflict."; + + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 142, buf.str(), __FILE__, __LINE__); + return false; + } - return true; + if (++pos < argc) { + try { + tmp = boost::lexical_cast< int >(argv[pos]); + } catch (const boost::bad_lexical_cast&) { + std::string buf("Invalid option value for -i option."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 143, buf, __FILE__, __LINE__); + return false; + } + + if (tmp >= 0) { + request.snmpinfo.interval = tmp; + request.snmpinfo.option_set_flag |= snmp_info::SNMP_INTERVAL_OPTION_FLAG; + + return true; + } else { + std::string buf("Invalid option value for -i option."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 144, buf, __FILE__, __LINE__); + return false; + } + } else { + std::string buf("Need option value for -i option"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 145, buf, __FILE__, __LINE__); + return false; + } } -//! snmp log category set function + +//! snmp logtrap set function //! @param[in] argument position //! @param[in] argument count //! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_snmp_log_category_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 26, "l7vsadm::parse_opt_snmp_log_category_func", __FILE__, __LINE__ ); +bool l7vs::l7vsadm::parse_opt_snmp_log_trap_func(int &pos, int argc, char *argv[]) +{ + int tmp = 0; + Logger logger(LOG_CAT_L7VSADM_COMMON, 47, "l7vs::l7vsadm::parse_opt_snmp_log_trap_func", __FILE__, __LINE__); - if( request.snmp_log_category != LOG_CAT_NONE ){ - // double target commands. - std::stringstream buf; - buf << "Option "; - buf << argv[pos]; - buf << " conflict."; + if (request.snmpinfo.option_set_flag & snmp_info::SNMP_LOGTRAP_OPTION_FLAG ) { + std::stringstream buf; + buf << "Option "; + buf << argv[pos]; + buf << " conflict."; + + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 146, buf.str(), __FILE__, __LINE__); + return false; + } + if (++pos < argc) { + try { + tmp = boost::lexical_cast< int >(argv[pos]); + } catch (const boost::bad_lexical_cast&) { + std::string buf("Invalid option value for -t option."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 147, buf, __FILE__, __LINE__); + return false; + } + if (tmp == 0 || tmp == 1) { + + request.snmpinfo.logtrap_enabled = tmp; + request.snmpinfo.option_set_flag |= snmp_info::SNMP_LOGTRAP_OPTION_FLAG; + + + return true; + } else { + std::string buf("Invalid option value for -t option."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 148, buf, __FILE__, __LINE__); + return false; + } + } else { + std::string buf("Need option value for -t option"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 149, buf, __FILE__, __LINE__); + return false; + } - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 78, buf.str(), __FILE__, __LINE__ ); - return false; - } - if( ++pos >= argc ){ - // don't target logcategory - std::string buf("snmp logcategory is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 79, buf, __FILE__, __LINE__ ); - return false; - } - string_logcategory_map_type::iterator itr = string_snmp_logcategory_dic.find( argv[pos] ); - if( itr != string_snmp_logcategory_dic.end() ){ - request.snmp_log_category = itr->second; - return true; - } - std::stringstream buf; - buf << "snmp logcategory not found:" << argv[pos]; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 80, buf.str(), __FILE__, __LINE__ ); - return false; } -//! snmp log level set function + +//! snmp logtrap_level set function //! @param[in] argument position //! @param[in] argument count //! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_snmp_log_level_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 27, "l7vsadm::parse_opt_snmp_log_level_func", __FILE__, __LINE__ ); +bool l7vs::l7vsadm::parse_opt_snmp_log_trap_level_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 48, "l7vs::l7vsadm::parse_opt_snmp_log_trap_level_func", __FILE__, __LINE__); - if( request.snmp_log_level != LOG_LV_NONE ){ - // double target commands. - std::stringstream buf; - buf << "Option "; - buf << argv[pos]; - buf << " conflict."; + if (request.snmpinfo.option_set_flag & snmp_info::SNMP_LOGTRAP_LEVEL_OPTION_FLAG) { + std::stringstream buf; + buf << "Option "; + buf << argv[pos]; + buf << " conflict."; + + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 150, buf.str(), __FILE__, __LINE__); + return false; + } + + if (++pos < argc) { + string_loglevel_map_type::iterator itr = string_loglevel_dic.find(argv[pos]); + if (itr != string_loglevel_dic.end()) { + request.snmpinfo.logtrap_level = itr->second; + request.snmpinfo.option_set_flag |= snmp_info::SNMP_LOGTRAP_LEVEL_OPTION_FLAG; + + return true; + } else { + std::string buf("logtrap_level not found."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 151, buf, __FILE__, __LINE__); + return false; + } + } else { + std::string buf("Need option value for -l option"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 152, buf, __FILE__, __LINE__); + return false; + + } - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 81, buf.str(), __FILE__, __LINE__ ); - return false; - } - if( ++pos >= argc ){ - // don't rarget logcategory - std::string buf("snmp loglevel is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 82, buf, __FILE__, __LINE__ ); - return false; - } - string_loglevel_map_type::iterator itr = string_loglevel_dic.find( argv[pos] ); - if( itr != string_loglevel_dic.end() ){ - request.snmp_log_level = itr->second; - return true; - } - std::stringstream buf; - buf << "snmp loglevel not found:" << argv[pos]; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 83, buf.str(), __FILE__, __LINE__ ); - return false; } //! parameter command parsing -//! @param[in] request command -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_parameter_func( l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 28, "l7vsadm::parse_parameter_func", __FILE__, __LINE__ ); +//! @param[in] request command +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_parameter_func(l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 28, "l7vsadm::parse_parameter_func", __FILE__, __LINE__); + + if (argc != 4) { + //argument num err + std::stringstream buf; + buf << "Argument argc is illegal for "; + buf << argv[1]; + buf << " command."; - if( argc != 4 ) { - //argument num err - std::stringstream buf; - buf << "Argument argc is illegal for "; - buf << argv[1]; - buf << " command."; - - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 126, buf.str(), __FILE__, __LINE__ ); - return false; - } - - request.command = cmd; - - for( int pos = 2; pos < argc; ++pos ){ - parse_opt_map_type::iterator itr = parameter_option_dic.find( argv[pos] ); - if( itr != parameter_option_dic.end() ){ // option string function find. - if( ! itr->second( pos, argc, argv ) ) return false; // option string function error. - } - else{ //option string function don't find. - // print option not found message. - std::stringstream buf; - buf << "parameter option not found:" << argv[pos]; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 84, buf.str(), __FILE__, __LINE__ ); - return false; - } - } - - if( PARAM_COMP_NOCAT == request.reload_param ){ - // not specified reload_param - std::string buf("reload component not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 85, buf, __FILE__, __LINE__ ); - return false; - } + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 126, buf.str(), __FILE__, __LINE__); + return false; + } + + request.command = cmd; + + for (int pos = 2; pos < argc; ++pos) { + parse_opt_map_type::iterator itr = parameter_option_dic.find(argv[pos]); + if (itr != parameter_option_dic.end()) { // option string function find. + if (! itr->second(pos, argc, argv)) return false; // option string function error. + } else { //option string function not found. + // print option not found message. + std::stringstream buf; + buf << "parameter option not found(--parameter): " << argv[pos]; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 84, buf.str(), __FILE__, __LINE__); + return false; + } + } + + if (PARAM_COMP_NOCAT == request.reload_param) { + // not specified reload_param + std::string buf("reload component is not specified.(--reload)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 85, buf, __FILE__, __LINE__); + return false; + } - return true; + return true; } // -// parameter command +// parameter command // //! parameter reload component parsing -//! @param[in] argument position -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_opt_parameter_reload_func( int& pos, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 29, "l7vsadm::parse_opt_parameter_reload_func", __FILE__, __LINE__ ); - - if( ++pos >= argc ){ - // don't target reload component - std::string buf("reload component is not specified."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 86, buf, __FILE__, __LINE__ ); +//! @param[in] argument position +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_opt_parameter_reload_func(int &pos, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 29, "l7vsadm::parse_opt_parameter_reload_func", __FILE__, __LINE__); + + if (++pos >= argc) { + // reload component is not specified + std::string buf("reload component is not specified.(--reload)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 86, buf, __FILE__, __LINE__); + return false; + } + string_parameter_map_type::iterator itr = string_parameter_dic.find(argv[pos]); + if (itr != string_parameter_dic.end()) { + request.reload_param = itr->second; + return true; + } + std::stringstream buf; + buf << "reload component not found(--reload): " << argv[pos]; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 87, buf.str(), __FILE__, __LINE__); return false; - } - string_parameter_map_type::iterator itr = string_parameter_dic.find( argv[pos] ); - if( itr != string_parameter_dic.end() ){ - request.reload_param = itr->second; - return true; - } - std::stringstream buf; - buf << "reload component not found:" << argv[pos]; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 87, buf.str(), __FILE__, __LINE__ ); - return false; } //! help command parsing -//! @param[in] request command -//! @param[in] argument count -//! @param[in] argument value -bool l7vs::l7vsadm::parse_help_func( l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 30, "l7vsadm::parse_help_func", __FILE__, __LINE__ ); - - request.command = cmd; - - std::cout << usage() << std::endl; - - std::cout << - "Commands:\n" - " --add-service -A add virtual service with options\n" - " --edit-service -E edit virtual service with options\n" - " --delete-service -D delete virtual service with options\n" - " --flush -C flush virtual service\n" - " --add-server -a add real server with options\n" - " --edit-server -e edit real server with options\n" - " --delete-server -d delete real server with options\n" - " --replication -R control replication-function\n" - " --log -L control logger-function\n" - " --snmp -S control SNMP Agent-function\n" - " --parameter -P control parameter-function\n" - " --list -l list the table\n" - " --verbose -V list the table in verbose format\n" - " --key -K list the table in key setting format\n" - " --help -h show usage\n" - << std::endl; - - std::cout << - "Options:\n" - " --tcp-service -t service-address service-address is host:port\n" - " --proto-module -m proto-module protocol module name and module argment\n" - " [module-args]\n" - " --scheduler -s scheduler one of rr,lc,wrr\n" - " --upper -u connection-count maximum number of connections\n" - " --bypass -b sorry-server sorry server address is host:port\n" - " --flag -f sorry-flag sorry status set to virtual service\n" - " --qos-up -Q QoSval-up QoS Threshold(bps) set to real server direction\n" - " --qos-down -q QoSval-down QoS Threshold(bps) set to client direction\n" - " --ssl -z ssl-config-file SSL configuration file(Use SSL)\n" - " --sockopt -O socket-option deferaccept,nodelay,cork,quickackon or quickackoff set to socket option\n" - " --access-log -L access-log-flag access log flag 0(none) or 1(output)\n" - " --access-log-name -a access-log-file access log file\n" - " [logrotate-args]\n" - " --real-server -r server-address server-address is host:port\n" - " --weight -w weight scheduling weight set to real server\n" - " --switch -s replication-switch start or stop replication\n" - " --force -f force replication start\n" - " --dump -d dump replication memory\n" - " --category -c log-category set log category for l7vsd or SNMP Agent\n" - " --level -l log-level set log level for l7vsd or SNMP Agent\n" - " --reload -r reload-parameter reload specified config parameter\n" - " --numeric -n list the table in numeric\n" - << std::endl; - - return true; +//! @param[in] request command +//! @param[in] argument count +//! @param[in] argument value +bool l7vs::l7vsadm::parse_help_func(l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd, int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 30, "l7vsadm::parse_help_func", __FILE__, __LINE__); + + request.command = cmd; + + std::cout << usage(); + + std::cout << + "Commands:\n" + " --add-service -A add virtual service with options\n" + " --edit-service -E edit virtual service with options\n" + " --delete-service -D delete virtual service with options\n" + " --flush -C flush virtual service\n" + " --add-server -a add real server with options\n" + " --edit-server -e edit real server with options\n" + " --delete-server -d delete real server with options\n" + " --replication -R control replication-function\n" + " --log -L control logger-function\n" + " --snmp -S control SNMP Agent-function\n" + " --parameter -P control parameter-function\n" + " --list -l list the table\n" + " --verbose -V list the table in verbose format\n" + " --key -K list the table in key setting format\n" + " --help -h show usage\n" + << std::endl; + + std::cout << + "Options:\n" + " --tcp-service -t service-address service-address is host:port\n" + " --proto-module -m proto-module protocol module name and module argument\n" + " [module-args]\n" + " --scheduler -s scheduler one of rr,lc,wrr\n" + " --upper -u connection-count maximum number of connections\n" + " --bypass -b sorry-server sorry server address is host:port\n" + " --tproxy -T set sorry server connection to IP transparent mode.\n" + " --masq -M set sorry server connection to IP masquerade mode.\n" + + " --flag -f sorry-flag sorry status set to virtual service\n" + " --qos-up -Q QoSval-up QoS Threshold(bps) set to real server direction\n" + " --qos-down -q QoSval-down QoS Threshold(bps) set to client direction\n" + " --ssl -z ssl-config-file SSL configuration file(Use SSL)\n" + " --sockopt -O socket-option deferaccept,nodelay,cork,quickackon or quickackoff set to socket option\n" + " --access-log -L access-log-flag access log flag 0(none) or 1(output)\n" + " --access-log-name -a access-log-file access log file\n" + " [logrotate-args]\n" + " --real-server -r server-address server-address is host:port\n" + " --weight -w weight scheduling weight set to real server\n" + " --tproxy -T set real server connection to IP transparent mode.\n" + " --masq -M set real server connection to IP masquerade mode.\n" + " --switch -s replication-switch start or stop replication\n" + " --force -f force replication start\n" + " --dump -d dump replication memory\n" + " --category -c log-category set log category for l7vsd or SNMP Agent\n" + " --level -l log-level set log level for l7vsd or SNMP Agent\n" + " --reload -r reload-parameter reload specified config parameter\n" + " --numeric -n list the table in numeric\n" + " --flag -f snmp-flag start or stop snmp function 0(off) 1(on)\n" + " --interval -i update-interval set collect snmp cache collect interval(s)\n" + " --logtrap -t log-trap-flag start or stop log trap function 0(off) 1(on)\n" + " --logtraplevel -l log-trap-level set log trap level for snmp\n" + " --refresh -r clear statistic info for snmp\n" + << std::endl; + + return true; } //! usage function. -std::string l7vs::l7vsadm::usage(){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 31, "l7vsadm::usage", __FILE__, __LINE__ ); - - std::stringstream stream; - stream << - "Usage: \n" - " l7vsadm -A -t service-address -m proto-module [module-args]\n" - " [-s scheduler] [-u connection-count] [-b sorry-server]\n" - " [-f sorry-flag] [-Q QoSval-up] [-q QoSval-down] [-z ssl-config-file]\n" - " [-O socket-option] [-L access-log-flag] [-a access-log-file [logrotate-args]]\n" - " l7vsadm -E -t service-address -m proto-module [module-args]\n" - " [-s scheduler] [-u connection-count] [-b sorry-server]\n" - " [-f sorry-flag] [-Q QoSval-up] [-q QoSval-down] [-L access-log-flag]\n" - " l7vsadm -D -t service-address -m proto-module [module-args]\n" - " l7vsadm -C\n" - " l7vsadm -a|e -t service-address -m proto-module [module-args]\n" - " -r server-address [-w weight]\n" - " l7vsadm -d -t service-address -m proto-module [module-args]\n" - " -r server-address\n" - " l7vsadm -R -s replication-switch\n" - " l7vsadm -R -f\n" - " l7vsadm -R -d\n" - " l7vsadm -L -c log-category -l log-level\n" - " l7vsadm -S -c log-category -l log-level\n" - " l7vsadm -P -r reload-parameter\n" - " l7vsadm -l [-n]\n" - " l7vsadm -V [-n]\n" - " l7vsadm -K [-n]\n" - " l7vsadm -h\n" - << std::endl; - return stream.str(); +std::string l7vs::l7vsadm::usage() +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 31, "l7vsadm::usage", __FILE__, __LINE__); + + std::stringstream stream; + stream << + "Usage: \n" + " l7vsadm -A -t service-address -m proto-module [module-args]\n" + " [-s scheduler] [-u connection-count] [-b sorry-server] [-T|M]\n" + " [-f sorry-flag] [-Q QoSval-up] [-q QoSval-down] [-z ssl-config-file]\n" + " [-O socket-option] [-L access-log-flag] [-a access-log-file [logrotate-args]]\n" + " l7vsadm -E -t service-address -m proto-module [module-args]\n" + " [-s scheduler] [-u connection-count] [-b sorry-server] [-T|M]\n" + " [-f sorry-flag] [-Q QoSval-up] [-q QoSval-down] [-L access-log-flag]\n" + " l7vsadm -D -t service-address -m proto-module [module-args]\n" + " l7vsadm -C\n" + " l7vsadm -a|e -t service-address -m proto-module [module-args]\n" + " -r server-address [-w weight] [-T|M]\n" + " l7vsadm -d -t service-address -m proto-module [module-args]\n" + " -r server-address\n" + " l7vsadm -R -s replication-switch\n" + " l7vsadm -R -f\n" + " l7vsadm -R -d\n" + " l7vsadm -L -c log-category -l log-level\n" + " l7vsadm -S [-f snmp-flag] [-i update-interval] [-t log-trap-flag] [-l log-trap-level]\n" + " l7vsadm -S -r [-t service-address -m proto-module]\n" + " l7vsadm -P -r reload-parameter\n" + " l7vsadm -l [-n]\n" + " l7vsadm -V [-n]\n" + " l7vsadm -K [-n]\n" + " l7vsadm -h\n" + << std::endl; + return stream.str(); } -//! disp_list function -void l7vs::l7vsadm::disp_list(){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 32, "l7vsadm::disp_list", __FILE__, __LINE__ ); - - std::stringstream buf; - buf << boost::format( "Layer-7 Virtual Server version %s\n" ) % VERSION; - buf << "Prot LocalAddress:Port ProtoMod Scheduler\n"; - buf << " -> RemoteAddress:Port Forward Weight ActiveConn InactConn\n"; - BOOST_FOREACH( virtualservice_element vse, response.virtualservice_status_list ){ - std::string vsepstr; - if(vse.udpmode) - vsepstr = endpoint_to_string( vse.udp_recv_endpoint, numeric_flag ); - else - vsepstr = endpoint_to_string( vse.tcp_accept_endpoint, numeric_flag ); - buf << boost::format( "%s %s %s %s\n" ) - % ( vse.udpmode ? "UDP" : "TCP" ) - % vsepstr - % vse.protocol_module_name - % vse.schedule_module_name; - BOOST_FOREACH( realserver_element rse, vse.realserver_vector ){ - std::string rsepstr; - if(vse.udpmode) - rsepstr = endpoint_to_string( rse.udp_endpoint, numeric_flag ); - else - rsepstr = endpoint_to_string( rse.tcp_endpoint, numeric_flag ); - buf << boost::format( " -> %-28s %-7s %-6d %-10d %-10d\n" ) - % rsepstr - % "Masq" - % rse.weight - % rse.get_active() - % rse.get_inact(); - } - } - std::cout << buf.str(); -} +//! disp_list function +void l7vs::l7vsadm::disp_list() +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 32, "l7vsadm::disp_list", __FILE__, __LINE__); -//! disp_list_key function -void l7vs::l7vsadm::disp_list_key(){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 33, "l7vsadm::disp_list_key", __FILE__, __LINE__ ); - - std::stringstream buf; - buf << boost::format( "Layer-7 Virtual Server version %s\n" ) % VERSION; - buf << "Prot LocalAddress:Port ProtoMod Scheduler\n"; - buf << " SSL_config_file\n"; - buf << " Socket option\n"; - buf << " Access_log_flag\n"; - buf << " Access_log_file\n"; - buf << " Access_log_rotate option\n"; - buf << " -> RemoteAddress:Port Forward Weight ActiveConn InactConn\n"; - BOOST_FOREACH( virtualservice_element vse, response.virtualservice_status_list ){ - std::string vsepstr; - if(vse.udpmode) - vsepstr = endpoint_to_string( vse.udp_recv_endpoint, numeric_flag ); - else - vsepstr = endpoint_to_string( vse.tcp_accept_endpoint, numeric_flag ); - buf << boost::format( "%s %s %s %s\n" ) - % ( vse.udpmode ? "UDP" : "TCP" ) - % vsepstr - % vse.protocol_module_name - % vse.schedule_module_name; - buf << boost::format( " %s\n" ) - % ( ( 0 == vse.ssl_file_name.length() ) ? "none": vse.ssl_file_name ); - buf << boost::format( " %s\n" ) - % ( ( 0 == vse.socket_option_string.length() ) ? "none": vse.socket_option_string ); - buf << boost::format( " %d\n" ) % vse.access_log_flag; - buf << boost::format( " %s\n" ) - % ( ( 0 == vse.access_log_file_name.length() ) ? "none": vse.access_log_file_name ); - buf << boost::format( " %s\n" ) - % ( ( 0 == vse.access_log_rotate_key_info.length() ) ? "none" : vse.access_log_rotate_key_info ); - - BOOST_FOREACH( realserver_element rse, vse.realserver_vector ){ - std::string rsepstr; - if(vse.udpmode) - rsepstr = endpoint_to_string( rse.udp_endpoint, numeric_flag ); - else - rsepstr = endpoint_to_string( rse.tcp_endpoint, numeric_flag ); - buf << boost::format( " -> %-28s %-7s %-6d %-10d %-10d\n" ) - % rsepstr - % "Masq" - % rse.weight - % rse.get_active() - % rse.get_inact(); - } - } - std::cout << buf.str(); + std::stringstream buf; + buf << boost::format("Layer-7 Virtual Server version %s\n") % VERSION; + buf << "Prot LocalAddress:Port ProtoMod Scheduler\n"; + buf << " -> RemoteAddress:Port Forward Weight ActiveConn InactConn\n"; + BOOST_FOREACH(virtualservice_element vse, response.virtualservice_status_list) { + std::string vsepstr; + if (vse.udpmode) { + vsepstr = endpoint_to_string(vse.udp_recv_endpoint, numeric_flag); + } else { + vsepstr = endpoint_to_string(vse.tcp_accept_endpoint, numeric_flag); + } + buf << boost::format("%s %s %s %s\n") + % (vse.udpmode ? "UDP" : "TCP") + % vsepstr + % vse.protocol_module_name + % vse.schedule_module_name; + BOOST_FOREACH(realserver_element rse, vse.realserver_vector) { + std::string rsepstr; + if (vse.udpmode) { + rsepstr = endpoint_to_string(rse.udp_endpoint, numeric_flag); + } else { + rsepstr = endpoint_to_string(rse.tcp_endpoint, numeric_flag); + } + buf << boost::format(" -> %-28s %-7s %-6d %-10d %-10d\n") + % rsepstr + % rse.get_fwdmode_str() + % rse.weight + % rse.get_active() + % rse.get_inact(); + } + } + std::cout << buf.str(); } -//! disp_list_verbose function -void l7vs::l7vsadm::disp_list_verbose(){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 34, "l7vsadm::disp_list_verbose", __FILE__, __LINE__ ); - - unsigned long long output_qos_upstream_value; - unsigned long long output_qos_downstream_value; - - std::stringstream buf; - buf << boost::format( "Layer-7 Virtual Server version %s\n" ) % VERSION; - - //disp loglevel - buf << "L7vsd Log Level:\n"; - buf << "Category Level\n"; - typedef std::pair< LOG_CATEGORY_TAG, LOG_LEVEL_TAG > logstatus_type; - BOOST_FOREACH( logstatus_type logstatus, response.log_status_list ){ - buf << boost::format( "%-30s %s\n" ) - % logcategory_string_dic[logstatus.first] - % loglevel_string_dic[logstatus.second]; - } - buf << "\n"; - - //disp replication - buf << "Replication Mode:\n"; - buf << boost::format( "%s\n" ) % replication_mode_string_dic[response.replication_mode_status]; - buf << "\n"; - - //disp snmp connection status - buf << "SNMPAgent Connection Status:\n"; - if( response.snmp_connection_status ) - buf << "connecting\n"; - else - buf << "non-connecting\n"; - buf << "\n"; - - //disp snmp loglevel - buf << "SNMPAgent Log Level:\n"; - buf << "Category Level\n"; - BOOST_FOREACH( logstatus_type snmplogstatus, response.snmp_log_status_list ){ - buf << boost::format( "%-30s %s\n" ) - % snmp_logcategory_string_dic[snmplogstatus.first] - % loglevel_string_dic[snmplogstatus.second]; - } - buf << "\n"; - - // disp vs - buf << "Prot LocalAddress:Port ProtoMod Scheduler Protomod_opt_string\n"; - buf << " SorryAddress:Port Sorry_cc Sorry_flag\n"; - buf << " QoS-up Throughput-up\n"; - buf << " QoS-down Throughput-down\n"; - buf << " SSL_config_file\n"; - buf << " Socket option\n"; - buf << " Access_log_flag\n"; - buf << " Access_log_file\n"; - buf << " Access_log_rotate option\n"; - buf << " -> RemoteAddress:Port Forward Weight ActiveConn InactConn\n"; - BOOST_FOREACH( virtualservice_element vse, response.virtualservice_status_list ){ - std::string vsepstr; - if( vse.udpmode ) - vsepstr = endpoint_to_string( vse.udp_recv_endpoint, numeric_flag ); - else - vsepstr = endpoint_to_string( vse.tcp_accept_endpoint, numeric_flag ); - - - if( vse.qos_upstream == ULLONG_MAX ) { - output_qos_upstream_value = 0; - } else { - output_qos_upstream_value = vse.qos_upstream * 8; +//! disp_list_key function +void l7vs::l7vsadm::disp_list_key() +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 33, "l7vsadm::disp_list_key", __FILE__, __LINE__); + + std::stringstream buf; + buf << boost::format("Layer-7 Virtual Server version %s\n") % VERSION; + buf << "Prot LocalAddress:Port ProtoMod Scheduler\n"; + buf << " SSL_config_file\n"; + buf << " Socket option\n"; + buf << " Access_log_flag\n"; + buf << " Access_log_file\n"; + buf << " Access_log_rotate option\n"; + buf << " -> RemoteAddress:Port Forward Weight ActiveConn InactConn\n"; + BOOST_FOREACH(virtualservice_element vse, response.virtualservice_status_list) { + std::string vsepstr; + if (vse.udpmode) { + vsepstr = endpoint_to_string(vse.udp_recv_endpoint, numeric_flag); + } else { + vsepstr = endpoint_to_string(vse.tcp_accept_endpoint, numeric_flag); + } + buf << boost::format("%s %s %s %s\n") + % (vse.udpmode ? "UDP" : "TCP") + % vsepstr + % vse.protocol_module_name + % vse.schedule_module_name; + buf << boost::format(" %s\n") + % ((0 == vse.ssl_file_name.length()) ? "none" : vse.ssl_file_name); + buf << boost::format(" %s\n") + % ((0 == vse.socket_option_string.length()) ? "none" : vse.socket_option_string); + buf << boost::format(" %d\n") % vse.access_log_flag; + buf << boost::format(" %s\n") + % ((0 == vse.access_log_file_name.length()) ? "none" : vse.access_log_file_name); + buf << boost::format(" %s\n") + % ((0 == vse.access_log_rotate_key_info.length()) ? "none" : vse.access_log_rotate_key_info); + + BOOST_FOREACH(realserver_element rse, vse.realserver_vector) { + std::string rsepstr; + if (vse.udpmode) + rsepstr = endpoint_to_string(rse.udp_endpoint, numeric_flag); + else + rsepstr = endpoint_to_string(rse.tcp_endpoint, numeric_flag); + buf << boost::format(" -> %-28s %-7s %-6d %-10d %-10d\n") + % rsepstr + % rse.get_fwdmode_str() + % rse.weight + % rse.get_active() + % rse.get_inact(); + } } + std::cout << buf.str(); +} + +//! disp_list_verbose function +void l7vs::l7vsadm::disp_list_verbose() +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 34, "l7vsadm::disp_list_verbose", __FILE__, __LINE__); - if( vse.qos_downstream == ULLONG_MAX ) { - output_qos_downstream_value = 0; + unsigned long long output_qos_upstream_value; + unsigned long long output_qos_downstream_value; + const int MAX_TIME_FORMAT_LEN = 20; + char snmp_start_date[MAX_TIME_FORMAT_LEN] = {0}; + char snmp_last_request_date[MAX_TIME_FORMAT_LEN] = {0}; + char snmp_last_trap_date[MAX_TIME_FORMAT_LEN] = {0}; + + std::stringstream buf; + buf << boost::format("Layer-7 Virtual Server version %s\n") % VERSION; + + //disp loglevel + buf << "L7vsd Log Level:\n"; + buf << "Category Level\n"; + typedef std::pair logstatus_type; + BOOST_FOREACH(logstatus_type logstatus, response.log_status_list) { + buf << boost::format("%-30s %s\n") + % logcategory_string_dic[logstatus.first] + % loglevel_string_dic[logstatus.second]; + } + buf << "\n"; + + //disp replication + buf << "Replication Mode:\n"; + buf << boost::format("%s\n") % replication_mode_string_dic[response.replication_mode_status]; + buf << "\n"; + + //disp snmp agent status + buf << "SNMPAgent:\n"; + if (!response.snmpinfo.enabled) { + boost::format fmtter("%-30s inactive\n" + "%-30s none\n" + "%-30s none\n" + "%-30s none\n" + "%-30s none\n" + "%-30s none\n" + "%-30s none\n" + "%-30s none\n" + "%-30s none\n" + "%-30s none\n"); + + fmtter % "Agent Status"; + fmtter % "log trap status"; + fmtter % "log trap level"; + fmtter % "cache update interval"; + fmtter % "start date"; + fmtter % "last request date"; + fmtter % "last trap date"; + fmtter % "total GET requests"; + fmtter % "total SET requests"; + fmtter % "total trap counts"; + + buf << fmtter.str(); } else { - output_qos_downstream_value = vse.qos_downstream * 8; - } - - - buf << boost::format( "%s %s %s %s %s\n" ) - % ( vse.udpmode ? "UDP" : "TCP" ) - % vsepstr - % vse.protocol_module_name - % vse.schedule_module_name - % vse.protocol_module_for_indication_options; - if( !vse.udpmode ){ - std::string sorryepstr; - boost::asio::ip::tcp::endpoint zeropoint; - if( zeropoint == vse.sorry_endpoint ){ - sorryepstr = "none"; - } - else{ - sorryepstr = endpoint_to_string( vse.sorry_endpoint, numeric_flag ); - } - buf << boost::format( " %s %d %d\n" ) - % sorryepstr - % vse.sorry_maxconnection - % vse.sorry_flag; - } - // QoS value and throughput convert from byte/s to bps. - buf << boost::format( " %lld %lld\n" ) - % (output_qos_upstream_value) - % (vse.throughput_upstream * 8); - buf << boost::format( " %lld %lld\n" ) - % (output_qos_downstream_value) - % (vse.throughput_downstream * 8); - buf << boost::format( " %s\n" ) - % ( ( 0 == vse.ssl_file_name.length() ) ? "none": vse.ssl_file_name ); - buf << boost::format( " %s\n" ) - % ( ( 0 == vse.socket_option_string.length() ) ? "none": vse.socket_option_string ); - buf << boost::format( " %d\n" ) % vse.access_log_flag; - buf << boost::format( " %s\n" ) - % ( ( 0 == vse.access_log_file_name.length() ) ? "none": vse.access_log_file_name ); - buf << boost::format( " %s\n" ) - % ( ( 0 == vse.access_log_rotate_verbose_info.length() ) ? "none" : vse.access_log_rotate_verbose_info ); - - BOOST_FOREACH( realserver_element rse, vse.realserver_vector ){ - std::string rsepstr; - if( vse.udpmode ) - rsepstr = endpoint_to_string( rse.udp_endpoint, numeric_flag ); - else - rsepstr = endpoint_to_string( rse.tcp_endpoint, numeric_flag ); - buf << boost::format( " -> %-28s %-7s %-6d %-10d %-10d\n" ) - % rsepstr - % "Masq" - % rse.weight - % rse.get_active() - % rse.get_inact(); - } - } - std::cout << buf.str(); + strftime(snmp_start_date, sizeof(snmp_start_date), "%Y-%m-%d %H-%M-%S", localtime(&response.snmpinfo.start_date)); + strftime(snmp_last_request_date, sizeof(snmp_start_date), "%Y-%m-%d %H-%M-%S", localtime(&response.snmpinfo.request_last_date)); + strftime(snmp_last_trap_date, sizeof(snmp_start_date), "%Y-%m-%d %H-%M-%S", localtime(&response.snmpinfo.trap_last_date)); + + boost::format fmtter("%-30s active\n" + "%-30s %s\n" + "%-30s %s\n" + "%-30s %d\n" + "%-30s %s\n" + "%-30s %s\n" + "%-30s %s\n" + "%-30s %u\n" + "%-30s %u\n" + "%-30s %u\n"); + + fmtter % "Agent Status"; + fmtter % "log trap status"; + fmtter % (response.snmpinfo.logtrap_enabled ? "on" : "off"); + fmtter % "log trap level"; + fmtter % (response.snmpinfo.logtrap_enabled ? loglevel_string_dic[response.snmpinfo.logtrap_level] : "none" ); + fmtter % "cache update interval" % response.snmpinfo.interval; + fmtter % "start date" % (response.snmpinfo.start_date == 0 ? "none" : snmp_start_date); + fmtter % "last request date" % (response.snmpinfo.request_last_date == 0 ? "none" : snmp_last_request_date); + fmtter % "last trap date" % (response.snmpinfo.trap_last_date == 0 ? "none" : snmp_last_trap_date); + fmtter % "total GET requests" % response.snmpinfo.snmp_get_requests; + fmtter % "total SET requests" % response.snmpinfo.snmp_set_requests; + fmtter % "total trap counts" % response.snmpinfo.snmp_trap_count; + buf << fmtter.str(); + } + + + buf << "\n"; + + // disp vs + buf << "Prot LocalAddress:Port ProtoMod Scheduler Protomod_opt_string\n"; + buf << " -> RemoteAddress:Port Forward Weight ActiveConn InactConn\n"; + BOOST_FOREACH(virtualservice_element vse, response.virtualservice_status_list) { + std::string vsepstr; + if (vse.udpmode) { + vsepstr = endpoint_to_string(vse.udp_recv_endpoint, numeric_flag); + } else { + vsepstr = endpoint_to_string(vse.tcp_accept_endpoint, numeric_flag); + } + + if (vse.qos_upstream == ULLONG_MAX) { + output_qos_upstream_value = 0; + } else { + output_qos_upstream_value = vse.qos_upstream * 8; + } + + if (vse.qos_downstream == ULLONG_MAX) { + output_qos_downstream_value = 0; + } else { + output_qos_downstream_value = vse.qos_downstream * 8; + } + + buf << boost::format("%s %s %s %s %s\n") + % (vse.udpmode ? "UDP" : "TCP") + % vsepstr + % vse.protocol_module_name + % vse.schedule_module_name + % vse.protocol_module_for_indication_options; + + BOOST_FOREACH(realserver_element rse, vse.realserver_vector) { + std::string rsepstr; + if (vse.udpmode) { + rsepstr = endpoint_to_string(rse.udp_endpoint, numeric_flag); + } else { + rsepstr = endpoint_to_string(rse.tcp_endpoint, numeric_flag); + } + buf << boost::format(" -> %-28s %-7s %-6d %-10d %-10d\n") + % rsepstr + % rse.get_fwdmode_str() + % rse.weight + % rse.get_active() + % rse.get_inact(); + } + + if (!vse.udpmode) { + std::string sorryepstr; + std::string sorry_flag_str; + boost::asio::ip::tcp::endpoint zeropoint; + if (zeropoint == vse.sorry_endpoint) { + sorryepstr = "none"; + } else { + sorryepstr = endpoint_to_string(vse.sorry_endpoint, + numeric_flag) + " " + vse.get_fwdmode_str(); + } + + if (vse.sorry_flag) { + sorry_flag_str = "on"; + } else { + sorry_flag_str = "off"; + } + + buf << boost::format(" Bypass Settings:\n" + " Sorry Server %s\n" + " Max Connection %lld\n" + " Sorry Flag %s\n") + % sorryepstr + % vse.sorry_maxconnection + % sorry_flag_str; + } + + buf << boost::format(" SSL Settings:\n" + " SSL Config File %s\n") + % ((0 == vse.ssl_file_name.length()) ? "none" : vse.ssl_file_name); + + buf << boost::format(" Logging Settings:\n" + " Access Log %s\n" + " Access Log File %s\n" + " Access Log Rotate %s\n") + % ((0 == vse.access_log_flag) ? "off" : "on") + % ((0 == vse.socket_option_string.length()) ? "none" : vse.socket_option_string) + % ((0 == vse.access_log_rotate_verbose_info.length()) ? "none" : vse.access_log_rotate_verbose_info); + + buf << boost::format(" Socket Settings:\n" + " TCP_DEFER_ACCEPT %s\n" + " TCP_NODELAY %s\n" + " TCP_CORK %s\n" + " TCP_QUICKACK %s\n") + % ((0 == vse.socket_option_tcp_defer_accept) ? "disable" : "enable") + % ((0 == vse.socket_option_tcp_nodelay) ? "disable" : "enable") + % ((0 == vse.socket_option_tcp_cork) ? "disable" : "enable") + % ((0 == vse.socket_option_tcp_quickack) ? "disable" : "enable"); + + + buf << boost::format(" Throughput:\n" + " Current Upload / Limit %f Mbps / %f Mbps\n" + " Current Download / Limit %f Mbps / %f Mbps\n") + % ((double)vse.throughput_upstream * 8 / (1000 * 1000)) % ((double)output_qos_upstream_value * 8 / (1000 * 1000) ) + % ((double)vse.throughput_downstream * 8 / (1000 * 1000)) % ((double)output_qos_downstream_value * 8 / (1000 * 1000)); + + buf << boost::format(" Statistics:\n" + " HTTP Total Requests %lld\n" + " HTTP GET Requests %lld\n" + " HTTP POST Requests %lld\n") + % vse.http_total_count % vse.http_get_count % vse.http_post_count; + + + } + std::cout << buf.str(); } -//! l7vsadm constractor. +//! l7vsadm constructor. //! create including all dictionary. l7vs::l7vsadm::l7vsadm() - : numeric_flag(false), - command_wait_interval( L7VSADM_DEFAULT_WAIT_INTERVAL ), - command_wait_count( L7VSADM_DEFAULT_WAIT_COUNT ), - connect_wait_interval( L7VSADM_DEFAULT_WAIT_INTERVAL ), - connect_wait_count( L7VSADM_DEFAULT_WAIT_COUNT ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 35, "l7vsadm::l7vsadm(constructor)", __FILE__, __LINE__ ); - - // create command dictionary. - command_dic["-l"] = boost::bind( &l7vsadm::parse_list_func, this, l7vsadm_request::CMD_LIST, _1, _2 ); - command_dic["--list"] = boost::bind( &l7vsadm::parse_list_func, this, l7vsadm_request::CMD_LIST, _1, _2 ); - command_dic["-V"] = boost::bind( &l7vsadm::parse_list_func, this, l7vsadm_request::CMD_LIST_VERBOSE, _1, _2 ); - command_dic["--verbose"] = boost::bind( &l7vsadm::parse_list_func, this, l7vsadm_request::CMD_LIST_VERBOSE, _1, _2 ); - command_dic["-K"] = boost::bind( &l7vsadm::parse_list_func, this, l7vsadm_request::CMD_LIST_KEY, _1, _2 ); - command_dic["--key"] = boost::bind( &l7vsadm::parse_list_func, this, l7vsadm_request::CMD_LIST_KEY, _1, _2 ); - command_dic["-A"] = boost::bind( &l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_ADD_VS, _1, _2 ); - command_dic["--add-service"] = boost::bind( &l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_ADD_VS, _1, _2 ); - command_dic["-D"] = boost::bind( &l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_DEL_VS, _1, _2 ); - command_dic["--delete-service"] = boost::bind( &l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_DEL_VS, _1, _2 ); - command_dic["-E"] = boost::bind( &l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_EDIT_VS, _1, _2 ); - command_dic["--edit-service"] = boost::bind( &l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_EDIT_VS, _1, _2 ); - command_dic["-C"] = boost::bind( &l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_FLUSH_VS, _1, _2 ); - command_dic["--flush"] = boost::bind( &l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_FLUSH_VS, _1, _2 ); - command_dic["-a"] = boost::bind( &l7vsadm::parse_rs_func, this, l7vsadm_request::CMD_ADD_RS, _1, _2 ); - command_dic["--add-server"] = boost::bind( &l7vsadm::parse_rs_func, this, l7vsadm_request::CMD_ADD_RS, _1, _2 ); - command_dic["-d"] = boost::bind( &l7vsadm::parse_rs_func, this, l7vsadm_request::CMD_DEL_RS, _1, _2 ); - command_dic["--delete-server"] = boost::bind( &l7vsadm::parse_rs_func, this, l7vsadm_request::CMD_DEL_RS, _1, _2 ); - command_dic["-e"] = boost::bind( &l7vsadm::parse_rs_func, this, l7vsadm_request::CMD_EDIT_RS, _1, _2 ); - command_dic["--edit-server"] = boost::bind( &l7vsadm::parse_rs_func, this, l7vsadm_request::CMD_EDIT_RS, _1, _2 ); - command_dic["-R"] = boost::bind( &l7vsadm::parse_replication_func, this, l7vsadm_request::CMD_REPLICATION, _1, _2 ); - command_dic["--replication"] = boost::bind( &l7vsadm::parse_replication_func, this, l7vsadm_request::CMD_REPLICATION, _1, _2 ); - command_dic["-L"] = boost::bind( &l7vsadm::parse_log_func, this, l7vsadm_request::CMD_LOG, _1, _2 ); - command_dic["--log"] = boost::bind( &l7vsadm::parse_log_func, this, l7vsadm_request::CMD_LOG, _1, _2 ); - command_dic["-S"] = boost::bind( &l7vsadm::parse_snmp_func, this, l7vsadm_request::CMD_SNMP, _1, _2 ); - command_dic["--snmp"] = boost::bind( &l7vsadm::parse_snmp_func, this, l7vsadm_request::CMD_SNMP, _1, _2 ); - command_dic["-P"] = boost::bind( &l7vsadm::parse_parameter_func, this, l7vsadm_request::CMD_PARAMETER, _1, _2 ); - command_dic["--parameter"] = boost::bind( &l7vsadm::parse_parameter_func, this, l7vsadm_request::CMD_PARAMETER, _1, _2 ); - command_dic["-h"] = boost::bind( &l7vsadm::parse_help_func, this, l7vsadm_request::CMD_HELP, _1, _2 ); - command_dic["--help"] = boost::bind( &l7vsadm::parse_help_func, this, l7vsadm_request::CMD_HELP, _1, _2 ); - - // create list option dictionary. - list_option_dic["-n"] = boost::bind( &l7vsadm::parse_opt_list_numeric_func, this, _1, _2, _3 ); - list_option_dic["--numeric"] = boost::bind( &l7vsadm::parse_opt_list_numeric_func, this, _1, _2, _3 ); - // create virtualservice option dictionary - vs_option_dic["-t"] = boost::bind( &l7vsadm::parse_opt_vs_target_func, this, _1, _2, _3 ); - vs_option_dic["--tcp-service"] = boost::bind( &l7vsadm::parse_opt_vs_target_func, this, _1, _2, _3 ); - vs_option_dic["-m"] = boost::bind( &l7vsadm::parse_opt_vs_module_func, this, _1, _2, _3 ); - vs_option_dic["--proto-module"] = boost::bind( &l7vsadm::parse_opt_vs_module_func, this, _1, _2, _3 ); - vs_option_dic["-s"] = boost::bind( &l7vsadm::parse_opt_vs_scheduler_func, this, _1, _2, _3 ); - vs_option_dic["--scheduler"] = boost::bind( &l7vsadm::parse_opt_vs_scheduler_func, this, _1, _2, _3 ); - vs_option_dic["-u"] = boost::bind( &l7vsadm::parse_opt_vs_upper_func, this, _1, _2, _3 ); - vs_option_dic["--upper"] = boost::bind( &l7vsadm::parse_opt_vs_upper_func, this, _1, _2, _3 ); - vs_option_dic["-b"] = boost::bind( &l7vsadm::parse_opt_vs_bypass_func, this, _1, _2, _3 ); - vs_option_dic["--bypass"] = boost::bind( &l7vsadm::parse_opt_vs_bypass_func, this, _1, _2, _3 ); - vs_option_dic["-f"] = boost::bind( &l7vsadm::parse_opt_vs_flag_func, this, _1, _2, _3 ); - vs_option_dic["--flag"] = boost::bind( &l7vsadm::parse_opt_vs_flag_func, this, _1, _2, _3 ); - vs_option_dic["-Q"] = boost::bind( &l7vsadm::parse_opt_vs_qosup_func, this, _1, _2, _3 ); - vs_option_dic["--qos-up"] = boost::bind( &l7vsadm::parse_opt_vs_qosup_func, this, _1, _2, _3 ); - vs_option_dic["-q"] = boost::bind( &l7vsadm::parse_opt_vs_qosdown_func, this, _1, _2, _3 ); - vs_option_dic["--qos-down"] = boost::bind( &l7vsadm::parse_opt_vs_qosdown_func, this, _1, _2, _3 ); - vs_option_dic["-p"] = boost::bind( &l7vsadm::parse_opt_vs_udp_func, this, _1, _2, _3 ); - vs_option_dic["--udp"] = boost::bind( &l7vsadm::parse_opt_vs_udp_func, this, _1, _2, _3 ); - vs_option_dic["-z"] = boost::bind( &l7vsadm::parse_opt_vs_ssl_file_func, this, _1, _2, _3 ); - vs_option_dic["--ssl"] = boost::bind( &l7vsadm::parse_opt_vs_ssl_file_func, this, _1, _2, _3 ); - vs_option_dic["-O"] = boost::bind( &l7vsadm::parse_opt_vs_socket_func, this, _1, _2, _3 ); - vs_option_dic["--sockopt"] = boost::bind( &l7vsadm::parse_opt_vs_socket_func, this, _1, _2, _3 ); - vs_option_dic["-L"] = boost::bind( &l7vsadm::parse_opt_vs_access_log_func, this, _1, _2, _3 ); - vs_option_dic["--access-log"] = boost::bind( &l7vsadm::parse_opt_vs_access_log_func, this, _1, _2, _3 ); - vs_option_dic["-a"] = boost::bind( &l7vsadm::parse_opt_vs_access_log_logrotate_func, this, _1, _2, _3 ); - vs_option_dic["--access-log-name"] - = boost::bind( &l7vsadm::parse_opt_vs_access_log_logrotate_func, this, _1, _2, _3 ); - // create realserver option dictionary - rs_option_dic["-t"] = boost::bind( &l7vsadm::parse_opt_vs_target_func, this, _1, _2, _3 ); - rs_option_dic["--tcp-service"] = boost::bind( &l7vsadm::parse_opt_vs_target_func, this, _1, _2, _3 ); - rs_option_dic["-w"] = boost::bind( &l7vsadm::parse_opt_rs_weight_func, this, _1, _2, _3 ); - rs_option_dic["--weight"] = boost::bind( &l7vsadm::parse_opt_rs_weight_func, this, _1, _2, _3 ); - rs_option_dic["-m"] = boost::bind( &l7vsadm::parse_opt_vs_module_func, this, _1, _2, _3 ); - rs_option_dic["--proto-module"] = boost::bind( &l7vsadm::parse_opt_vs_module_func, this, _1, _2, _3 ); - rs_option_dic["-p"] = boost::bind( &l7vsadm::parse_opt_vs_udp_func, this, _1, _2, _3 ); - rs_option_dic["--udp"] = boost::bind( &l7vsadm::parse_opt_vs_udp_func, this, _1, _2, _3 ); - rs_option_dic["-r"] = boost::bind( &l7vsadm::parse_opt_rs_realserver_func, this, _1, _2, _3 ); - rs_option_dic["--real-server"] = boost::bind( &l7vsadm::parse_opt_rs_realserver_func, this, _1, _2, _3 ); - // create replication option dictionary - replication_option_dic["-s"] = boost::bind( &l7vsadm::parse_opt_replication_switch_func, this, _1, _2, _3 ); - replication_option_dic["--switch"] - = boost::bind( &l7vsadm::parse_opt_replication_switch_func, this, _1, _2, _3 ); - replication_switch_option_dic["start"] - = boost::bind( &l7vsadm::parse_opt_replication_start_func, this, _1, _2, _3 ); - replication_switch_option_dic["stop"] - = boost::bind( &l7vsadm::parse_opt_replication_stop_func, this, _1, _2, _3 ); - replication_option_dic["-f"] = boost::bind( &l7vsadm::parse_opt_replication_force_func, this, _1, _2, _3 ); - replication_option_dic["--force"] - = boost::bind( &l7vsadm::parse_opt_replication_force_func, this, _1, _2, _3 ); - replication_option_dic["-d"] = boost::bind( &l7vsadm::parse_opt_replication_dump_func, this, _1, _2, _3 ); - replication_option_dic["--dump"] - = boost::bind( &l7vsadm::parse_opt_replication_dump_func, this, _1, _2, _3 ); - // create log option function dictionary create - log_option_dic["-c"] = boost::bind( &l7vsadm::parse_opt_log_category_func, this, _1, _2, _3 ); - log_option_dic["--category"] = boost::bind( &l7vsadm::parse_opt_log_category_func, this, _1, _2, _3 ); - log_option_dic["-l"] = boost::bind( &l7vsadm::parse_opt_log_level_func, this, _1, _2, _3 ); - log_option_dic["--level"] = boost::bind( &l7vsadm::parse_opt_log_level_func, this, _1, _2, _3 ); - // snmp agent option function dictionary create - snmp_option_dic["-c"] = boost::bind( &l7vsadm::parse_opt_snmp_log_category_func, this, _1, _2, _3 ); - snmp_option_dic["--category"] = boost::bind( &l7vsadm::parse_opt_snmp_log_category_func, this, _1, _2, _3 ); - snmp_option_dic["-l"] = boost::bind( &l7vsadm::parse_opt_snmp_log_level_func, this, _1, _2, _3 ); - snmp_option_dic["--level"] = boost::bind( &l7vsadm::parse_opt_snmp_log_level_func, this, _1, _2, _3 ); - // parameter option function dictionary create - parameter_option_dic["-r"] = boost::bind( &l7vsadm::parse_opt_parameter_reload_func, this, _1, _2, _3 ); - parameter_option_dic["--reload"] - = boost::bind( &l7vsadm::parse_opt_parameter_reload_func, this, _1, _2, _3 ); - - // string logcategory dictionary create - string_logcategory_dic["l7vsd_network"] = LOG_CAT_L7VSD_NETWORK; - string_logcategory_dic["nw"] = LOG_CAT_L7VSD_NETWORK; - logcategory_string_dic[LOG_CAT_L7VSD_NETWORK] = "l7vsd_network"; - string_logcategory_dic["l7vsd_network_qos"] = LOG_CAT_L7VSD_NETWORK_QOS; - string_logcategory_dic["nw_qos"] = LOG_CAT_L7VSD_NETWORK_QOS; - logcategory_string_dic[LOG_CAT_L7VSD_NETWORK_QOS] = "l7vsd_network_qos"; - string_logcategory_dic["l7vsd_network_bandwidth"] = LOG_CAT_L7VSD_NETWORK_BANDWIDTH; - string_logcategory_dic["nw_bw"] = LOG_CAT_L7VSD_NETWORK_BANDWIDTH; - logcategory_string_dic[LOG_CAT_L7VSD_NETWORK_BANDWIDTH] = "l7vsd_network_bandwidth"; - string_logcategory_dic["l7vsd_network_num_connection"] = LOG_CAT_L7VSD_NETWORK_NUM_CONNECTION; - string_logcategory_dic["nw_conn"] = LOG_CAT_L7VSD_NETWORK_NUM_CONNECTION; - logcategory_string_dic[LOG_CAT_L7VSD_NETWORK_NUM_CONNECTION] - = "l7vsd_network_num_connection"; - string_logcategory_dic["l7vsd_network_access"] = LOG_CAT_L7VSD_NETWORK_ACCESS; - string_logcategory_dic["nw_acc"] = LOG_CAT_L7VSD_NETWORK_ACCESS; - logcategory_string_dic[LOG_CAT_L7VSD_NETWORK_ACCESS] = "l7vsd_network_access"; - string_logcategory_dic["l7vsd_mainthread"] = LOG_CAT_L7VSD_MAINTHREAD; - string_logcategory_dic["mth"] = LOG_CAT_L7VSD_MAINTHREAD; - logcategory_string_dic[LOG_CAT_L7VSD_MAINTHREAD] = "l7vsd_mainthread"; - string_logcategory_dic["l7vsd_virtualservice"] = LOG_CAT_L7VSD_VIRTUALSERVICE; - string_logcategory_dic["vs"] = LOG_CAT_L7VSD_VIRTUALSERVICE; - logcategory_string_dic[LOG_CAT_L7VSD_VIRTUALSERVICE] = "l7vsd_virtualservice"; - string_logcategory_dic["l7vsd_virtualservice_thread"] = LOG_CAT_L7VSD_VIRTUALSERVICE_THREAD; - string_logcategory_dic["vs_th"] = LOG_CAT_L7VSD_VIRTUALSERVICE_THREAD; - logcategory_string_dic[LOG_CAT_L7VSD_VIRTUALSERVICE_THREAD] - = "l7vsd_virtualservice_thread"; - string_logcategory_dic["l7vsd_session"] = LOG_CAT_L7VSD_SESSION; - string_logcategory_dic["ss"] = LOG_CAT_L7VSD_SESSION; - logcategory_string_dic[LOG_CAT_L7VSD_SESSION] = "l7vsd_session"; - string_logcategory_dic["l7vsd_session_thread"] = LOG_CAT_L7VSD_SESSION_THREAD; - string_logcategory_dic["ss_th"] = LOG_CAT_L7VSD_SESSION_THREAD; - logcategory_string_dic[LOG_CAT_L7VSD_SESSION_THREAD] = "l7vsd_session_thread"; - string_logcategory_dic["l7vsd_realserver"] = LOG_CAT_L7VSD_REALSERVER; - string_logcategory_dic["rs"] = LOG_CAT_L7VSD_REALSERVER; - logcategory_string_dic[LOG_CAT_L7VSD_REALSERVER] = "l7vsd_realserver"; - string_logcategory_dic["l7vsd_sorryserver"] = LOG_CAT_L7VSD_SORRYSERVER; - string_logcategory_dic["sorry"] = LOG_CAT_L7VSD_SORRYSERVER; - logcategory_string_dic[LOG_CAT_L7VSD_SORRYSERVER] = "l7vsd_sorryserver"; - string_logcategory_dic["l7vsd_module"] = LOG_CAT_L7VSD_MODULE; - string_logcategory_dic["mod"] = LOG_CAT_L7VSD_MODULE; - logcategory_string_dic[LOG_CAT_L7VSD_MODULE] = "l7vsd_module"; - string_logcategory_dic["l7vsd_replication"] = LOG_CAT_L7VSD_REPLICATION; - string_logcategory_dic["rep"] = LOG_CAT_L7VSD_REPLICATION; - logcategory_string_dic[LOG_CAT_L7VSD_REPLICATION] = "l7vsd_replication"; - string_logcategory_dic["l7vsd_replication_sendthread"] = LOG_CAT_L7VSD_REPLICATION_SENDTHREAD; - string_logcategory_dic["rep_sth"] = LOG_CAT_L7VSD_REPLICATION_SENDTHREAD; - logcategory_string_dic[LOG_CAT_L7VSD_REPLICATION_SENDTHREAD] - = "l7vsd_replication_sendthread"; - string_logcategory_dic["l7vsd_parameter"] = LOG_CAT_L7VSD_PARAMETER; - string_logcategory_dic["para"] = LOG_CAT_L7VSD_PARAMETER; - logcategory_string_dic[LOG_CAT_L7VSD_PARAMETER] = "l7vsd_parameter"; - string_logcategory_dic["l7vsd_logger"] = LOG_CAT_L7VSD_LOGGER; - string_logcategory_dic["logger"] = LOG_CAT_L7VSD_LOGGER; - logcategory_string_dic[LOG_CAT_L7VSD_LOGGER] = "l7vsd_logger"; - string_logcategory_dic["l7vsd_command"] = LOG_CAT_L7VSD_COMMAND; - string_logcategory_dic["cmd"] = LOG_CAT_L7VSD_COMMAND; - logcategory_string_dic[LOG_CAT_L7VSD_COMMAND] = "l7vsd_command"; - string_logcategory_dic["l7vsd_start_stop"] = LOG_CAT_L7VSD_START_STOP; - string_logcategory_dic["stastp"] = LOG_CAT_L7VSD_START_STOP; - logcategory_string_dic[LOG_CAT_L7VSD_START_STOP] = "l7vsd_start_stop"; - string_logcategory_dic["l7vsd_system"] = LOG_CAT_L7VSD_SYSTEM; - string_logcategory_dic["sys"] = LOG_CAT_L7VSD_SYSTEM; - logcategory_string_dic[LOG_CAT_L7VSD_SYSTEM] = "l7vsd_system"; - string_logcategory_dic["l7vsd_system_memory"] = LOG_CAT_L7VSD_SYSTEM_MEMORY; - string_logcategory_dic["sys_mem"] = LOG_CAT_L7VSD_SYSTEM_MEMORY; - logcategory_string_dic[LOG_CAT_L7VSD_SYSTEM_MEMORY] = "l7vsd_system_memory"; - string_logcategory_dic["l7vsd_system_endpoint"] = LOG_CAT_L7VSD_SYSTEM_ENDPOINT; - string_logcategory_dic["sys_ep"] = LOG_CAT_L7VSD_SYSTEM_ENDPOINT; - logcategory_string_dic[LOG_CAT_L7VSD_SYSTEM_ENDPOINT] = "l7vsd_system_endpoint"; - string_logcategory_dic["l7vsd_system_signal"] = LOG_CAT_L7VSD_SYSTEM_SIGNAL; - string_logcategory_dic["sys_sig"] = LOG_CAT_L7VSD_SYSTEM_SIGNAL; - logcategory_string_dic[LOG_CAT_L7VSD_SYSTEM_SIGNAL] = "l7vsd_system_signal"; - string_logcategory_dic["l7vsd_system_environment"] = LOG_CAT_L7VSD_SYSTEM_ENVIRONMENT; - string_logcategory_dic["sys_env"] = LOG_CAT_L7VSD_SYSTEM_ENVIRONMENT; - logcategory_string_dic[LOG_CAT_L7VSD_SYSTEM_ENVIRONMENT] - = "l7vsd_system_environment"; - string_logcategory_dic["l7vsd_snmpbridge"] = LOG_CAT_L7VSD_SNMPBRIDGE; - string_logcategory_dic["bridge"] = LOG_CAT_L7VSD_SNMPBRIDGE; - logcategory_string_dic[LOG_CAT_L7VSD_SNMPBRIDGE] - = "l7vsd_snmpbridge"; - string_logcategory_dic["l7vsd_protocol"] = LOG_CAT_PROTOCOL; - string_logcategory_dic["prot"] = LOG_CAT_PROTOCOL; - logcategory_string_dic[LOG_CAT_PROTOCOL] = "l7vsd_protocol"; - string_logcategory_dic["l7vsd_schedule"] = LOG_CAT_SCHEDULE; - string_logcategory_dic["sched"] = LOG_CAT_SCHEDULE; - logcategory_string_dic[LOG_CAT_SCHEDULE] = "l7vsd_schedule"; - string_logcategory_dic["all"] = LOG_CAT_END; - - // string snmp logcategory dictionary create - string_snmp_logcategory_dic["snmpagent_start_stop"] = LOG_CAT_SNMPAGENT_START_STOP; - string_snmp_logcategory_dic["snmp_stastp"] = LOG_CAT_SNMPAGENT_START_STOP; - snmp_logcategory_string_dic[LOG_CAT_SNMPAGENT_START_STOP] = "snmpagent_start_stop"; - string_snmp_logcategory_dic["snmpagent_manager_receive"] = LOG_CAT_SNMPAGENT_MANAGER_RECEIVE; - string_snmp_logcategory_dic["snmp_mngrcv"] = LOG_CAT_SNMPAGENT_MANAGER_RECEIVE; - snmp_logcategory_string_dic[LOG_CAT_SNMPAGENT_MANAGER_RECEIVE] - = "snmpagent_manager_receive"; - string_snmp_logcategory_dic["snmpagent_manager_send"] = LOG_CAT_SNMPAGENT_MANAGER_SEND; - string_snmp_logcategory_dic["snmp_mngsnd"] = LOG_CAT_SNMPAGENT_MANAGER_SEND; - snmp_logcategory_string_dic[LOG_CAT_SNMPAGENT_MANAGER_SEND] = "snmpagent_manager_send"; - string_snmp_logcategory_dic["snmpagent_l7vsd_receive"] = LOG_CAT_SNMPAGENT_L7VSD_RECEIVE; - string_snmp_logcategory_dic["snmp_vsdrcv"] = LOG_CAT_SNMPAGENT_L7VSD_RECEIVE; - snmp_logcategory_string_dic[LOG_CAT_SNMPAGENT_L7VSD_RECEIVE] - = "snmpagent_l7vsd_receive"; - string_snmp_logcategory_dic["snmpagent_l7vsd_send"] = LOG_CAT_SNMPAGENT_L7VSD_SEND; - string_snmp_logcategory_dic["snmp_vsdsnd"] = LOG_CAT_SNMPAGENT_L7VSD_SEND; - snmp_logcategory_string_dic[LOG_CAT_SNMPAGENT_L7VSD_SEND] = "snmpagent_l7vsd_send"; - string_snmp_logcategory_dic["snmpagent_logger"] = LOG_CAT_SNMPAGENT_LOGGER; - string_snmp_logcategory_dic["snmp_logger"] = LOG_CAT_SNMPAGENT_LOGGER; - snmp_logcategory_string_dic[LOG_CAT_SNMPAGENT_LOGGER] = "snmpagent_logger"; - string_snmp_logcategory_dic["snmpagent_parameter"] = LOG_CAT_SNMPAGENT_PARAMETER; - string_snmp_logcategory_dic["snmp_para"] = LOG_CAT_SNMPAGENT_PARAMETER; - snmp_logcategory_string_dic[LOG_CAT_SNMPAGENT_PARAMETER] = "snmpagent_parameter"; - string_snmp_logcategory_dic["snmpagent_system"] = LOG_CAT_SNMPAGENT_SYSTEM; - string_snmp_logcategory_dic["snmp_sys"] = LOG_CAT_SNMPAGENT_SYSTEM; - snmp_logcategory_string_dic[LOG_CAT_SNMPAGENT_SYSTEM] = "snmpagent_system"; - string_snmp_logcategory_dic["snmpagent_system_memory"] = LOG_CAT_SNMPAGENT_SYSTEM_MEMORY; - string_snmp_logcategory_dic["snmp_sys_mem"] = LOG_CAT_SNMPAGENT_SYSTEM_MEMORY; - snmp_logcategory_string_dic[LOG_CAT_SNMPAGENT_SYSTEM_MEMORY] - = "snmpagent_system_memory"; - string_snmp_logcategory_dic["snmpagent_system_endpoint"] = LOG_CAT_SNMPAGENT_SYSTEM_ENDPOINT; - string_snmp_logcategory_dic["snmp_sys_ep"] = LOG_CAT_SNMPAGENT_SYSTEM_ENDPOINT; - snmp_logcategory_string_dic[LOG_CAT_SNMPAGENT_SYSTEM_ENDPOINT] - = "snmpagent_system_endpoint"; - string_snmp_logcategory_dic["snmpagent_system_signal"] = LOG_CAT_SNMPAGENT_SYSTEM_SIGNAL; - string_snmp_logcategory_dic["snmp_sys_sig"] = LOG_CAT_SNMPAGENT_SYSTEM_SIGNAL; - snmp_logcategory_string_dic[LOG_CAT_SNMPAGENT_SYSTEM_SIGNAL] - = "snmpagent_system_signal"; - string_snmp_logcategory_dic["snmpagent_system_environment"] = LOG_CAT_SNMPAGENT_SYSTEM_ENVIRONMENT; - string_snmp_logcategory_dic["snmp_sys_env"] = LOG_CAT_SNMPAGENT_SYSTEM_ENVIRONMENT; - snmp_logcategory_string_dic[LOG_CAT_SNMPAGENT_SYSTEM_ENVIRONMENT] - = "snmpagent_system_environment"; - string_snmp_logcategory_dic["all"] = LOG_CAT_END; - - // string log level dictionary create. - string_loglevel_dic["debug"] = LOG_LV_DEBUG; - loglevel_string_dic[LOG_LV_DEBUG] = "debug"; - string_loglevel_dic["info"] = LOG_LV_INFO; - loglevel_string_dic[LOG_LV_INFO] = "info"; - string_loglevel_dic["warn"] = LOG_LV_WARN; - loglevel_string_dic[LOG_LV_WARN] = "warn"; - string_loglevel_dic["error"] = LOG_LV_ERROR; - loglevel_string_dic[LOG_LV_ERROR] = "error"; - string_loglevel_dic["fatal"] = LOG_LV_FATAL; - loglevel_string_dic[LOG_LV_FATAL] = "fatal"; - - // parameter category dictionary create - string_parameter_dic["all"] = PARAM_COMP_ALL; - string_parameter_dic["l7vsd"] = PARAM_COMP_L7VSD; - string_parameter_dic["command"] = PARAM_COMP_COMMAND; - string_parameter_dic["session"] = PARAM_COMP_SESSION; - string_parameter_dic["virtualservice"] = PARAM_COMP_VIRTUALSERVICE; - string_parameter_dic["module"] = PARAM_COMP_MODULE; - string_parameter_dic["replication"] = PARAM_COMP_REPLICATION; - string_parameter_dic["logger"] = PARAM_COMP_LOGGER; - string_parameter_dic["l7vsadm"] = PARAM_COMP_L7VSADM; - string_parameter_dic["snmpagent"] = PARAM_COMP_SNMPAGENT; - string_parameter_dic["ssl"] = PARAM_COMP_SSL; - - // create disp_result dictionary. - disp_result_dic[l7vsadm_request::CMD_LIST] = boost::bind( &l7vsadm::disp_list, this ); - disp_result_dic[l7vsadm_request::CMD_LIST_KEY] = boost::bind( &l7vsadm::disp_list_key, this ); - disp_result_dic[l7vsadm_request::CMD_LIST_VERBOSE] = boost::bind( &l7vsadm::disp_list_verbose, this ); - - // response_message_dic create - response_error_message_dic[l7vsd_response::RESPONSE_ERROR] = "command error : "; - response_error_message_dic[l7vsd_response::RESPONSE_LIST_ERROR] = "list command error : "; - response_error_message_dic[l7vsd_response::RESPONSE_LIST_VERBOSE_ERROR] = "list verbose error : "; - response_error_message_dic[l7vsd_response::RESPONSE_LIST_KEY_ERROR] = "list key error : "; - response_error_message_dic[l7vsd_response::RESPONSE_ADD_VS_ERROR] = "add vs error : "; - response_error_message_dic[l7vsd_response::RESPONSE_DEL_VS_ERROR] = "del vs error : "; - response_error_message_dic[l7vsd_response::RESPONSE_EDIT_VS_ERROR] = "edit vs error : "; - response_error_message_dic[l7vsd_response::RESPONSE_FLUSH_VS_ERROR] = "flush vs error : "; - response_error_message_dic[l7vsd_response::RESPONSE_ADD_RS_ERROR] = "add rs error : "; - response_error_message_dic[l7vsd_response::RESPONSE_DEL_RS_ERROR] = "del rs error : "; - response_error_message_dic[l7vsd_response::RESPONSE_EDIT_RS_ERROR] = "edit rs error : "; - response_error_message_dic[l7vsd_response::RESPONSE_REPLICATION_ERROR] = "replication command error : "; - response_error_message_dic[l7vsd_response::RESPONSE_LOG_ERROR] = "log command error : "; - response_error_message_dic[l7vsd_response::RESPONSE_SNMP_ERROR] = "snmp command error : "; - response_error_message_dic[l7vsd_response::RESPONSE_PARAMETER_ERROR] = "parameter error : "; - - replication_mode_string_dic[replication::REPLICATION_OUT] = "OUT"; - replication_mode_string_dic[replication::REPLICATION_SINGLE] = "SINGLE"; - replication_mode_string_dic[replication::REPLICATION_MASTER] = "MASTER"; - replication_mode_string_dic[replication::REPLICATION_SLAVE] = "SLAVE"; - replication_mode_string_dic[replication::REPLICATION_MASTER_STOP] = "MASTER_STOP"; - replication_mode_string_dic[replication::REPLICATION_SLAVE_STOP] = "SLAVE_STOP"; - + : numeric_flag(false), + command_wait_interval(L7VSADM_DEFAULT_WAIT_INTERVAL), + command_wait_count(L7VSADM_DEFAULT_WAIT_COUNT) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 35, "l7vsadm::l7vsadm(constructor)", __FILE__, __LINE__); + + // create command dictionary. + command_dic["-l"] = boost::bind(&l7vsadm::parse_list_func, this, l7vsadm_request::CMD_LIST, _1, _2); + command_dic["--list"] = boost::bind(&l7vsadm::parse_list_func, this, l7vsadm_request::CMD_LIST, _1, _2); + command_dic["-V"] = boost::bind(&l7vsadm::parse_list_func, this, l7vsadm_request::CMD_LIST_VERBOSE, _1, _2); + command_dic["--verbose"] = boost::bind(&l7vsadm::parse_list_func, this, l7vsadm_request::CMD_LIST_VERBOSE, _1, _2); + command_dic["-K"] = boost::bind(&l7vsadm::parse_list_func, this, l7vsadm_request::CMD_LIST_KEY, _1, _2); + command_dic["--key"] = boost::bind(&l7vsadm::parse_list_func, this, l7vsadm_request::CMD_LIST_KEY, _1, _2); + command_dic["-A"] = boost::bind(&l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_ADD_VS, _1, _2); + command_dic["--add-service"] = boost::bind(&l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_ADD_VS, _1, _2); + command_dic["-D"] = boost::bind(&l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_DEL_VS, _1, _2); + command_dic["--delete-service"] = boost::bind(&l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_DEL_VS, _1, _2); + command_dic["-E"] = boost::bind(&l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_EDIT_VS, _1, _2); + command_dic["--edit-service"] = boost::bind(&l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_EDIT_VS, _1, _2); + command_dic["-C"] = boost::bind(&l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_FLUSH_VS, _1, _2); + command_dic["--flush"] = boost::bind(&l7vsadm::parse_vs_func, this, l7vsadm_request::CMD_FLUSH_VS, _1, _2); + command_dic["-a"] = boost::bind(&l7vsadm::parse_rs_func, this, l7vsadm_request::CMD_ADD_RS, _1, _2); + command_dic["--add-server"] = boost::bind(&l7vsadm::parse_rs_func, this, l7vsadm_request::CMD_ADD_RS, _1, _2); + command_dic["-d"] = boost::bind(&l7vsadm::parse_rs_func, this, l7vsadm_request::CMD_DEL_RS, _1, _2); + command_dic["--delete-server"] = boost::bind(&l7vsadm::parse_rs_func, this, l7vsadm_request::CMD_DEL_RS, _1, _2); + command_dic["-e"] = boost::bind(&l7vsadm::parse_rs_func, this, l7vsadm_request::CMD_EDIT_RS, _1, _2); + command_dic["--edit-server"] = boost::bind(&l7vsadm::parse_rs_func, this, l7vsadm_request::CMD_EDIT_RS, _1, _2); + command_dic["-R"] = boost::bind(&l7vsadm::parse_replication_func, this, l7vsadm_request::CMD_REPLICATION, _1, _2); + command_dic["--replication"] = boost::bind(&l7vsadm::parse_replication_func, this, l7vsadm_request::CMD_REPLICATION, _1, _2); + command_dic["-L"] = boost::bind(&l7vsadm::parse_log_func, this, l7vsadm_request::CMD_LOG, _1, _2); + command_dic["--log"] = boost::bind(&l7vsadm::parse_log_func, this, l7vsadm_request::CMD_LOG, _1, _2); + command_dic["-S"] = boost::bind(&l7vsadm::parse_snmp_func, this, l7vsadm_request::CMD_SNMP, _1, _2); + command_dic["--snmp"] = boost::bind(&l7vsadm::parse_snmp_func, this, l7vsadm_request::CMD_SNMP, _1, _2); + command_dic["-P"] = boost::bind(&l7vsadm::parse_parameter_func, this, l7vsadm_request::CMD_PARAMETER, _1, _2); + command_dic["--parameter"] = boost::bind(&l7vsadm::parse_parameter_func, this, l7vsadm_request::CMD_PARAMETER, _1, _2); + command_dic["-h"] = boost::bind(&l7vsadm::parse_help_func, this, l7vsadm_request::CMD_HELP, _1, _2); + command_dic["--help"] = boost::bind(&l7vsadm::parse_help_func, this, l7vsadm_request::CMD_HELP, _1, _2); + + // create list option dictionary. + list_option_dic["-n"] = boost::bind(&l7vsadm::parse_opt_list_numeric_func, this, _1, _2, _3); + list_option_dic["--numeric"] = boost::bind(&l7vsadm::parse_opt_list_numeric_func, this, _1, _2, _3); + + // create virtualservice option dictionary + vs_option_dic["-t"] = boost::bind(&l7vsadm::parse_opt_vs_target_func, this, _1, _2, _3); + vs_option_dic["--tcp-service"] = boost::bind(&l7vsadm::parse_opt_vs_target_func, this, _1, _2, _3); + vs_option_dic["-m"] = boost::bind(&l7vsadm::parse_opt_vs_module_func, this, _1, _2, _3); + vs_option_dic["--proto-module"] = boost::bind(&l7vsadm::parse_opt_vs_module_func, this, _1, _2, _3); + vs_option_dic["-s"] = boost::bind(&l7vsadm::parse_opt_vs_scheduler_func, this, _1, _2, _3); + vs_option_dic["--scheduler"] = boost::bind(&l7vsadm::parse_opt_vs_scheduler_func, this, _1, _2, _3); + vs_option_dic["-u"] = boost::bind(&l7vsadm::parse_opt_vs_upper_func, this, _1, _2, _3); + vs_option_dic["--upper"] = boost::bind(&l7vsadm::parse_opt_vs_upper_func, this, _1, _2, _3); + vs_option_dic["-b"] = boost::bind(&l7vsadm::parse_opt_vs_bypass_func, this, _1, _2, _3); + vs_option_dic["--bypass"] = boost::bind(&l7vsadm::parse_opt_vs_bypass_func, this, _1, _2, _3); + vs_option_dic["-T"] = boost::bind(&l7vsadm::parse_opt_vs_fwdmode_func, this, _1, _2, _3); + vs_option_dic["--tproxy"] = boost::bind(&l7vsadm::parse_opt_vs_fwdmode_func, this, _1, _2, _3); + vs_option_dic["-M"] = boost::bind(&l7vsadm::parse_opt_vs_fwdmode_func, this, _1, _2, _3); + vs_option_dic["--masq"] = boost::bind(&l7vsadm::parse_opt_vs_fwdmode_func, this, _1, _2, _3); + vs_option_dic["-f"] = boost::bind(&l7vsadm::parse_opt_vs_flag_func, this, _1, _2, _3); + vs_option_dic["--flag"] = boost::bind(&l7vsadm::parse_opt_vs_flag_func, this, _1, _2, _3); + vs_option_dic["-Q"] = boost::bind(&l7vsadm::parse_opt_vs_qosup_func, this, _1, _2, _3); + vs_option_dic["--qos-up"] = boost::bind(&l7vsadm::parse_opt_vs_qosup_func, this, _1, _2, _3); + vs_option_dic["-q"] = boost::bind(&l7vsadm::parse_opt_vs_qosdown_func, this, _1, _2, _3); + vs_option_dic["--qos-down"] = boost::bind(&l7vsadm::parse_opt_vs_qosdown_func, this, _1, _2, _3); + vs_option_dic["-p"] = boost::bind(&l7vsadm::parse_opt_vs_udp_func, this, _1, _2, _3); + vs_option_dic["--udp"] = boost::bind(&l7vsadm::parse_opt_vs_udp_func, this, _1, _2, _3); + vs_option_dic["-z"] = boost::bind(&l7vsadm::parse_opt_vs_ssl_file_func, this, _1, _2, _3); + vs_option_dic["--ssl"] = boost::bind(&l7vsadm::parse_opt_vs_ssl_file_func, this, _1, _2, _3); + vs_option_dic["-O"] = boost::bind(&l7vsadm::parse_opt_vs_socket_func, this, _1, _2, _3); + vs_option_dic["--sockopt"] = boost::bind(&l7vsadm::parse_opt_vs_socket_func, this, _1, _2, _3); + vs_option_dic["-L"] = boost::bind(&l7vsadm::parse_opt_vs_access_log_func, this, _1, _2, _3); + vs_option_dic["--access-log"] = boost::bind(&l7vsadm::parse_opt_vs_access_log_func, this, _1, _2, _3); + vs_option_dic["-a"] = boost::bind(&l7vsadm::parse_opt_vs_access_log_logrotate_func, this, _1, _2, _3); + vs_option_dic["--access-log-name"] = boost::bind(&l7vsadm::parse_opt_vs_access_log_logrotate_func, this, _1, _2, _3); + + // create realserver option dictionary + rs_option_dic["-t"] = boost::bind(&l7vsadm::parse_opt_vs_target_func, this, _1, _2, _3); + rs_option_dic["--tcp-service"] = boost::bind(&l7vsadm::parse_opt_vs_target_func, this, _1, _2, _3); + rs_option_dic["-w"] = boost::bind(&l7vsadm::parse_opt_rs_weight_func, this, _1, _2, _3); + rs_option_dic["--weight"] = boost::bind(&l7vsadm::parse_opt_rs_weight_func, this, _1, _2, _3); + rs_option_dic["-T"] = boost::bind(&l7vsadm::parse_opt_rs_fwdmode_func, this, _1, _2, _3); + rs_option_dic["--tproxy"] = boost::bind(&l7vsadm::parse_opt_rs_fwdmode_func, this, _1, _2, _3); + rs_option_dic["-M"] = boost::bind(&l7vsadm::parse_opt_rs_fwdmode_func, this, _1, _2, _3); + rs_option_dic["--masq"] = boost::bind(&l7vsadm::parse_opt_rs_fwdmode_func, this, _1, _2, _3); + rs_option_dic["-m"] = boost::bind(&l7vsadm::parse_opt_vs_module_func, this, _1, _2, _3); + rs_option_dic["--proto-module"] = boost::bind(&l7vsadm::parse_opt_vs_module_func, this, _1, _2, _3); + rs_option_dic["-p"] = boost::bind(&l7vsadm::parse_opt_vs_udp_func, this, _1, _2, _3); + rs_option_dic["--udp"] = boost::bind(&l7vsadm::parse_opt_vs_udp_func, this, _1, _2, _3); + rs_option_dic["-r"] = boost::bind(&l7vsadm::parse_opt_rs_realserver_func, this, _1, _2, _3); + rs_option_dic["--real-server"] = boost::bind(&l7vsadm::parse_opt_rs_realserver_func, this, _1, _2, _3); + + // create replication option dictionary + replication_option_dic["-s"] = boost::bind(&l7vsadm::parse_opt_replication_switch_func, this, _1, _2, _3); + replication_option_dic["--switch"] = boost::bind(&l7vsadm::parse_opt_replication_switch_func, this, _1, _2, _3); + replication_switch_option_dic["start"] = boost::bind(&l7vsadm::parse_opt_replication_start_func, this, _1, _2, _3); + replication_switch_option_dic["stop"] = boost::bind(&l7vsadm::parse_opt_replication_stop_func, this, _1, _2, _3); + replication_option_dic["-f"] = boost::bind(&l7vsadm::parse_opt_replication_force_func, this, _1, _2, _3); + replication_option_dic["--force"] = boost::bind(&l7vsadm::parse_opt_replication_force_func, this, _1, _2, _3); + replication_option_dic["-d"] = boost::bind(&l7vsadm::parse_opt_replication_dump_func, this, _1, _2, _3); + replication_option_dic["--dump"] = boost::bind(&l7vsadm::parse_opt_replication_dump_func, this, _1, _2, _3); + + // create log option function dictionary create + log_option_dic["-c"] = boost::bind(&l7vsadm::parse_opt_log_category_func, this, _1, _2, _3); + log_option_dic["--category"] = boost::bind(&l7vsadm::parse_opt_log_category_func, this, _1, _2, _3); + log_option_dic["-l"] = boost::bind(&l7vsadm::parse_opt_log_level_func, this, _1, _2, _3); + log_option_dic["--level"] = boost::bind(&l7vsadm::parse_opt_log_level_func, this, _1, _2, _3); + + // snmp agent option function dictionary create + snmp_option_dic["-r"] = boost::bind(&l7vsadm::parse_opt_snmp_refresh_func, this, _1, _2, _3); + snmp_option_dic["--refresh"] = boost::bind(&l7vsadm::parse_opt_snmp_refresh_func, this, _1, _2, _3); + snmp_option_dic["-f"] = boost::bind(&l7vsadm::parse_opt_snmp_flag_func, this, _1, _2, _3); + snmp_option_dic["--flag"] = boost::bind(&l7vsadm::parse_opt_snmp_flag_func, this, _1, _2, _3); + snmp_option_dic["-i"] = boost::bind(&l7vsadm::parse_opt_snmp_interval_func, this, _1, _2, _3); + snmp_option_dic["--interval"] = boost::bind(&l7vsadm::parse_opt_snmp_interval_func, this, _1, _2, _3); + snmp_option_dic["-t"] = boost::bind(&l7vsadm::parse_opt_snmp_log_trap_func, this, _1, _2, _3); + snmp_option_dic["--logtrap"] = boost::bind(&l7vsadm::parse_opt_snmp_log_trap_func, this, _1, _2, _3); + snmp_option_dic["-l"] = boost::bind(&l7vsadm::parse_opt_snmp_log_trap_level_func, this, _1, _2, _3); + snmp_option_dic["--logtraplevel"] = boost::bind(&l7vsadm::parse_opt_snmp_log_trap_level_func, this, _1, _2, _3); + snmp_vs_option_dic["-t"] = boost::bind(&l7vsadm::parse_opt_snmp_vs_target_func, this, _1, _2, _3); + snmp_vs_option_dic["--tcp-service"] = boost::bind(&l7vsadm::parse_opt_snmp_vs_target_func, this, _1, _2, _3); + snmp_vs_option_dic["-m"] = boost::bind(&l7vsadm::parse_opt_snmp_vs_module_func, this, _1, _2, _3); + snmp_vs_option_dic["--proto-module"] = boost::bind(&l7vsadm::parse_opt_snmp_vs_module_func, this, _1, _2, _3); + // parameter option function dictionary create + parameter_option_dic["-r"] = boost::bind(&l7vsadm::parse_opt_parameter_reload_func, this, _1, _2, _3); + parameter_option_dic["--reload"] = boost::bind(&l7vsadm::parse_opt_parameter_reload_func, this, _1, _2, _3); + + // string logcategory dictionary create + string_logcategory_dic["l7vsd_network"] = LOG_CAT_L7VSD_NETWORK; + string_logcategory_dic["nw"] = LOG_CAT_L7VSD_NETWORK; + logcategory_string_dic[LOG_CAT_L7VSD_NETWORK] = "l7vsd_network"; + string_logcategory_dic["l7vsd_network_qos"] = LOG_CAT_L7VSD_NETWORK_QOS; + string_logcategory_dic["nw_qos"] = LOG_CAT_L7VSD_NETWORK_QOS; + logcategory_string_dic[LOG_CAT_L7VSD_NETWORK_QOS] = "l7vsd_network_qos"; + string_logcategory_dic["l7vsd_network_bandwidth"] = LOG_CAT_L7VSD_NETWORK_BANDWIDTH; + string_logcategory_dic["nw_bw"] = LOG_CAT_L7VSD_NETWORK_BANDWIDTH; + logcategory_string_dic[LOG_CAT_L7VSD_NETWORK_BANDWIDTH] = "l7vsd_network_bandwidth"; + string_logcategory_dic["l7vsd_network_num_connection"] = LOG_CAT_L7VSD_NETWORK_NUM_CONNECTION; + string_logcategory_dic["nw_conn"] = LOG_CAT_L7VSD_NETWORK_NUM_CONNECTION; + logcategory_string_dic[LOG_CAT_L7VSD_NETWORK_NUM_CONNECTION] = "l7vsd_network_num_connection"; + string_logcategory_dic["l7vsd_network_access"] = LOG_CAT_L7VSD_NETWORK_ACCESS; + string_logcategory_dic["nw_acc"] = LOG_CAT_L7VSD_NETWORK_ACCESS; + logcategory_string_dic[LOG_CAT_L7VSD_NETWORK_ACCESS] = "l7vsd_network_access"; + string_logcategory_dic["l7vsd_mainthread"] = LOG_CAT_L7VSD_MAINTHREAD; + string_logcategory_dic["mth"] = LOG_CAT_L7VSD_MAINTHREAD; + logcategory_string_dic[LOG_CAT_L7VSD_MAINTHREAD] = "l7vsd_mainthread"; + string_logcategory_dic["l7vsd_virtualservice"] = LOG_CAT_L7VSD_VIRTUALSERVICE; + string_logcategory_dic["vs"] = LOG_CAT_L7VSD_VIRTUALSERVICE; + logcategory_string_dic[LOG_CAT_L7VSD_VIRTUALSERVICE] = "l7vsd_virtualservice"; + string_logcategory_dic["l7vsd_virtualservice_thread"] = LOG_CAT_L7VSD_VIRTUALSERVICE_THREAD; + string_logcategory_dic["vs_th"] = LOG_CAT_L7VSD_VIRTUALSERVICE_THREAD; + logcategory_string_dic[LOG_CAT_L7VSD_VIRTUALSERVICE_THREAD] = "l7vsd_virtualservice_thread"; + string_logcategory_dic["l7vsd_session"] = LOG_CAT_L7VSD_SESSION; + string_logcategory_dic["ss"] = LOG_CAT_L7VSD_SESSION; + logcategory_string_dic[LOG_CAT_L7VSD_SESSION] = "l7vsd_session"; + string_logcategory_dic["l7vsd_session_thread"] = LOG_CAT_L7VSD_SESSION_THREAD; + string_logcategory_dic["ss_th"] = LOG_CAT_L7VSD_SESSION_THREAD; + logcategory_string_dic[LOG_CAT_L7VSD_SESSION_THREAD] = "l7vsd_session_thread"; + string_logcategory_dic["l7vsd_realserver"] = LOG_CAT_L7VSD_REALSERVER; + string_logcategory_dic["rs"] = LOG_CAT_L7VSD_REALSERVER; + logcategory_string_dic[LOG_CAT_L7VSD_REALSERVER] = "l7vsd_realserver"; + string_logcategory_dic["l7vsd_sorryserver"] = LOG_CAT_L7VSD_SORRYSERVER; + string_logcategory_dic["sorry"] = LOG_CAT_L7VSD_SORRYSERVER; + logcategory_string_dic[LOG_CAT_L7VSD_SORRYSERVER] = "l7vsd_sorryserver"; + string_logcategory_dic["l7vsd_module"] = LOG_CAT_L7VSD_MODULE; + string_logcategory_dic["mod"] = LOG_CAT_L7VSD_MODULE; + logcategory_string_dic[LOG_CAT_L7VSD_MODULE] = "l7vsd_module"; + string_logcategory_dic["l7vsd_replication"] = LOG_CAT_L7VSD_REPLICATION; + string_logcategory_dic["rep"] = LOG_CAT_L7VSD_REPLICATION; + logcategory_string_dic[LOG_CAT_L7VSD_REPLICATION] = "l7vsd_replication"; + string_logcategory_dic["l7vsd_replication_sendthread"] = LOG_CAT_L7VSD_REPLICATION_SENDTHREAD; + string_logcategory_dic["rep_sth"] = LOG_CAT_L7VSD_REPLICATION_SENDTHREAD; + logcategory_string_dic[LOG_CAT_L7VSD_REPLICATION_SENDTHREAD] = "l7vsd_replication_sendthread"; + string_logcategory_dic["l7vsd_parameter"] = LOG_CAT_L7VSD_PARAMETER; + string_logcategory_dic["para"] = LOG_CAT_L7VSD_PARAMETER; + logcategory_string_dic[LOG_CAT_L7VSD_PARAMETER] = "l7vsd_parameter"; + string_logcategory_dic["l7vsd_logger"] = LOG_CAT_L7VSD_LOGGER; + string_logcategory_dic["logger"] = LOG_CAT_L7VSD_LOGGER; + logcategory_string_dic[LOG_CAT_L7VSD_LOGGER] = "l7vsd_logger"; + string_logcategory_dic["l7vsd_command"] = LOG_CAT_L7VSD_COMMAND; + string_logcategory_dic["cmd"] = LOG_CAT_L7VSD_COMMAND; + logcategory_string_dic[LOG_CAT_L7VSD_COMMAND] = "l7vsd_command"; + string_logcategory_dic["l7vsd_start_stop"] = LOG_CAT_L7VSD_START_STOP; + string_logcategory_dic["stastp"] = LOG_CAT_L7VSD_START_STOP; + logcategory_string_dic[LOG_CAT_L7VSD_START_STOP] = "l7vsd_start_stop"; + string_logcategory_dic["l7vsd_system"] = LOG_CAT_L7VSD_SYSTEM; + string_logcategory_dic["sys"] = LOG_CAT_L7VSD_SYSTEM; + logcategory_string_dic[LOG_CAT_L7VSD_SYSTEM] = "l7vsd_system"; + string_logcategory_dic["l7vsd_system_memory"] = LOG_CAT_L7VSD_SYSTEM_MEMORY; + string_logcategory_dic["sys_mem"] = LOG_CAT_L7VSD_SYSTEM_MEMORY; + logcategory_string_dic[LOG_CAT_L7VSD_SYSTEM_MEMORY] = "l7vsd_system_memory"; + string_logcategory_dic["l7vsd_system_endpoint"] = LOG_CAT_L7VSD_SYSTEM_ENDPOINT; + string_logcategory_dic["sys_ep"] = LOG_CAT_L7VSD_SYSTEM_ENDPOINT; + logcategory_string_dic[LOG_CAT_L7VSD_SYSTEM_ENDPOINT] = "l7vsd_system_endpoint"; + string_logcategory_dic["l7vsd_system_signal"] = LOG_CAT_L7VSD_SYSTEM_SIGNAL; + string_logcategory_dic["sys_sig"] = LOG_CAT_L7VSD_SYSTEM_SIGNAL; + logcategory_string_dic[LOG_CAT_L7VSD_SYSTEM_SIGNAL] = "l7vsd_system_signal"; + string_logcategory_dic["l7vsd_system_environment"] = LOG_CAT_L7VSD_SYSTEM_ENVIRONMENT; + string_logcategory_dic["sys_env"] = LOG_CAT_L7VSD_SYSTEM_ENVIRONMENT; + logcategory_string_dic[LOG_CAT_L7VSD_SYSTEM_ENVIRONMENT] = "l7vsd_system_environment"; + string_logcategory_dic["l7vsd_snmpagent"] = LOG_CAT_L7VSD_SNMPAGENT; + string_logcategory_dic["agent"] = LOG_CAT_L7VSD_SNMPAGENT; + logcategory_string_dic[LOG_CAT_L7VSD_SNMPAGENT] = "l7vsd_snmpagent"; + string_logcategory_dic["l7vsd_protocol"] = LOG_CAT_PROTOCOL; + string_logcategory_dic["prot"] = LOG_CAT_PROTOCOL; + logcategory_string_dic[LOG_CAT_PROTOCOL] = "l7vsd_protocol"; + string_logcategory_dic["l7vsd_schedule"] = LOG_CAT_SCHEDULE; + string_logcategory_dic["sched"] = LOG_CAT_SCHEDULE; + logcategory_string_dic[LOG_CAT_SCHEDULE] = "l7vsd_schedule"; + string_logcategory_dic["all"] = LOG_CAT_END; + + // string log level dictionary create. + string_loglevel_dic["debug"] = LOG_LV_DEBUG; + loglevel_string_dic[LOG_LV_DEBUG] = "debug"; + string_loglevel_dic["info"] = LOG_LV_INFO; + loglevel_string_dic[LOG_LV_INFO] = "info"; + string_loglevel_dic["warn"] = LOG_LV_WARN; + loglevel_string_dic[LOG_LV_WARN] = "warn"; + string_loglevel_dic["error"] = LOG_LV_ERROR; + loglevel_string_dic[LOG_LV_ERROR] = "error"; + string_loglevel_dic["fatal"] = LOG_LV_FATAL; + loglevel_string_dic[LOG_LV_FATAL] = "fatal"; + + // parameter category dictionary create + string_parameter_dic["all"] = PARAM_COMP_ALL; + string_parameter_dic["l7vsd"] = PARAM_COMP_L7VSD; + string_parameter_dic["command"] = PARAM_COMP_COMMAND; + string_parameter_dic["session"] = PARAM_COMP_SESSION; + string_parameter_dic["virtualservice"] = PARAM_COMP_VIRTUALSERVICE; + string_parameter_dic["module"] = PARAM_COMP_MODULE; + string_parameter_dic["replication"] = PARAM_COMP_REPLICATION; + string_parameter_dic["logger"] = PARAM_COMP_LOGGER; + string_parameter_dic["l7vsadm"] = PARAM_COMP_L7VSADM; + string_parameter_dic["snmpagent"] = PARAM_COMP_SNMPAGENT; + string_parameter_dic["ssl"] = PARAM_COMP_SSL; + + // create disp_result dictionary. + disp_result_dic[l7vsadm_request::CMD_LIST] = boost::bind(&l7vsadm::disp_list, this); + disp_result_dic[l7vsadm_request::CMD_LIST_KEY] = boost::bind(&l7vsadm::disp_list_key, this); + disp_result_dic[l7vsadm_request::CMD_LIST_VERBOSE] = boost::bind(&l7vsadm::disp_list_verbose, this); + + // response_message_dic create + response_error_message_dic[l7vsd_response::RESPONSE_ERROR] = "command error : "; + response_error_message_dic[l7vsd_response::RESPONSE_LIST_ERROR] = "list command error : "; + response_error_message_dic[l7vsd_response::RESPONSE_LIST_VERBOSE_ERROR] = "list verbose error : "; + response_error_message_dic[l7vsd_response::RESPONSE_LIST_KEY_ERROR] = "list key error : "; + response_error_message_dic[l7vsd_response::RESPONSE_ADD_VS_ERROR] = "add vs error : "; + response_error_message_dic[l7vsd_response::RESPONSE_DEL_VS_ERROR] = "del vs error : "; + response_error_message_dic[l7vsd_response::RESPONSE_EDIT_VS_ERROR] = "edit vs error : "; + response_error_message_dic[l7vsd_response::RESPONSE_FLUSH_VS_ERROR] = "flush vs error : "; + response_error_message_dic[l7vsd_response::RESPONSE_ADD_RS_ERROR] = "add rs error : "; + response_error_message_dic[l7vsd_response::RESPONSE_DEL_RS_ERROR] = "del rs error : "; + response_error_message_dic[l7vsd_response::RESPONSE_EDIT_RS_ERROR] = "edit rs error : "; + response_error_message_dic[l7vsd_response::RESPONSE_REPLICATION_ERROR] = "replication command error : "; + response_error_message_dic[l7vsd_response::RESPONSE_LOG_ERROR] = "log command error : "; + response_error_message_dic[l7vsd_response::RESPONSE_SNMP_ERROR] = "snmp command error : "; + response_error_message_dic[l7vsd_response::RESPONSE_PARAMETER_ERROR] = "parameter error : "; + + replication_mode_string_dic[replication::REPLICATION_OUT] = "OUT"; + replication_mode_string_dic[replication::REPLICATION_SINGLE] = "SINGLE"; + replication_mode_string_dic[replication::REPLICATION_MASTER] = "MASTER"; + replication_mode_string_dic[replication::REPLICATION_SLAVE] = "SLAVE"; + replication_mode_string_dic[replication::REPLICATION_MASTER_STOP] = "MASTER_STOP"; + replication_mode_string_dic[replication::REPLICATION_SLAVE_STOP] = "SLAVE_STOP"; } //! Get l7vsadm parameter data -void l7vs::l7vsadm::set_parameter(){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 36, "l7vsadm::set_parameter", __FILE__, __LINE__ ); - - // Get and Set l7vsadm all parameter value. - Parameter param; - error_code err; - - // command_wait_interval - command_wait_interval = param.get_int(PARAM_COMP_L7VSADM, "cmd_interval", err); - if( !err ){ - if( command_wait_interval < 0 || - command_wait_interval > L7VSADM_MAX_WAIT ){ - // When illegal parameter value, use default parameter value. - command_wait_interval = L7VSADM_DEFAULT_WAIT_INTERVAL; - std::string msg("Illegal cmd_interval parameter value. Use default value."); - Logger::putLogWarn(LOG_CAT_L7VSADM_COMMON, 1, msg, __FILE__, __LINE__); - } - } - else{ - command_wait_interval = L7VSADM_DEFAULT_WAIT_INTERVAL; - std::string msg("Get cmd_interval parameter error. Use default value."); - Logger::putLogWarn(LOG_CAT_L7VSADM_COMMON, 2, msg, __FILE__, __LINE__); - } - - //command_wait_count - command_wait_count = param.get_int(PARAM_COMP_L7VSADM, "cmd_count", err); - if( !err ){ - if( command_wait_count < 0 || - command_wait_count > L7VSADM_MAX_WAIT ){ - // When illegal parameter value, use default parameter value. - command_wait_count = L7VSADM_DEFAULT_WAIT_COUNT; - std::string msg("Illegal cmd_count parameter value. Use default value."); - Logger::putLogWarn(LOG_CAT_L7VSADM_COMMON, 3, msg, __FILE__, __LINE__); - } - } - else{ - command_wait_count = L7VSADM_DEFAULT_WAIT_COUNT; - std::string msg("Get cmd_count parameter error. Use default value."); - Logger::putLogWarn(LOG_CAT_L7VSADM_COMMON, 4, msg, __FILE__, __LINE__); - } - - if ((command_wait_interval * command_wait_count) > L7VSADM_MAX_WAIT) { - // When wait value too long, use default parameter value. - command_wait_interval = L7VSADM_DEFAULT_WAIT_INTERVAL; - command_wait_count = L7VSADM_DEFAULT_WAIT_COUNT; - std::string msg("Command wait value too long. Use default value."); - Logger::putLogWarn(LOG_CAT_L7VSADM_COMMON, 9, msg, __FILE__, __LINE__); - - } - if ((connect_wait_interval * connect_wait_count) > L7VSADM_MAX_WAIT) { - // When wait value too long, use default parameter value. - connect_wait_interval = L7VSADM_DEFAULT_WAIT_INTERVAL; - connect_wait_count = L7VSADM_DEFAULT_WAIT_COUNT; - std::string msg("Connect wait value too long. Use default value."); - Logger::putLogWarn(LOG_CAT_L7VSADM_COMMON, 10, msg, __FILE__, __LINE__); - } +void l7vs::l7vsadm::set_parameter() +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 36, "l7vsadm::set_parameter", __FILE__, __LINE__); + + // Get and Set l7vsadm all parameter value. + Parameter param; + error_code err; + + // command_wait_interval + command_wait_interval = param.get_int(PARAM_COMP_L7VSADM, "cmd_interval", err); + if (!err) { + if (command_wait_interval < 0 || + command_wait_interval > L7VSADM_MAX_WAIT) { + // When illegal parameter value, use default parameter value. + command_wait_interval = L7VSADM_DEFAULT_WAIT_INTERVAL; + std::stringstream msg; + msg << boost::format("Illegal cmd_interval parameter value. Use default value(%s).") + % L7VSADM_DEFAULT_WAIT_INTERVAL; + Logger::putLogWarn(LOG_CAT_L7VSADM_COMMON, 1, msg.str(), __FILE__, __LINE__); + } + } else { + command_wait_interval = L7VSADM_DEFAULT_WAIT_INTERVAL; + std::stringstream msg; + msg << boost::format("Get cmd_interval parameter error. Use default value(%s).") + % L7VSADM_DEFAULT_WAIT_INTERVAL; + Logger::putLogWarn(LOG_CAT_L7VSADM_COMMON, 2, msg.str(), __FILE__, __LINE__); + } + + //command_wait_count + command_wait_count = param.get_int(PARAM_COMP_L7VSADM, "cmd_count", err); + if (!err) { + if (command_wait_count < 0 || + command_wait_count > L7VSADM_MAX_WAIT) { + // When illegal parameter value, use default parameter value. + command_wait_count = L7VSADM_DEFAULT_WAIT_COUNT; + std::stringstream msg; + msg << boost::format("Illegal cmd_count parameter value. Use default value(%s).") + % L7VSADM_DEFAULT_WAIT_COUNT; + Logger::putLogWarn(LOG_CAT_L7VSADM_COMMON, 3, msg.str(), __FILE__, __LINE__); + } + } else { + command_wait_count = L7VSADM_DEFAULT_WAIT_COUNT; + std::stringstream msg; + msg << boost::format("Get cmd_count parameter error. Use default value(%s).") + % L7VSADM_DEFAULT_WAIT_COUNT; + Logger::putLogWarn(LOG_CAT_L7VSADM_COMMON, 4, msg.str(), __FILE__, __LINE__); + } + + if ((command_wait_interval * command_wait_count) > L7VSADM_MAX_WAIT) { + // When wait value too long, use default parameter value. + command_wait_interval = L7VSADM_DEFAULT_WAIT_INTERVAL; + command_wait_count = L7VSADM_DEFAULT_WAIT_COUNT; + std::stringstream msg; + msg << boost::format("Command wait value too long. Use default value(%s).") + % L7VSADM_DEFAULT_WAIT_COUNT; + Logger::putLogWarn(LOG_CAT_L7VSADM_COMMON, 9, msg.str(), __FILE__, __LINE__); + } } //! l7vsadm command execute -bool l7vs::l7vsadm::execute( int argc, char* argv[] ){ - Logger logger( LOG_CAT_L7VSADM_COMMON, 37, "l7vsadm::execute", __FILE__, __LINE__ ); - - /*-------- DEBUG LOG --------*/ - if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSADM_COMMON ) ){ - std::stringstream debugstr; - debugstr << boost::format( "l7vsadm::execute arguments:%s" ) % argument_debug_dump( argc, argv ); - Logger::putLogDebug( LOG_CAT_L7VSADM_COMMON, 38, debugstr.str(), __FILE__, __LINE__ ); - } - /*------ DEBUG LOG END ------*/ - - // set sighanlder - if ( 0 > set_sighandlers() ) { - std::string buf("set_sighandlers failed."); - std::cerr << "COMMON ERROR : " << buf << std::endl; - Logger::putLogError( LOG_CAT_L7VSADM_COMMON, 1, buf, __FILE__, __LINE__ ); - return false; - } +bool l7vs::l7vsadm::execute(int argc, char *argv[]) +{ + Logger logger(LOG_CAT_L7VSADM_COMMON, 37, "l7vsadm::execute", __FILE__, __LINE__); + + /*-------- DEBUG LOG --------*/ + if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSADM_COMMON)) { + std::stringstream debugstr; + debugstr << boost::format("l7vsadm::execute arguments: %s") % argument_debug_dump(argc, argv); + Logger::putLogDebug(LOG_CAT_L7VSADM_COMMON, 38, debugstr.str(), __FILE__, __LINE__); + } + /*------ DEBUG LOG END ------*/ + + // set sighandler + if (0 > set_sighandlers()) { + std::string buf("set_sighandlers failed."); + std::cerr << "COMMON ERROR: " << buf << std::endl; + Logger::putLogError(LOG_CAT_L7VSADM_COMMON, 1, buf, __FILE__, __LINE__); + return false; + } - // readparam - set_parameter(); + // read param + set_parameter(); - // Get l7vsadm execute file path from /proc/(pid)/exe (symbolic link) - char l7vsadm_file_path[256]; - memset(l7vsadm_file_path, 0, sizeof(l7vsadm_file_path)); - readlink("/proc/self/exe", l7vsadm_file_path, sizeof(l7vsadm_file_path)); + // Get l7vsadm execute file path from /proc/(pid)/exe (symbolic link) + char l7vsadm_file_path[256]; + ssize_t retsize; + memset(l7vsadm_file_path, 0, sizeof(l7vsadm_file_path)); + retsize = readlink("/proc/self/exe", l7vsadm_file_path, sizeof(l7vsadm_file_path)); - // L7vsadm command conflict check. (Try l7vsadm execute file lock) - file_lock lock( l7vsadm_file_path, l7vsadm_err ); - if( l7vsadm_err ){ - std::cerr << "COMMON ERROR : " << l7vsadm_err.get_message() << std::endl; - Logger::putLogError( LOG_CAT_L7VSADM_COMMON, 2, l7vsadm_err.get_message(), __FILE__, __LINE__ ); - return false; - } - - try{ - // l7vsadm file lock wait - int command_retry_count = 0; - while( true ){ - // Check signal. - if( signal_flag ){ + // L7vsadm command conflict check. (Try l7vsadm execute file lock) + file_lock lock(l7vsadm_file_path, l7vsadm_err); + if (l7vsadm_err) { + std::cerr << "COMMON ERROR: " << l7vsadm_err.get_message() << std::endl; + Logger::putLogError(LOG_CAT_L7VSADM_COMMON, 2, l7vsadm_err.get_message(), __FILE__, __LINE__); + return false; + } + + try { + // l7vsadm file lock wait + int command_retry_count = 0; + while (true) { + // Check signal. + if (signal_flag) { + std::stringstream buf; + buf << boost::format("Signal (%d) Received.") % received_sig; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_COMMON, 3, buf.str(), __FILE__, __LINE__); + break; + } + + // Try lock l7vsadm file. + if (lock.try_lock()) { + break; + } + + ++command_retry_count; + if (command_retry_count > command_wait_count) { + // L7vsadm file lock error. (l7vsadm is executing) + std::string buf("L7vsadm file lock timeout. (l7vsadm is already executing)"); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_COMMON, 4, buf, __FILE__, __LINE__); + break; + } + + std::stringstream buf; + buf << boost::format("L7vsadm file lock error. (l7vsadm is already executing) (retry %d)") % command_retry_count; + Logger::putLogWarn(LOG_CAT_L7VSADM_COMMON, 11, buf.str(), __FILE__, __LINE__); + + // Lock retrying. + boost::xtime xt; + xtime_get(&xt, boost::TIME_UTC); + xt.sec += command_wait_interval; + boost::thread::sleep(xt); + } + + // display err + if (l7vsadm_err) { + std::cerr << "COMMON ERROR: " << l7vsadm_err.get_message() << std::endl; + return false; + } + + // no argument, assume list command + if (1 == argc) { + request.command = l7vsadm_request::CMD_LIST; + } else { + // parse command line + int pos = 1; + parse_cmd_map_type::iterator itr = command_dic.find(argv[pos]); + if (itr != command_dic.end()) { + itr->second(argc, argv); + } else { + std::string buf("command not found."); + l7vsadm_err.setter(true, buf); + Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 88, buf, __FILE__, __LINE__); + } + } + + // display command parse result + if (l7vsadm_err) { + std::cerr << "PARSE ERROR: " << l7vsadm_err.get_message() << std::endl; + std::cerr << usage() << std::endl; + return false; + } + + if (l7vsadm_request::CMD_HELP != request.command) { + // communicate to l7vsd + using boost::asio::local::stream_protocol; + boost::array response_buffer; + response_buffer.assign(0x00); + + // connect + boost::asio::io_service io; + stream_protocol::socket s(io); + + // Check signal. + if (signal_flag) { + std::stringstream buf; + buf << boost::format("Signal (%d) Received.") % received_sig; + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_COMMON, 5, buf.str(), __FILE__, __LINE__); + } else { + // Try connect to config socket. + boost::system::error_code err; + s.connect(stream_protocol::endpoint(L7VS_CONFIG_SOCKNAME), err); + if (err) { + std::stringstream buf; + buf << boost::format("connect() failed: %s.") % err.message(); + l7vsadm_err.setter(true, buf.str()); + Logger::putLogError(LOG_CAT_L7VSADM_COMMON, 9, buf.str(), __FILE__, __LINE__); + } + } + + // display err + if (l7vsadm_err) { + std::cerr << "COMMON ERROR: " << l7vsadm_err.get_message() << std::endl; + return false; + } + + /*-------- DEBUG LOG --------*/ + if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSADM_COMMON)) { + std::stringstream debugstr; + debugstr << boost::format("l7vsadm_send_request:%s") % request; + Logger::putLogDebug(LOG_CAT_L7VSADM_COMMON, 39, debugstr.str(), __FILE__, __LINE__); + } + /*------ DEBUG LOG END ------*/ + + // write sockfile + std::stringstream send_stream; + boost::archive::text_oarchive oa(send_stream); + oa << (const l7vs::l7vsadm_request &) request; + boost::asio::write(s, boost::asio::buffer(send_stream.str())); + + // read sockfile + s.read_some(boost::asio::buffer(response_buffer)); + + std::stringstream recv_stream; + recv_stream << &(response_buffer[0]); + boost::archive::text_iarchive ia(recv_stream); + ia >> response; + + /*-------- DEBUG LOG --------*/ + if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSADM_COMMON)) { + std::stringstream debugstr; + debugstr << boost::format("l7vsadm_recv_response:%s") % response; + Logger::putLogDebug(LOG_CAT_L7VSADM_COMMON, 40, debugstr.str(), __FILE__, __LINE__); + } + /*------ DEBUG LOG END ------*/ + + // close socket + s.close(); + + // display result + if (l7vsd_response::RESPONSE_OK == response.status) { + disp_result_map_type::iterator itr = disp_result_dic.find(request.command); + if (itr != disp_result_dic.end()) + itr->second(); + } else { + std::stringstream buf; + response_error_message_map_type::iterator itr = response_error_message_dic.find(response.status); + if (itr != response_error_message_dic.end()) + buf << itr->second << response.message; + else + buf << "COMMAND ERROR: " << response.message; + std::cerr << buf.str() << std::endl; + Logger::putLogError(LOG_CAT_L7VSADM_COMMON, 7, buf.str(), __FILE__, __LINE__); + return false; + } + } //if help_mode + } //try + catch (std::exception &e) { std::stringstream buf; - buf << boost::format( "Signal (%d) Received." ) % received_sig; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_COMMON, 3, buf.str(), __FILE__, __LINE__ ); - break; - } - - // Try lock l7vsadm file. - if( lock.try_lock() ){ - break; - } - - ++command_retry_count; - if (command_retry_count > command_wait_count) { - // L7vsadm file lock error. (l7vsadm is executing) - std::string buf( "L7vsadm file lock timeout. (l7vsadm is already executing)" ); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_COMMON, 4, buf, __FILE__, __LINE__ ); - break; - } - - std::stringstream buf; - buf << boost::format( "L7vsadm file lock error. (l7vsadm is already executing) (retry %d)" ) % command_retry_count; - Logger::putLogWarn( LOG_CAT_L7VSADM_COMMON, 11, buf.str(), __FILE__, __LINE__ ); - - // Lock retrying. - boost::xtime xt; - xtime_get(&xt, boost::TIME_UTC); - xt.sec += command_wait_interval; - boost::thread::sleep(xt); - } - - // display err - if( l7vsadm_err ){ - std::cerr << "COMMON ERROR : " << l7vsadm_err.get_message() << std::endl; - return false; - } - - // no argument, assume list command - if( 1 == argc ){ - request.command = l7vsadm_request::CMD_LIST; - } - else { - // parse command line - int pos = 1; - parse_cmd_map_type::iterator itr = command_dic.find( argv[pos] ); - if( itr != command_dic.end() ){ - itr->second( argc, argv ); - } - else{ - std::string buf("command not found."); - l7vsadm_err.setter( true, buf ); - Logger::putLogError( LOG_CAT_L7VSADM_PARSE, 88, buf, __FILE__, __LINE__ ); - } - } - - // display command parse result - if( l7vsadm_err ){ - std::cerr << "PARSE ERROR : " << l7vsadm_err.get_message() << std::endl; - std::cerr << usage() << std::endl; - return false; - } - - if( l7vsadm_request::CMD_HELP != request.command ){ - // communicate to l7vsd - using boost::asio::local::stream_protocol; - boost::array< char, COMMAND_BUFFER_SIZE > response_buffer; - response_buffer.assign( 0x00 ); - - // connect - boost::asio::io_service io; - stream_protocol::socket s( io ); - - int connect_retry_count = 0; - while( true ){ - // Check signal. - if( signal_flag ){ - std::stringstream buf; - buf << boost::format( "Signal (%d) Received." ) % received_sig; - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_COMMON, 5, buf.str(), __FILE__, __LINE__ ); - break; - } - - // Try connect to config socket. - boost::system::error_code err; - s.connect(stream_protocol::endpoint( L7VS_CONFIG_SOCKNAME ), err ); - if( !err ){ - break; - }else{ - //connect_retry_count was to be unused. - //must be delete below "waiting" code! - std::stringstream buf; - buf << boost::format( "connect() failed: %s.") % err.message(); - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_COMMON, 9, buf.str(), __FILE__, __LINE__ ); - break; - } - - connect_retry_count++; - if (connect_retry_count > connect_wait_count) { - std::stringstream buf; - buf << boost::format( "connect() to daemon timeout: %s." ) % err.message(); - l7vsadm_err.setter( true, buf.str() ); - Logger::putLogError( LOG_CAT_L7VSADM_COMMON, 6, buf.str(), __FILE__, __LINE__ ); - break; - } - // Connect retrying. - boost::xtime xt; - xtime_get(&xt, boost::TIME_UTC); - xt.sec += connect_wait_interval; - boost::thread::sleep(xt); - } - - // display err - if( l7vsadm_err ){ - std::cerr << "COMMON ERROR : " << l7vsadm_err.get_message() << std::endl; - return false; - } - - /*-------- DEBUG LOG --------*/ - if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSADM_COMMON ) ){ - std::stringstream debugstr; - debugstr << boost::format( "l7vsadm_send_request:%s" ) % request; - Logger::putLogDebug( LOG_CAT_L7VSADM_COMMON, 39, debugstr.str(), __FILE__, __LINE__ ); - } - /*------ DEBUG LOG END ------*/ - - // write sockfile - std::stringstream send_stream; - boost::archive::text_oarchive oa( send_stream ); - oa << (const l7vs::l7vsadm_request&) request; - boost::asio::write( s, boost::asio::buffer( send_stream.str() ) ); - - // read sockfile - s.read_some( boost::asio::buffer( response_buffer ) ); - - std::stringstream recv_stream; - recv_stream << &(response_buffer[0]); - boost::archive::text_iarchive ia( recv_stream ); - ia >> response; - - /*-------- DEBUG LOG --------*/ - if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSADM_COMMON ) ){ - std::stringstream debugstr; - debugstr << boost::format( "l7vsadm_recv_response:%s" ) % response; - Logger::putLogDebug( LOG_CAT_L7VSADM_COMMON, 40, debugstr.str(), __FILE__, __LINE__ ); - } - /*------ DEBUG LOG END ------*/ - - // close socket - s.close(); - - // display result - if( l7vsd_response::RESPONSE_OK == response.status ){ - disp_result_map_type::iterator itr = disp_result_dic.find( request.command ); - if( itr != disp_result_dic.end() ) - itr->second(); - } - else{ - std::stringstream buf; - response_error_message_map_type::iterator itr = response_error_message_dic.find( response.status ); - if( itr != response_error_message_dic.end() ) - buf << itr->second << response.message; - else - buf << "COMMAND ERROR : " << response.message; + buf << "COMMON ERROR: " << e.what(); std::cerr << buf.str() << std::endl; - Logger::putLogError( LOG_CAT_L7VSADM_COMMON, 7, buf.str(), __FILE__, __LINE__ ); - return false; - } - } //if help_mode - } //try - catch( std::exception& e ){ - std::stringstream buf; - buf << "COMMON ERROR : " << e.what(); - std::cerr << buf.str() << std::endl; - Logger::putLogError( LOG_CAT_L7VSADM_COMMON, 8, buf.str(), __FILE__, __LINE__ ); - return false; - } - return true; + Logger::putLogError(LOG_CAT_L7VSADM_COMMON, 8, buf.str(), __FILE__, __LINE__); + return false; + } + return true; } //! argument dump for debug -//! @param[in] argument count -//! @param[in] argument value -std::string l7vs::l7vsadm::argument_debug_dump( int argc, char* argv[] ){ - std::stringstream buf; - if( !argv ){ - buf << "argument=(null)"; - } - else{ - buf << boost::format( "argument={argc=%d: " ) % argc; - for( int i = 0; i < argc; ++i){ - buf << boost::format( "argv[%d]=%s: " ) % i % argv[i]; - } - buf << "}"; - } - return buf.str(); +//! @param[in] argument count +//! @param[in] argument value +std::string l7vs::l7vsadm::argument_debug_dump(int argc, char *argv[]) +{ + std::stringstream buf; + if (!argv) { + buf << "argument=(null)"; + } else { + buf << boost::format("argument={argc=%d") % argc; + for (int i = 0; i < argc; ++i) { + buf << boost::format(", argv[%d]=%s") % i % argv[i]; + } + buf << "}"; + } + return buf.str(); } //! signal handler function -//! @param[in] signal -static void sig_exit_handler( int sig ){ - received_sig = sig; - signal_flag = true; +//! @param[in] signal +static void sig_exit_handler(int sig) +{ + received_sig = sig; + signal_flag = true; } -//! set singal handler function -//! @param[in] signal -//! @param[in] handler function pointer -//! @return 0/success, -1/fail -static int set_sighandler( int sig, void ( *handler )( int ) ){ - struct sigaction act; - int ret; +//! set signal handler function +//! @param[in] signal +//! @param[in] handler function pointer +//! @return 0/success, -1/fail +static int set_sighandler(int sig, void (*handler)(int)) +{ + struct sigaction act; + int ret; - ret = sigaction( sig, NULL, &act ); - if( 0 > ret ) return ret; + ret = sigaction(sig, NULL, &act); + if (0 > ret) { + return ret; + } - act.sa_flags &= ~SA_RESETHAND; - act.sa_handler = handler; + act.sa_flags &= ~SA_RESETHAND; + act.sa_handler = handler; - ret = sigaction( sig, &act, NULL ); - if( 0 > ret ) return ret; + ret = sigaction(sig, &act, NULL); + if (0 > ret) { + return ret; + } - return 0; + return 0; } -//! set all singal handler function -//! @return 0/success, -1/fail -static int set_sighandlers() { - int ret; - -#define SET_SIGHANDLER(sig, handler) \ - do { \ - ret = set_sighandler((sig), (handler)); \ - if (ret < 0) { \ - return ret; \ - } \ +//! set all signal handler function +//! @return 0/success, -1/fail +static int set_sighandlers() +{ + int ret; + +#define SET_SIGHANDLER(sig, handler) \ + do { \ + ret = set_sighandler((sig), (handler)); \ + if (ret < 0) { \ + return ret; \ + } \ } while (0) - SET_SIGHANDLER( SIGHUP, sig_exit_handler ); - SET_SIGHANDLER( SIGINT, sig_exit_handler ); - SET_SIGHANDLER( SIGQUIT, sig_exit_handler ); - SET_SIGHANDLER( SIGPIPE, sig_exit_handler ); - SET_SIGHANDLER( SIGTERM, sig_exit_handler ); - SET_SIGHANDLER( SIGUSR1, sig_exit_handler ); - SET_SIGHANDLER( SIGUSR2, sig_exit_handler ); + SET_SIGHANDLER(SIGHUP, sig_exit_handler); + SET_SIGHANDLER(SIGINT, sig_exit_handler); + SET_SIGHANDLER(SIGQUIT, sig_exit_handler); + SET_SIGHANDLER(SIGPIPE, sig_exit_handler); + SET_SIGHANDLER(SIGTERM, sig_exit_handler); + SET_SIGHANDLER(SIGUSR1, sig_exit_handler); + SET_SIGHANDLER(SIGUSR2, sig_exit_handler); #undef SET_SIGHANDLER - return 0; + return 0; } -#ifndef UNIT_TEST -int main( int argc, char* argv[] ){ - - try { - l7vs::Logger logger; - l7vs::Parameter param; - logger.loadConf(); - } catch(...) { - } - +#ifndef UNIT_TEST +int main(int argc, char *argv[]) +{ + try { + l7vs::Logger logger; + l7vs::Parameter param; + logger.loadConf(); + } catch (...) { + } - l7vs::l7vsadm adm; - if( !adm.execute( argc, argv ) ){ - return -1; - } - return 0; + l7vs::l7vsadm adm; + if (!adm.execute(argc, argv)) { + return -1; + } + return 0; } -#endif //UNIT_TEST - +#endif //UNIT_TEST