OSDN Git Service

Merge DHC codes
[ultramonkey-l7/ultramonkey-l7-v3.git] / snmpagent / subagent.cpp
1 #include <sstream>
2 #include <sys/time.h>
3
4 #include "error_code.h"
5 #include "parameter.h"
6 #include "subagent.h"
7 #include "netsnmp_bridge.h"
8
9 #define NIC_DEFAULT         "eth0"
10 #define ADDR_DEFAULT        "127.0.0.1"
11 #define PORT_DEFAULT        (60162)
12 #define INTERVAL_DEFAULT    (1000)
13 #define SLEEPNANOTIME       (1000000)
14
15
16 /*!
17  * l7ag_subagent class constructor
18  */
19 l7ag_subagent::l7ag_subagent()
20 {
21         stop_flag   = false;
22         stat        = STOP;
23
24         dispatcher  = new l7ag_dispatcher(&msg_queue, &trap_queue);
25         messenger   = new MessengerClient(&msg_queue);
26
27         loglevelmap_init();
28 }
29
30 /*!
31  * l7ag_subagent class destructor
32  */
33 l7ag_subagent::~l7ag_subagent()
34 {
35         delete  messenger;
36         delete  dispatcher;
37 }
38
39 /*!
40  * main loop
41  */
42 bool
43 l7ag_subagent::start()
44 {
45         struct timespec req;
46         req.tv_sec = 0;
47         req.tv_nsec = SLEEPNANOTIME;
48
49         // initialize
50         reload_config();
51
52         // convert int to string
53         std::stringstream   ss;
54         std::string         port;
55         ss << snmpparam.portno;
56         ss >> port;
57
58         messenger->setEndpoint(snmpparam.address.c_str(), port.c_str());
59
60         // start IPC thread
61         messenger->start();
62
63         // start dispatcher thread
64         dispatcher->start();
65
66         netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE, 1);
67         init_agent("l7snmpagent");
68         init_netsnmp_bridge(messenger);
69         init_snmp("l7snmpagent");
70
71         //loop
72         while (1) {
73                 agent_check_and_process(0); // non-blocking
74                 if (stop_flag) {
75                         //他スレッドの終了指示
76                         messenger->stop();
77                         dispatcher->stop();
78                         break;
79                 }
80                 //Trapキューチェック
81                 //Trapキューにデータがある場合
82                 if (!dispatcher->get_TrapQueue()->empty()) {
83                         //Trap値設定
84                         struct l7_status *stat = l7ag_store_mibdata::getInstance().getStatmibdata();
85                         strncpy(stat->message, dispatcher->get_TrapQueue()->front().message.c_str(), DISPLAYSTRING_LEN);
86                         l7ag_store_mibdata::getInstance().setStatmibdata(*stat);
87                         //Trap送信
88                         send_um7MessageAlert_trap();
89                         dispatcher->get_TrapQueue()->pop();
90                 }
91
92                 int ret = nanosleep(&req, NULL);
93                 if (ret == -1) {
94                         break; // nanosleep failed
95                 }
96         }
97         //finalize
98
99         //completed
100         return true;
101 }
102
103 /*!
104  * stop main loop
105  */
106 void
107 l7ag_subagent::stop()
108 {
109         stop_flag = true;
110 }
111
112 void
113 l7ag_subagent::reload_config()
114 {
115         l7vs::Parameter        param;
116         l7vs::error_code    err;
117         //パラメータの読み込み
118         //NIC
119         snmpparam.nic = param.get_string(l7vs::PARAM_COMP_SNMPAGENT, "nic", err);
120         if (err) {
121                 snmpparam.nic = NIC_DEFAULT;
122         }
123         //EndPoint
124         snmpparam.address = param.get_string(l7vs::PARAM_COMP_SNMPAGENT, "ip_addr", err);
125         if (err) {
126                 snmpparam.address = ADDR_DEFAULT;
127         }
128         snmpparam.portno = param.get_int(l7vs::PARAM_COMP_SNMPAGENT, "port", err);
129         if (err) {
130                 snmpparam.portno = PORT_DEFAULT;
131         }
132         //RequestInterval
133         snmpparam.interval = param.get_int(l7vs::PARAM_COMP_SNMPAGENT, "interval", err);
134         if (err) {
135                 snmpparam.interval = INTERVAL_DEFAULT;
136         }
137         //status
138         snmpparam.status = param.get_int(l7vs::PARAM_COMP_SNMPAGENT, "status", err);
139         if (err) {
140                 snmpparam.status = 0;
141         }
142
143         //loglevel設定
144         load_loglevel();
145 }
146
147 void
148 l7ag_subagent::load_loglevel()
149 {
150         l7vs::Parameter        param;
151         l7vs::error_code    err;
152         std::string            tmpstr;
153         //log level 取得
154         snmpparam.loglevel.clear();
155
156         tmpstr = param.get_string(l7vs::PARAM_COMP_LOGGER, "snmpagent_start_stop", err);
157         if (!err) {
158                 snmpparam.loglevel.insert(
159                         std::pair<l7vs::LOG_CATEGORY_TAG, l7vs::LOG_LEVEL_TAG>(l7vs::LOG_CAT_SNMPAGENT_START_STOP,
160                                         levelstring_map[tmpstr]));
161         } else {
162                 snmpparam.loglevel.insert(
163                         std::pair<l7vs::LOG_CATEGORY_TAG, l7vs::LOG_LEVEL_TAG>(l7vs::LOG_CAT_SNMPAGENT_START_STOP,
164                                         l7vs::LOG_LV_INFO));
165         }
166
167         tmpstr = param.get_string(l7vs::PARAM_COMP_LOGGER, "snmpagent_manager_receive", err);
168         if (!err) {
169                 snmpparam.loglevel.insert(
170                         std::pair<l7vs::LOG_CATEGORY_TAG, l7vs::LOG_LEVEL_TAG>(l7vs::LOG_CAT_SNMPAGENT_MANAGER_RECEIVE,
171                                         levelstring_map[tmpstr]));
172         } else {
173                 snmpparam.loglevel.insert(
174                         std::pair<l7vs::LOG_CATEGORY_TAG, l7vs::LOG_LEVEL_TAG>(l7vs::LOG_CAT_SNMPAGENT_MANAGER_RECEIVE,
175                                         l7vs::LOG_LV_INFO));
176         }
177
178         tmpstr = param.get_string(l7vs::PARAM_COMP_LOGGER, "snmpagent_manager_send", err);
179         if (!err) {
180                 snmpparam.loglevel.insert(
181                         std::pair<l7vs::LOG_CATEGORY_TAG, l7vs::LOG_LEVEL_TAG>(l7vs::LOG_CAT_SNMPAGENT_MANAGER_SEND,
182                                         levelstring_map[tmpstr]));
183         } else {
184                 snmpparam.loglevel.insert(
185                         std::pair<l7vs::LOG_CATEGORY_TAG, l7vs::LOG_LEVEL_TAG>(l7vs::LOG_CAT_SNMPAGENT_MANAGER_SEND,
186                                         l7vs::LOG_LV_INFO));
187         }
188
189         tmpstr = param.get_string(l7vs::PARAM_COMP_LOGGER, "snmpagent_l7vsd_receive", err);
190         if (!err) {
191                 snmpparam.loglevel.insert(
192                         std::pair<l7vs::LOG_CATEGORY_TAG, l7vs::LOG_LEVEL_TAG>(l7vs::LOG_CAT_SNMPAGENT_L7VSD_RECEIVE,
193                                         levelstring_map[tmpstr]));
194         } else {
195                 snmpparam.loglevel.insert(
196                         std::pair<l7vs::LOG_CATEGORY_TAG, l7vs::LOG_LEVEL_TAG>(l7vs::LOG_CAT_SNMPAGENT_L7VSD_RECEIVE,
197                                         l7vs::LOG_LV_INFO));
198         }
199
200         tmpstr = param.get_string(l7vs::PARAM_COMP_LOGGER, "snmpagent_l7vsd_send", err);
201         if (!err) {
202                 snmpparam.loglevel.insert(
203                         std::pair<l7vs::LOG_CATEGORY_TAG, l7vs::LOG_LEVEL_TAG>(l7vs::LOG_CAT_SNMPAGENT_L7VSD_SEND,
204                                         levelstring_map[tmpstr]));
205         } else {
206                 snmpparam.loglevel.insert(
207                         std::pair<l7vs::LOG_CATEGORY_TAG, l7vs::LOG_LEVEL_TAG>(l7vs::LOG_CAT_SNMPAGENT_L7VSD_SEND,
208                                         l7vs::LOG_LV_INFO));
209         }
210
211         tmpstr = param.get_string(l7vs::PARAM_COMP_LOGGER, "snmpagent_logger", err);
212         if (!err) {
213                 snmpparam.loglevel.insert(
214                         std::pair<l7vs::LOG_CATEGORY_TAG, l7vs::LOG_LEVEL_TAG>(l7vs::LOG_CAT_SNMPAGENT_LOGGER,
215                                         levelstring_map[tmpstr]));
216         } else {
217                 snmpparam.loglevel.insert(
218                         std::pair<l7vs::LOG_CATEGORY_TAG, l7vs::LOG_LEVEL_TAG>(l7vs::LOG_CAT_SNMPAGENT_LOGGER,
219                                         l7vs::LOG_LV_INFO));
220         }
221
222         tmpstr = param.get_string(l7vs::PARAM_COMP_LOGGER, "snmpagent_parameter", err);
223         if (!err) {
224                 snmpparam.loglevel.insert(
225                         std::pair<l7vs::LOG_CATEGORY_TAG, l7vs::LOG_LEVEL_TAG>(l7vs::LOG_CAT_SNMPAGENT_PARAMETER,
226                                         levelstring_map[tmpstr]));
227         } else {
228                 snmpparam.loglevel.insert(
229                         std::pair<l7vs::LOG_CATEGORY_TAG, l7vs::LOG_LEVEL_TAG>(l7vs::LOG_CAT_SNMPAGENT_PARAMETER,
230                                         l7vs::LOG_LV_INFO));
231         }
232 }
233
234 void
235 l7ag_subagent::loglevelmap_init()
236 {
237         //loglevelのテーブル作成
238         levelstring_map.clear();
239         levelstring_map.insert(std::pair<std::string, l7vs::LOG_LEVEL_TAG>("debug", l7vs::LOG_LV_DEBUG));
240         levelstring_map.insert(std::pair<std::string, l7vs::LOG_LEVEL_TAG>("info", l7vs::LOG_LV_INFO));
241         levelstring_map.insert(std::pair<std::string, l7vs::LOG_LEVEL_TAG>("warn", l7vs::LOG_LV_WARN));
242         levelstring_map.insert(std::pair<std::string, l7vs::LOG_LEVEL_TAG>("error", l7vs::LOG_LV_ERROR));
243         levelstring_map.insert(std::pair<std::string, l7vs::LOG_LEVEL_TAG>("fatal", l7vs::LOG_LV_FATAL));
244 }