|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inherit "global_variables"; |
inherit Roxen; |
#define roxen roxenp() |
|
|
|
|
|
#define NO_THREADS 1 |
|
#ifdef SNMPAGENT_DEBUG |
# define SNMPAGENT_MSG(X) report_notice("SNMPagent: "+X+"\n") |
# define SNMPAGENT_MSGS(X, Y) report_notice("SNMPagent: "+X+"\n", @Y) |
#else |
# define SNMPAGENT_MSG(X) |
# define SNMPAGENT_MSGS(X, Y) |
#endif |
|
|
#ifndef SNMPAGENT_DEFAULT_PORT |
#define SNMPAGENT_DEFAULT_PORT 1610 |
#endif |
|
#define SNMP_OP_GETREQUEST 0 |
#define SNMP_OP_GETNEXT 1 |
#define SNMP_OP_GETRESPONSE 2 |
#define SNMP_OP_SETREQUEST 3 |
#define SNMP_OP_TRAP 4 |
|
#define OBJ_STR(x) ({"str", x}) |
#define OBJ_INT(x) ({"int", x}) |
#define OBJ_OID(x) ({"oid", x}) |
#define OBJ_TICK(x) ({"tick", x}) |
#define OBJ_COUNT(x) ({"count", x}) |
|
|
|
#define MIBTREE_BASE "1.3.6.1" |
|
#define RISMIB_BASE_ADD "4.1.8614" |
|
#define RISMIB_BASE MIBTREE_BASE+"."+RISMIB_BASE_ADD |
#define RISMIB_BASE_WEBSERVER_ADD "1.1" |
|
#define RISMIB_BASE_WEBSERVER RISMIB_BASE+"."+RISMIB_BASE_WEBSERVER_ADD |
|
|
#define RISMIB_BASE_WEBSERVER_GLOBAL RISMIB_BASE_WEBSERVER+".1" |
|
#define RISMIB_BASE_WEBSERVER_GLOBAL_BOOT RISMIB_BASE_WEBSERVER_GLOBAL+".1" |
|
#define RISMIB_BASE_WEBSERVER_GLOBAL_VS RISMIB_BASE_WEBSERVER_GLOBAL+".2" |
|
|
#define RISMIB_BASE_WEBSERVER_VS RISMIB_BASE_WEBSERVER+".2" |
|
#define RISMIB_BASE_WEBSERVER_VS_INDEX RISMIB_BASE_WEBSERVER_VS+".1.1" |
|
#define RISMIB_BASE_WEBSERVER_VS_NAME RISMIB_BASE_WEBSERVER_VS+".1.2" |
|
#define RISMIB_BASE_WEBSERVER_VS_DESC RISMIB_BASE_WEBSERVER_VS+".1.3" |
|
#define RISMIB_BASE_WEBSERVER_VS_SDATA RISMIB_BASE_WEBSERVER_VS+".1.4" |
|
#define RISMIB_BASE_WEBSERVER_VS_RDATA RISMIB_BASE_WEBSERVER_VS+".1.5" |
|
#define RISMIB_BASE_WEBSERVER_VS_SHDRS RISMIB_BASE_WEBSERVER_VS+".1.6" |
|
#define RISMIB_BASE_WEBSERVER_VS_REQS RISMIB_BASE_WEBSERVER_VS+".1.7" |
|
|
#define RISMIB_BASE_WEBSERVER_TRAPG RISMIB_BASE_WEBSERVER+".3" |
|
#define RISMIB_BASE_WEBSERVER_TRAPG_DOWN RISMIB_BASE_WEBSERVER_TRAPG+".1" |
|
#define RISMIB_BASE_WEBSERVER_TRAPVS RISMIB_BASE_WEBSERVER+".4" |
|
#define RISMIB_BASE_WEBSERVER_TRAP_VSEXT RISMIB_BASE_WEBSERVER_TRAPVS+".1" |
|
#define RISMIB_BASE_WEBSERVER_TRAP_VSSTART RISMIB_BASE_WEBSERVER_TRAPVS+".2" |
|
#define RISMIB_BASE_WEBSERVER_TRAP_VSSTOP RISMIB_BASE_WEBSERVER_TRAPVS+".3" |
|
#define RISMIB_BASE_WEBSERVER_TRAP_VSCONF RISMIB_BASE_WEBSERVER_TRAPVS+".4" |
|
#define LOG_EVENT(txt, pkt) log_event(txt, pkt) |
|
#if !efunc(Array.oid_sort_func) |
int oid_sort_func(string a0,string b0) { |
string a2="",b2=""; |
int a1, b1; |
sscanf(a0,"%d.%s",a1,a2); |
sscanf(b0,"%d.%s",b1,b2); |
if (a1>b1) return 1; |
if (a1<b1) return 0; |
if (a2==b2) return 0; |
return oid_sort_func(a2,b2); |
} |
#define OID_SORT_FUNC oid_sort_func |
#else |
#define OID_SORT_FUNC Array.oid_sort_func |
#endif |
|
|
|
class SNMPagent { |
private int enabled; |
|
|
private object fd; |
private int inited; |
private int snmpinpkts; |
private int snmpoutpkts; |
private int snmpbadver; |
private int snmpbadcommnames; |
private int snmpbadcommuses; |
private int snmpenaauth; |
private mapping events; |
private mixed co; |
private object th; |
private static object mib; |
private mapping vsdb; |
private array dtraps; |
|
array get_snmpinpkts() { return OBJ_COUNT(snmpinpkts); } |
array get_snmpoutpkts() { return OBJ_COUNT(snmpoutpkts); } |
array get_snmpbadver() { return OBJ_COUNT(snmpbadver); } |
array get_snmpbadcommnames() { return OBJ_COUNT(snmpbadcommnames); } |
array get_snmpbadcommuses() { return OBJ_COUNT(snmpbadcommuses); } |
array get_snmpenaauth() { return OBJ_INT(snmpenaauth); } |
|
array get_virtserv() { return OBJ_COUNT(sizeof(vsdb)); } |
|
int get_uptime() { return (time(1) - roxen->start_time)*100; } |
|
void create() { |
vsdb = ([]); |
dtraps = ({}); |
|
} |
|
|
int enable() { |
|
if(enabled) |
return(enabled); |
mib = SubMIBSystem(); |
if(objectp(mib)) { |
|
mib->register(SubMIBSnmp(this_object())); |
|
mib->register(SubMIBRoxenVS(this_object())); |
mib->register(SubMIBRoxenVSTable(this_object())); |
mib->register(SubMIBRoxenBoot(this_object())); |
} |
if (!status()) |
start(); |
enabled = 1; |
return (enabled); |
} |
|
|
int disable() { |
|
if(status()) |
stop(); |
enabled = 0; |
return (!enabled); |
} |
|
int status() { |
return enabled; |
} |
|
private void log_event(string txt, mapping pkt) { |
|
SNMPAGENT_MSG(sprintf("event: %O", txt)); |
if(zero_type(events[txt])) |
events[txt] += ([ pkt->ip : ([ pkt->community: 1]) ]) ; |
else if(zero_type(events[txt][pkt->ip])) |
events[txt][pkt->ip] += ([ pkt->community: 1]); |
else |
events[txt][pkt->ip][pkt->community]++; |
} |
|
|
int chk_access(string level , mapping pkt) { |
|
return |
(search(query("snmp_community"), pkt->community+":"+level) > -1) || |
(search(query("snmp_community"), pkt->community+":"+"rw") > -1); |
} |
|
|
|
private void process_query(mapping data) { |
|
mapping pdata, rdata = ([]); |
int msgid, op, errnum = 0, setflg = 0; |
string attrname, comm; |
array val; |
|
snmpinpkts++; |
pdata = fd->decode_asn1_msg(data); |
|
|
|
if(!mappingp(pdata)) { |
SNMPAGENT_MSG("SNMP message can not be decoded. Silently ommited."); |
return; |
} |
|
msgid = indices(pdata)[0]; |
comm = pdata[msgid]->community || ""; |
op = pdata[msgid]->op; |
|
|
if(!chk_access("ro", pdata[msgid])) { |
snmpbadcommnames++; |
errnum = 5 ; |
attrname = indices(pdata[msgid]->attribute[0])[0]; |
LOG_EVENT("Bad community name", pdata[msgid]); |
authfailure_trap(pdata[msgid]); |
} else |
foreach(pdata[msgid]->attribute, mapping attrs) { |
mixed attrval = values(attrs)[0]; |
attrname = indices(attrs)[0]; |
|
if(!mib) { |
SNMPAGENT_MSG(" MIB table isn't loaded!\n"); |
|
} |
switch(op) { |
|
case SNMP_OP_GETREQUEST: |
val = mib->get(attrname, pdata[msgid]); |
if (arrayp(val) && sizeof(val) && val[0]) |
rdata[attrname] += val; |
break; |
|
case SNMP_OP_GETNEXT: |
val = mib->getnext(attrname, pdata[msgid]); |
if (arrayp(val) && sizeof(val) && val[0]) |
|
rdata[val[0]] += val[1..2]; |
break; |
|
case SNMP_OP_SETREQUEST: |
val = mib->set(attrname, attrval, pdata[msgid]); |
if(arrayp(val) && sizeof(val)) |
setflg = val[0]; |
|
rdata["1.3.6.1.2.1.1.3.0"] += OBJ_TICK(get_uptime()); |
if (arrayp(val) && stringp(val[1])) |
report_warning(val[1]); |
break; |
|
|
} |
|
|
|
} |
|
if(op == SNMP_OP_SETREQUEST && !setflg && !errnum) { |
LOG_EVENT("Set not allowed", pdata[msgid]); |
snmpbadcommuses++; |
} |
|
|
snmpoutpkts++; |
if(!sizeof(rdata)) { |
if (!errnum) LOG_EVENT("No such name", pdata[msgid]); |
fd->get_response(([attrname:({"oid", attrname})]), pdata, errnum || 2 ); |
|
} else |
fd->get_response(rdata, pdata); |
} |
|
|
private string get_cif_domain() { |
|
return(Standards.URI(roxen->configurations[0]->get_url()||"http://0.0.0.0")->host); |
} |
|
|
private void real_start() { |
|
mixed err; |
mapping data; |
array hp = query("snmp_hostport")/":"; |
int p = (sizeof(hp)>1) ? (int)hp[1] : (int)SNMPAGENT_DEFAULT_PORT; |
|
if(!sizeof(hp[0])) |
hp[0] = get_cif_domain(); |
err = catch( fd = Protocols.SNMP.protocol(0, hp[0], p||161) ); |
if(arrayp(err)) |
RXML.run_error("SNMPagent: can't open UDP port " + hp[0]+":"+(string)(p||161)+"[" + err[0] + "]."); |
SNMPAGENT_MSG(sprintf("SNMP UDP port %s:%d binded successfully.", hp[0], p||161)); |
|
|
if(arrayp(dtraps) && sizeof(dtraps)) |
foreach(dtraps, array dtrap1) |
fd->trap( @dtrap1 ); |
dtraps = ({}); |
|
enabled = 1; |
#if NO_THREADS |
|
fd->set_nonblocking(process_query); |
#else |
|
|
while(enabled) |
if(!arrayp(err=catch(data=fd->read()))) |
process_query(data); |
#endif |
|
} |
|
|
private void start() { |
|
events = ([]); |
if(!inited) { |
inited++; |
SNMPAGENT_MSG("Initializing..."); |
|
|
#if NO_THREADS |
|
co = call_out( real_start, 1 ); |
#else |
|
th = thread_create( real_start ); |
#endif |
} |
} |
|
|
void stop() { |
|
SNMPAGENT_MSG("Shutting down..."); |
fd->set_read_callback(0); |
catch(fd->set_blocking()); |
catch(fd->close()); |
#if NO_THREADS |
remove_call_out(co); |
#else |
th = 0; |
#endif |
destruct(fd); |
fd = 0; |
inited = 0; |
SNMPAGENT_MSG("Shutdown complete."); |
} |
|
|
private void x_trap(string oid, array|void val) { |
|
object uri; |
int rtype = 6; |
mapping aval = ([oid: val]); |
|
switch (oid) { |
|
case "0"+RISMIB_BASE_WEBSERVER: |
oid = RISMIB_BASE_WEBSERVER; |
rtype = 0; |
break; |
|
case "4"+RISMIB_BASE_WEBSERVER: |
oid = RISMIB_BASE_WEBSERVER; |
rtype = 4; |
break; |
|
case RISMIB_BASE_WEBSERVER_TRAPG_DOWN: |
break; |
|
} |
if(!arrayp(val)) |
aval = ([]); |
foreach(query("snmp_global_traphosts"), string url) { |
if(catch(uri = Standards.URI(url))) { |
SNMPAGENT_MSG(sprintf("Traphost is invalid: %s !", url)); |
continue; |
} |
if(objectp(fd)) { |
SNMPAGENT_MSG(sprintf("Trap sent: %s", url)); |
fd->trap( aval, |
oid, rtype, 0, |
get_uptime(), |
0, uri->host, uri->port ); |
} else { |
SNMPAGENT_MSG(sprintf("Trap delayed: %s", url)); |
dtraps += ({ ({ aval, |
oid, rtype, 0, |
get_uptime(), |
0, uri->host, uri->port }) }); |
} |
} |
} |
|
|
void start_trap() { |
x_trap("0"+RISMIB_BASE_WEBSERVER); |
} |
|
|
void stop_trap() { |
x_trap(RISMIB_BASE_WEBSERVER_TRAPG_DOWN); |
} |
|
|
void vs_start_trap(int vsid) { |
x_trap(RISMIB_BASE_WEBSERVER_TRAP_VSSTART+".0", OBJ_INT(vsid)); |
} |
|
|
void vs_stop_trap(int vsid) { |
x_trap(RISMIB_BASE_WEBSERVER_TRAP_VSSTOP+".0", OBJ_INT(vsid)); |
} |
|
|
void warmstart_trap() { |
|
} |
|
|
void authfailure_trap(mapping data) { |
x_trap("4"+RISMIB_BASE_WEBSERVER); |
} |
|
|
void enterprise_trap(int vsid, mapping attrvals) { |
|
object uri; |
|
if(vsdb[vsid] && vsdb[vsid]->variables["snmp_traphosts"] && |
sizeof(vsdb[vsid]->variables["snmp_traphosts"]->query())) { |
SNMPAGENT_MSG(sprintf("server %O(#%d): traphosts:%O", |
vsdb[vsid]->name, vsid, |
vsdb[vsid]->variables["snmp_traphosts"]->query())); |
foreach(vsdb[vsid]->variables["snmp_traphosts"]->query(), mixed thost) { |
if(catch(uri = Standards.URI(thost))) { |
SNMPAGENT_MSG(sprintf("Traphost is invalid: %s !", thost)); |
continue; |
} |
SNMPAGENT_MSG(sprintf("Enterprise trap sent: %s", thost)); |
fd->trap( |
attrvals || ([RISMIB_BASE_WEBSERVER_TRAP_VSEXT+".0": OBJ_STR(vsdb[vsid]->name)]), |
RISMIB_BASE_WEBSERVER_TRAP_VSEXT, 6, 0, |
get_uptime(), |
0, |
uri->host, uri->port); |
} |
} else |
if(vsdb[vsid]) |
SNMPAGENT_MSG(sprintf("server %O(#%d) hasn't any traphosts.", |
vsdb[vsid] && vsdb[vsid]->name, vsid)); |
} |
|
|
int add_virtserv(int vsid) { |
|
if(zero_type(vsdb[vsid])) { |
report_debug(sprintf("SNMPagent: added server %O(#%d)\n", |
roxen->configurations[vsid]->name, vsid)); |
vsdb += ([vsid: roxen->configurations[vsid]]); |
} |
|
|
|
|
return(1); |
} |
|
|
string get_virtservname(int vsid) { |
if(zero_type(vsdb[vsid])) |
return 0; |
return (roxen->configurations[vsid]->name); |
} |
|
|
string get_virtservdesc(int vsid) { |
if(zero_type(vsdb[vsid])) |
return 0; |
return "blahblah!"; |
} |
|
|
int get_virtservsdata(int vsid) { |
if(zero_type(vsdb[vsid])) |
return -1; |
return (roxen->configurations[vsid]->sent); |
} |
|
|
int get_virtservrdata(int vsid) { |
if(zero_type(vsdb[vsid])) |
return -1; |
return (roxen->configurations[vsid]->received); |
} |
|
|
int get_virtservshdrs(int vsid) { |
if(zero_type(vsdb[vsid])) |
return -1; |
return (roxen->configurations[vsid]->hsent); |
} |
|
|
int get_virtservreqs(int vsid) { |
if(zero_type(vsdb[vsid])) |
return -1; |
return (roxen->configurations[vsid]->requests); |
} |
|
|
|
int del_virtserv(int vsid) { |
|
if(!zero_type(vsdb[vsid])) { |
report_debug(sprintf("SNMPagent: deleted server %O(#%d)\n", |
roxen->configurations[vsid]->name, vsid)); |
vsdb -= ([ vsid: 0 ]); |
} |
|
return(1); |
} |
|
} |
|
|
|
private string|int oid_strip (string oid) { |
|
array arr = oid / "."; |
if (sizeof(arr) < 7) |
return 0; |
oid = arr[4..] * "."; |
return oid; |
} |
|
|
|
|
class SubMIBManager { |
|
|
constant name = "generic skeleton"; |
|
|
constant tree = ""; |
|
|
|
mapping submibtab = ([]); |
|
|
|
mapping subtreeman = ([]); |
|
|
private int|string oid_check(string oid) { |
|
if(!(oid = oid_strip(oid))) return 0; |
return zero_type(submibtab[oid]) ? 0 : oid; |
} |
|
|
|
|
|
int register(object manager) { |
|
string oid = manager->tree; |
|
if(oid_check(oid)) |
return 0; |
|
if(subtreeman[oid]) |
return 0; |
subtreeman += ([oid: manager]); |
SNMPAGENT_MSG(sprintf("manager %O registered for tree %O", manager->name, manager->tree)); |
return 1; |
} |
|
void create() { |
|
report_error("SubMIBManager object [" + (string)name + "] hasn't replaced contructor!\n"); |
} |
|
|
|
|
array get(string oid, mapping|void pkt) { |
|
function rval; |
string soid; |
|
SNMPAGENT_MSG(sprintf("%s: GET(%O) from %s@%s:%d", name, oid, pkt->community, pkt->ip,pkt->port)); |
soid = oid_strip(oid); |
if (functionp(rval = submibtab[soid])) { |
SNMPAGENT_MSG("found MIB object."); |
return rval(); |
} |
|
|
array s = soid/"."; |
for(int cnt = sizeof(s)-1; cnt>0; cnt--) { |
SNMPAGENT_MSG(sprintf("finding manager for tree %O", s[..cnt]*".")); |
if(subtreeman[s[..cnt]*"."]) { |
|
string manoid = s[..cnt]*"."; |
SNMPAGENT_MSG(sprintf("found subtree manager: %s(%O)", |
subtreeman[manoid]->name, manoid)); |
return subtreeman[manoid]->get(oid, pkt); |
} |
} |
|
SNMPAGENT_MSG("Not found any suitable manager"); |
return 0; |
} |
|
|
array|int getnext(string oid, mapping|void pkt) { |
|
|
array idxnums = Array.sort_array(indices(submibtab), OID_SORT_FUNC); |
int idx; |
string soid, manoid; |
array s; |
|
SNMPAGENT_MSG(sprintf("%s: GETNEXT(%O) from %s@%s:%d", name, oid, pkt->community, pkt->ip,pkt->port)); |
if(!(soid = oid_strip(oid))) |
return 0; |
idx = search(idxnums, soid); |
if(idx >= 0) { |
|
SNMPAGENT_MSG(sprintf("%s: eq match: %O", tree, idx)); |
if(idx < sizeof(idxnums)-1) |
return (({ MIBTREE_BASE+"."+(string)idxnums[idx+1], |
@submibtab[idxnums[idx+1]]() })); |
} else { |
int tlen = sizeof(tree/"."); |
array sarr = soid/"."; |
if(sizeof(sarr)>=tlen && (sarr[..tlen-1]*".") == tree) { |
SNMPAGENT_MSG(name+": owned subtree found."); |
|
for(idx = 0; idx < sizeof(idxnums); idx++) |
if (soid < idxnums[idx]) { |
SNMPAGENT_MSG(sprintf("subtree match: %O", idxnums[idx])); |
return (({ MIBTREE_BASE+"."+(string)idxnums[idx], |
@submibtab[idxnums[idx]]() })); |
} |
} |
} |
|
SNMPAGENT_MSG(name+": trying foreign object"); |
s = soid/"."; |
|
for(int cnt = sizeof(s)-1; cnt>0; cnt--) { |
SNMPAGENT_MSG(sprintf("finding manager for tree %O", s[..cnt]*".")); |
if(subtreeman[s[..cnt]*"."]) { |
|
manoid = s[..cnt]*"."; |
SNMPAGENT_MSG(sprintf("found subtree manager: %s(%O)", |
subtreeman[manoid]->name, manoid)); |
return subtreeman[manoid]->getnext(oid, pkt); |
} |
} |
|
SNMPAGENT_MSG(name+": trying nearest manager"); |
|
|
idxnums = Array.sort_array(indices(subtreeman), OID_SORT_FUNC); |
idx = Array.search_array(idxnums, OID_SORT_FUNC, soid); |
if(idx >= 0) { |
manoid = idxnums[idx]; |
SNMPAGENT_MSG(sprintf("found nearest manager: %s(%O)", |
subtreeman[manoid]->name, manoid)); |
return subtreeman[manoid]->getnext(MIBTREE_BASE+"."+manoid, pkt); |
} |
|
SNMPAGENT_MSG("Not found any suitable manager"); |
return 0; |
} |
|
int compare_oid(string oid1, string oid2) { |
|
array o1 = oid1/".", o2 = oid2/"."; |
int len = sizeof(o1)<sizeof(o2)?sizeof(o1):sizeof(o2); |
|
for (int idx = 0; idx < len; idx++) |
if(o1[idx] > o2[idx]) |
return 1; |
return 0; |
} |
|
|
array set(string oid, mixed val, mapping|void pkt) { |
|
string soid; |
|
SNMPAGENT_MSG(sprintf("SET(%s): %O = %O", name, oid, val)); |
soid = oid_strip(oid); |
|
|
array s = soid/"."; |
for(int cnt = sizeof(s)-1; cnt>0; cnt--) { |
SNMPAGENT_MSG(sprintf("finding manager for tree %O", s[..cnt]*".")); |
if(subtreeman[s[..cnt]*"."]) { |
|
string manoid = s[..cnt]*"."; |
SNMPAGENT_MSG(sprintf("found subtree manager: %s(%O)", |
subtreeman[manoid]->name, manoid)); |
return subtreeman[manoid]->set(oid, val, pkt); |
} |
} |
|
SNMPAGENT_MSG("Not found any suitable manager"); |
return ({ 0, 0}); |
} |
|
|
array get_null() { return OBJ_COUNT(0); } |
|
} |
|
|
|
|
array get_description() { |
return OBJ_STR("Roxen Webserver SNMP agent v"+("$Revision: 1.21 $"/" ")[1]+" (devel. rel.)"); |
} |
|
|
array get_sysoid() { |
return OBJ_OID(RISMIB_BASE_WEBSERVER); |
} |
|
|
array get_sysuptime() { |
return OBJ_TICK((time(1) - roxen->start_time)*100); |
} |
|
|
array get_syscontact() { |
return OBJ_STR(query("snmp_syscontact")); |
} |
|
|
array get_sysname() { |
return OBJ_STR(query("snmp_sysname")); |
} |
|
|
array get_syslocation() { |
return OBJ_STR(query("snmp_syslocation")); |
} |
|
|
array get_sysservices() { |
return OBJ_INT(query("snmp_sysservices")); |
} |
|
|
|
|
|
class SubMIBSystem { |
|
inherit SubMIBManager; |
|
constant name = "system"; |
constant tree = "2.1.1"; |
|
void create() { |
|
submibtab = ([ |
|
|
"2.1.1.1.0": get_description, |
|
"2.1.1.2.0": get_sysoid, |
|
"2.1.1.3.0": get_sysuptime, |
|
"2.1.1.4.0": get_syscontact, |
|
"2.1.1.5.0": get_sysname, |
|
"2.1.1.6.0": get_syslocation, |
|
"2.1.1.7.0": get_sysservices, |
]); |
} |
|
array|int getnext(string oid, mapping|void pkt) { |
|
array rv = ::getnext(oid, pkt); |
mapping sm = ::subtreeman; |
|
if(intp(rv)) { |
::subtreeman = subtreeman; |
rv = ::getnext(oid, pkt); |
::subtreeman = sm; |
} |
return rv; |
} |
|
|
} |
|
|
|
|
class SubMIBSnmp { |
|
inherit SubMIBManager; |
|
constant name = "snmp"; |
constant tree = "2.1.11"; |
|
void create(object agent) { |
|
submibtab = ([ |
|
|
|
"2.1.11.1.0": agent->get_snmpinpkts, |
|
"2.1.11.2.0": agent->get_snmpoutpkts, |
|
"2.1.11.3.0": agent->get_snmpbadver, |
|
"2.1.11.4.0": agent->get_snmpbadcommnames, |
|
"2.1.11.5.0": get_null, |
|
"2.1.11.6.0": get_null, |
|
|
"2.1.11.8.0": get_null, |
|
"2.1.11.9.0": get_null, |
|
"2.1.11.10.0": get_null, |
|
"2.1.11.11.0": get_null, |
|
"2.1.11.12.0": get_null, |
|
"2.1.11.13.0": get_null, |
|
"2.1.11.14.0": get_null, |
|
"2.1.11.15.0": get_null, |
|
"2.1.11.16.0": get_null, |
|
"2.1.11.17.0": get_null, |
|
"2.1.11.18.0": get_null, |
|
"2.1.11.19.0": get_null, |
|
"2.1.11.20.0": get_null, |
|
"2.1.11.21.0": get_null, |
|
"2.1.11.22.0": get_null, |
|
|
"2.1.11.24.0": get_null, |
|
"2.1.11.25.0": get_null, |
|
"2.1.11.26.0": get_null, |
|
"2.1.11.27.0": get_null, |
|
"2.1.11.28.0": get_null, |
|
"2.1.11.29.0": get_null, |
|
"2.1.11.30.0": agent->get_snmpenaauth, |
|
]); |
|
} |
} |
|
|
|
class SubMIBRoxenVS { |
|
inherit SubMIBManager; |
|
constant name = "enterprises.roxenis.app.webserver.global.vsCount"; |
constant tree = RISMIB_BASE_WEBSERVER_GLOBAL_VS - (MIBTREE_BASE+"."); |
|
void create(object agent) { |
|
submibtab = ([ |
|
|
tree+".0": agent->get_virtserv, |
]); |
} |
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SubMIBRoxenVSTable { |
|
inherit SubMIBManager; |
|
constant name = "enterprises.roxenis.app.webserver.vsTable"; |
constant tree = RISMIB_BASE_WEBSERVER_VS - (MIBTREE_BASE+"."); |
|
object agent; |
|
void create(object agentp) { |
agent = agentp; |
submibtab = ([ ]); |
} |
|
array get(string oid, mapping|void pkt) { |
|
string soid, vname; |
int vdata, idx; |
array rval, arroid; |
|
SNMPAGENT_MSG(sprintf("%s: GET(%O) from %s@%s:%d", name, oid, pkt->community, pkt->ip,pkt->port)); |
soid = oid_strip(oid); |
|
|
|
|
|
|
|
|
if(sizeof((soid = soid - (tree + "."))/".") != 3 || (soid/".")[0] != "1") |
return ({}); |
|
idx = ((int)(soid/".")[2]); |
switch ((soid/".")[1]) { |
|
case "1": |
vname = agent->get_virtservname(idx); |
if(!stringp(vname)) |
return ({}); |
return (OBJ_INT(idx)); |
|
case "2": |
vname = agent->get_virtservname(idx); |
if(!stringp(vname)) |
return ({}); |
return (OBJ_STR(vname)); |
|
case "3": |
vname = agent->get_virtservdesc(idx); |
if(!stringp(vname)) |
return ({}); |
return (OBJ_STR(vname)); |
|
case "4": |
vdata = agent->get_virtservsdata(idx); |
if(vdata < 0) |
return ({}); |
return (OBJ_COUNT(vdata)); |
|
case "5": |
vdata = agent->get_virtservrdata(idx); |
if(vdata < 0) |
return ({}); |
return (OBJ_COUNT(vdata)); |
|
case "6": |
vdata = agent->get_virtservshdrs(idx); |
if(vdata < 0) |
return ({}); |
return (OBJ_COUNT(vdata)); |
|
case "7": |
vdata = agent->get_virtservreqs(idx); |
if(vdata < 0) |
return ({}); |
return (OBJ_COUNT(vdata)); |
|
} |
return ({}); |
|
} |
|
array getnext(string oid, mapping|void pkt) { |
|
string soid, noid, vname; |
int idx, vdata; |
array rval, arr; |
|
SNMPAGENT_MSG(sprintf("%s: GETNEXT(%O)", name, oid)); |
soid = oid_strip(oid); |
|
if(soid == tree) soid +="."; |
arr = allocate(5); |
switch(idx = sscanf(soid-(tree+"."), "%d.%d.%d.%s", arr[0], arr[1], arr[2], arr[3])) { |
|
case 3: |
break; |
|
case 0: |
arr[0] = 1; |
case 1: |
arr[1] = 1; |
case 2: |
arr[2] = 0; |
break; |
|
default: |
return ({}); |
} |
if(!stringp(agent->get_virtservname(arr[2]+1))) { |
SNMPAGENT_MSG(sprintf("DEB: idx:%O soid: %O arr: %O", idx, soid, arr)); |
arr[1]++; |
if(arr[1] > 7) |
return ({}); |
arr[2] = 0; |
} |
arr[2]++; |
idx = arr[2]; |
noid = MIBTREE_BASE+"."+tree + "."+(string)arr[0]+"."+(string)arr[1]+"."+(string)arr[2]; |
|
|
|
|
switch (arr[1]) { |
|
case 1: |
vname = agent->get_virtservname(idx); |
if(!stringp(vname)) |
return ({}); |
return (({noid, @OBJ_INT(idx)})); |
|
case 2: |
vname = agent->get_virtservname(idx); |
if(!stringp(vname)) |
return ({}); |
return (({noid, @OBJ_STR(vname)})); |
|
case 3: |
vname = agent->get_virtservname(idx); |
if(!stringp(vname)) |
return ({}); |
return (({noid, @OBJ_STR(vname)})); |
|
case 4: |
vdata = agent->get_virtservsdata(idx); |
if(vdata < 0) |
return ({}); |
return (({noid, @OBJ_COUNT(vdata)})); |
|
case 5: |
vdata = agent->get_virtservrdata(idx); |
if(vdata < 0) |
return ({}); |
return (({noid, @OBJ_COUNT(vdata)})); |
|
case 6: |
vdata = agent->get_virtservshdrs(idx); |
if(vdata < 0) |
return ({}); |
return (({noid, @OBJ_COUNT(vdata)})); |
|
case 7: |
vdata = agent->get_virtservreqs(idx); |
if(vdata < 0) |
return ({}); |
return (({noid, @OBJ_COUNT(vdata)})); |
|
} |
return ({}); |
} |
|
} |
|
|
|
class SubMIBRoxenBoot { |
|
inherit SubMIBManager; |
|
constant name = "enterprises.roxenis.app.webserver.global.boot"; |
constant tree = RISMIB_BASE_WEBSERVER_GLOBAL_BOOT - (MIBTREE_BASE+"."); |
|
object agent; |
|
void create(object agentp) { |
agent = agentp; |
submibtab = ([ tree+".0": lambda() { return OBJ_INT(0); } ]); |
} |
|
|
|
array set(string oid, mixed val, mapping|void pkt) { |
|
string soid, vname; |
int setflg = 0; |
array rval, arroid; |
|
SNMPAGENT_MSG(sprintf("SET(%s): %O = %O", name, oid, val)); |
soid = oid_strip(oid); |
|
if(soid != tree + ".0") |
return ({}); |
|
if(agent->chk_access("rw", pkt)) { |
SNMPAGENT_MSG(sprintf("%O=%O - access granted", name, val)); |
setflg = 1; |
if(val == 1 || val == 2) { |
report_warning("SNMPagent: Initiated " + ((val==1)?"restart":"shutdown") + " from snmp://" + pkt->community + "@" + pkt->ip + "/\n"); |
if (val == 1) roxen->restart(0.5); |
if (val == 2) roxen->shutdown(0.5); |
} |
} |
return ({ setflg, "" }); |
} |
|
} |
|
|
SNMPagent snmpagent; |
|
|
|