OSDN Git Service

Improvement to compilation warning about indication of SIGNUM.
[ultramonkey-l7/ultramonkey-l7-v3.git] / l7vsd / src / l7vsd.cpp
index 9f3591d..a83f9aa 100644 (file)
 
 #include "l7vsd.h"
 #include "error_code.h"
-
+#include "snmpagent.h"
+#include "snmpfunc.h"
 #define    PARAM_SCHED_ALGORITHM    "task_scheduler_algorithm"
 #define PARAM_SCHED_PRIORITY    "task_scheduler_priority"
+#define TRAP_TIME_STRING_MAX_SIZE   (20)
 
-namespace l7vs{
+namespace l7vs
+{
 
 //! constructor
 l7vsd::l7vsd()
-    :    help(false),
-        exit_requested(0),
-        received_sig(0){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 1, "l7vsd::l7vsd", __FILE__, __LINE__ );
-
-    option_dic["-h"]        = boost::bind( &l7vsd::parse_help, this, _1, _2, _3 );
-    option_dic["--help"]    = boost::bind( &l7vsd::parse_help, this, _1, _2, _3 );
-
-    starttime = boost::posix_time::second_clock::local_time();
+        :    help(false),
+             debug(false),
+             exit_requested(0),
+             received_sig(0)
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 1, "l7vsd::l7vsd", __FILE__, __LINE__);
+
+        option_dic["-h"]        = boost::bind(&l7vsd::parse_help, this, _1, _2, _3);
+        option_dic["--help"]    = boost::bind(&l7vsd::parse_help, this, _1, _2, _3);
+        option_dic["-d"]                = boost::bind(&l7vsd::parse_debug, this, _1, _2, _3);
+        option_dic["--debug"]   = boost::bind(&l7vsd::parse_debug, this, _1, _2, _3);
+
+        starttime = boost::posix_time::second_clock::local_time();
 }
 
 //! destructor
-l7vsd::~l7vsd(){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 2, "l7vsd::~l7vsd", __FILE__, __LINE__ );
+l7vsd::~l7vsd()
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 2, "l7vsd::~l7vsd", __FILE__, __LINE__);
 }
 
 //! virtual_service list command
-//! @param[out]    arry of vs_element
+//! @param[out]    array of vs_element
 //! @param[out]    error_code
-void    l7vsd::list_virtual_service( vselist_type* out_vslist, error_code& err ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 3, "l7vsd::list_virtual_service", __FILE__, __LINE__ );
-
-    boost::mutex::scoped_lock command_lock( command_mutex );
-    boost::mutex::scoped_lock vslist_lock( vslist_mutex );
-
-    if( !out_vslist ){
-        std::string msg("out_vslist pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 1, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-
-    // make vselement list
-    for( vslist_type::iterator itr = vslist.begin();
-         itr != vslist.end();
-         ++itr ){
-        out_vslist->push_back( (*itr)->get_element() );
-    }
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-        std::stringstream    debugstr;
-        debugstr << "l7vsd::list_virtual_service return value:";
-        unsigned int i = 0;
-        BOOST_FOREACH( virtualservice_element vs_elem, *out_vslist ){
-            debugstr << boost::format( "*out_vslist[%d]=" ) % i;
-            debugstr << vs_elem;
-            debugstr << ": ";
-            ++i;
+void    l7vsd::list_virtual_service(vselist_type *out_vslist, error_code &err)
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 3, "l7vsd::list_virtual_service", __FILE__, __LINE__);
+
+        boost::mutex::scoped_lock command_lock(command_mutex);
+        boost::mutex::scoped_lock vslist_lock(vslist_mutex);
+
+        if (!out_vslist) {
+                std::string msg("out_vslist pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 1, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
+        }
+
+        // make vselement list
+        for (vslist_type::iterator itr = vslist.begin();
+             itr != vslist.end();
+             ++itr) {
+                out_vslist->push_back((*itr)->get_element());
+        }
+
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                std::stringstream    debugstr;
+                debugstr << "l7vsd::list_virtual_service return value:";
+                unsigned int i = 0;
+                BOOST_FOREACH(virtualservice_element vs_elem, *out_vslist) {
+                        debugstr << boost::format("*out_vslist[%d]=") % i;
+                        debugstr << vs_elem;
+                        debugstr << ": ";
+                        ++i;
+                }
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 4, debugstr.str(), __FILE__, __LINE__);
         }
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 4, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
+        /*------ DEBUG LOG END ------*/
 
 }
 
 //! virtual_service list verbose command
-//! @param[out]    arry of vs_element
+//! @param[out]    array of vs_element
 //! @param[out]    error_code
-void    l7vsd::list_virtual_service_verbose( l7vsd_response* response, error_code& err ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 5, "l7vsd::list_virtual_service_verbose", __FILE__, __LINE__ );
-
-    boost::mutex::scoped_lock command_lock( command_mutex );
-    boost::mutex::scoped_lock vslist_lock( vslist_mutex );
-
-    if( !response ){
-        std::string msg("response pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 2, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-    if( !bridge ){
-        std::string msg("bridge pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 3, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-    if( !rep ){
-        std::string msg("rep pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 4, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-
-    unsigned long long    total_client_recv_byte = 0ULL;
-    unsigned long long    total_client_send_byte = 0ULL;
-    unsigned long long    total_realserver_recv_byte = 0ULL;
-    unsigned long long    total_realserver_send_byte = 0ULL;
-
-    // make vselement list
-    for( vslist_type::iterator itr = vslist.begin();
-         itr != vslist.end();
-         ++itr ){
-        response->virtualservice_status_list.push_back( (*itr)->get_element() );
-        // calc send recv bytes
-        total_client_recv_byte += (*itr)->get_up_recv_size();
-        total_client_send_byte += (*itr)->get_down_send_size();
-        total_realserver_recv_byte += (*itr)->get_down_recv_size();
-        total_realserver_send_byte += (*itr)->get_up_send_size();
-    }
-
-    // get_replication_mode
-    response->replication_mode_status = rep->get_status();
-
-    // get all category log level
-    Logger::getLogLevelAll( response->log_status_list );
-
-    // get snmp connect status
-    response->snmp_connection_status = bridge->get_connectionstate();
-
-    // get snmp all category log level
-    typedef std::map< LOG_CATEGORY_TAG, LOG_LEVEL_TAG > snmplogmap_type; 
-    snmplogmap_type snmplogmap;
-    bridge->get_loglevel_allcategory( snmplogmap );
-    for( snmplogmap_type::iterator itr = snmplogmap.begin();
-         itr != snmplogmap.end();
-         ++itr ){
-        response->snmp_log_status_list.push_back( *itr );
-    }
-
-    // calc total bps
-    unsigned long long    total_bytes =
-        total_client_recv_byte +
-        total_client_send_byte +
-        total_realserver_recv_byte +
-        total_realserver_send_byte;
-
-    boost::posix_time::ptime    now =
-        boost::posix_time::second_clock::local_time();
-    boost::posix_time::time_duration    dur = ( now - starttime );
-    if( 0ULL != dur.total_seconds() )
-        response->total_bps = ( total_bytes / dur.total_seconds() );
-    else
-        response->total_bps = 0ULL;
-
-    response->total_client_recv_byte = total_client_recv_byte;
-    response->total_client_send_byte = total_client_send_byte;
-    response->total_realserver_recv_byte = total_realserver_recv_byte;
-    response->total_realserver_send_byte = total_realserver_send_byte;
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-        std::stringstream    debugstr;
-        debugstr << boost::format( "l7vsd::list_virtual_service_verbose return value:%s" ) % *response;
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 6, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
+void    l7vsd::list_virtual_service_verbose(l7vsd_response *response, error_code &err)
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 5, "l7vsd::list_virtual_service_verbose", __FILE__, __LINE__);
+
+        boost::mutex::scoped_lock command_lock(command_mutex);
+        boost::mutex::scoped_lock vslist_lock(vslist_mutex);
+
+        if (!response) {
+                std::string msg("response pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 2, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
+        }
+
+        if (!rep) {
+                std::string msg("rep pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 4, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
+        }
+
+        unsigned long long    total_client_recv_byte = 0ULL;
+        unsigned long long    total_client_send_byte = 0ULL;
+        unsigned long long    total_realserver_recv_byte = 0ULL;
+        unsigned long long    total_realserver_send_byte = 0ULL;
+
+        // make vselement list
+        for (vslist_type::iterator itr = vslist.begin();
+             itr != vslist.end();
+             ++itr) {
+                response->virtualservice_status_list.push_back((*itr)->get_element());
+                // calc send recv bytes
+                total_client_recv_byte += (*itr)->get_up_recv_size();
+                total_client_send_byte += (*itr)->get_down_send_size();
+                total_realserver_recv_byte += (*itr)->get_down_recv_size();
+                total_realserver_send_byte += (*itr)->get_up_send_size();
+        }
+
+        // get_replication_mode
+        response->replication_mode_status = rep->get_status();
+
+        // get all category log level
+        Logger::getLogLevelAll(response->log_status_list);
+
+        //get snmp info
+        response->snmpinfo = snmpagent::get_snmp_info();
+
+        // calc total bps
+        unsigned long long    total_bytes =
+                total_client_recv_byte +
+                total_client_send_byte +
+                total_realserver_recv_byte +
+                total_realserver_send_byte;
+
+        boost::posix_time::ptime    now =
+                boost::posix_time::second_clock::local_time();
+        boost::posix_time::time_duration    dur = (now - starttime);
+        if (0ULL != dur.total_seconds())
+                response->total_bps = (total_bytes / dur.total_seconds());
+        else
+                response->total_bps = 0ULL;
+
+        response->total_client_recv_byte = total_client_recv_byte;
+        response->total_client_send_byte = total_client_send_byte;
+        response->total_realserver_recv_byte = total_realserver_recv_byte;
+        response->total_realserver_send_byte = total_realserver_send_byte;
+
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                std::stringstream    debugstr;
+                debugstr << boost::format("l7vsd::list_virtual_service_verbose return value:%s") % *response;
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 6, debugstr.str(), __FILE__, __LINE__);
+        }
+        /*------ DEBUG LOG END ------*/
 
 }
 
 //! virtual_service add command
 //! @param[in]    vs_element
 //! @param[out]    error_code
-void    l7vsd::add_virtual_service( const virtualservice_element* in_vselement, error_code& err ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 7, "l7vsd::add_virtual_service", __FILE__, __LINE__ );
-
-    boost::mutex::scoped_lock command_lock( command_mutex );
-    boost::mutex::scoped_lock vslist_lock( vslist_mutex );
-
-    if( !in_vselement ){
-        std::string msg("in_vselement pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 5, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-        std::stringstream    debugstr;
-        debugstr << "l7vsd::add_virtual_service arguments:";
-        debugstr << boost::format( "*in_vselement=%s" ) % *in_vselement;
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 8, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
-
-    if( vslist.end() == search_vslist( *in_vselement ) ){
-        // replication null check
-        if( NULL == rep ){
-            std::string msg("replication pointer is null.");
-            Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 6, msg, __FILE__, __LINE__);
-    
-            err.setter( true, msg );
-            return;
-        }
-        // create virtualservice
-        virtualservice_ptr    vsptr;
-        try{
-            vsptr.reset( new virtual_service( *this, *rep, *in_vselement ) );
+void    l7vsd::add_virtual_service(const virtualservice_element *in_vselement, error_code &err)
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 7, "l7vsd::add_virtual_service", __FILE__, __LINE__);
+
+        boost::mutex::scoped_lock command_lock(command_mutex);
+        boost::mutex::scoped_lock vslist_lock(vslist_mutex);
+
+        if (!in_vselement) {
+                std::string msg("in_vselement pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 5, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
         }
-        catch( std::bad_alloc& ){
-            std::string msg("virtualservice create failed.");
-            Logger::putLogError(LOG_CAT_L7VSD_MAINTHREAD, 1, msg, __FILE__, __LINE__);
-            err.setter( true, msg );
-            return;
-        }
-        if( NULL == vsptr ){
-            std::string msg("virtualservice pointer is null.");
-            Logger::putLogError(LOG_CAT_L7VSD_MAINTHREAD, 2, msg, __FILE__, __LINE__);
-            err.setter( true, msg );
-            return;
+
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                std::stringstream    debugstr;
+                debugstr << "l7vsd::add_virtual_service arguments:";
+                debugstr << boost::format("*in_vselement=%s") % *in_vselement;
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 8, debugstr.str(), __FILE__, __LINE__);
         }
+        /*------ DEBUG LOG END ------*/
 
-        // vs initialize
-        vsptr->initialize( err );
-        if( err )    return;
+        if (vslist.end() == search_vslist(*in_vselement)) {
+                // replication null check
+                if (NULL == rep) {
+                        std::string msg("replication pointer is null.");
+                        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 6, msg, __FILE__, __LINE__);
+
+                        err.setter(true, msg);
+                        return;
+                }
+                // create virtualservice
+                virtualservice_ptr    vsptr;
+                try {
+                        vsptr.reset(new virtual_service(*this, *rep, *in_vselement));
+                } catch (std::bad_alloc &) {
+                        std::string msg("virtualservice create failed.");
+                        Logger::putLogError(LOG_CAT_L7VSD_MAINTHREAD, 1, msg, __FILE__, __LINE__);
+                        err.setter(true, msg);
+                        return;
+                }
+                if (NULL == vsptr) {
+                        std::string msg("virtualservice pointer is null.");
+                        Logger::putLogError(LOG_CAT_L7VSD_MAINTHREAD, 2, msg, __FILE__, __LINE__);
+                        err.setter(true, msg);
+                        return;
+                }
 
-        // set virtualservice
-        vsptr->set_virtualservice( *in_vselement, err );
-        if( err )    return;
+                // vs initialize
+                vsptr->initialize(err);
+                if (err)    return;
 
-        try{
-        
-            // create thread and run
-            vs_threads.create_thread( boost::bind( &virtual_service::run, vsptr ) );
+                // set virtualservice
+                vsptr->set_virtualservice(*in_vselement, err);
+                if (err)    return;
 
-        }
-        catch( ... ){
-            std::stringstream    buf;
-            buf << "virtualservice thread initialize failed.";
-            Logger::putLogError(LOG_CAT_L7VSD_MAINTHREAD, 8, buf.str(), __FILE__, __LINE__);
-            err.setter( true, buf.str() );
-            
-            vsptr->stop();
-            l7vs::error_code finalize_err;
-            vsptr->finalize( finalize_err );
-            
-            /*-------- DEBUG LOG --------*/
-            if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-                Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 41, "out l7vsd::add_virtual_service", __FILE__, __LINE__ );
-            }
-            /*------ DEBUG LOG END ------*/
-            
-            return;
-        }
-            
-        // add to vslist
-        vslist.push_back( vsptr );
+                try {
 
-        // when first vs, replication switch to master
-        if( 1U == vslist.size() ){
-            rep->switch_to_master();
+                        // create thread and run
+                        (*vsptr).vs_thread_ptr =  boost::shared_ptr<boost::thread>(vs_threads.create_thread(boost::bind(&virtual_service::run, vsptr)));
+
+                } catch (...) {
+                        std::stringstream    buf;
+                        buf << "virtualservice thread initialize failed.";
+                        Logger::putLogError(LOG_CAT_L7VSD_MAINTHREAD, 8, buf.str(), __FILE__, __LINE__);
+                        err.setter(true, buf.str());
+
+                        vsptr->stop();
+                        l7vs::error_code finalize_err;
+                        vsptr->finalize(finalize_err);
+
+                        /*-------- DEBUG LOG --------*/
+                        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 41, "out l7vsd::add_virtual_service", __FILE__, __LINE__);
+                        }
+                        /*------ DEBUG LOG END ------*/
+
+                        return;
+                }
+
+                // add to vslist
+                vslist.push_back(vsptr);
+
+                //create trap message
+                trapmessage trap_msg;
+                trap_msg.type = trapmessage::VIRTUALSERVICE_ADD;
+
+                std::ostringstream oss;
+                oss << "TRAP00020001,A virtual service was added.vs:";
+                if (in_vselement->udpmode) {
+                        if (in_vselement->udp_recv_endpoint.address().is_v6()) {
+                                oss << "[" << in_vselement->udp_recv_endpoint.address().to_string() << "]:" << in_vselement->udp_recv_endpoint.port();
+                        } else {
+                                oss << in_vselement->udp_recv_endpoint.address().to_string() << ":" << in_vselement->udp_recv_endpoint.port();
+                        }
+                } else {
+                        if (in_vselement->tcp_accept_endpoint.address().is_v6()) {
+                                oss << "[" << in_vselement->tcp_accept_endpoint.address().to_string() << "]:" << in_vselement->tcp_accept_endpoint.port();
+                        } else {
+                                oss << in_vselement->tcp_accept_endpoint.address().to_string() << ":" << in_vselement->tcp_accept_endpoint.port();
+                        }
+                }
+
+                trap_msg.message = oss.str();
+
+                error_code err_code;
+
+                //push the trap message
+                snmpagent::push_trapmessage(trap_msg, err_code);
+
+                if (err_code) {
+                        std::string msg("Push trap message failed.");
+                        Logger::putLogError(LOG_CAT_L7VSD_VIRTUALSERVICE, 124, msg, __FILE__, __LINE__);
+                }
+
+                // when first vs, replication switch to master
+                if (1U == vslist.size()) {
+                        rep->switch_to_master();
+                }
+        } else {
+                std::string msg("virtual service already exist.");
+                Logger::putLogWarn(LOG_CAT_L7VSD_VIRTUALSERVICE, 23, msg, __FILE__, __LINE__);
+
+                err.setter(true, msg);
+                return;
         }
-    }
-    else {
-        std::string msg("virtual service already exist.");
-        Logger::putLogWarn(LOG_CAT_L7VSD_VIRTUALSERVICE, 23, msg, __FILE__, __LINE__);
-
-        err.setter( true, msg );
-        return;
-    }
 }
 
 //! virtual_service del command
 //! @param[in]    vs_element
 //! @param[out]    error_code
-void    l7vsd::del_virtual_service( const virtualservice_element* in_vselement, error_code& err ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 9, "l7vsd::del_virtual_service", __FILE__, __LINE__ );
-
-    boost::mutex::scoped_lock command_lock( command_mutex );
-    boost::mutex::scoped_lock vslist_lock( vslist_mutex );
-
-    if( !in_vselement ){
-        std::string msg("in_vselement pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 7, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-        std::stringstream    debugstr;
-        debugstr << "l7vsd::del_virtual_service arguments:";
-        debugstr << boost::format( "*in_vselement=%s" ) % *in_vselement;
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 10, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
-
-    vslist_type::iterator vsitr = search_vslist( *in_vselement ,true);
-    if( vslist.end() !=  vsitr ){
-        // vs stop
-        (*vsitr)->stop();
-        // vs finalize
-        (*vsitr)->finalize( err );
-
-        // when first vs, replication switch to slave
-        if( 0U == vslist.size() ){
-            rep->switch_to_slave();
+void    l7vsd::del_virtual_service(const virtualservice_element *in_vselement, error_code &err)
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 9, "l7vsd::del_virtual_service", __FILE__, __LINE__);
+
+        boost::mutex::scoped_lock command_lock(command_mutex);
+        boost::mutex::scoped_lock vslist_lock(vslist_mutex);
+
+        if (!in_vselement) {
+                std::string msg("in_vselement pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 7, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
+        }
+
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                std::stringstream    debugstr;
+                debugstr << "l7vsd::del_virtual_service arguments:";
+                debugstr << boost::format("*in_vselement=%s") % *in_vselement;
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 10, debugstr.str(), __FILE__, __LINE__);
+        }
+        /*------ DEBUG LOG END ------*/
+
+        vslist_type::iterator vsitr = search_vslist(*in_vselement , true);
+        if (vslist.end() !=  vsitr) {
+                // vs stop
+                (*vsitr)->stop();
+                (*vsitr)->vs_thread_ptr->join();
+                vs_threads.remove_thread((*vsitr)->vs_thread_ptr.get());
+                // vs finalize
+                (*vsitr)->finalize(err);
+
+                //create trap message
+                trapmessage trap_msg;
+                trap_msg.type = trapmessage::VIRTUALSERVICE_REMOVE;
+
+                std::ostringstream oss;
+                oss << "TRAP00020003,A virtual service was eliminated.vs:";
+                if (in_vselement->udpmode) {
+                        if (in_vselement->udp_recv_endpoint.address().is_v6()) {
+                                oss << "[" << in_vselement->udp_recv_endpoint.address().to_string() << "]:" << in_vselement->udp_recv_endpoint.port();
+                        } else {
+                                oss << in_vselement->udp_recv_endpoint.address().to_string() << ":" << in_vselement->udp_recv_endpoint.port();
+                        }
+                } else {
+                        if (in_vselement->tcp_accept_endpoint.address().is_v6()) {
+                                oss << "[" << in_vselement->tcp_accept_endpoint.address().to_string() << "]:" << in_vselement->tcp_accept_endpoint.port();
+                        } else {
+                                oss << in_vselement->tcp_accept_endpoint.address().to_string() << ":" << in_vselement->tcp_accept_endpoint.port();
+                        }
+                }
+
+                trap_msg.message = oss.str();
+
+                error_code err_code;
+
+                //push the trap message
+                snmpagent::push_trapmessage(trap_msg, err_code);
+
+                if (err_code) {
+                        std::string msg("Push trap message failed.");
+                        Logger::putLogError(LOG_CAT_L7VSD_VIRTUALSERVICE, 125, msg, __FILE__, __LINE__);
+                }
+
+                // when first vs, replication switch to slave
+                if (0U == vslist.size()) {
+                        rep->switch_to_slave();
+                }
+        } else {
+                std::string msg("virtual service not found.");
+                Logger::putLogWarn(LOG_CAT_L7VSD_VIRTUALSERVICE, 24, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
         }
-    }
-    else {
-        std::string msg("virtual service not found.");
-        Logger::putLogWarn(LOG_CAT_L7VSD_VIRTUALSERVICE, 24, msg, __FILE__, __LINE__);
-
-        err.setter( true, msg );
-        return;
-    }
 }
 
 //! virtual_service edit command
 //! @param[in]    vs_element
 //! @param[out]    error_code
-void    l7vsd::edit_virtual_service( const virtualservice_element* in_vselement, error_code& err ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 11, "l7vsd::edit_virtual_service", __FILE__, __LINE__ );
-
-    boost::mutex::scoped_lock command_lock( command_mutex );
-    boost::mutex::scoped_lock vslist_lock( vslist_mutex );
-
-    if( !in_vselement ){
-        std::string msg("in_vselement pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 8, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-        std::stringstream    debugstr;
-        debugstr << "l7vsd::edit_virtual_service arguments:";
-        debugstr << boost::format( "*in_vselement=%s" ) % *in_vselement;
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 12, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
-
-    vslist_type::iterator vsitr = search_vslist( *in_vselement );
-    if( vslist.end() !=  vsitr ){
-        // edit virtualservice
-        (*vsitr)->edit_virtualservice( *in_vselement, err );
-        if( err )    return;
-    }
-    else {
-        std::string msg("virtual service not found.");
-        Logger::putLogWarn(LOG_CAT_L7VSD_VIRTUALSERVICE, 25, msg, __FILE__, __LINE__);
-
-        err.setter( true, msg );
-        return;
-    }
+void    l7vsd::edit_virtual_service(const virtualservice_element *in_vselement, error_code &err)
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 11, "l7vsd::edit_virtual_service", __FILE__, __LINE__);
+
+        boost::mutex::scoped_lock command_lock(command_mutex);
+        boost::mutex::scoped_lock vslist_lock(vslist_mutex);
+
+        if (!in_vselement) {
+                std::string msg("in_vselement pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 8, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
+        }
+
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                std::stringstream    debugstr;
+                debugstr << "l7vsd::edit_virtual_service arguments:";
+                debugstr << boost::format("*in_vselement=%s") % *in_vselement;
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 12, debugstr.str(), __FILE__, __LINE__);
+        }
+        /*------ DEBUG LOG END ------*/
+
+        vslist_type::iterator vsitr = search_vslist(*in_vselement);
+        if (vslist.end() !=  vsitr) {
+                // edit virtualservice
+                (*vsitr)->edit_virtualservice(*in_vselement, err);
+                if (err)    return;
+
+                //create trap message
+                trapmessage trap_msg;
+                trap_msg.type = trapmessage::VIRTUALSERVICE_CHANGE;
+
+                std::ostringstream oss;
+                oss << "TRAP00020002,The virtual service was changed.vs:";
+                if (in_vselement->udpmode) {
+                        if (in_vselement->udp_recv_endpoint.address().is_v6()) {
+                                oss << "[" << in_vselement->udp_recv_endpoint.address().to_string() << "]:" << in_vselement->udp_recv_endpoint.port();
+                        } else {
+                                oss << in_vselement->udp_recv_endpoint.address().to_string() << ":" << in_vselement->udp_recv_endpoint.port();
+                        }
+                } else {
+                        if (in_vselement->tcp_accept_endpoint.address().is_v6()) {
+                                oss << "[" << in_vselement->tcp_accept_endpoint.address().to_string() << "]:" << in_vselement->tcp_accept_endpoint.port();
+                        } else {
+                                oss << in_vselement->tcp_accept_endpoint.address().to_string() << ":" << in_vselement->tcp_accept_endpoint.port();
+                        }
+                }
+
+                trap_msg.message = oss.str();
+
+                error_code err_code;
+
+                //push the trap message
+                snmpagent::push_trapmessage(trap_msg, err_code);
+
+                if (err_code) {
+                        std::string msg("Push trap message failed.");
+                        Logger::putLogError(LOG_CAT_L7VSD_VIRTUALSERVICE, 126, msg, __FILE__, __LINE__);
+                }
+
+        } else {
+                std::string msg("virtual service not found.");
+                Logger::putLogWarn(LOG_CAT_L7VSD_VIRTUALSERVICE, 25, msg, __FILE__, __LINE__);
+
+                err.setter(true, msg);
+                return;
+        }
 }
 
 //! real_server add command
 //! @param[in]    vs_element
 //! @param[out]    error_code
-void    l7vsd::add_real_server( const virtualservice_element* in_vselement, error_code& err ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 13, "l7vsd::add_real_server", __FILE__, __LINE__ );
-
-    boost::mutex::scoped_lock command_lock( command_mutex );
-    boost::mutex::scoped_lock vslist_lock( vslist_mutex );
-
-    if( !in_vselement ){
-        std::string msg("in_vselement pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 9, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-        std::stringstream    debugstr;
-        debugstr << "l7vsd::add_real_server arguments:";
-        debugstr << boost::format( "*in_vselement=%s" ) % *in_vselement;
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 14, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
-
-    vslist_type::iterator vsitr = search_vslist( *in_vselement );
-    if( vslist.end() !=  vsitr ){
-        // add realserver
-        (*vsitr)->add_realserver( *in_vselement, err );
-        if( err )    return;
-    }
-    else {
-        std::string msg("virtual service not found.");
-        Logger::putLogWarn(LOG_CAT_L7VSD_VIRTUALSERVICE, 26, msg, __FILE__, __LINE__);
-
-        err.setter( true, msg );
-        return;
-    }
+void    l7vsd::add_real_server(const virtualservice_element *in_vselement, error_code &err)
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 13, "l7vsd::add_real_server", __FILE__, __LINE__);
+
+        boost::mutex::scoped_lock command_lock(command_mutex);
+        boost::mutex::scoped_lock vslist_lock(vslist_mutex);
+
+        if (!in_vselement) {
+                std::string msg("in_vselement pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 9, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
+        }
+
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                std::stringstream    debugstr;
+                debugstr << "l7vsd::add_real_server arguments:";
+                debugstr << boost::format("*in_vselement=%s") % *in_vselement;
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 14, debugstr.str(), __FILE__, __LINE__);
+        }
+        /*------ DEBUG LOG END ------*/
+
+        vslist_type::iterator vsitr = search_vslist(*in_vselement);
+        if (vslist.end() !=  vsitr) {
+                // add realserver
+                (*vsitr)->add_realserver(*in_vselement, err);
+                if (err)    return;
+
+                //create trap message
+                trapmessage trap_msg;
+                trap_msg.type = trapmessage::REALSERVER_ADD;
+
+                std::ostringstream oss;
+                oss << "TRAP00020004,A real server was added.vs:";
+                //virtualservice information
+                if (in_vselement->udpmode) {
+                        if (in_vselement->udp_recv_endpoint.address().is_v6()) {
+                                oss << "[" << in_vselement->udp_recv_endpoint.address().to_string() << "]:" << in_vselement->udp_recv_endpoint.port();
+                        } else {
+                                oss << in_vselement->udp_recv_endpoint.address().to_string() << ":" << in_vselement->udp_recv_endpoint.port();
+                        }
+                } else {
+                        if (in_vselement->tcp_accept_endpoint.address().is_v6()) {
+                                oss << "[" << in_vselement->tcp_accept_endpoint.address().to_string() << "]:" << in_vselement->tcp_accept_endpoint.port();
+                        } else {
+                                oss << in_vselement->tcp_accept_endpoint.address().to_string() << ":" << in_vselement->tcp_accept_endpoint.port();
+                        }
+                }
+
+                //realserver information
+                BOOST_FOREACH(realserver_element elem, in_vselement->realserver_vector) {
+                        if (in_vselement->udpmode) {
+                                if (elem.udp_endpoint.address().is_v6()) {
+                                        oss << ",rs:[" << elem.udp_endpoint.address().to_string() << "]:" << elem.udp_endpoint.port();
+                                } else {
+                                        oss << ",rs:"  << elem.udp_endpoint.address().to_string() << ":" << elem.udp_endpoint.port();
+                                }
+                        } else {
+                                if (elem.tcp_endpoint.address().is_v6()) {
+                                        oss << ",rs:[" << elem.tcp_endpoint.address().to_string() << "]:" << elem.tcp_endpoint.port();
+                                } else {
+                                        oss << ",rs:"  << elem.tcp_endpoint.address().to_string() << ":" << elem.tcp_endpoint.port();
+                                }
+                        }
+                }
+
+                trap_msg.message = oss.str();
+
+                error_code err_code;
+
+                //push the trap message
+                snmpagent::push_trapmessage(trap_msg, err_code);
+
+                if (err_code) {
+                        std::string msg("Push trap message failed.");
+                        Logger::putLogError(LOG_CAT_L7VSD_VIRTUALSERVICE, 127, msg, __FILE__, __LINE__);
+                }
+
+
+        } else {
+                std::string msg("virtual service not found.");
+                Logger::putLogWarn(LOG_CAT_L7VSD_VIRTUALSERVICE, 26, msg, __FILE__, __LINE__);
+
+                err.setter(true, msg);
+                return;
+        }
 }
 
 //! real_server del command
 //! @param[in]    vs_element
 //! @param[out]    error_code
-void    l7vsd::del_real_server( const virtualservice_element* in_vselement, error_code& err ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 15, "l7vsd::del_real_server", __FILE__, __LINE__ );
-
-    boost::mutex::scoped_lock command_lock( command_mutex );
-    boost::mutex::scoped_lock vslist_lock( vslist_mutex );
-
-    if( !in_vselement ){
-        std::string msg("in_vselement pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 10, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-        std::stringstream    debugstr;
-        debugstr << "l7vsd::del_real_server arguments:";
-        debugstr << boost::format( "*in_vselement=%s" ) % *in_vselement;
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 16, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
-
-    vslist_type::iterator vsitr = search_vslist( *in_vselement );
-    if( vslist.end() !=  vsitr ){
-        // del realserver
-        (*vsitr)->del_realserver( *in_vselement, err );
-        if( err )    return;
-    }
-    else {
-        std::string msg("virtual service not found.");
-        Logger::putLogWarn(LOG_CAT_L7VSD_VIRTUALSERVICE, 27, msg, __FILE__, __LINE__);
-
-        err.setter( true, msg );
-        return;
-    }
+void    l7vsd::del_real_server(const virtualservice_element *in_vselement, error_code &err)
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 15, "l7vsd::del_real_server", __FILE__, __LINE__);
+
+        boost::mutex::scoped_lock command_lock(command_mutex);
+        boost::mutex::scoped_lock vslist_lock(vslist_mutex);
+
+        if (!in_vselement) {
+                std::string msg("in_vselement pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 10, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
+        }
+
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                std::stringstream    debugstr;
+                debugstr << "l7vsd::del_real_server arguments:";
+                debugstr << boost::format("*in_vselement=%s") % *in_vselement;
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 16, debugstr.str(), __FILE__, __LINE__);
+        }
+        /*------ DEBUG LOG END ------*/
+
+        vslist_type::iterator vsitr = search_vslist(*in_vselement);
+        if (vslist.end() !=  vsitr) {
+                // del realserver
+                (*vsitr)->del_realserver(*in_vselement, err);
+                if (err)    return;
+
+                //create trap message
+                trapmessage trap_msg;
+                trap_msg.type = trapmessage::REALSERVER_REMOVE;
+
+                std::ostringstream oss;
+                oss << "TRAP00020006,A real server was eliminated.vs:";
+                //virtualservice information
+                if (in_vselement->udpmode) {
+                        if (in_vselement->udp_recv_endpoint.address().is_v6()) {
+                                oss << "[" << in_vselement->udp_recv_endpoint.address().to_string() << "]:" << in_vselement->udp_recv_endpoint.port();
+                        } else {
+                                oss << in_vselement->udp_recv_endpoint.address().to_string() << ":" << in_vselement->udp_recv_endpoint.port();
+                        }
+                } else {
+                        if (in_vselement->tcp_accept_endpoint.address().is_v6()) {
+                                oss << "[" << in_vselement->tcp_accept_endpoint.address().to_string() << "]:" << in_vselement->tcp_accept_endpoint.port();
+                        } else {
+                                oss << in_vselement->tcp_accept_endpoint.address().to_string() << ":" << in_vselement->tcp_accept_endpoint.port();
+                        }
+                }
+
+                //realserver information
+                BOOST_FOREACH(realserver_element elem, in_vselement->realserver_vector) {
+                        if (in_vselement->udpmode) {
+                                if (elem.udp_endpoint.address().is_v6()) {
+                                        oss << ",rs:[" << elem.udp_endpoint.address().to_string() << "]:" << elem.udp_endpoint.port();
+                                } else {
+                                        oss << ",rs:"  << elem.udp_endpoint.address().to_string() << ":" << elem.udp_endpoint.port();
+                                }
+                        } else {
+                                if (elem.tcp_endpoint.address().is_v6()) {
+                                        oss << ",rs:[" << elem.tcp_endpoint.address().to_string() << "]:" << elem.tcp_endpoint.port();
+                                } else {
+                                        oss << ",rs:"  << elem.tcp_endpoint.address().to_string() << ":" << elem.tcp_endpoint.port();
+                                }
+                        }
+                }
+
+                trap_msg.message = oss.str();
+
+                error_code err_code;
+
+                //push the trap message
+                snmpagent::push_trapmessage(trap_msg, err_code);
+
+                if (err_code) {
+                        std::string msg("Push trap message failed.");
+                        Logger::putLogError(LOG_CAT_L7VSD_VIRTUALSERVICE, 128, msg, __FILE__, __LINE__);
+                }
+        } else {
+                std::string msg("virtual service not found.");
+                Logger::putLogWarn(LOG_CAT_L7VSD_VIRTUALSERVICE, 27, msg, __FILE__, __LINE__);
+
+                err.setter(true, msg);
+                return;
+        }
 }
 
 //! real_server edit command
 //! @param[in]    vs_element
 //! @param[out]    error_code
-void    l7vsd::edit_real_server( const virtualservice_element* in_vselement, error_code& err ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 17, "l7vsd::edit_real_server", __FILE__, __LINE__ );
-
-    boost::mutex::scoped_lock command_lock( command_mutex );
-    boost::mutex::scoped_lock vslist_lock( vslist_mutex );
-
-    if( !in_vselement ){
-        std::string msg("in_vselement pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 11, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-        std::stringstream    debugstr;
-        debugstr << "l7vsd::edit_real_server arguments:";
-        debugstr << boost::format( "*in_vselement=%s" ) % *in_vselement;
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 18, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
-
-    vslist_type::iterator vsitr = search_vslist( *in_vselement );
-    if( vslist.end() !=  vsitr ){
-        // del realserver
-        (*vsitr)->edit_realserver( *in_vselement, err );
-        if( err )    return;
-    }
-    else {
-        std::string msg("virtual service not found.");
-        Logger::putLogWarn(LOG_CAT_L7VSD_VIRTUALSERVICE, 28, msg, __FILE__, __LINE__);
-
-        err.setter( true, msg );
-        return;
-    }
-}
+void    l7vsd::edit_real_server(const virtualservice_element *in_vselement, error_code &err)
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 17, "l7vsd::edit_real_server", __FILE__, __LINE__);
+
+        boost::mutex::scoped_lock command_lock(command_mutex);
+        boost::mutex::scoped_lock vslist_lock(vslist_mutex);
+
+        if (!in_vselement) {
+                std::string msg("in_vselement pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 11, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
+        }
 
-//! virtual_service flush command
-//! @param[out]    error_code
-void    l7vsd::flush_virtual_service( error_code& err ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 19, "l7vsd::flush_virtual_service", __FILE__, __LINE__ );
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                std::stringstream    debugstr;
+                debugstr << "l7vsd::edit_real_server arguments:";
+                debugstr << boost::format("*in_vselement=%s") % *in_vselement;
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 18, debugstr.str(), __FILE__, __LINE__);
+        }
+        /*------ DEBUG LOG END ------*/
+
+        vslist_type::iterator vsitr = search_vslist(*in_vselement);
+        if (vslist.end() !=  vsitr) {
+                // del realserver
+                (*vsitr)->edit_realserver(*in_vselement, err);
+                if (err)    return;
+
+                //create trap message
+                trapmessage trap_msg;
+                trap_msg.type = trapmessage::REALSERVER_CHANGE;
+
+                std::ostringstream oss;
+                oss << "TRAP00020005,The real server was changed.vs:";
+                //virtualservice information
+                if (in_vselement->udpmode) {
+                        if (in_vselement->udp_recv_endpoint.address().is_v6()) {
+                                oss << "[" << in_vselement->udp_recv_endpoint.address().to_string() << "]:" << in_vselement->udp_recv_endpoint.port();
+                        } else {
+                                oss << in_vselement->udp_recv_endpoint.address().to_string() << ":" << in_vselement->udp_recv_endpoint.port();
+                        }
+                } else {
+                        if (in_vselement->tcp_accept_endpoint.address().is_v6()) {
+                                oss << "[" << in_vselement->tcp_accept_endpoint.address().to_string() << "]:" << in_vselement->tcp_accept_endpoint.port();
+                        } else {
+                                oss << in_vselement->tcp_accept_endpoint.address().to_string() << ":" << in_vselement->tcp_accept_endpoint.port();
+                        }
+                }
 
-    boost::mutex::scoped_lock command_lock( command_mutex );
-    boost::mutex::scoped_lock vslist_lock( vslist_mutex );
+                //realserver information
+                BOOST_FOREACH(realserver_element elem, in_vselement->realserver_vector) {
+                        if (in_vselement->udpmode) {
+                                if (elem.udp_endpoint.address().is_v6()) {
+                                        oss << ",rs:[" << elem.udp_endpoint.address().to_string() << "]:" << elem.udp_endpoint.port();
+                                } else {
+                                        oss << ",rs:"  << elem.udp_endpoint.address().to_string() << ":" << elem.udp_endpoint.port();
+                                }
+                        } else {
+                                if (elem.tcp_endpoint.address().is_v6()) {
+                                        oss << ",rs:[" << elem.tcp_endpoint.address().to_string() << "]:" << elem.tcp_endpoint.port();
+                                } else {
+                                        oss << ",rs:"  << elem.tcp_endpoint.address().to_string() << ":" << elem.tcp_endpoint.port();
+                                }
+                        }
+                }
 
-    // all virtualservice stop and finalize
-    for(;;){
-        vslist_type::iterator itr = vslist.begin();
-        if(vslist.end() == itr){
-            break;
-        }
-        else{
-            // vs stop
-            (*itr)->stop();
-            // vs finalize
-            (*itr)->finalize( err );
+                trap_msg.message = oss.str();
+
+                error_code err_code;
+
+                //push the trap message
+                snmpagent::push_trapmessage(trap_msg, err_code);
+
+                if (err_code) {
+                        std::string msg("Push trap message failed.");
+                        Logger::putLogError(LOG_CAT_L7VSD_VIRTUALSERVICE, 129, msg, __FILE__, __LINE__);
+                }
+
+
+        } else {
+                std::string msg("virtual service not found.");
+                Logger::putLogWarn(LOG_CAT_L7VSD_VIRTUALSERVICE, 28, msg, __FILE__, __LINE__);
+
+                err.setter(true, msg);
+                return;
         }
-    }    
+}
 
-    // join virtualservice threads
-    vs_threads.join_all();
+//! virtual_service flush command
+//! @param[out]    error_code
+void    l7vsd::flush_virtual_service(error_code &err)
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 19, "l7vsd::flush_virtual_service", __FILE__, __LINE__);
+
+        boost::mutex::scoped_lock command_lock(command_mutex);
+        boost::mutex::scoped_lock vslist_lock(vslist_mutex);
+
+        // all virtualservice stop and finalize
+        for (;;) {
+                vslist_type::iterator itr = vslist.begin();
+                if (vslist.end() == itr) {
+                        break;
+                } else {
+                        //create trap message
+                        trapmessage trap_msg;
+                        trap_msg.type = trapmessage::VIRTUALSERVICE_REMOVE;
+
+                        std::ostringstream oss;
+                        oss << "TRAP00020003,A virtual service was eliminated.vs:";
+                        if ((*itr)->get_element().udpmode) {
+                                if ((*itr)->get_element().udp_recv_endpoint.address().is_v6()) {
+                                        oss << "[" << (*itr)->get_element().udp_recv_endpoint.address().to_string() << "]:" << (*itr)->get_element().udp_recv_endpoint.port();
+                                } else {
+                                        oss << (*itr)->get_element().udp_recv_endpoint.address().to_string() << ":" << (*itr)->get_element().udp_recv_endpoint.port();
+                                }
+                        } else {
+                                if ((*itr)->get_element().tcp_accept_endpoint.address().is_v6()) {
+                                        oss << "[" << (*itr)->get_element().tcp_accept_endpoint.address().to_string() << "]:" << (*itr)->get_element().tcp_accept_endpoint.port();
+                                } else {
+                                        oss << (*itr)->get_element().tcp_accept_endpoint.address().to_string() << ":" << (*itr)->get_element().tcp_accept_endpoint.port();
+                                }
+                        }
+
+                        trap_msg.message = oss.str();
+
+                        error_code err_code;
+
+                        //push the trap message
+                        snmpagent::push_trapmessage(trap_msg, err_code);
+
+                        if (err_code) {
+                                std::string msg("Push trap message failed.");
+                                Logger::putLogError(LOG_CAT_L7VSD_VIRTUALSERVICE, 130, msg, __FILE__, __LINE__);
+                        }
+
+                        // vs stop
+                        (*itr)->stop();
+                        // join virtualservice threads
+                        (*itr)->vs_thread_ptr->join();
+                        vs_threads.remove_thread((*itr)->vs_thread_ptr.get());
+                        // vs finalize
+                        (*itr)->finalize(err);
+                }
+        }
 
-    // replication switch to slave
-    rep->switch_to_slave();
+        // replication switch to slave
+        rep->switch_to_slave();
 }
 
 //! replication command
-//! @param[in]    replicaiton command
+//! @param[in]    replication command
 //! @param[out]    error_code
-void    l7vsd::replication_command( const l7vsadm_request::REPLICATION_COMMAND_TAG* cmd, error_code& err ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 20, "l7vsd::replication_command", __FILE__, __LINE__ );
-
-    boost::mutex::scoped_lock command_lock( command_mutex );
-    boost::mutex::scoped_lock vslist_lock( vslist_mutex );
-
-    if( !cmd ){
-        std::string msg("cmd pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 12, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-    if( !rep ){
-        std::string msg("rep pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 13, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-        std::stringstream    debugstr;
-        debugstr << "l7vsd::replication_command arguments:";
-        debugstr << boost::format( "*cmd=%d" ) % *cmd;
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 21, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
-
-    switch( *cmd ){
-    case    l7vsadm_request::REP_START:
-        rep->start();
-        break;
-    case    l7vsadm_request::REP_STOP:
-        rep->stop();
-        break;
-    case    l7vsadm_request::REP_FORCE:
-        rep->force_replicate();
-        break;
-    case    l7vsadm_request::REP_DUMP:
-        rep->dump_memory();
-        break;
-    default:
-        std::string msg("invalid replication command.");
-        Logger::putLogError(LOG_CAT_L7VSD_REPLICATION, 38, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
+void    l7vsd::replication_command(const l7vsadm_request::REPLICATION_COMMAND_TAG *cmd, error_code &err)
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 20, "l7vsd::replication_command", __FILE__, __LINE__);
+
+        boost::mutex::scoped_lock command_lock(command_mutex);
+        boost::mutex::scoped_lock vslist_lock(vslist_mutex);
+
+        if (!cmd) {
+                std::string msg("cmd pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 12, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
+        }
+        if (!rep) {
+                std::string msg("rep pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 13, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
+        }
+
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                std::stringstream    debugstr;
+                debugstr << "l7vsd::replication_command arguments:";
+                debugstr << boost::format("*cmd=%d") % *cmd;
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 21, debugstr.str(), __FILE__, __LINE__);
+        }
+        /*------ DEBUG LOG END ------*/
+
+        switch (*cmd) {
+        case    l7vsadm_request::REP_START:
+                rep->start();
+                break;
+        case    l7vsadm_request::REP_STOP:
+                rep->stop();
+                break;
+        case    l7vsadm_request::REP_FORCE:
+                rep->force_replicate();
+                break;
+        case    l7vsadm_request::REP_DUMP:
+                rep->dump_memory();
+                break;
+        default:
+                std::string msg("invalid replication command.");
+                Logger::putLogError(LOG_CAT_L7VSD_REPLICATION, 38, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
+        }
 }
 
 //! loglevel set command
 //! @param[in]    log category
 //! @param[in]    log level
 //! @param[out]    error_code
-void    l7vsd::set_loglevel( const LOG_CATEGORY_TAG* cat, const LOG_LEVEL_TAG* level, error_code& err ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 22, "l7vsd::set_loglevel", __FILE__, __LINE__ );
-
-    boost::mutex::scoped_lock command_lock( command_mutex );
-    boost::mutex::scoped_lock vslist_lock( vslist_mutex );
-
-    if( !cat ){
-        std::string msg("cat pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 14, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-    if( !level ){
-        std::string msg("level pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 15, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-        std::stringstream    debugstr;
-        debugstr << "l7vsd::set_loglevel arguments:";
-        debugstr << boost::format( "*cat=%d, level=%d" ) % *cat % *level;
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 23, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
-
-    if( LOG_CAT_END == *cat ){
-        // set loglevel all
-        if( !Logger::setLogLevelAll( *level ) ){
-            std::string msg("set loglevel all failed.");
-            Logger::putLogError(LOG_CAT_L7VSD_LOGGER, 122, msg, __FILE__, __LINE__);
-            err.setter( true, msg );
-            return;
+void    l7vsd::set_loglevel(const LOG_CATEGORY_TAG *cat, const LOG_LEVEL_TAG *level, error_code &err)
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 22, "l7vsd::set_loglevel", __FILE__, __LINE__);
+
+        boost::mutex::scoped_lock command_lock(command_mutex);
+        boost::mutex::scoped_lock vslist_lock(vslist_mutex);
+
+        if (!cat) {
+                std::string msg("cat pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 14, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
         }
-    }
-    else{
-        if( !Logger::setLogLevel( *cat, *level ) ){
-            std::string msg("set loglevel failed.");
-            Logger::putLogError(LOG_CAT_L7VSD_LOGGER, 123, msg, __FILE__, __LINE__);
-            err.setter( true, msg );
-            return;
+        if (!level) {
+                std::string msg("level pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 15, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
         }
-    }
-}
 
-//! snmp loglevel set command
-//! @param[in]    log category
-//! @param[in]    log level
-//! @param[out]    error_code
-void    l7vsd::snmp_set_loglevel( const LOG_CATEGORY_TAG* cat, const LOG_LEVEL_TAG* level, error_code& err ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 24, "l7vsd::snmp_set_loglevel", __FILE__, __LINE__ );
-
-    boost::mutex::scoped_lock command_lock( command_mutex );
-    boost::mutex::scoped_lock vslist_lock( vslist_mutex );
-
-    if( !cat ){
-        std::string msg("cat pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 16, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-    if( !level ){
-        std::string msg("level pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 17, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-    if( !bridge ){
-        std::string msg("bridge pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 18, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-        std::stringstream    debugstr;
-        debugstr << "l7vsd::snmp_set_loglevel arguments:";
-        debugstr << boost::format( "*cat=%d, level=%d" ) % *cat % *level;
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 25, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
-
-    if( LOG_CAT_END == *cat ){
-        // set loglevel all
-        if( 0 != bridge->change_loglevel_allcategory( *level ) ){
-            std::string msg("set snmp loglevel all failed.");
-            Logger::putLogError(LOG_CAT_L7VSD_LOGGER, 124, msg, __FILE__, __LINE__);
-            err.setter( true, msg );
-            return;
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                std::stringstream    debugstr;
+                debugstr << "l7vsd::set_loglevel arguments:";
+                debugstr << boost::format("*cat=%d, level=%d") % *cat % *level;
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 23, debugstr.str(), __FILE__, __LINE__);
         }
-    }
-    else{
-        if( 0 != bridge->change_loglevel( *cat, *level ) ){
-            std::string msg("set snmp loglevel failed.");
-            Logger::putLogError(LOG_CAT_L7VSD_LOGGER, 125, msg, __FILE__, __LINE__);
-            err.setter( true, msg );
-            return;
+        /*------ DEBUG LOG END ------*/
+
+        if (LOG_CAT_END == *cat) {
+                // set loglevel all
+                if (!Logger::setLogLevelAll(*level)) {
+                        std::string msg("set loglevel all failed.");
+                        Logger::putLogError(LOG_CAT_L7VSD_LOGGER, 122, msg, __FILE__, __LINE__);
+                        err.setter(true, msg);
+                        return;
+                }
+        } else {
+                if (!Logger::setLogLevel(*cat, *level)) {
+                        std::string msg("set loglevel failed.");
+                        Logger::putLogError(LOG_CAT_L7VSD_LOGGER, 123, msg, __FILE__, __LINE__);
+                        err.setter(true, msg);
+                        return;
+                }
         }
-    }
 }
 
 //! reload parameter command
 //! @param[in]    reload component
 //! @param[out]    error_code
-void    l7vsd::reload_parameter( const PARAMETER_COMPONENT_TAG* comp, error_code& err ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 26, "l7vsd::reload_parameter", __FILE__, __LINE__ );
-
-    boost::mutex::scoped_lock command_lock( command_mutex );
-    boost::mutex::scoped_lock vslist_lock( vslist_mutex );
-
-    if( !comp ){
-        std::string msg("comp pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 19, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-    if( !rep ){
-        std::string msg("rep pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 20, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-    if( !bridge ){
-        std::string msg("bridge pointer is null.");
-        Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 21, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-        std::stringstream    debugstr;
-        debugstr << "l7vsd::reload_parameter arguments:";
-        debugstr << boost::format( "*comp=%d" ) % *comp;
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 27, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
-
-    Parameter    param;
-    Logger        logger_instance;
-
-    switch( *comp ){
-    case    PARAM_COMP_REPLICATION:
-        if( param.read_file( *comp  )){
-            rep->reset();
-        } else {
-            std::string msg("parameter reload failed.");
-            Logger::putLogError(LOG_CAT_L7VSD_PARAMETER, 7, msg, __FILE__, __LINE__);
-            err.setter( true, msg );
-            return;
+void    l7vsd::reload_parameter(const PARAMETER_COMPONENT_TAG *comp, error_code &err)
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 26, "l7vsd::reload_parameter", __FILE__, __LINE__);
+
+        boost::mutex::scoped_lock command_lock(command_mutex);
+        boost::mutex::scoped_lock vslist_lock(vslist_mutex);
+
+        if (!comp) {
+                std::string msg("comp pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 19, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
         }
-        
-        break;
-    case    PARAM_COMP_LOGGER:
-        if( param.read_file( *comp  )){
-        
-            try {
-                logger_instance.loadConf();
-            }catch(...){
-            }
-            
-        } else {
-            std::string msg("parameter reload failed.");
-            Logger::putLogError(LOG_CAT_L7VSD_PARAMETER, 7, msg, __FILE__, __LINE__);
-            err.setter( true, msg );
-            return;
+        if (!rep) {
+                std::string msg("rep pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 20, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
         }
 
-        break;
-    case    PARAM_COMP_SNMPAGENT:
-        if( param.read_file( *comp  )){
-            bridge->reload_config();
-        } else {
-            std::string msg("parameter reload failed.");
-            Logger::putLogError(LOG_CAT_L7VSD_PARAMETER, 7, msg, __FILE__, __LINE__);
-            err.setter( true, msg );
-            return;
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                std::stringstream    debugstr;
+                debugstr << "l7vsd::reload_parameter arguments:";
+                debugstr << boost::format("*comp=%d") % *comp;
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 27, debugstr.str(), __FILE__, __LINE__);
+        }
+        /*------ DEBUG LOG END ------*/
+
+        Parameter    param;
+        Logger        logger_instance;
+
+        switch (*comp) {
+        case    PARAM_COMP_REPLICATION:
+                if (param.read_file(*comp)) {
+                        rep->reset();
+                } else {
+                        std::string msg("parameter reload failed.");
+                        Logger::putLogError(LOG_CAT_L7VSD_PARAMETER, 7, msg, __FILE__, __LINE__);
+                        err.setter(true, msg);
+                        return;
+                }
+
+                break;
+        case    PARAM_COMP_LOGGER:
+                if (param.read_file(*comp)) {
+
+                        try {
+                                logger_instance.loadConf();
+                        } catch (...) {
+                        }
+
+                } else {
+                        std::string msg("parameter reload failed.");
+                        Logger::putLogError(LOG_CAT_L7VSD_PARAMETER, 7, msg, __FILE__, __LINE__);
+                        err.setter(true, msg);
+                        return;
+                }
+
+                break;
+        case    PARAM_COMP_ALL:
+                if (!param.read_file(PARAM_COMP_REPLICATION)) {
+                        std::string msg("parameter reload failed.");
+                        Logger::putLogError(LOG_CAT_L7VSD_PARAMETER, 7, msg, __FILE__, __LINE__);
+                        err.setter(true, msg);
+                        return;
+                }
+
+                if (!param.read_file(PARAM_COMP_LOGGER)) {
+                        std::string msg("parameter reload failed.");
+                        Logger::putLogError(LOG_CAT_L7VSD_PARAMETER, 7, msg, __FILE__, __LINE__);
+                        err.setter(true, msg);
+                        return;
+                }
+
+                rep->reset();
+                try {
+                        logger_instance.loadConf();
+                } catch (...) {
+                }
+
+                break;
+        default:
+                std::string msg("parameter reload command not found.");
+                Logger::putLogWarn(LOG_CAT_L7VSD_PARAMETER, 1, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
         }
 
-        break;
-    case    PARAM_COMP_ALL:
-        if( !param.read_file( PARAM_COMP_REPLICATION  )){
-            std::string msg("parameter reload failed.");
-            Logger::putLogError(LOG_CAT_L7VSD_PARAMETER, 7, msg, __FILE__, __LINE__);
-            err.setter( true, msg );
-            return;
+
+}
+void    l7vsd::set_snmp_info(const snmp_info *info, error_code &err)
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 42, "l7vsd::set_snmp_info", __FILE__, __LINE__);
+
+        boost::mutex::scoped_lock command_lock(command_mutex);
+
+        if (!info) {
+                std::string msg("info pointer is null.");
+                Logger::putLogFatal(LOG_CAT_L7VSD_MAINTHREAD, 21, msg, __FILE__, __LINE__);
+                err.setter(true, msg);
+                return;
         }
-        
-        if( !param.read_file( PARAM_COMP_LOGGER  )){
-            std::string msg("parameter reload failed.");
-            Logger::putLogError(LOG_CAT_L7VSD_PARAMETER, 7, msg, __FILE__, __LINE__);
-            err.setter( true, msg );
-            return;
+
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                std::stringstream    debugstr;
+                debugstr << boost::format("info=%s") % *info;
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 43, debugstr.str(), __FILE__, __LINE__);
         }
-        
-        if( !param.read_file( PARAM_COMP_SNMPAGENT  )){
-            std::string msg("parameter reload failed.");
-            Logger::putLogError(LOG_CAT_L7VSD_PARAMETER, 7, msg, __FILE__, __LINE__);
-            err.setter( true, msg );
-            return;
+        /*------ DEBUG LOG END ------*/
+
+        if (info->option_set_flag & snmp_info::SNMP_ENABLE_OPTION_FLAG) {
+                if (info->enabled) {
+                        snmpagent::enable();
+                } else {
+                        snmpagent::disable();
+                }
         }
-        
-        rep->reset();
-        try {
-            logger_instance.loadConf();
-        }catch(...){
+
+        if (info->option_set_flag & snmp_info::SNMP_LOGTRAP_OPTION_FLAG) {
+                if (info->logtrap_enabled) {
+                        snmpagent::logtrap_enable();
+                } else {
+                        snmpagent::logtrap_disable();
+                }
+        }
+
+        if (info->option_set_flag & snmp_info::SNMP_LOGTRAP_LEVEL_OPTION_FLAG) {
+                snmpagent::set_logtrap_level(info->logtrap_level);
+        }
+
+        if (info->option_set_flag & snmp_info::SNMP_INTERVAL_OPTION_FLAG) {
+                snmpagent::set_interval(info->interval);
+        }
+
+        if (info->option_set_flag & snmp_info::SNMP_REFRESH_OPTION_FLAG) {
+                {
+                        boost::mutex::scoped_lock vslist_lock(vslist_mutex);
+                        virtualservice_element element;
+                        element.udpmode = false;
+                        element.tcp_accept_endpoint = info->vs_endpoint;
+                        element.protocol_module_name = info->protocol;
+                        vslist_type::iterator it = search_vslist(element, true);
+                        if (it == vslist.end()) {
+                                std::string msg("virtual service not found.");
+                                Logger::putLogWarn(LOG_CAT_L7VSD_VIRTUALSERVICE, 29, msg, __FILE__, __LINE__);
+
+                                err.setter(true, msg);
+                                return;
+                        }
+                }
+
+                snmpagent::refresh_statistics(info->vs_endpoint, info->protocol);
         }
-        bridge->reload_config();
-    
-        break;
-    default:
-        std::string msg("parameter reload command not found.");
-        Logger::putLogWarn(LOG_CAT_L7VSD_PARAMETER, 1, msg, __FILE__, __LINE__);
-        err.setter( true, msg );
-        return;
-    }
 
+        if (info->option_set_flag & snmp_info::SNMP_REFRESH_ALL_OPTION_FLAG) {
+                snmpagent::refresh_all_statistics();
+        }
 
 }
 
 //! vs_list search function
 //! @param[in]    vs_element
 //! @param[out]    error_code
-l7vsd::vslist_type::iterator    l7vsd::search_vslist( 
-    const virtualservice_element& in_vselement,
-    bool find_module_name ) const {
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 28, "l7vsd::search_vslist", __FILE__, __LINE__ );
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-        std::stringstream    debugstr;
-        debugstr << "l7vsd::search_vslist arguments:";
-        debugstr << boost::format( "in_vselement=%s" ) % in_vselement;
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 29, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
-
-    for( vslist_type::iterator itr = vslist.begin();
-         itr != vslist.end();
-         ++itr ){
-        if( in_vselement.udpmode ){
-            if(    ( (*itr)->get_element().udpmode ) &&
-                ( (*itr)->get_element().udp_recv_endpoint  == in_vselement.udp_recv_endpoint ) ){
-                if( find_module_name ){
-                    if( (*itr)->get_element().protocol_module_name ==  in_vselement.protocol_module_name){
-                        return itr;
-                    }
-                }else{
-                    return itr;
-                }
-            }
+l7vsd::vslist_type::iterator    l7vsd::search_vslist(
+        const virtualservice_element &in_vselement,
+        bool find_module_name) const
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 28, "l7vsd::search_vslist", __FILE__, __LINE__);
+
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                std::stringstream    debugstr;
+                debugstr << "l7vsd::search_vslist arguments:";
+                debugstr << boost::format("in_vselement=%s") % in_vselement;
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 29, debugstr.str(), __FILE__, __LINE__);
         }
-        else{
-            if(    ( !((*itr)->get_element().udpmode) ) &&
-                ( (*itr)->get_element().tcp_accept_endpoint == in_vselement.tcp_accept_endpoint ) ){
-                if( find_module_name ){
-                    if( (*itr)->get_element().protocol_module_name ==  in_vselement.protocol_module_name){
-                        return itr;
-                    }
-                }else{
-                    return itr;
+        /*------ DEBUG LOG END ------*/
+
+        for (vslist_type::iterator itr = vslist.begin();
+             itr != vslist.end();
+             ++itr) {
+                if (in_vselement.udpmode) {
+                        if (((*itr)->get_element().udpmode) &&
+                            ((*itr)->get_element().udp_recv_endpoint  == in_vselement.udp_recv_endpoint)) {
+                                if (find_module_name) {
+                                        if ((*itr)->get_element().protocol_module_name ==  in_vselement.protocol_module_name) {
+                                                return itr;
+                                        }
+                                } else {
+                                        return itr;
+                                }
+                        }
+                } else {
+                        if ((!((*itr)->get_element().udpmode)) &&
+                            ((*itr)->get_element().tcp_accept_endpoint == in_vselement.tcp_accept_endpoint)) {
+                                if (find_module_name) {
+                                        if ((*itr)->get_element().protocol_module_name ==  in_vselement.protocol_module_name) {
+                                                return itr;
+                                        }
+                                } else {
+                                        return itr;
+                                }
+                        }
                 }
-            }
         }
-    }
-    return vslist.end();
+        return vslist.end();
 }
 
 //! virtualservice release from vslist
 //! @param[in]    vs_element
-void    l7vsd::release_virtual_service( const virtualservice_element& in_vselement ) const {
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 30, "l7vsd::release_virtual_service", __FILE__, __LINE__ );
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){
-        std::stringstream    debugstr;
-        debugstr << "l7vsd::release_virtual_service arguments:";
-        debugstr << boost::format( "in_vselement=%s" ) % in_vselement;
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 31, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
-
-    vslist_type::iterator vsitr = search_vslist( in_vselement );
-    if( vslist.end() !=  vsitr ){
-        // remove from vslist
-        vslist.remove( *vsitr );
-    }
+void    l7vsd::release_virtual_service(const virtualservice_element &in_vselement) const
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 30, "l7vsd::release_virtual_service", __FILE__, __LINE__);
+
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSD_MAINTHREAD)) {
+                std::stringstream    debugstr;
+                debugstr << "l7vsd::release_virtual_service arguments:";
+                debugstr << boost::format("in_vselement=%s") % in_vselement;
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 31, debugstr.str(), __FILE__, __LINE__);
+        }
+        /*------ DEBUG LOG END ------*/
+
+        vslist_type::iterator vsitr = search_vslist(in_vselement);
+        if (vslist.end() !=  vsitr) {
+                // remove from vslist
+                vslist.remove(*vsitr);
+        }
 }
 //! virtualservice_list getter
 //! @return    vslist
-l7vsd::vslist_type&    l7vsd::get_virtualservice_list(){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 32, "l7vsd::get_virtualservice_list", __FILE__, __LINE__ );
+l7vsd::vslist_type    &l7vsd::get_virtualservice_list()
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 32, "l7vsd::get_virtualservice_list", __FILE__, __LINE__);
 
-    return vslist;
+        return vslist;
 }
 
 //! virtualservice_list mutex getter
 //! @return    vslist_mutex
-boost::mutex&    l7vsd::get_virtualservice_list_mutex(){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 33, "l7vsd::get_virtualservice_list_mutex", __FILE__, __LINE__ );
+boost::mutex    &l7vsd::get_virtualservice_list_mutex()
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 33, "l7vsd::get_virtualservice_list_mutex", __FILE__, __LINE__);
+
+        return vslist_mutex;
+}
 
-    return vslist_mutex;
+//! replication_ptr getter
+//! @return    replication_ptr
+replication::REPLICATION_MODE_TAG l7vsd::get_replication_state() const
+{
+        return rep->get_status();
 }
 
+
 //! l7vsd run method
 //! @param[in]    argument count
 //! @param[in]    argument value
-int    l7vsd::run( int argc, char* argv[] ) {
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 34, "l7vsd::run", __FILE__, __LINE__ );
-
-    /*-------- DEBUG LOG --------*/
-    if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSADM_COMMON ) ){
-        std::stringstream    debugstr;
-        debugstr << boost::format( "l7vsd::run arguments:%s" ) % argument_debug_dump( argc, argv );
-        Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 35, debugstr.str(), __FILE__, __LINE__ );
-    }
-    /*------ DEBUG LOG END ------*/
-
-    mlockall(MCL_FUTURE);
-
-    try{
-        // check options
-        if( !check_options( argc, argv ) ){
-            std::cerr << usage();
-            munlockall();
-            return -1;
-        }
-    
-        // help mode ?
-        if( help ){
-            std::cout << usage();
-            munlockall();
-            return 0;
-        }
-    
-        if( 0 > daemon( 0, 0 ) ){
-            std::stringstream buf;
-            buf << "daemon() failed: " << strerror( errno );
-            logger.putLogError( LOG_CAT_L7VSD_MAINTHREAD, 3, buf.str(), __FILE__, __LINE__ );
-            munlockall();
-            return -1;
+int    l7vsd::run(int argc, char *argv[])
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 34, "l7vsd::run", __FILE__, __LINE__);
+
+        /*-------- DEBUG LOG --------*/
+        if (LOG_LV_DEBUG == Logger::getLogLevel(LOG_CAT_L7VSADM_COMMON)) {
+                std::stringstream    debugstr;
+                debugstr << boost::format("l7vsd::run arguments:%s") % argument_debug_dump(argc, argv);
+                Logger::putLogDebug(LOG_CAT_L7VSD_MAINTHREAD, 35, debugstr.str(), __FILE__, __LINE__);
         }
+        /*------ DEBUG LOG END ------*/
 
-        //set max file open num
-        Parameter    param;
-        error_code    err;
-        int    maxfileno = param.get_int(PARAM_COMP_L7VSD, "maxfileno", err);
-        if( err ){
-            logger.putLogWarn( LOG_CAT_L7VSD_MAINTHREAD, 1, 
-                "maxfileno parameter not found.", __FILE__, __LINE__ );
-            maxfileno = 1024;
-        }
-        if ( maxfileno < 32 ){
-            logger.putLogWarn( LOG_CAT_L7VSD_MAINTHREAD, 10, 
-                "invalid parameter for maxfileno.", __FILE__, __LINE__ );
-            maxfileno = 1024;
-        }
+        mlockall(MCL_FUTURE);
 
-        //set process scheduler & priority
-        int    scheduler = SCHED_OTHER;
-        bool   change_scheduler = true;
-        int    int_val = param.get_int(PARAM_COMP_L7VSD, PARAM_SCHED_ALGORITHM, err);
-        if( err ){
-            change_scheduler = false;
-        }
-        if( change_scheduler ){
-            if( (SCHED_FIFO == int_val) || (SCHED_RR == int_val) || (SCHED_OTHER == int_val) || (SCHED_BATCH == int_val) ){
-                scheduler = int_val;
-            }else{
-                logger.putLogWarn( LOG_CAT_L7VSD_MAINTHREAD, 5, "invalid parameter for task scheduler algorithm.", __FILE__, __LINE__ );
-            }
-            int    proc_pri  = param.get_int(PARAM_COMP_L7VSD, PARAM_SCHED_PRIORITY, err);
-            if( err ){
-                logger.putLogWarn( LOG_CAT_L7VSD_MAINTHREAD, 6, "task scheduler priority parameter not found.", __FILE__, __LINE__ );
-                proc_pri  = sched_get_priority_min( scheduler );
-            }else{
-                if( (SCHED_FIFO == scheduler) || (SCHED_RR == scheduler) ){
-                    if(proc_pri < 1 || 99 < proc_pri){
-                        logger.putLogWarn( LOG_CAT_L7VSD_MAINTHREAD, 7, "invalid parameter for task scheduler priority.", __FILE__, __LINE__ );
-                        proc_pri  = sched_get_priority_min( scheduler );
-                    }
+        try {
+                // check options
+                if (!check_options(argc, argv)) {
+                        std::cerr << usage();
+                        munlockall();
+                        return -1;
                 }
-                if( (SCHED_OTHER == scheduler) || (SCHED_BATCH == scheduler) ){
-                    if(proc_pri != 0){
-                        logger.putLogWarn( LOG_CAT_L7VSD_MAINTHREAD, 8, "invalid parameter for task scheduler priority.", __FILE__, __LINE__ );
-                        proc_pri  = sched_get_priority_min( scheduler );
-                    }
+
+                // help mode ?
+                if (help) {
+                        std::cout << usage();
+                        munlockall();
+                        return 0;
                 }
-            }
-    
-            sched_param        scheduler_param;
-            int    ret_val        = sched_getparam( 0, &scheduler_param );
-            scheduler_param.__sched_priority    = proc_pri;
-            ret_val            = sched_setscheduler( 0, scheduler, &scheduler_param );
-            if(ret_val != 0){
-                logger.putLogWarn( LOG_CAT_L7VSD_MAINTHREAD, 9, "task scheduler setting failed.", __FILE__, __LINE__ );
-            }
-        }
 
-        struct rlimit lim;
-        lim.rlim_cur = maxfileno;
-        lim.rlim_max = maxfileno;
-        int ret;
-        ret = setrlimit( RLIMIT_NOFILE, &lim );
-        if( 0 != ret ){
-            std::stringstream buf;
-            buf << "setrlimit failed:" << errno;
-            logger.putLogWarn( LOG_CAT_L7VSD_MAINTHREAD, 2, buf.str(), __FILE__, __LINE__ );
-        }
+                if (!debug) {
+                        if (0 > daemon(0, 0)) {
+                                std::stringstream buf;
+                                buf << "daemon() failed: " << strerror(errno);
+                                logger.putLogError(LOG_CAT_L7VSD_MAINTHREAD, 3, buf.str(), __FILE__, __LINE__);
+                                munlockall();
+                                return -1;
+                        }
+                }
 
-        // signal handler thread start
-        boost::thread    sigthread( boost::bind( &l7vsd::sig_exit_handler, this ) );
-        sigthread.detach();
-
-        // protoclol module control initialize
-        protocol_module_control::getInstance().initialize( L7VS_MODULE_PATH );
-    
-        // schedule module control initialize
-        schedule_module_control::getInstance().initialize( L7VS_MODULE_PATH );
-    
-        // receiver initialize
-        receiver.reset( new command_receiver( dispatcher, L7VS_CONFIG_SOCKNAME, *this ) );
-        if( NULL ==  receiver ){
-            logger.putLogError( LOG_CAT_L7VSD_MAINTHREAD, 4, "command receiver pointer null.", __FILE__, __LINE__ );
-            munlockall();
-            return -1;
-        }
-    
-        // replication initialize
-        rep.reset( new replication() );
-        if( NULL ==  rep ){
-            logger.putLogError( LOG_CAT_L7VSD_MAINTHREAD, 5, "replication pointer null.", __FILE__, __LINE__ );
-            munlockall();
-            return -1;
-        }
-        if( 0 > rep->initialize() ){
-            logger.putLogWarn( LOG_CAT_L7VSD_MAINTHREAD, 3, "replication initialize failed.", __FILE__, __LINE__ );
-        }
+                //set max file open num
+                Parameter    param;
+                error_code    err;
+                int    maxfileno = param.get_int(PARAM_COMP_L7VSD, "maxfileno", err);
+                if (err) {
+                        logger.putLogWarn(LOG_CAT_L7VSD_MAINTHREAD, 1,
+                                          "maxfileno parameter not found.", __FILE__, __LINE__);
+                        maxfileno = 1024;
+                }
+                if (maxfileno < 32) {
+                        logger.putLogWarn(LOG_CAT_L7VSD_MAINTHREAD, 10,
+                                          "invalid parameter for maxfileno.", __FILE__, __LINE__);
+                        maxfileno = 1024;
+                }
 
-        // snmp bridge initialize
-        bridge.reset( new snmpbridge( *this, dispatcher ) );
-        if( NULL ==  bridge ){
-            logger.putLogFatal( LOG_CAT_L7VSD_MAINTHREAD, 22, "snmpbridge pointer null.", __FILE__, __LINE__ );
-            munlockall();
-            return -1;
-        }
-        if( 0 > bridge->initialize() ){
-            logger.putLogError( LOG_CAT_L7VSD_MAINTHREAD, 6, "snmpbridge initialize failed.", __FILE__, __LINE__ );
-            munlockall();
-            return -1;
-        }
+                //set process scheduler & priority
+                int    scheduler = SCHED_OTHER;
+                bool   change_scheduler = true;
+                int    int_val = param.get_int(PARAM_COMP_L7VSD, PARAM_SCHED_ALGORITHM, err);
+                if (err) {
+                        change_scheduler = false;
+                }
+                if (change_scheduler) {
+                        if ((SCHED_FIFO == int_val) || (SCHED_RR == int_val) || (SCHED_OTHER == int_val) || (SCHED_BATCH == int_val)) {
+                                scheduler = int_val;
+                        } else {
+                                logger.putLogWarn(LOG_CAT_L7VSD_MAINTHREAD, 5, "invalid parameter for task scheduler algorithm.", __FILE__, __LINE__);
+                        }
+                        int    proc_pri  = param.get_int(PARAM_COMP_L7VSD, PARAM_SCHED_PRIORITY, err);
+                        if (err) {
+                                logger.putLogWarn(LOG_CAT_L7VSD_MAINTHREAD, 6, "task scheduler priority parameter not found.", __FILE__, __LINE__);
+                                proc_pri  = sched_get_priority_min(scheduler);
+                        } else {
+                                if ((SCHED_FIFO == scheduler) || (SCHED_RR == scheduler)) {
+                                        if (proc_pri < 1 || 99 < proc_pri) {
+                                                logger.putLogWarn(LOG_CAT_L7VSD_MAINTHREAD, 7, "invalid parameter for task scheduler priority.", __FILE__, __LINE__);
+                                                proc_pri  = sched_get_priority_min(scheduler);
+                                        }
+                                }
+                                if ((SCHED_OTHER == scheduler) || (SCHED_BATCH == scheduler)) {
+                                        if (proc_pri != 0) {
+                                                logger.putLogWarn(LOG_CAT_L7VSD_MAINTHREAD, 8, "invalid parameter for task scheduler priority.", __FILE__, __LINE__);
+                                                proc_pri  = sched_get_priority_min(scheduler);
+                                        }
+                                }
+                        }
+
+                        sched_param        scheduler_param;
+                        int    ret_val        = sched_getparam(0, &scheduler_param);
+                        scheduler_param.__sched_priority    = proc_pri;
+                        ret_val            = sched_setscheduler(0, scheduler, &scheduler_param);
+                        if (ret_val != 0) {
+                                logger.putLogWarn(LOG_CAT_L7VSD_MAINTHREAD, 9, "task scheduler setting failed.", __FILE__, __LINE__);
+                        }
+                }
 
-//SNMP is unsupported.
-//
-//        // snmp trap function set
-//        Logger::setSnmpSendtrap( boost::bind( &snmpbridge::send_trap, bridge, _1 ) );
-//
-
-        // main loop
-        for(;;){
-            if( unlikely( exit_requested ) ){
-                std::stringstream buf;
-                buf << boost::format( "l7vsd signal(%d) received. exitting..." ) % received_sig;
-                logger.putLogInfo( LOG_CAT_L7VSD_MAINTHREAD, 1, buf.str(), __FILE__, __LINE__ );
-                break;
-            }
-            dispatcher.poll();
-            timespec    wait_val;
-            wait_val.tv_sec        = 0;
-            wait_val.tv_nsec    = 10;
-            nanosleep( &wait_val, NULL );
-            boost::this_thread::yield();
+                struct rlimit lim;
+                lim.rlim_cur = maxfileno;
+                lim.rlim_max = maxfileno;
+                int ret;
+                ret = setrlimit(RLIMIT_NOFILE, &lim);
+                if (0 != ret) {
+                        std::stringstream buf;
+                        buf << "setrlimit failed:" << errno;
+                        logger.putLogWarn(LOG_CAT_L7VSD_MAINTHREAD, 2, buf.str(), __FILE__, __LINE__);
+                }
+
+                // signal handler thread start
+                boost::thread    sigthread(boost::bind(&l7vsd::sig_exit_handler, this));
+                sigthread.detach();
+
+                // protocol module control initialize
+                protocol_module_control::getInstance().initialize(L7VS_MODULE_PATH);
+
+                // schedule module control initialize
+                schedule_module_control::getInstance().initialize(L7VS_MODULE_PATH);
+
+                // receiver initialize
+                receiver.reset(new command_receiver(dispatcher, L7VS_CONFIG_SOCKNAME, *this));
+                if (NULL ==  receiver) {
+                        logger.putLogError(LOG_CAT_L7VSD_MAINTHREAD, 4, "command receiver pointer null.", __FILE__, __LINE__);
+                        munlockall();
+                        return -1;
+                }
+
+                // replication initialize
+                rep.reset(new replication());
+                if (NULL ==  rep) {
+                        logger.putLogError(LOG_CAT_L7VSD_MAINTHREAD, 5, "replication pointer null.", __FILE__, __LINE__);
+                        munlockall();
+                        return -1;
+                }
+                if (0 > rep->initialize()) {
+                        logger.putLogWarn(LOG_CAT_L7VSD_MAINTHREAD, 3, "replication initialize failed.", __FILE__, __LINE__);
+                }
+
+                // snmpagent initialize
+                snmpagent agent(this);
+
+                // snmp trap function set
+                Logger::set_snmp_send_trap_func(boost::bind(&snmpagent::push_trapmessage, _1, _2));
+
+                error_code err_code;
+
+                // snmp start
+                agent.start(err_code);
+
+                if (err_code) {
+                        logger.putLogError(LOG_CAT_L7VSD_MAINTHREAD, 8, "snmp function start failed.", __FILE__, __LINE__);
+                }
+
+                err_code.setter(false, "");
+
+                //create trap message
+                trapmessage trap_msg;
+                trap_msg.type = trapmessage::SERVICE_START;
+                trap_msg.message = "TRAP00010001,l7vsd start.";
+
+                //push the trap message
+                snmpagent::push_trapmessage(trap_msg, err_code);
+
+                if (err_code) {
+                        std::string msg("Push trap message failed.");
+                        Logger::putLogError(LOG_CAT_L7VSD_MAINTHREAD, 9, msg, __FILE__, __LINE__);
+                }
+
+                // main loop
+                for (;;) {
+                        if (unlikely(exit_requested)) {
+                                std::stringstream buf;
+                                buf << boost::format("l7vsd signal(%d) received. exiting...") % reinterpret_cast<int>(received_sig);
+                                logger.putLogInfo(LOG_CAT_L7VSD_MAINTHREAD, 1, buf.str(), __FILE__, __LINE__);
+                                break;
+                        }
+                        dispatcher.poll();
+                        timespec    wait_val;
+                        wait_val.tv_sec        = 0;
+                        wait_val.tv_nsec    = 1000000;
+                        nanosleep(&wait_val, NULL);
+                        boost::this_thread::yield();
+                }
+
+                // snmp trap function unset
+                Logger::set_snmp_send_trap_func(NULL);
+
+                // check snmp function enabled
+                if (snmpagent::get_snmp_info().enabled) {
+                        // get local time string
+                        char time_buf[TRAP_TIME_STRING_MAX_SIZE] = {0};
+                        time_t now = time(NULL);
+                        struct tm *t = localtime(&now);
+                        if (t) strftime(time_buf, sizeof(time_buf), "%Y/%m/%d %H:%M:%S", t);
+
+                        // make trap message
+                        std::stringstream   trap_buf;
+                        trap_buf << time_buf << "," << "TRAP00010002,l7vsd stop.";
+                        char buff[HOST_NAME_MAX] = {0};
+                        gethostname(buff, HOST_NAME_MAX);
+                        trap_buf << "," << buff;
+                        // send trap message
+                        trap_service_stop(trap_buf.str());
+                }
+
+                // snmp agent finalize
+                agent.finalize();
+
+                // replication finalize
+                rep->finalize();
+
+                // schedule module control finalize
+                schedule_module_control::getInstance().finalize();
+
+                // protocol module control finalize
+                protocol_module_control::getInstance().finalize();
+        } catch (std::exception &e) {
+                std::stringstream    buf;
+                buf << "l7vsd run error:" << e.what();
+                logger.putLogError(LOG_CAT_L7VSD_MAINTHREAD, 7, buf.str(), __FILE__, __LINE__);
+                munlockall();
+                return -1;
         }
-    
-        // snmp trap function unset
-        Logger::setSnmpSendtrap( NULL );
-    
-        // snmp bridge finalize
-        bridge->finalize();
-    
-        // replication finalize
-        rep->finalize();
-    
-        // schedule module control finalize
-        schedule_module_control::getInstance().finalize();
-    
-        // protpcol module control finalize
-        protocol_module_control::getInstance().finalize();
-    }
-    catch( std::exception& e ){
-        std::stringstream    buf;
-        buf << "l7vsd run error:" << e.what();
-        logger.putLogError( LOG_CAT_L7VSD_MAINTHREAD, 7, buf.str(), __FILE__, __LINE__ );
-        munlockall();
-        return -1;
-    }
 
-    munlockall();
-    return 0;
+        munlockall();
+        return 0;
 }
 
 //! argument dump for debug
 //! @param[in]    argument count
 //! @param[in]    argument value
-std::string    l7vsd::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];
+std::string    l7vsd::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 << "}";
         }
-        buf << "}";
-    }
-    return buf.str();
+        return buf.str();
 }
 
 //! command option check
 //! @param[in]    argument count
 //! @param[in]    argument value
-bool    l7vsd::check_options( int argc, char* argv[] ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 36, "l7vsd::check_options", __FILE__, __LINE__ );
-
-    for( int pos = 1; pos < argc; ++pos ){    // check options.
-        parse_opt_map_type::iterator itr = option_dic.find( argv[pos] );
-        if( itr != option_dic.end() ){    // find option
-            if( !itr->second( pos, argc, argv ) ){
-                return false;    // option function execute.
-            }
-        }
-        else{    // don't find option function.
-            std::stringstream buf;
-            buf << "l7vsd: unknown option: " << argv[ pos ] << "\n";
-            std::cerr << buf.str();
-            return false;
+bool    l7vsd::check_options(int argc, char *argv[])
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 36, "l7vsd::check_options", __FILE__, __LINE__);
+
+        for (int pos = 1; pos < argc; ++pos) {    // check options.
+                parse_opt_map_type::iterator itr = option_dic.find(argv[pos]);
+                if (itr != option_dic.end()) {    // find option
+                        if (!itr->second(pos, argc, argv)) {
+                                return false;    // option function execute.
+                        }
+                } else { // don't find option function.
+                        std::stringstream buf;
+                        buf << "l7vsd: unknown option: " << argv[ pos ] << "\n";
+                        std::cerr << buf.str();
+                        return false;
+                }
         }
-    }
-    return true;
+        return true;
 }
 
 //! command help parse
 //! @param[in]    argument count
 //! @param[in]    argument value
-bool    l7vsd::parse_help(int& pos, int argc, char* argv[] ){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 37, "l7vsd::parse_help", __FILE__, __LINE__ );
+bool    l7vsd::parse_help(int &pos, int argc, char *argv[])
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 37, "l7vsd::parse_help", __FILE__, __LINE__);
 
-    help = true;        //help_mode flag on
-    return true;
+        help = true;        //help_mode flag on
+        return true;
+}
+
+//! command debug parse
+bool    l7vsd::parse_debug(int &pos, int argc, char *argv[])
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 38, "l7vsd::parse_help", __FILE__, __LINE__);
+        debug = true;
+        return true;
 }
 
 //! create usage string
 //! @return        usage string
-std::string    l7vsd::usage(){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 39, "l7vsd::usage", __FILE__, __LINE__ );
-
-    std::stringstream    stream;
-    stream <<
-    "Usage: l7vsd [-h]\n"
-    "   -h    --help         print this help messages and exit\n";
-    return stream.str();
+std::string    l7vsd::usage()
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 39, "l7vsd::usage", __FILE__, __LINE__);
+
+        std::stringstream    stream;
+        stream <<
+               "Usage: l7vsd [-h]\n"
+               "   -h    --help         print this help messages and exit\n";
+        return stream.str();
 }
 
 //! signal handler function
-void    l7vsd::sig_exit_handler(){
-    Logger    logger( LOG_CAT_L7VSD_MAINTHREAD, 40, "l7vsd::sig_exit_handler", __FILE__, __LINE__ );
-
-    sigset_t    sigmask;
-    sigemptyset( &sigmask );
-    sigaddset( &sigmask, SIGHUP );
-    sigaddset( &sigmask, SIGINT );
-    sigaddset( &sigmask, SIGQUIT );
-    sigaddset( &sigmask, SIGTERM );
-    
-    int    sig;
-    sigwait( &sigmask, &sig );
-
-    received_sig = sig;
-    exit_requested = 1;
+void    l7vsd::sig_exit_handler()
+{
+        Logger    logger(LOG_CAT_L7VSD_MAINTHREAD, 40, "l7vsd::sig_exit_handler", __FILE__, __LINE__);
+
+        sigset_t    sigmask;
+        sigemptyset(&sigmask);
+        sigaddset(&sigmask, SIGHUP);
+        sigaddset(&sigmask, SIGINT);
+        sigaddset(&sigmask, SIGQUIT);
+        sigaddset(&sigmask, SIGTERM);
+        sigaddset(&sigmask, SIGPIPE);
+
+        int    sig;
+        sigwait(&sigmask, &sig);
+
+        received_sig = sig;
+        exit_requested = 1;
 }
 
 };// namespace l7vsd
 
 #ifndef    TEST_CASE
 
-extern "C" int pthread_sigmask_non( int how, const sigset_t* newmask, sigset_t* old_mask ){
-    return 0;
+extern "C" int pthread_sigmask_non(int how, const sigset_t *newmask, sigset_t *old_mask)
+{
+        return 0;
 }
-int pthread_sigmask( int, const sigset_t*, sigset_t*) __attribute__((weak,alias("pthread_sigmask_non" )));
+int pthread_sigmask(int, const sigset_t *, sigset_t *) __attribute__((weak, alias("pthread_sigmask_non")));
 
 
 //! main function
-int main( int argc, char* argv[] ){
+int main(int argc, char *argv[])
+{
 
-    int ret = 0;
+        int ret = 0;
 
-    // signal block
-    sigset_t    newmask;
-    sigset_t    oldmask;
-    sigfillset( &newmask );
-    ret = sigprocmask( SIG_BLOCK, &newmask, &oldmask );
-    if( 0 != ret )
-        return ret;
+        // signal block
+        sigset_t    newmask;
+        sigset_t    oldmask;
+        sigfillset(&newmask);
+        ret = sigprocmask(SIG_BLOCK, &newmask, &oldmask);
+        if (0 != ret)
+                return ret;
 
-    try{
-        l7vs::Logger    logger_instance;
-        l7vs::Parameter    parameter_instance;
-        logger_instance.loadConf();
-        l7vs::logger_access_manager::getInstance().access_log_rotate_loadConf();
+        try {
+                l7vs::Logger    logger_instance;
+                l7vs::Parameter    parameter_instance;
+                logger_instance.loadConf();
+                l7vs::logger_access_manager::getInstance().access_log_rotate_loadConf();
 
-        l7vs::l7vsd vsd;
+                l7vs::l7vsd vsd;
 
-        ret =  vsd.run( argc, argv );
-    }
-    catch( ... ){
-        return -1;
-    }
+                ret =  vsd.run(argc, argv);
+        } catch (...) {
+                return -1;
+        }
 
-    // restore sigmask
-    pthread_sigmask( SIG_SETMASK, &oldmask, NULL );
+        // restore sigmask
+        pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
 
-    return ret;
+        return ret;
 
 }
 #endif    //TEST_CASE