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.
12 * \brief SNMP Agent / SubAgent support for Asterisk
14 * \author Thorsten Lockert <tholo@voop.as>
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"
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
62 #define ASTVERSTRING 1
65 #define ASTCONFIGURATION 2
66 #define ASTCONFUPTIME 1
67 #define ASTCONFRELOADTIME 2
69 #define ASTCONFSOCKET 4
74 #define ASTINDICATIONS 4
76 #define ASTINDCURRENT 2
80 #define ASTINDCOUNTRY 2
82 #define ASTINDDESCRIPTION 4
85 #define ASTCHANCOUNT 1
87 #define ASTCHANTABLE 2
88 #define ASTCHANINDEX 1
90 #define ASTCHANLANGUAGE 3
92 #define ASTCHANMUSICCLASS 5
93 #define ASTCHANBRIDGE 6
95 #define ASTCHANMASQR 8
96 #define ASTCHANWHENHANGUP 9
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");
156 init_snmp("asterisk");
158 if (!res_snmp_agentx_subagent
)
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" : "");
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
))
183 long_ret
= ast_active_channels();
184 return (u_char
*)&long_ret
;
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
;
202 if (header_simple_table(vp
, name
, length
, exact
, var_len
, write_method
, ast_active_channels()))
205 i
= name
[*length
- 1] - 1;
206 for (chan
= ast_channel_walk_locked(NULL
);
208 chan
= ast_channel_walk_locked(chan
), i
--)
209 ast_channel_unlock(chan
);
212 *var_len
= sizeof(long_ret
);
216 long_ret
= name
[*length
- 1];
217 ret
= (u_char
*)&long_ret
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
332 case ASTCHANMACROPRI
:
333 long_ret
= chan
->macropriority
;
334 ret
= (u_char
*)&long_ret
;
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
;
343 long_ret
= chan
->priority
;
344 ret
= (u_char
*)&long_ret
;
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
;
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
;
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
;
372 case ASTCHANCALLGROUP
:
373 long_ret
= chan
->callgroup
;
374 ret
= (u_char
*)&long_ret
;
376 case ASTCHANPICKUPGROUP
:
377 long_ret
= chan
->pickupgroup
;
378 ret
= (u_char
*)&long_ret
;
381 long_ret
= chan
->_state
& 0xffff;
382 ret
= (u_char
*)&long_ret
;
385 long_ret
= chan
->_state
& AST_STATE_MUTE
? 1 : 2;
386 ret
= (u_char
*)&long_ret
;
389 long_ret
= chan
->rings
;
390 ret
= (u_char
*)&long_ret
;
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
;
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
;
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
;
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
;
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
;
443 long_ret
= chan
->cid
.cid_pres
;
444 ret
= (u_char
*)&long_ret
;
447 long_ret
= chan
->cid
.cid_ani2
;
448 ret
= (u_char
*)&long_ret
;
451 long_ret
= chan
->cid
.cid_ton
;
452 ret
= (u_char
*)&long_ret
;
455 long_ret
= chan
->cid
.cid_tns
;
456 ret
= (u_char
*)&long_ret
;
458 case ASTCHANAMAFLAGS
:
459 long_ret
= chan
->amaflags
;
460 ret
= (u_char
*)&long_ret
;
463 long_ret
= chan
->adsicpe
;
464 ret
= (u_char
*)&long_ret
;
466 case ASTCHANTONEZONE
:
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
;
476 case ASTCHANHANGUPCAUSE
:
477 long_ret
= chan
->hangupcause
;
478 ret
= (u_char
*)&long_ret
;
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
;
490 for (bit
= 0; bit
< 8; bit
++)
491 bits_ret
[0] |= ((chan
->flags
& (1 << bit
)) >> bit
) << (7 - bit
);
493 for (bit
= 0; bit
< 8; bit
++)
494 bits_ret
[1] |= (((chan
->flags
>> 8) & (1 << bit
)) >> bit
) << (7 - bit
);
498 case ASTCHANTRANSFERCAP
:
499 long_ret
= chan
->transfercapability
;
500 ret
= (u_char
*)&long_ret
;
506 ast_channel_unlock(chan
);
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
))
520 case ASTCHANTYPECOUNT
:
522 for (channel_types
= next
= ast_channeltype_list(); next
; next
= next
->next
) {
525 ast_variables_destroy(channel_types
);
526 return (u_char
*)&long_ret
;
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
;
542 if (header_simple_table(vp
, name
, length
, exact
, var_len
, write_method
, -1))
545 channel_types
= ast_channeltype_list();
546 for (i
= 1, next
= channel_types
; next
&& i
!= name
[*length
- 1]; next
= next
->next
, i
++)
549 tech
= ast_get_channel_tech(next
->name
);
550 ast_variables_destroy(channel_types
);
551 if (next
== NULL
|| tech
== NULL
)
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
:
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
)
580 return (u_char
*)&long_ret
;
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
;
593 if (header_generic(vp
, name
, length
, exact
, var_len
, write_method
))
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;
606 long_ret
= difftime(tval
.tv_sec
, ast_startuptime
) * 100 + tval
.tv_usec
/ 10000;
607 return (u_char
*)&long_ret
;
610 return (u_char
*)&long_ret
;
612 *var_len
= strlen(ast_config_AST_SOCKET
);
613 return (u_char
*)ast_config_AST_SOCKET
;
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
))
632 while ( (tz
= ast_walk_indications(tz
)) )
635 return (u_char
*)&long_ret
;
637 tz
= ast_get_indication_zone(NULL
);
639 *var_len
= strlen(tz
->country
);
640 return (u_char
*)tz
->country
;
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
;
657 if (header_simple_table(vp
, name
, length
, exact
, var_len
, write_method
, -1))
660 i
= name
[*length
- 1] - 1;
661 while ( (tz
= ast_walk_indications(tz
)) && i
)
668 long_ret
= name
[*length
- 1];
669 return (u_char
*)&long_ret
;
671 *var_len
= strlen(tz
->country
);
672 return (u_char
*)tz
->country
;
675 *var_len
= strlen(tz
->alias
);
676 return (u_char
*)tz
->alias
;
679 case ASTINDDESCRIPTION
:
680 *var_len
= strlen(tz
->description
);
681 return (u_char
*)tz
->description
;
688 static int countmodule(const char *mod
, const char *desc
, int use
, const char *like
)
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
))
703 long_ret
= ast_update_module_list(countmodule
, NULL
);
704 return (u_char
*)&long_ret
;
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
))
721 *var_len
= strlen(ASTERISK_VERSION
);
722 return (u_char
*)ASTERISK_VERSION
;
724 long_ret
= ASTERISK_VERSION_NUM
;
725 return (u_char
*)&long_ret
;
732 static int term_asterisk_mib(int majorID
, int minorID
, void *serverarg
, void *clientarg
)
734 unregister_sysORTable(asterisk_oid
, OID_LENGTH(asterisk_oid
));
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
);
819 * c-file-offsets: ((case-label . 0))
821 * indent-tabs-mode: t