ensure that DAHDI_INCLUDE and ZAPTEL_INCLUDE are added in all the places needed
[asterisk-bristuff.git] / res / snmp / agent.c
blob7ab0d68f91e17b48cc50c25ea244420eef638af8
1 /*
2 * Copyright (C) 2006 Voop as
3 * Thorsten Lockert <tholo@voop.as>
5 * This program is free software, distributed under the terms of
6 * the GNU General Public License Version 2. See the LICENSE file
7 * at the top of the source tree.
8 */
10 /*! \file
12 * \brief SNMP Agent / SubAgent support for Asterisk
14 * \author Thorsten Lockert <tholo@voop.as>
17 #include "asterisk.h"
19 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
21 #include <net-snmp/net-snmp-config.h>
22 #include <net-snmp/net-snmp-includes.h>
23 #include <net-snmp/agent/net-snmp-agent-includes.h>
25 #include "asterisk/channel.h"
26 #include "asterisk/logger.h"
27 #include "asterisk/options.h"
28 #include "asterisk/indications.h"
29 #include "asterisk/version.h"
30 #include "asterisk/pbx.h"
32 /* Colission between Net-SNMP and Asterisk */
33 #define unload_module ast_unload_module
34 #include "asterisk/module.h"
35 #undef unload_module
37 #include "agent.h"
39 /* Helper functions in Net-SNMP, header file not installed by default */
40 int header_generic(struct variable *, oid *, size_t *, int, size_t *, WriteMethod **);
41 int header_simple_table(struct variable *, oid *, size_t *, int, size_t *, WriteMethod **, int);
42 int register_sysORTable(oid *, size_t, const char *);
43 int unregister_sysORTable(oid *, size_t);
45 /* Not defined in header files */
46 extern char ast_config_AST_SOCKET[];
48 /* Forward declaration */
49 static void init_asterisk_mib(void);
52 * Anchor for all the Asterisk MIB values
54 static oid asterisk_oid[] = { 1, 3, 6, 1, 4, 1, 22736, 1 };
57 * MIB values -- these correspond to values in the Asterisk MIB,
58 * and MUST be kept in sync with the MIB for things to work as
59 * expected.
61 #define ASTVERSION 1
62 #define ASTVERSTRING 1
63 #define ASTVERTAG 2
65 #define ASTCONFIGURATION 2
66 #define ASTCONFUPTIME 1
67 #define ASTCONFRELOADTIME 2
68 #define ASTCONFPID 3
69 #define ASTCONFSOCKET 4
71 #define ASTMODULES 3
72 #define ASTMODCOUNT 1
74 #define ASTINDICATIONS 4
75 #define ASTINDCOUNT 1
76 #define ASTINDCURRENT 2
78 #define ASTINDTABLE 3
79 #define ASTINDINDEX 1
80 #define ASTINDCOUNTRY 2
81 #define ASTINDALIAS 3
82 #define ASTINDDESCRIPTION 4
84 #define ASTCHANNELS 5
85 #define ASTCHANCOUNT 1
87 #define ASTCHANTABLE 2
88 #define ASTCHANINDEX 1
89 #define ASTCHANNAME 2
90 #define ASTCHANLANGUAGE 3
91 #define ASTCHANTYPE 4
92 #define ASTCHANMUSICCLASS 5
93 #define ASTCHANBRIDGE 6
94 #define ASTCHANMASQ 7
95 #define ASTCHANMASQR 8
96 #define ASTCHANWHENHANGUP 9
97 #define ASTCHANAPP 10
98 #define ASTCHANDATA 11
99 #define ASTCHANCONTEXT 12
100 #define ASTCHANMACROCONTEXT 13
101 #define ASTCHANMACROEXTEN 14
102 #define ASTCHANMACROPRI 15
103 #define ASTCHANEXTEN 16
104 #define ASTCHANPRI 17
105 #define ASTCHANACCOUNTCODE 18
106 #define ASTCHANFORWARDTO 19
107 #define ASTCHANUNIQUEID 20
108 #define ASTCHANCALLGROUP 21
109 #define ASTCHANPICKUPGROUP 22
110 #define ASTCHANSTATE 23
111 #define ASTCHANMUTED 24
112 #define ASTCHANRINGS 25
113 #define ASTCHANCIDDNID 26
114 #define ASTCHANCIDNUM 27
115 #define ASTCHANCIDNAME 28
116 #define ASTCHANCIDANI 29
117 #define ASTCHANCIDRDNIS 30
118 #define ASTCHANCIDPRES 31
119 #define ASTCHANCIDANI2 32
120 #define ASTCHANCIDTON 33
121 #define ASTCHANCIDTNS 34
122 #define ASTCHANAMAFLAGS 35
123 #define ASTCHANADSI 36
124 #define ASTCHANTONEZONE 37
125 #define ASTCHANHANGUPCAUSE 38
126 #define ASTCHANVARIABLES 39
127 #define ASTCHANFLAGS 40
128 #define ASTCHANTRANSFERCAP 41
130 #define ASTCHANTYPECOUNT 3
132 #define ASTCHANTYPETABLE 4
133 #define ASTCHANTYPEINDEX 1
134 #define ASTCHANTYPENAME 2
135 #define ASTCHANTYPEDESC 3
136 #define ASTCHANTYPEDEVSTATE 4
137 #define ASTCHANTYPEINDICATIONS 5
138 #define ASTCHANTYPETRANSFER 6
139 #define ASTCHANTYPECHANNELS 7
141 void *agent_thread(void *arg)
143 ast_verbose(VERBOSE_PREFIX_2 "Starting %sAgent\n", res_snmp_agentx_subagent ? "Sub" : "");
145 snmp_enable_stderrlog();
147 if (res_snmp_agentx_subagent)
148 netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID,
149 NETSNMP_DS_AGENT_ROLE,
152 init_agent("asterisk");
154 init_asterisk_mib();
156 init_snmp("asterisk");
158 if (!res_snmp_agentx_subagent)
159 init_master_agent();
161 while (res_snmp_dont_stop)
162 agent_check_and_process(1);
164 snmp_shutdown("asterisk");
166 ast_verbose(VERBOSE_PREFIX_2 "Terminating %sAgent\n",
167 res_snmp_agentx_subagent ? "Sub" : "");
169 return NULL;
172 static u_char *
173 ast_var_channels(struct variable *vp, oid *name, size_t *length,
174 int exact, size_t *var_len, WriteMethod **write_method)
176 static unsigned long long_ret;
178 if (header_generic(vp, name, length, exact, var_len, write_method))
179 return NULL;
181 switch (vp->magic) {
182 case ASTCHANCOUNT:
183 long_ret = ast_active_channels();
184 return (u_char *)&long_ret;
185 default:
186 break;
188 return NULL;
191 static u_char *ast_var_channels_table(struct variable *vp, oid *name, size_t *length,
192 int exact, size_t *var_len, WriteMethod **write_method)
194 static unsigned long long_ret;
195 static u_char bits_ret[2];
196 static char string_ret[256];
197 struct ast_channel *chan, *bridge;
198 struct timeval tval;
199 u_char *ret;
200 int i, bit;
202 if (header_simple_table(vp, name, length, exact, var_len, write_method, ast_active_channels()))
203 return NULL;
205 i = name[*length - 1] - 1;
206 for (chan = ast_channel_walk_locked(NULL);
207 chan && i;
208 chan = ast_channel_walk_locked(chan), i--)
209 ast_channel_unlock(chan);
210 if (chan == NULL)
211 return NULL;
212 *var_len = sizeof(long_ret);
214 switch (vp->magic) {
215 case ASTCHANINDEX:
216 long_ret = name[*length - 1];
217 ret = (u_char *)&long_ret;
218 break;
219 case ASTCHANNAME:
220 if (!ast_strlen_zero(chan->name)) {
221 strncpy(string_ret, chan->name, sizeof(string_ret));
222 string_ret[sizeof(string_ret) - 1] = '\0';
223 *var_len = strlen(string_ret);
224 ret = (u_char *)string_ret;
226 else
227 ret = NULL;
228 break;
229 case ASTCHANLANGUAGE:
230 if (!ast_strlen_zero(chan->language)) {
231 strncpy(string_ret, chan->language, sizeof(string_ret));
232 string_ret[sizeof(string_ret) - 1] = '\0';
233 *var_len = strlen(string_ret);
234 ret = (u_char *)string_ret;
236 else
237 ret = NULL;
238 break;
239 case ASTCHANTYPE:
240 strncpy(string_ret, chan->tech->type, sizeof(string_ret));
241 string_ret[sizeof(string_ret) - 1] = '\0';
242 *var_len = strlen(string_ret);
243 ret = (u_char *)string_ret;
244 break;
245 case ASTCHANMUSICCLASS:
246 if (!ast_strlen_zero(chan->musicclass)) {
247 strncpy(string_ret, chan->musicclass, sizeof(string_ret));
248 string_ret[sizeof(string_ret) - 1] = '\0';
249 *var_len = strlen(string_ret);
250 ret = (u_char *)string_ret;
252 else
253 ret = NULL;
254 break;
255 case ASTCHANBRIDGE:
256 if ((bridge = ast_bridged_channel(chan)) != NULL) {
257 strncpy(string_ret, bridge->name, sizeof(string_ret));
258 string_ret[sizeof(string_ret) - 1] = '\0';
259 *var_len = strlen(string_ret);
260 ret = (u_char *)string_ret;
262 else
263 ret = NULL;
264 break;
265 case ASTCHANMASQ:
266 if (chan->masq && !ast_strlen_zero(chan->masq->name)) {
267 strncpy(string_ret, chan->masq->name, sizeof(string_ret));
268 string_ret[sizeof(string_ret) - 1] = '\0';
269 *var_len = strlen(string_ret);
270 ret = (u_char *)string_ret;
272 else
273 ret = NULL;
274 break;
275 case ASTCHANMASQR:
276 if (chan->masqr && !ast_strlen_zero(chan->masqr->name)) {
277 strncpy(string_ret, chan->masqr->name, sizeof(string_ret));
278 string_ret[sizeof(string_ret) - 1] = '\0';
279 *var_len = strlen(string_ret);
280 ret = (u_char *)string_ret;
282 else
283 ret = NULL;
284 break;
285 case ASTCHANWHENHANGUP:
286 if (chan->whentohangup) {
287 gettimeofday(&tval, NULL);
288 long_ret = difftime(chan->whentohangup, tval.tv_sec) * 100 - tval.tv_usec / 10000;
289 ret= (u_char *)&long_ret;
291 else
292 ret = NULL;
293 break;
294 case ASTCHANAPP:
295 if (chan->appl) {
296 strncpy(string_ret, chan->appl, sizeof(string_ret));
297 string_ret[sizeof(string_ret) - 1] = '\0';
298 *var_len = strlen(string_ret);
299 ret = (u_char *)string_ret;
301 else
302 ret = NULL;
303 break;
304 case ASTCHANDATA:
305 if (chan->data) {
306 strncpy(string_ret, chan->data, sizeof(string_ret));
307 string_ret[sizeof(string_ret) - 1] = '\0';
308 *var_len = strlen(string_ret);
309 ret = (u_char *)string_ret;
311 else
312 ret = NULL;
313 break;
314 case ASTCHANCONTEXT:
315 strncpy(string_ret, chan->context, sizeof(string_ret));
316 string_ret[sizeof(string_ret) - 1] = '\0';
317 *var_len = strlen(string_ret);
318 ret = (u_char *)string_ret;
319 break;
320 case ASTCHANMACROCONTEXT:
321 strncpy(string_ret, chan->macrocontext, sizeof(string_ret));
322 string_ret[sizeof(string_ret) - 1] = '\0';
323 *var_len = strlen(string_ret);
324 ret = (u_char *)string_ret;
325 break;
326 case ASTCHANMACROEXTEN:
327 strncpy(string_ret, chan->macroexten, sizeof(string_ret));
328 string_ret[sizeof(string_ret) - 1] = '\0';
329 *var_len = strlen(string_ret);
330 ret = (u_char *)string_ret;
331 break;
332 case ASTCHANMACROPRI:
333 long_ret = chan->macropriority;
334 ret = (u_char *)&long_ret;
335 break;
336 case ASTCHANEXTEN:
337 strncpy(string_ret, chan->exten, sizeof(string_ret));
338 string_ret[sizeof(string_ret) - 1] = '\0';
339 *var_len = strlen(string_ret);
340 ret = (u_char *)string_ret;
341 break;
342 case ASTCHANPRI:
343 long_ret = chan->priority;
344 ret = (u_char *)&long_ret;
345 break;
346 case ASTCHANACCOUNTCODE:
347 if (!ast_strlen_zero(chan->accountcode)) {
348 strncpy(string_ret, chan->accountcode, sizeof(string_ret));
349 string_ret[sizeof(string_ret) - 1] = '\0';
350 *var_len = strlen(string_ret);
351 ret = (u_char *)string_ret;
353 else
354 ret = NULL;
355 break;
356 case ASTCHANFORWARDTO:
357 if (!ast_strlen_zero(chan->call_forward)) {
358 strncpy(string_ret, chan->call_forward, sizeof(string_ret));
359 string_ret[sizeof(string_ret) - 1] = '\0';
360 *var_len = strlen(string_ret);
361 ret = (u_char *)string_ret;
363 else
364 ret = NULL;
365 break;
366 case ASTCHANUNIQUEID:
367 strncpy(string_ret, chan->uniqueid, sizeof(string_ret));
368 string_ret[sizeof(string_ret) - 1] = '\0';
369 *var_len = strlen(string_ret);
370 ret = (u_char *)string_ret;
371 break;
372 case ASTCHANCALLGROUP:
373 long_ret = chan->callgroup;
374 ret = (u_char *)&long_ret;
375 break;
376 case ASTCHANPICKUPGROUP:
377 long_ret = chan->pickupgroup;
378 ret = (u_char *)&long_ret;
379 break;
380 case ASTCHANSTATE:
381 long_ret = chan->_state & 0xffff;
382 ret = (u_char *)&long_ret;
383 break;
384 case ASTCHANMUTED:
385 long_ret = chan->_state & AST_STATE_MUTE ? 1 : 2;
386 ret = (u_char *)&long_ret;
387 break;
388 case ASTCHANRINGS:
389 long_ret = chan->rings;
390 ret = (u_char *)&long_ret;
391 break;
392 case ASTCHANCIDDNID:
393 if (chan->cid.cid_dnid) {
394 strncpy(string_ret, chan->cid.cid_dnid, sizeof(string_ret));
395 string_ret[sizeof(string_ret) - 1] = '\0';
396 *var_len = strlen(string_ret);
397 ret = (u_char *)string_ret;
399 else
400 ret = NULL;
401 break;
402 case ASTCHANCIDNUM:
403 if (chan->cid.cid_num) {
404 strncpy(string_ret, chan->cid.cid_num, sizeof(string_ret));
405 string_ret[sizeof(string_ret) - 1] = '\0';
406 *var_len = strlen(string_ret);
407 ret = (u_char *)string_ret;
409 else
410 ret = NULL;
411 break;
412 case ASTCHANCIDNAME:
413 if (chan->cid.cid_name) {
414 strncpy(string_ret, chan->cid.cid_name, sizeof(string_ret));
415 string_ret[sizeof(string_ret) - 1] = '\0';
416 *var_len = strlen(string_ret);
417 ret = (u_char *)string_ret;
419 else
420 ret = NULL;
421 break;
422 case ASTCHANCIDANI:
423 if (chan->cid.cid_ani) {
424 strncpy(string_ret, chan->cid.cid_ani, sizeof(string_ret));
425 string_ret[sizeof(string_ret) - 1] = '\0';
426 *var_len = strlen(string_ret);
427 ret = (u_char *)string_ret;
429 else
430 ret = NULL;
431 break;
432 case ASTCHANCIDRDNIS:
433 if (chan->cid.cid_rdnis) {
434 strncpy(string_ret, chan->cid.cid_rdnis, sizeof(string_ret));
435 string_ret[sizeof(string_ret) - 1] = '\0';
436 *var_len = strlen(string_ret);
437 ret = (u_char *)string_ret;
439 else
440 ret = NULL;
441 break;
442 case ASTCHANCIDPRES:
443 long_ret = chan->cid.cid_pres;
444 ret = (u_char *)&long_ret;
445 break;
446 case ASTCHANCIDANI2:
447 long_ret = chan->cid.cid_ani2;
448 ret = (u_char *)&long_ret;
449 break;
450 case ASTCHANCIDTON:
451 long_ret = chan->cid.cid_ton;
452 ret = (u_char *)&long_ret;
453 break;
454 case ASTCHANCIDTNS:
455 long_ret = chan->cid.cid_tns;
456 ret = (u_char *)&long_ret;
457 break;
458 case ASTCHANAMAFLAGS:
459 long_ret = chan->amaflags;
460 ret = (u_char *)&long_ret;
461 break;
462 case ASTCHANADSI:
463 long_ret = chan->adsicpe;
464 ret = (u_char *)&long_ret;
465 break;
466 case ASTCHANTONEZONE:
467 if (chan->zone) {
468 strncpy(string_ret, chan->zone->country, sizeof(string_ret));
469 string_ret[sizeof(string_ret) - 1] = '\0';
470 *var_len = strlen(string_ret);
471 ret = (u_char *)string_ret;
473 else
474 ret = NULL;
475 break;
476 case ASTCHANHANGUPCAUSE:
477 long_ret = chan->hangupcause;
478 ret = (u_char *)&long_ret;
479 break;
480 case ASTCHANVARIABLES:
481 if (pbx_builtin_serialize_variables(chan, string_ret, sizeof(string_ret))) {
482 *var_len = strlen(string_ret);
483 ret = (u_char *)string_ret;
485 else
486 ret = NULL;
487 break;
488 case ASTCHANFLAGS:
489 bits_ret[0] = 0;
490 for (bit = 0; bit < 8; bit++)
491 bits_ret[0] |= ((chan->flags & (1 << bit)) >> bit) << (7 - bit);
492 bits_ret[1] = 0;
493 for (bit = 0; bit < 8; bit++)
494 bits_ret[1] |= (((chan->flags >> 8) & (1 << bit)) >> bit) << (7 - bit);
495 *var_len = 2;
496 ret = bits_ret;
497 break;
498 case ASTCHANTRANSFERCAP:
499 long_ret = chan->transfercapability;
500 ret = (u_char *)&long_ret;
501 break;
502 default:
503 ret = NULL;
504 break;
506 ast_channel_unlock(chan);
507 return ret;
510 static u_char *ast_var_channel_types(struct variable *vp, oid *name, size_t *length,
511 int exact, size_t *var_len, WriteMethod **write_method)
513 static unsigned long long_ret;
514 struct ast_variable *channel_types, *next;
516 if (header_generic(vp, name, length, exact, var_len, write_method))
517 return NULL;
519 switch (vp->magic) {
520 case ASTCHANTYPECOUNT:
521 long_ret = 0;
522 for (channel_types = next = ast_channeltype_list(); next; next = next->next) {
523 long_ret++;
525 ast_variables_destroy(channel_types);
526 return (u_char *)&long_ret;
527 default:
528 break;
530 return NULL;
533 static u_char *ast_var_channel_types_table(struct variable *vp, oid *name, size_t *length,
534 int exact, size_t *var_len, WriteMethod **write_method)
536 const struct ast_channel_tech *tech = NULL;
537 struct ast_variable *channel_types, *next;
538 static unsigned long long_ret;
539 struct ast_channel *chan;
540 u_long i;
542 if (header_simple_table(vp, name, length, exact, var_len, write_method, -1))
543 return NULL;
545 channel_types = ast_channeltype_list();
546 for (i = 1, next = channel_types; next && i != name[*length - 1]; next = next->next, i++)
548 if (next != NULL)
549 tech = ast_get_channel_tech(next->name);
550 ast_variables_destroy(channel_types);
551 if (next == NULL || tech == NULL)
552 return NULL;
554 switch (vp->magic) {
555 case ASTCHANTYPEINDEX:
556 long_ret = name[*length - 1];
557 return (u_char *)&long_ret;
558 case ASTCHANTYPENAME:
559 *var_len = strlen(tech->type);
560 return (u_char *)tech->type;
561 case ASTCHANTYPEDESC:
562 *var_len = strlen(tech->description);
563 return (u_char *)tech->description;
564 case ASTCHANTYPEDEVSTATE:
565 long_ret = tech->devicestate ? 1 : 2;
566 return (u_char *)&long_ret;
567 case ASTCHANTYPEINDICATIONS:
568 long_ret = tech->indicate ? 1 : 2;
569 return (u_char *)&long_ret;
570 case ASTCHANTYPETRANSFER:
571 long_ret = tech->transfer ? 1 : 2;
572 return (u_char *)&long_ret;
573 case ASTCHANTYPECHANNELS:
574 long_ret = 0;
575 for (chan = ast_channel_walk_locked(NULL); chan; chan = ast_channel_walk_locked(chan)) {
576 ast_channel_unlock(chan);
577 if (chan->tech == tech)
578 long_ret++;
580 return (u_char *)&long_ret;
581 default:
582 break;
584 return NULL;
587 static u_char *ast_var_Config(struct variable *vp, oid *name, size_t *length,
588 int exact, size_t *var_len, WriteMethod **write_method)
590 static unsigned long long_ret;
591 struct timeval tval;
593 if (header_generic(vp, name, length, exact, var_len, write_method))
594 return NULL;
596 switch (vp->magic) {
597 case ASTCONFUPTIME:
598 gettimeofday(&tval, NULL);
599 long_ret = difftime(tval.tv_sec, ast_startuptime) * 100 + tval.tv_usec / 10000;
600 return (u_char *)&long_ret;
601 case ASTCONFRELOADTIME:
602 gettimeofday(&tval, NULL);
603 if (ast_lastreloadtime)
604 long_ret = difftime(tval.tv_sec, ast_lastreloadtime) * 100 + tval.tv_usec / 10000;
605 else
606 long_ret = difftime(tval.tv_sec, ast_startuptime) * 100 + tval.tv_usec / 10000;
607 return (u_char *)&long_ret;
608 case ASTCONFPID:
609 long_ret = getpid();
610 return (u_char *)&long_ret;
611 case ASTCONFSOCKET:
612 *var_len = strlen(ast_config_AST_SOCKET);
613 return (u_char *)ast_config_AST_SOCKET;
614 default:
615 break;
617 return NULL;
620 static u_char *ast_var_indications(struct variable *vp, oid *name, size_t *length,
621 int exact, size_t *var_len, WriteMethod **write_method)
623 static unsigned long long_ret;
624 struct ind_tone_zone *tz = NULL;
626 if (header_generic(vp, name, length, exact, var_len, write_method))
627 return NULL;
629 switch (vp->magic) {
630 case ASTINDCOUNT:
631 long_ret = 0;
632 while ( (tz = ast_walk_indications(tz)) )
633 long_ret++;
635 return (u_char *)&long_ret;
636 case ASTINDCURRENT:
637 tz = ast_get_indication_zone(NULL);
638 if (tz) {
639 *var_len = strlen(tz->country);
640 return (u_char *)tz->country;
642 *var_len = 0;
643 return NULL;
644 default:
645 break;
647 return NULL;
650 static u_char *ast_var_indications_table(struct variable *vp, oid *name, size_t *length,
651 int exact, size_t *var_len, WriteMethod **write_method)
653 static unsigned long long_ret;
654 struct ind_tone_zone *tz = NULL;
655 int i;
657 if (header_simple_table(vp, name, length, exact, var_len, write_method, -1))
658 return NULL;
660 i = name[*length - 1] - 1;
661 while ( (tz = ast_walk_indications(tz)) && i )
662 i--;
663 if (tz == NULL)
664 return NULL;
666 switch (vp->magic) {
667 case ASTINDINDEX:
668 long_ret = name[*length - 1];
669 return (u_char *)&long_ret;
670 case ASTINDCOUNTRY:
671 *var_len = strlen(tz->country);
672 return (u_char *)tz->country;
673 case ASTINDALIAS:
674 if (tz->alias) {
675 *var_len = strlen(tz->alias);
676 return (u_char *)tz->alias;
678 return NULL;
679 case ASTINDDESCRIPTION:
680 *var_len = strlen(tz->description);
681 return (u_char *)tz->description;
682 default:
683 break;
685 return NULL;
688 static int countmodule(const char *mod, const char *desc, int use, const char *like)
690 return 1;
693 static u_char *ast_var_Modules(struct variable *vp, oid *name, size_t *length,
694 int exact, size_t *var_len, WriteMethod **write_method)
696 static unsigned long long_ret;
698 if (header_generic(vp, name, length, exact, var_len, write_method))
699 return NULL;
701 switch (vp->magic) {
702 case ASTMODCOUNT:
703 long_ret = ast_update_module_list(countmodule, NULL);
704 return (u_char *)&long_ret;
705 default:
706 break;
708 return NULL;
711 static u_char *ast_var_Version(struct variable *vp, oid *name, size_t *length,
712 int exact, size_t *var_len, WriteMethod **write_method)
714 static unsigned long long_ret;
716 if (header_generic(vp, name, length, exact, var_len, write_method))
717 return NULL;
719 switch (vp->magic) {
720 case ASTVERSTRING:
721 *var_len = strlen(ASTERISK_VERSION);
722 return (u_char *)ASTERISK_VERSION;
723 case ASTVERTAG:
724 long_ret = ASTERISK_VERSION_NUM;
725 return (u_char *)&long_ret;
726 default:
727 break;
729 return NULL;
732 static int term_asterisk_mib(int majorID, int minorID, void *serverarg, void *clientarg)
734 unregister_sysORTable(asterisk_oid, OID_LENGTH(asterisk_oid));
735 return 0;
738 static void init_asterisk_mib(void)
740 static struct variable4 asterisk_vars[] = {
741 {ASTVERSTRING, ASN_OCTET_STR, RONLY, ast_var_Version, 2, {ASTVERSION, ASTVERSTRING}},
742 {ASTVERTAG, ASN_UNSIGNED, RONLY, ast_var_Version, 2, {ASTVERSION, ASTVERTAG}},
743 {ASTCONFUPTIME, ASN_TIMETICKS, RONLY, ast_var_Config, 2, {ASTCONFIGURATION, ASTCONFUPTIME}},
744 {ASTCONFRELOADTIME, ASN_TIMETICKS, RONLY, ast_var_Config, 2, {ASTCONFIGURATION, ASTCONFRELOADTIME}},
745 {ASTCONFPID, ASN_INTEGER, RONLY, ast_var_Config, 2, {ASTCONFIGURATION, ASTCONFPID}},
746 {ASTCONFSOCKET, ASN_OCTET_STR, RONLY, ast_var_Config, 2, {ASTCONFIGURATION, ASTCONFSOCKET}},
747 {ASTMODCOUNT, ASN_INTEGER, RONLY, ast_var_Modules , 2, {ASTMODULES, ASTMODCOUNT}},
748 {ASTINDCOUNT, ASN_INTEGER, RONLY, ast_var_indications, 2, {ASTINDICATIONS, ASTINDCOUNT}},
749 {ASTINDCURRENT, ASN_OCTET_STR, RONLY, ast_var_indications, 2, {ASTINDICATIONS, ASTINDCURRENT}},
750 {ASTINDINDEX, ASN_INTEGER, RONLY, ast_var_indications_table, 4, {ASTINDICATIONS, ASTINDTABLE, 1, ASTINDINDEX}},
751 {ASTINDCOUNTRY, ASN_OCTET_STR, RONLY, ast_var_indications_table, 4, {ASTINDICATIONS, ASTINDTABLE, 1, ASTINDCOUNTRY}},
752 {ASTINDALIAS, ASN_OCTET_STR, RONLY, ast_var_indications_table, 4, {ASTINDICATIONS, ASTINDTABLE, 1, ASTINDALIAS}},
753 {ASTINDDESCRIPTION, ASN_OCTET_STR, RONLY, ast_var_indications_table, 4, {ASTINDICATIONS, ASTINDTABLE, 1, ASTINDDESCRIPTION}},
754 {ASTCHANCOUNT, ASN_GAUGE, RONLY, ast_var_channels, 2, {ASTCHANNELS, ASTCHANCOUNT}},
755 {ASTCHANINDEX, ASN_INTEGER, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANINDEX}},
756 {ASTCHANNAME, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANNAME}},
757 {ASTCHANLANGUAGE, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANLANGUAGE}},
758 {ASTCHANTYPE, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANTYPE}},
759 {ASTCHANMUSICCLASS, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANMUSICCLASS}},
760 {ASTCHANBRIDGE, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANBRIDGE}},
761 {ASTCHANMASQ, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANMASQ}},
762 {ASTCHANMASQR, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANMASQR}},
763 {ASTCHANWHENHANGUP, ASN_TIMETICKS, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANWHENHANGUP}},
764 {ASTCHANAPP, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANAPP}},
765 {ASTCHANDATA, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANDATA}},
766 {ASTCHANCONTEXT, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANCONTEXT}},
767 {ASTCHANMACROCONTEXT, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANMACROCONTEXT}},
768 {ASTCHANMACROEXTEN, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANMACROEXTEN}},
769 {ASTCHANMACROPRI, ASN_INTEGER, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANMACROPRI}},
770 {ASTCHANEXTEN, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANEXTEN}},
771 {ASTCHANPRI, ASN_INTEGER, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANPRI}},
772 {ASTCHANACCOUNTCODE, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANACCOUNTCODE}},
773 {ASTCHANFORWARDTO, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANFORWARDTO}},
774 {ASTCHANUNIQUEID, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANUNIQUEID}},
775 {ASTCHANCALLGROUP, ASN_UNSIGNED, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANCALLGROUP}},
776 {ASTCHANPICKUPGROUP, ASN_UNSIGNED, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANPICKUPGROUP}},
777 {ASTCHANSTATE, ASN_INTEGER, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANSTATE}},
778 {ASTCHANMUTED, ASN_INTEGER, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANMUTED}},
779 {ASTCHANRINGS, ASN_INTEGER, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANRINGS}},
780 {ASTCHANCIDDNID, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANCIDDNID}},
781 {ASTCHANCIDNUM, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANCIDNUM}},
782 {ASTCHANCIDNAME, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANCIDNAME}},
783 {ASTCHANCIDANI, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANCIDANI}},
784 {ASTCHANCIDRDNIS, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANCIDRDNIS}},
785 {ASTCHANCIDPRES, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANCIDPRES}},
786 {ASTCHANCIDANI2, ASN_INTEGER, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANCIDANI2}},
787 {ASTCHANCIDTON, ASN_INTEGER, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANCIDTON}},
788 {ASTCHANCIDTNS, ASN_INTEGER, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANCIDTNS}},
789 {ASTCHANAMAFLAGS, ASN_INTEGER, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANAMAFLAGS}},
790 {ASTCHANADSI, ASN_INTEGER, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANADSI}},
791 {ASTCHANTONEZONE, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANTONEZONE}},
792 {ASTCHANHANGUPCAUSE, ASN_INTEGER, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANHANGUPCAUSE}},
793 {ASTCHANVARIABLES, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANVARIABLES}},
794 {ASTCHANFLAGS, ASN_OCTET_STR, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANFLAGS}},
795 {ASTCHANTRANSFERCAP, ASN_INTEGER, RONLY, ast_var_channels_table, 4, {ASTCHANNELS, ASTCHANTABLE, 1, ASTCHANTRANSFERCAP}},
796 {ASTCHANTYPECOUNT, ASN_INTEGER, RONLY, ast_var_channel_types, 2, {ASTCHANNELS, ASTCHANTYPECOUNT}},
797 {ASTCHANTYPEINDEX, ASN_INTEGER, RONLY, ast_var_channel_types_table, 4, {ASTCHANNELS, ASTCHANTYPETABLE, 1, ASTCHANTYPEINDEX}},
798 {ASTCHANTYPENAME, ASN_OCTET_STR, RONLY, ast_var_channel_types_table, 4, {ASTCHANNELS, ASTCHANTYPETABLE, 1, ASTCHANTYPENAME}},
799 {ASTCHANTYPEDESC, ASN_OCTET_STR, RONLY, ast_var_channel_types_table, 4, {ASTCHANNELS, ASTCHANTYPETABLE, 1, ASTCHANTYPEDESC}},
800 {ASTCHANTYPEDEVSTATE, ASN_INTEGER, RONLY, ast_var_channel_types_table, 4, {ASTCHANNELS, ASTCHANTYPETABLE, 1, ASTCHANTYPEDEVSTATE}},
801 {ASTCHANTYPEINDICATIONS, ASN_INTEGER, RONLY, ast_var_channel_types_table, 4, {ASTCHANNELS, ASTCHANTYPETABLE, 1, ASTCHANTYPEINDICATIONS}},
802 {ASTCHANTYPETRANSFER, ASN_INTEGER, RONLY, ast_var_channel_types_table, 4, {ASTCHANNELS, ASTCHANTYPETABLE, 1, ASTCHANTYPETRANSFER}},
803 {ASTCHANTYPECHANNELS, ASN_GAUGE, RONLY, ast_var_channel_types_table, 4, {ASTCHANNELS, ASTCHANTYPETABLE, 1, ASTCHANTYPECHANNELS}},
806 register_sysORTable(asterisk_oid, OID_LENGTH(asterisk_oid),
807 "ASTERISK-MIB implementation for Asterisk.");
809 REGISTER_MIB("res_snmp", asterisk_vars, variable4, asterisk_oid);
811 snmp_register_callback(SNMP_CALLBACK_LIBRARY,
812 SNMP_CALLBACK_SHUTDOWN,
813 term_asterisk_mib, NULL);
817 * Local Variables:
818 * c-basic-offset: 4
819 * c-file-offsets: ((case-label . 0))
820 * tab-width: 4
821 * indent-tabs-mode: t
822 * End: