Roxen.git / server / base_server / snmpagent.pike

version» Context lines:

Roxen.git/server/base_server/snmpagent.pike:1:   /* -  * $Id: snmpagent.pike,v 1.16 2001/09/04 13:26:48 hop Exp $ +  * $Id: snmpagent.pike,v 1.17 2001/09/11 14:30:47 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:109:   #define RISMIB_BASE_WEBSERVER_VS_RDATA RISMIB_BASE_WEBSERVER_VS+".1.5"   // enterprises.roxenis.app.webserver.vsTable.vsEntry.vsHeaders   #define RISMIB_BASE_WEBSERVER_VS_SHDRS RISMIB_BASE_WEBSERVER_VS+".1.6"   // enterprises.roxenis.app.webserver.vsTable.vsEntry.vsRequests   #define RISMIB_BASE_WEBSERVER_VS_REQS RISMIB_BASE_WEBSERVER_VS+".1.7"   //   // enterprises.roxenis.app.webserver.trap   #define RISMIB_BASE_WEBSERVER_TRAP RISMIB_BASE_WEBSERVER+".3"   // enterprises.roxenis.app.webserver.trap.vsColdTrap   #define RISMIB_BASE_WEBSERVER_TRAP_VSCOLD RISMIB_BASE_WEBSERVER_TRAP+".1" + // enterprises.roxenis.app.webserver.trap.vsSpecificTrap + #define RISMIB_BASE_WEBSERVER_TRAP_VSSPEC RISMIB_BASE_WEBSERVER_TRAP+".2"      #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;
Roxen.git/server/base_server/snmpagent.pike:146:    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 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_virtserv() { return OBJ_COUNT(sizeof(vsdb)); };          void create() {    vsdb = ([]); -  +  dtraps = ({});    //disable();    }       //! Enable SNMPagent processing.    int enable() {       if(enabled)    return(enabled);    mib = SubMIBSystem(); // system.* table    if(objectp(mib)) {
Roxen.git/server/base_server/snmpagent.pike:321:    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));    +  // first we server dealyed traps +  if(arrayp(dtraps) && sizeof(dtraps)) +  foreach(dtraps, array dtrap1) { +  SNMPAGENT_MSG(sprintf("Delayed trap sent: %O", dtrap1)); +  //fd->trap( dtrap1[1], dtrap1[2], dtrap1[3]); +  fd->trap( @dtrap1 ); +  } +  dtraps = ({}); +     enabled = 1;   #if NO_THREADS    // set callbacks    fd->set_nonblocking(process_query);   #else    // wait for connection    //while(1) process_query(fd->read());    while(enabled)    if(!arrayp(err=catch(data=fd->read())))    process_query(data);
Roxen.git/server/base_server/snmpagent.pike:373:   #else    th = 0;   #endif    destruct(fd); // avoid fd leaking; FIXME: some cyclic dependencies in SNMP pmod.    fd = 0;    inited = 0;    SNMPAGENT_MSG("Shutdown complete.");    }       //! Cold start notificator. Sends trap for all virtual servers in the vsarr. -  void coldstart_trap(array(int) vsarr) { +  void coldstart_trap() {       object uri;    -  if(intp(vsarr)) -  return; -  foreach(vsarr, int vsid) -  if(vsdb[vsid] && vsdb[vsid]->variables["snmp_traphosts"] && +  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)); +  //foreach(indices(vsdb), int vsid) +  fd->trap( +  ([]), +  RISMIB_BASE_WEBSERVER, 0, 0, +  1, //FIXME: uptime +  0, uri->host, uri->port ); +  } else { +  // mutex +  SNMPAGENT_MSG(sprintf("Trap delayed: %s", url)); +  //foreach(indices(vsdb), mixed vsid) +  dtraps += ({ ({ ([]), +  RISMIB_BASE_WEBSERVER, 0, 0, +  1, //FIXME: uptime +  0, uri->host, uri->port }) }); +  // unmutex +  } +  } +  } +  + /* +  if(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; // FIXME: what about possibility to add some warnings?    }    SNMPAGENT_MSG(sprintf("Trap sent: %s", thost));
Roxen.git/server/base_server/snmpagent.pike:403: Inside #if 1
   ([RISMIB_BASE_WEBSERVER_TRAP_VSCOLD:    ({ "count", vsid }) ]),    //({ "str", Standards.URI(vsdb[vsid]->variables["MyWorldLocation"]->query())->host}) ]),    uri->host, uri->port);   #endif    }    } else    if(vsdb[vsid])    SNMPAGENT_MSG(sprintf("server %O(#%d) hasn't any traphosts.",    vsdb[vsid] && vsdb[vsid]->name, vsid)); + */    -  } -  +     //! Warm start notificator    void warmstart_trap() {       }       //! Authentication failure notificator    void authfailure_trap() {       }       //! Enterprise specific trap notificator -  void enterprise_trap() { +  void enterprise_trap(int vsid, array 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; // FIXME: what about possibility to add some warnings?    } -  +  SNMPAGENT_MSG(sprintf("Enterprise trap sent: %s", thost)); +  fd->trap( +  attrvals || ([RISMIB_BASE_WEBSERVER_TRAP_VSSPEC+".0": OBJ_STR(vsdb[vsid]->name)]), +  RISMIB_BASE_WEBSERVER_TRAP_VSSPEC, 6, 0, +  1, //FIXME: 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)); +  }    -  +  //! Authentication failure notificator +  void vs_start_trap(int vsid) { +  +  enterprise_trap(vsid, 0); +  +  } +     //! Adds virtual server to the DB of managed objects    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]]);    }       // some tabulars handlers ...
Roxen.git/server/base_server/snmpagent.pike:638:    subtreeman[manoid]->name, manoid));    return subtreeman[manoid]->getnext(oid, pkt);    }    }       SNMPAGENT_MSG(name+": trying nearest manager");    // OK, we have to find nearest oid manager    //idxnums = Array.sort(indices(subtreeman));    idxnums = Array.sort_array(indices(subtreeman), OID_SORT_FUNC);    idx = Array.search_array(idxnums, OID_SORT_FUNC, soid); - SNMPAGENT_MSG(sprintf("DEB: idx:%O, idxnums: %O", idx, idxnums)); +     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;    }
Roxen.git/server/base_server/snmpagent.pike:695:       //! 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.16 $"/" ")[1]+" (devel. rel.)"); +  return OBJ_STR("Roxen Webserver SNMP agent v"+("$Revision: 1.17 $"/" ")[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() {    return OBJ_TICK((time(1) - roxen->start_time)*100);
Roxen.git/server/base_server/snmpagent.pike:765:    // system.sysServices    "2.1.1.7.0": get_sysservices,    ]);    } // create       array|int getnext(string oid, mapping|void pkt) {       array rv = ::getnext(oid, pkt);    mapping sm = ::subtreeman;    - SNMPAGENT_MSG(sprintf("DEB: rv: %O", rv)); +     if(intp(rv)) {    ::subtreeman = subtreeman;    rv = ::getnext(oid, pkt);    ::subtreeman = sm;    }    return rv;    }         } // SubMIBsystem