📄 radius_snmp.c
字号:
/* * radius_snmp.c Radius SNMP support * * Version: $Id: radius_snmp.c,v 1.17 2004/02/26 19:04:24 aland Exp $ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Copyright 2000 The FreeRADIUS server project * Copyright 2000 Jochen Friedrich <jochen@scram.de> */static const char rcsid[] ="$Id: radius_snmp.c,v 1.17 2004/02/26 19:04:24 aland Exp $";#include "autoconf.h"#ifdef WITH_SNMP#include "libradius.h"#ifdef HAVE_NETINET_IN_H# include <netinet/in.h>#endif#include <string.h>#include "radius_snmp.h"#include "radiusd.h"#include "conffile.h"extern int need_reload;/* * More globals (sigh); */rad_snmp_t rad_snmp;#define RADACCOID 1,3,6,1,2,1,67,2,1,1,1#define RADAUTHOID 1,3,6,1,2,1,67,1,1,1,1#define RADIUSOID 1,3,6,1,4,1,3317,1,3,1static oid radacc_oid [] = { RADACCOID };static oid radauth_oid [] = { RADAUTHOID };static oid radius_oid [] = { RADIUSOID };#define COUNTER ASN_COUNTER#define INTEGER ASN_INTEGER#define GAUGE ASN_GAUGE#define TIMETICKS ASN_TIMETICKS#define IPADDRESS ASN_IPADDRESS#define STRING ASN_OCTET_STR#define RADIUSACCSERVIDENT 1#define RADIUSACCSERVUPTIME 2#define RADIUSACCSERVRESETTIME 3#define RADIUSACCSERVCONFIGRESET 4#define RADIUSACCSERVTOTALREQUESTS 5#define RADIUSACCSERVTOTALINVALIDREQUESTS 6#define RADIUSACCSERVTOTALDUPREQUESTS 7#define RADIUSACCSERVTOTALRESPONSES 8#define RADIUSACCSERVTOTALMALFORMEDREQUESTS 9#define RADIUSACCSERVTOTALBADAUTHENTICATORS 10#define RADIUSACCSERVTOTALPACKETSDROPPED 11#define RADIUSACCSERVTOTALNORECORDS 12#define RADIUSACCSERVTOTALUNKNOWNTYPES 13/* */#define RADIUSACCCLIENTADDRESS 2#define RADIUSACCCLIENTID 3#define RADIUSACCSERVPACKETSDROPPED 4#define RADIUSACCSERVREQUESTS 5#define RADIUSACCSERVDUPREQUESTS 6#define RADIUSACCSERVRESPONSES 7#define RADIUSACCSERVBADAUTHENTICATORS 8#define RADIUSACCSERVMALFORMEDREQUESTS 9#define RADIUSACCSERVNORECORDS 10#define RADIUSACCSERVUNKNOWNTYPES 11/* */#define RADIUSAUTHSERVIDENT 1#define RADIUSAUTHSERVUPTIME 2#define RADIUSAUTHSERVRESETTIME 3#define RADIUSAUTHSERVCONFIGRESET 4#define RADIUSAUTHSERVTOTALACCESSREQUESTS 5#define RADIUSAUTHSERVTOTALINVALIDREQUESTS 6#define RADIUSAUTHSERVTOTALDUPACCESSREQUESTS 7#define RADIUSAUTHSERVTOTALACCESSACCEPTS 8#define RADIUSAUTHSERVTOTALACCESSREJECTS 9#define RADIUSAUTHSERVTOTALACCESSCHALLENGES 10#define RADIUSAUTHSERVTOTALMALFORMEDACCESSREQUESTS 11#define RADIUSAUTHSERVTOTALBADAUTHENTICATORS 12#define RADIUSAUTHSERVTOTALPACKETSDROPPED 13#define RADIUSAUTHSERVTOTALUNKNOWNTYPES 14/* */#define RADIUSAUTHCLIENTADDRESS 2#define RADIUSAUTHCLIENTID 3#define RADIUSAUTHSERVACCESSREQUESTS 4#define RADIUSAUTHSERVDUPACCESSREQUESTS 5#define RADIUSAUTHSERVACCESSACCEPTS 6#define RADIUSAUTHSERVACCESSREJECTS 7#define RADIUSAUTHSERVACCESSCHALLENGES 8#define RADIUSAUTHSERVMALFORMEDACCESSREQUESTS 9#define RADIUSAUTHSERVBADAUTHENTICATORS 10#define RADIUSAUTHSERVPACKETSDROPPED 11#define RADIUSAUTHSERVUNKNOWNTYPES 12/* Hook functions. */static const unsigned char *radAccServ(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method);static const unsigned char *radAccEntry(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method);static const u_char *radAuthServ(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method);static const unsigned char *radAuthEntry(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method);static struct variable radiusacc_variables[] ={ {RADIUSACCSERVIDENT, STRING, RONLY, radAccServ, 1, {1}}, {RADIUSACCSERVUPTIME, TIMETICKS, RONLY, radAccServ, 1, {2}}, {RADIUSACCSERVRESETTIME, TIMETICKS, RONLY, radAccServ, 1, {3}}, {RADIUSACCSERVCONFIGRESET, INTEGER, RWRITE, radAccServ, 1, {4}}, {RADIUSACCSERVTOTALREQUESTS, COUNTER, RONLY, radAccServ, 1, {5}}, {RADIUSACCSERVTOTALINVALIDREQUESTS, COUNTER, RONLY, radAccServ, 1, {6}}, {RADIUSACCSERVTOTALDUPREQUESTS, COUNTER, RONLY, radAccServ, 1, {7}}, {RADIUSACCSERVTOTALRESPONSES, COUNTER, RONLY, radAccServ, 1, {8}}, {RADIUSACCSERVTOTALMALFORMEDREQUESTS, COUNTER, RONLY, radAccServ, 1, {9}}, {RADIUSACCSERVTOTALBADAUTHENTICATORS, COUNTER, RONLY, radAccServ, 1, {10}}, {RADIUSACCSERVTOTALPACKETSDROPPED, COUNTER, RONLY, radAccServ, 1, {11}}, {RADIUSACCSERVTOTALNORECORDS, COUNTER, RONLY, radAccServ, 1, {12}}, {RADIUSACCSERVTOTALUNKNOWNTYPES, COUNTER, RONLY, radAccServ, 1, {13}}, {RADIUSACCCLIENTADDRESS, IPADDRESS, RONLY, radAccEntry, 3, {14,1,2}}, {RADIUSACCCLIENTID, STRING, RONLY, radAccEntry, 3, {14,1,3}}, {RADIUSACCSERVPACKETSDROPPED, COUNTER, RONLY, radAccEntry, 3, {14,1,4}}, {RADIUSACCSERVREQUESTS, COUNTER, RONLY, radAccEntry, 3, {14,1,5}}, {RADIUSACCSERVDUPREQUESTS, COUNTER, RONLY, radAccEntry, 3, {14,1,6}}, {RADIUSACCSERVRESPONSES, COUNTER, RONLY, radAccEntry, 3, {14,1,7}}, {RADIUSACCSERVBADAUTHENTICATORS, COUNTER, RONLY, radAccEntry, 3, {14,1,8}}, {RADIUSACCSERVMALFORMEDREQUESTS, COUNTER, RONLY, radAccEntry, 3, {14,1,9}}, {RADIUSACCSERVNORECORDS, COUNTER, RONLY, radAccEntry, 3, {14,1,10}}, {RADIUSACCSERVUNKNOWNTYPES, COUNTER, RONLY, radAccEntry, 3, {14,1,11}},};static struct variable radiusauth_variables[] ={ {RADIUSAUTHSERVIDENT, STRING, RONLY, radAuthServ, 1, {1}}, {RADIUSAUTHSERVUPTIME, TIMETICKS, RONLY, radAuthServ, 1, {2}}, {RADIUSAUTHSERVRESETTIME, TIMETICKS, RONLY, radAuthServ, 1, {3}}, {RADIUSAUTHSERVCONFIGRESET, INTEGER, RWRITE, radAuthServ, 1, {4}}, {RADIUSAUTHSERVTOTALACCESSREQUESTS, COUNTER, RONLY, radAuthServ, 1, {5}}, {RADIUSAUTHSERVTOTALINVALIDREQUESTS, COUNTER, RONLY, radAuthServ, 1, {6}}, {RADIUSAUTHSERVTOTALDUPACCESSREQUESTS, COUNTER, RONLY, radAuthServ, 1, {7}}, {RADIUSAUTHSERVTOTALACCESSACCEPTS, COUNTER, RONLY, radAuthServ, 1, {8}}, {RADIUSAUTHSERVTOTALACCESSREJECTS, COUNTER, RONLY, radAuthServ, 1, {9}}, {RADIUSAUTHSERVTOTALACCESSCHALLENGES, COUNTER, RONLY, radAuthServ, 1, {10}}, {RADIUSAUTHSERVTOTALMALFORMEDACCESSREQUESTS, COUNTER, RONLY, radAuthServ, 1, {11}}, {RADIUSAUTHSERVTOTALBADAUTHENTICATORS, COUNTER, RONLY, radAuthServ, 1, {12}}, {RADIUSAUTHSERVTOTALPACKETSDROPPED, COUNTER, RONLY, radAuthServ, 1, {13}}, {RADIUSAUTHSERVTOTALUNKNOWNTYPES, COUNTER, RONLY, radAuthServ, 1, {14}}, {RADIUSAUTHCLIENTADDRESS, IPADDRESS, RONLY, radAuthEntry, 3, {15,1,2}}, {RADIUSAUTHCLIENTID, STRING, RONLY, radAuthEntry, 3, {15,1,3}}, {RADIUSAUTHSERVACCESSREQUESTS, COUNTER, RONLY, radAuthEntry, 3, {15,1,4}}, {RADIUSAUTHSERVDUPACCESSREQUESTS, COUNTER, RONLY, radAuthEntry, 3, {15,1,5}}, {RADIUSAUTHSERVACCESSACCEPTS, COUNTER, RONLY, radAuthEntry, 3, {15,1,6}}, {RADIUSAUTHSERVACCESSREJECTS, COUNTER, RONLY, radAuthEntry, 3, {15,1,7}}, {RADIUSAUTHSERVACCESSCHALLENGES, COUNTER, RONLY, radAuthEntry, 3, {15,1,8}}, {RADIUSAUTHSERVMALFORMEDACCESSREQUESTS, COUNTER, RONLY, radAuthEntry, 3, {15,1,9}}, {RADIUSAUTHSERVBADAUTHENTICATORS, COUNTER, RONLY, radAuthEntry, 3, {15,1,10}}, {RADIUSAUTHSERVPACKETSDROPPED, COUNTER, RONLY, radAuthEntry, 3, {15,1,11}}, {RADIUSAUTHSERVUNKNOWNTYPES, COUNTER, RONLY, radAuthEntry, 3, {15,1,12}},};static RADCLIENT *get_client(struct variable *v, oid objid[], size_t *objid_len, int exact) { RADCLIENT *c; int i, len; len = *objid_len - v->namelen; if (!mainconfig.clients) return NULL; if (exact) { /* Check the length. */ if (len != 1) return NULL; if (objid[v->namelen] == 0) return NULL; i = objid[v->namelen]-1; c = mainconfig.clients; while (i && c) { c = c->next; i--; } if (c) return c; return NULL; } i = objid[v->namelen]-1; *objid_len = v->namelen + 1; if (!len || (objid[v->namelen] == 0)) { objid[v->namelen]=1; return mainconfig.clients; } c = mainconfig.clients->next; while (i && c) { c = c->next; i--; } if (c) { objid[v->namelen]++; return c; } else return NULL;}static intradServReset (int action, u_char *var_val, u_char var_val_type, size_t var_val_len, const unsigned char *statP, oid *name, size_t name_len) { long i; int big = SNMP_MAX_LEN; switch (action) { case RESERVE1: if (var_val_type != INTEGER) return SNMP_ERR_WRONGTYPE; if (var_val_len != sizeof (long)) return SNMP_ERR_WRONGLENGTH; if (! asn_parse_int(var_val, &big, &var_val_type, &i, sizeof(long))) return SNMP_ERR_WRONGENCODING; if (i != 2) return SNMP_ERR_WRONGVALUE; break; case COMMIT: need_reload = TRUE; break; case FREE: break; default: return SNMP_ERR_GENERR; } return SNMP_ERR_NOERROR;}static const unsigned char *radAccServ(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method) { static int result; /* check whether the instance identifier is valid */ if (smux_header_generic(vp, name, length, exact, var_len, write_method) == MATCH_FAILED) { return NULL; } /* return the current value of the variable */ switch (vp->magic) { case RADIUSACCSERVIDENT: *var_len = strlen(rad_snmp.acct.ident); return (const unsigned char *) rad_snmp.acct.ident; case RADIUSACCSERVUPTIME: rad_snmp.acct.uptime = (time(NULL) - rad_snmp.acct.start_time) * 100; *var_len = sizeof(int32_t); return (unsigned char *) &rad_snmp.acct.uptime;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -