1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
27
  
28
  
29
  
30
  
31
  
32
  
33
  
34
  
35
  
36
  
37
  
38
  
39
  
40
  
41
  
42
  
43
  
44
  
45
  
46
  
47
  
48
  
49
  
50
  
51
  
52
  
53
  
54
  
55
  
56
  
57
  
58
  
59
  
60
  
61
  
62
  
63
  
64
  
65
  
66
  
67
  
68
  
69
  
70
  
71
  
72
  
73
  
74
  
75
  
76
  
77
  
78
  
79
  
80
  
81
  
82
  
83
  
84
  
85
  
86
  
87
  
88
  
89
  
90
  
91
  
92
  
93
  
94
  
95
  
96
  
97
  
98
  
99
  
// Locale stuff. 
// <locale-token project="roxen_config"> _ </locale-token> 
 
#include <roxen.h> 
#define _(X,Y)      _DEF_LOCALE("roxen_config",X,Y) 
 
constant box      = "large"; 
constant box_initial = 1; 
 
constant box_position = 3; 
 
LocaleString box_name = _(1066,"SNMP status"); 
LocaleString box_doc  = _(1067,"Global SNMP server statistics"); 
 
string add_row( string item, string value ) { 
  return "<tr><td>" + item + ":</td><td>" + value + "</td></tr>"; 
} 
 
string parse( RequestID id ) 
{ 
  array(int) oid_prefix = SNMP.RIS_OID_WEBSERVER; 
 
  array(string) res = ({ 
    "<th align='left'>Name</th>" 
    "<th align='left'>Value</th>", 
  }); 
 
  ADT.Trie mib = ADT.Trie(); 
 
conf_loop: 
  foreach(roxen->configurations, Configuration conf) { 
    foreach(conf->registered_urls, string url) { 
      mapping(string:string|Configuration|Protocol) port_info = roxen.urls[url]; 
 
      foreach((port_info && port_info->ports) || ({}), Protocol prot) { 
        if ((prot->prot_name != "snmp") || (!prot->mib)) { 
          continue; 
        } 
        mib->merge(prot->mib); 
        break conf_loop; 
      } 
    } 
  } 
 
  array(int) oid_stop = SNMP.RIS_OID_WEBSERVER + ({ 2 }); 
  array(int) oid_start = mib->first(); 
  for (array(int) oid = oid_start; oid; oid = mib->next(oid)) { 
    if ((string)oid >= (string)oid_stop) break; 
    string oid_string = ((array(string)) oid) * "."; 
    string name = ""; 
    string doc = ""; 
    mixed val = ""; 
    mixed err = catch { 
        val = mib->lookup(oid); 
        if (zero_type(val)) continue; 
        if (objectp(val)) { 
          if (val->update_value) { 
            val->update_value(); 
          } 
          name = val->name || ""; 
          doc = val->doc || ""; 
          val = sprintf("%s", val); 
        } 
        val = (string)val; 
      }; 
    if (err) { 
      name = "Error"; 
      val = ""; 
      doc = "<tt>" + 
        replace(Roxen.html_encode_string(describe_backtrace(err)), 
                "\n", "<br />\n") + 
        "</tt>"; 
    } 
    if (!sizeof(name)) continue; 
    res += ({ 
        sprintf("<td><b><a href=\"urn:oid:%s\">%s:</a></b></td>" 
                "<td>%s</td>", 
                oid_string, 
                Roxen.html_encode_string(name), 
                Roxen.html_encode_string(val)), 
    }); 
    if (sizeof(doc)) { 
      res += ({ 
        sprintf("<td></td><td><font size='-1'>%s</font></td>", doc), 
      }); 
    } 
  } 
 
  if (sizeof(res) <= 1) { 
    res = ({ "<th align='left'>No active SNMP ports.</th>" }); 
  } 
 
  return 
    "<box type='"+box+"' title='"+box_name+"'><table cellpadding='0'><tr>" + 
    res * "</tr>\n<tr>" + 
    "</tr></table></box>\n"; 
}