Roxen.git / server / base_server / snmpagent.pike

version» Context lines:

Roxen.git/server/base_server/snmpagent.pike:1:   /* -  * $Id: snmpagent.pike,v 1.18 2001/09/13 13:15:19 hop Exp $ +  * $Id: snmpagent.pike,v 1.19 2001/09/13 13:54:01 hop Exp $    *    * The Roxen SNMP agent    * Copyright © 2001, Roxen IS.    *    * Author: Honza Petrous    * January 2001         RFC 1213 base MIB    system.* (all done)
Roxen.git/server/base_server/snmpagent.pike:23:   Developer notes:       Known issues:    - every reload spawne a new thread, I guess that old ones are never    used then. [threads leak] // FIXME: solved by switching to the async i/o    - the OID must be minimally 5 elements long, otherwise GETNEXT return    "no such name" error    - default value for snmpagent host/port variable in the config. int.    hasn't set correctly hostname part // FIXME: how reach config.int.'s URL    from define_global_variables ? +  - vsStopTrap is generated even if the virtual server wasn't started       Todos:       - module reloading    - Roxen.module API for registering MIB subtree       - SNMP v3    - security (DES?)      
Roxen.git/server/base_server/snmpagent.pike:159:    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; // table of registered virtual servers    private array dtraps; // delayed traps    -  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_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)); }; +  array get_virtserv() { return OBJ_COUNT(sizeof(vsdb)); }    -  +  int get_uptime() { return (time(1) - roxen->start_time)*100; }    -  + //! External function for MIB object 'system.sysContact' +     void create() {    vsdb = ([]);    dtraps = ({});    //disable();    }       //! Enable SNMPagent processing.    int enable() {       if(enabled)
Roxen.git/server/base_server/snmpagent.pike:256:    msgid = indices(pdata)[0];    comm = pdata[msgid]->community || "";    op = pdata[msgid]->op;       // test for correct community string    if(!chk_access("ro", pdata[msgid])) {    snmpbadcommnames++;    errnum = 5 /*SNMP_ERR_GENERR*/;    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");    // what to do now ?    }    switch(op) {
Roxen.git/server/base_server/snmpagent.pike:285:    if (arrayp(val) && sizeof(val) && val[0])    //rdata[attrname] += val;    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[attrname] += ({ "int", attrval }); -  rdata["1.3.6.1.2.1.1.3.0"] += get_uptime(); +  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;          } //switch    //else    // SNMPAGENT_MSG(sprintf(" unknown or unsupported OID: %O:%O", attrname, attrval));       } //foreach
Roxen.git/server/base_server/snmpagent.pike:399:       // start/stop notificator    private void x_trap(string oid, array|void val) {       object uri;    int rtype = 6;    mapping aval = ([oid: val]);       switch (oid) {    -  case RISMIB_BASE_WEBSERVER: // a little hack, but only cold start is alowed to use such oid +  case "0"+RISMIB_BASE_WEBSERVER: // flagged +  oid = RISMIB_BASE_WEBSERVER;    rtype = 0;    break;    -  +  case "4"+RISMIB_BASE_WEBSERVER: // flagged +  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; // FIXME: what about possibility to add some warnings?    }    if(objectp(fd)) {    SNMPAGENT_MSG(sprintf("Trap sent: %s", url));    fd->trap( aval,    oid, rtype, 0, -  1, //FIXME: uptime +  get_uptime(),    0, uri->host, uri->port );    } else {    SNMPAGENT_MSG(sprintf("Trap delayed: %s", url));    dtraps += ({ ({ aval,    oid, rtype, 0, -  1, //FIXME: uptime +  get_uptime(),    0, uri->host, uri->port }) });    }    }    }       //! Start notificator.    void start_trap() { -  -  x_trap(RISMIB_BASE_WEBSERVER); +  x_trap("0"+RISMIB_BASE_WEBSERVER);    }       //! Stop notificator.    void stop_trap() { -  +     x_trap(RISMIB_BASE_WEBSERVER_TRAPG_DOWN);    }       //! Virtual server start notificator    void vs_start_trap(int vsid) {    x_trap(RISMIB_BASE_WEBSERVER_TRAP_VSSTART+".0", OBJ_INT(vsid));    }       //! Virtual server stop notificator    void vs_stop_trap(int vsid) {    x_trap(RISMIB_BASE_WEBSERVER_TRAP_VSSTOP+".0", OBJ_INT(vsid));    }       //! Warm start notificator    void warmstart_trap() {       }       //! Authentication failure notificator -  void authfailure_trap() { -  +  void authfailure_trap(mapping data) { +  x_trap("4"+RISMIB_BASE_WEBSERVER);    }       //! Enterprise specific trap notificator    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",
Roxen.git/server/base_server/snmpagent.pike:481:    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; // FIXME: what about possibility to add some warnings?    }    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, -  1, //FIXME: uptime +  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));    }       //! Adds virtual server to the DB of managed objects
Roxen.git/server/base_server/snmpagent.pike:764:       //! External function for MIB object returning nothing    array get_null() { return OBJ_COUNT(0); }      } // SubMIBManager      // base external feeders      //! External function for MIB object 'system.sysDescr'   array get_description() { -  return OBJ_STR("Roxen Webserver SNMP agent v"+("$Revision: 1.18 $"/" ")[1]+" (devel. rel.)"); +  return OBJ_STR("Roxen Webserver SNMP agent v"+("$Revision: 1.19 $"/" ")[1]+" (devel. rel.)");   }      //! External function for MIB object 'system.sysOID'   array get_sysoid() {    return OBJ_OID(RISMIB_BASE_WEBSERVER);   }      //! External function for MIB object 'system.sysUpTime' - array get_uptime() { + array get_sysuptime() {    return OBJ_TICK((time(1) - roxen->start_time)*100);   }      //! External function for MIB object 'system.sysContact'   array get_syscontact() {    return OBJ_STR(query("snmp_syscontact"));   }      //! External function for MIB object 'system.sysName'   array get_sysname() {
Roxen.git/server/base_server/snmpagent.pike:817:       void create() {       submibtab = ([    // system "2.1.1"    // system.sysDescr    "2.1.1.1.0": get_description,    // system.sysObjectID    "2.1.1.2.0": get_sysoid,    // system.sysUpTime -  "2.1.1.3.0": get_uptime, +  "2.1.1.3.0": get_sysuptime,    // system.sysContact    "2.1.1.4.0": get_syscontact,    // system.sysName    "2.1.1.5.0": get_sysname,    // system.sysLocation    "2.1.1.6.0": get_syslocation,    // system.sysServices    "2.1.1.7.0": get_sysservices,    ]);    } // create