I've re-written my template to pull more useful things. If there are other OIDs that someone might find useful, please let me know.
This needs to be run once per context. So, for example, if you have three contexts, you might do something like this:
Code:
/usr/bin/cfgmaker --if-template=ace.iftemplate --ifref=name --interfaces --host-template=ace.template --subdir=site1/HOSTNAME --username='foo' --authkey='0x75' --authproto='sha' --privkey='0xed' --privproto=aescfb128 --contextname=context1 --output=/var/mrtg/cfg/site1/context1.site1-ace-left.cfg context1@site1-ace-left.example.com::3:1:1:3
/usr/bin/cfgmaker --if-template=ace.iftemplate --ifref=name --interfaces --host-template=ace.template --subdir=site1/HOSTNAME --username='foo' --authkey='0x75' --authproto='sha' --privkey='0xed' --privproto=aescfb128 --contextname=context2 --output=/var/mrtg/cfg/site1/context1.site1-ace-left.cfg context2@site1-ace-left.example.com::3:1:1:3
/usr/bin/cfgmaker --if-template=ace.iftemplate --ifref=name --interfaces --host-template=ace.template --subdir=site1/HOSTNAME --username='foo' --authkey='0x75' --authproto='sha' --privkey='0xed' --privproto=aescfb128 --contextname=context3 --output=/var/mrtg/cfg/site1/context1.site1-ace-left.cfg context3@site1-ace-left.example.com::3:1:1:3
I tried to cram the multi-context detection into the template, but it was just too hard. So I wrote it into my wrapper script that generates the cfgmaker lines for me. My wrapper is probably too hard to sanitize enough that it can be shared, but this host-template should be generic enough...
Code:
#
snmpMIB_to_OID("/usr/share/snmp/mibs/CISCO-SMI-V1SMI.my");
snmpMIB_to_OID("/usr/share/snmp/mibs/CISCO-TC-V1SMI.my");
$head_lines .= <<ECHO
#.....................................................................
# Router processor utilization.
#
ECHO
;
snmpMIB_to_OID("/usr/share/snmp/mibs/CISCO-PROCESS-MIB.my");
my %cpu;
my (@temp) = snmpwalk($router,$v3opt,'cpmCPUTotalMonIntervalValue');
foreach my $tempi (@temp) {
$tempi =~ /(\d+):\d/;
my $instance=$1;
my ($duration) = snmpget($router,$v3opt,"cpmCPUMonInterval.$instance");
my $target_name;
if (exists $$v3opt{contextname} ) {
$target_name=$router_name.".cpu".$instance.'.'.$$v3opt{contextname};
} else {
$target_name=$router_name.".cpu".$instance;
}
$cpu{$instance}++;
$target_lines .= <<CPUMON
Target[$target_name]: cpmCPUTotalMonIntervalValue.$instance&cpmCPUTotal1minRev.$instance:$router
SnmpOptions[$target_name]: $v3options
MaxBytes[$target_name]: 100
routers.cgi*ShortDesc[$target_name]: CPU # $instance
routers.cgi*Options[$target_name]: nototal
bb*host[$target_name]: $router_name
bb*svc[$target_name]: cpu
bb*red[$target_name]: 90
bb*yellow[$target_name]: 80
Options[$target_name]: gauge, unknaszero
Directory[$target_name]: $directory_name
WithPeak[$target_name]: wmy
YLegend[$target_name]: % Utilization
ShortLegend[$target_name]: %
Legend1[$target_name]: $duration Second Load
Legend2[$target_name]: 1 Minute Load
LegendI[$target_name]: $duration sec :
LegendO[$target_name]: 1 min :
Title[$target_name]: $sysname
PageTop[$target_name]: <H1>$sysname Processor Load</H1>
<TABLE>
<TR><TD>System:</TD><TD>$sysname </TD></TR>
<TR><TD>Location:</TD><TD>$syslocation </TD></TR>
</TABLE>
CPUMON
;
}
my (@temp) = snmpwalk($router,$v3opt,'cpmCPUTotal5secRev');
foreach my $tempi(@temp) {
$tempi =~ /(\d+):\d/;
my $instance=$1;
next if exists $cpu{$instance};
my $target_name;
if (exists $$v3opt{contextname} ) {
$target_name=$router_name.".cpu".$instance.'.'.$$v3opt{contextname};
} else {
$target_name=$router_name.".cpu".$instance;
}
$cpu{$instance}++;
$target_lines .= <<CPU
Target[$target_name]: cpmCPUTotal5secRev.$instance&cpmCPUTotal1minRev.$instance:$router
SnmpOptions[$target_name]: $v3options
MaxBytes[$target_name]: 100
routers.cgi*ShortDesc[$target_name]: CPU # $instance
routers.cgi*Options[$target_name]: nototal
bb*host[$target_name]: $router_name
bb*svc[$target_name]: cpu
bb*red[$target_name]: 90
bb*yellow[$target_name]: 80
Options[$target_name]: gauge, unknaszero
Directory[$target_name]: $directory_name
WithPeak[$target_name]: wmy
YLegend[$target_name]: % Utilization
ShortLegend[$target_name]: %
Legend1[$target_name]: 5 Second Load
Legend2[$target_name]: 1 Minute Load
LegendI[$target_name]: 5sec :
LegendO[$target_name]: 1min :
Title[$target_name]: $sysname
PageTop[$target_name]: <H1>$sysname Processor Load</H1>
<TABLE>
<TR><TD>System:</TD><TD>$sysname </TD></TR>
<TR><TD>Location:</TD><TD>$syslocation </TD></TR>
</TABLE>
CPU
;
}
my (@temp) = snmpwalk($router,$v3opt,'cpmCPUTotal5sec');
foreach my $tempi(@temp) {
$tempi =~ /(\d+):\d/;
my $instance=$1;
next if exists $cpu{$instance};
my $target_name;
if (exists $$v3opt{contextname} ) {
$target_name=$router_name.".cpu".$instance.'.'.$$v3opt{contextname};
} else {
$target_name=$router_name.".cpu".$instance;
}
$cpu{$instance}++;
$target_lines .= <<CPUOLD
Target[$target_name]: cpmCPUTotal5sec.$instance&cpmCPUTotal1min.$instance:$router
SnmpOptions[$target_name]: $v3options
MaxBytes[$target_name]: 100
routers.cgi*ShortDesc[$target_name]: CPU # $instance
routers.cgi*Options[$target_name]: nototal
bb*host[$target_name]: $router_name
bb*svc[$target_name]: cpu
bb*red[$target_name]: 90
bb*yellow[$target_name]: 80
Options[$target_name]: gauge, unknaszero
Directory[$target_name]: $directory_name
WithPeak[$target_name]: wmy
YLegend[$target_name]: % Utilization
ShortLegend[$target_name]: %
Legend1[$target_name]: 5 Second Load
Legend2[$target_name]: 1 Minute Load
LegendI[$target_name]: 5sec :
LegendO[$target_name]: 1min :
Title[$target_name]: $sysname
PageTop[$target_name]: <H1>$sysname Processor Load</H1>
<TABLE>
<TR><TD>System:</TD><TD>$sysname </TD></TR>
<TR><TD>Location:</TD><TD>$syslocation </TD></TR>
</TABLE>
CPUOLD
;
}
#snmpMIB_to_OID("/usr/share/snmp/mibs/CISCO-QOS-PIB-MIB-V1SMI.my");
#snmpMIB_to_OID("/usr/share/snmp/mibs/SNMPv2-SMI-V1SMI.my");
#snmpMIB_to_OID("/usr/share/snmp/mibs/SNMP-FRAMEWORK-MIB-V1SMI.my");
snmpMIB_to_OID("/usr/share/snmp/mibs/CISCO-ENHANCED-MEMPOOL-MIB-V1SMI.my");
my (@temp) = snmpwalk($router,$v3opt,'cempMemPoolName');
foreach my $tempi(@temp) {
$tempi =~ /^([\d\.]+):(.+)/;
my $instance=$1;
next if $2 !~ /Processor/;
my ($entity,$in2) = split('\.',$instance);
my ($used, $free, $pool_descr) = snmpget($router,$v3opt,
'cempMemPoolUsed.'.$instance,
'cempMemPoolFree.'.$instance,
'entPhysicalName.'.$entity
);
my $target_name;
if (exists $$v3opt{contextname} ) {
$target_name=$router_name.".memory".$instance.'.'.$$v3opt{contextname};
} else {
$target_name=$router_name.".memory".$instance;
}
my $maxsize = $used+$free;
$target_lines .= <<DISK
#--------------------------------------------------------------------------------------
# Memory Utilization
Target[$target_name]: cempMemPoolFree.$instance&cempMemPoolLargestFree.$instance:$router
SnmpOptions[$target_name]: $v3options
YLegend[$target_name]: Bytes Free
Options[$target_name]: gauge, unknaszero
Directory[$target_name]: $directory_name
MaxBytes[$target_name]: $maxsize
ShortLegend[$target_name]: bytes
routers.cgi*ShortDesc[$target_name]: Memory
routers.cgi*Options[$target_name]: nototal
bb*host[$target_name]: $router_name
bb*svc[$target_name]: memory
bb*red[$target_name]: 99%
bb*yellow[$target_name]: 98%
Legend1[$target_name]: Free Mem
Legend2[$target_name]: Largest Block
LegendI[$target_name]: Free
LegendO[$target_name]: Block
WithPeak[$target_name]: ymw
Title[$target_name]: $sysname $pool_descr
PageTop[$target_name]: <H1>Memory on $sysname $pool_descr </H1>
<TABLE>
<TR><TD>System:</TD><TD>$sysname </TD></TR>
<TR><TD>Location:</TD><TD>$syslocation </TD></TR>
</TABLE>
DISK
;
}
snmpMIB_to_OID("/usr/share/snmp/mibs/CISCO-SLB-MIB.my");
my (@temp) = snmpwalk($router,$v3opt,'slbStatsCreatedHCConnections');
foreach my $tempi(@temp) {
$tempi =~ /^([\d\.]+):(.+)/;
my $instance=$1;
my $target_name;
if (exists $$v3opt{contextname} ) {
$target_name=$router_name.".conn".$instance.'.'.$$v3opt{contextname};
} else {
$target_name=$router_name.".conn".$instance;
}
$target_lines .= <<CONN
#--------------------------------------------------------------------------------------
# Total Connections
Target[$target_name]: slbStatsEstablishedHCConnections.$instance&slbStatsDestroyedHCConnections.$instance:$router
SnmpOptions[$target_name]: $v3options
YLegend[$target_name]: connections
Directory[$target_name]: $directory_name
MaxBytes[$target_name]: 4294967295
ShortLegend[$target_name]: Connections
routers.cgi*ShortDesc[$target_name]: Connections
routers.cgi*Options[$target_name]: nototal,nomax,nopercent
routers.cgi*GraphStyle[$target_name]: range
Legend1[$target_name]: Established
Legend2[$target_name]: Destroyed
LegendI[$target_name]: Estab
LegendO[$target_name]: Dest
WithPeak[$target_name]: ymw
Title[$target_name]: $sysname Connections
PageTop[$target_name]: <H1>Total Connections on $sysname</H1>
<TABLE>
<TR><TD>System:</TD><TD>$sysname </TD></TR>
<TR><TD>Location:</TD><TD>$syslocation </TD></TR>
</TABLE>
CONN
;
}
snmpMIB_to_OID("/usr/share/snmp/mibs/CISCO-ENHANCED-SLB-MIB.my");
my (@temp) = snmpwalk($router,$v3opt,'cesServerFarmRserverOperStatus');
foreach my $tempi(@temp) {
$tempi =~ /^([\d\.]+):(.+)/;
my $instance=$1;
my @instchar = split(/\./,$instance);
shift @instchar;
my ($farm,$rserver,$on);
$on = 0;
foreach my $char (@instchar) {
if ($char < 32) {
$on++;
next;
};
if ($on == 1) {
$farm .= chr($char);
} else {
$rserver .= chr($char);
}
}
my $target_name = $router_name.".total.".$farm.".".$rserver.".".$$v3opt{contextname};
$target_lines .= <<FARM1
#--------------------------------------------------------------------------------------
# $farm $rserver Connections
Target[$target_name]: cesServerFarmRserverTotalConns.$instance&cesServerFarmRserverTotalConns.$instance:$router
SnmpOptions[$target_name]: $v3options
YLegend[$target_name]: connections
Directory[$target_name]: $directory_name
MaxBytes[$target_name]: 4294967295
ShortLegend[$target_name]: Connections
Options[$target_name]: noo
routers.cgi*ShortDesc[$target_name]: cnx $farm / $rserver
routers.cgi*Options[$target_name]: nomax,nopercent
Legend1[$target_name]: Established
LegendI[$target_name]: Estab
WithPeak[$target_name]: ymw
Title[$target_name]: Connections on $farm / $rserver
PageTop[$target_name]: <H1>Total Connections on $sysname for Farm $farm $rserver </H1>
<TABLE>
<TR><TD>System:</TD><TD>$sysname </TD></TR>
<TR><TD>Location:</TD><TD>$syslocation </TD></TR>
</TABLE>
FARM1
;
my $target_name = $router_name.".current.".$farm.".".$rserver.".".$$v3opt{contextname};
$target_lines .= <<FARM2
#--------------------------------------------------------------------------------------
# $farm $rserver Current Connections
Target[$target_name]: cesServerFarmRserverCurrentConns.$instance&cesServerFarmRserverCurrentConns.$instance:$router
SnmpOptions[$target_name]: $v3options
YLegend[$target_name]: connections
Directory[$target_name]: $directory_name
MaxBytes[$target_name]: 4294967295
ShortLegend[$target_name]: Connections
Options[$target_name]: gauge, noo
routers.cgi*ShortDesc[$target_name]: cur $farm / $rserver
routers.cgi*Options[$target_name]: nomax,nopercent,nototal
Legend1[$target_name]: Current
LegendI[$target_name]: Estab
WithPeak[$target_name]: ymw
Title[$target_name]: Connections on $farm / $rserver
PageTop[$target_name]: <H1>Current Connections on $sysname for Farm $farm $rserver </H1>
<TABLE>
<TR><TD>System:</TD><TD>$sysname </TD></TR>
<TR><TD>Location:</TD><TD>$syslocation </TD></TR>
</TABLE>
FARM2
;
my $target_name = $router_name.".status.".$farm.".".$rserver.".".$$v3opt{contextname};
$target_lines .= <<FARM3
#--------------------------------------------------------------------------------------
# $farm $rserver Status
Target[$target_name]: cesServerFarmRserverOperStatus.$instance&cesServerFarmRserverAdminStatus.$instance:$router
SnmpOptions[$target_name]: $v3options
YLegend[$target_name]: connections
Directory[$target_name]: $directory_name
MaxBytes[$target_name]: 24
ShortLegend[$target_name]: Status
Options[$target_name]: gauge
routers.cgi*ShortDesc[$target_name]: cnx $farm / $rserver
routers.cgi*Options[$target_name]: nomax,nopercent,nototal
bb*host[$target_name]: $router_name
bb*red[$target_name]: 1.5:2.5:2:3
Legend1[$target_name]: Operational
Legend2[$target_name]: Administrative
LegendI[$target_name]: Oper
LegendO[$target_name]: Admin
WithPeak[$target_name]: ymw
Title[$target_name]: Status of $farm / $rserver
PageTop[$target_name]: <H1>Status on $sysname for Farm $farm $rserver </H1>
<TABLE>
<TR><TD>System:</TD><TD>$sysname </TD></TR>
<TR><TD>Location:</TD><TD>$syslocation </TD></TR>
</TABLE>
FARM3
;
};
Since the same vlan might be found in multiple contexts, I also wrote an interface template that made that adjustment. It also ignores the NoHC directive that would be put in without the iftemplate. The ACE has working HC counters, but doesn't have a working ifSpeed or ifHighSpeed OID.
Code:
#
if ($if_ok and $if_snmp_descr !~ /(unrouted|Stack)/ and $if_snmp_descr !~ /Null/i) {
$target_name .= "." . $$v3opt{contextname} if exists $$v3opt{contextname};
$target_lines .= <<TOPPART
Target[$target_name]: $if_ref:$router_connect
SnmpOptions[$target_name]: $v3options
routers.cgi*ShortDesc[$target_name]: $html_if_snmp_name - $html_if_snmp_alias
routers.cgi*Extension[$target_name]: "Show current interface status" /cgi-bin/ifstatus.cgi camera2-sm.gif
TOPPART
;
# Only add to big brother if it is a routed interface or a trunk line, not a "regular" vlan interface
if ($if_ip || $if_cisco_trunk) {
$target_lines .= <<IPPART
bb*host[$target_name]: $router_name
IPPART
;
} else {
# if it is a "normal user port", then mark it with the service name "bw"
$target_lines .=<<NUPART
bb*host[$target_name]: $router_name
bb*svc[$target_name]: bw
NUPART
;
}
$target_lines .= <<LASTPART
Directory[$target_name]: $directory_name
MaxBytes[$target_name]: $if_speed
Options[$target_name]: bits
WithPeak[$target_name]: wmy
Title[$target_name]: $html_if_snmp_name - $html_if_snmp_alias
PageTop[$target_name]: <H1>$html_if_snmp_alias - Traffic </H1>
LASTPART
;
if ($if_is_ethernet && ($if_ip || $if_cisco_trunk)
&& ($target_name =~ /(tlc|ecc|rlc|811|kramer|decker|sandhill|stelmo)-(net|voip|3560)/)
) {
$target_name .= "_drop";
my $maxpps = int($if_speed / 70);
$target_lines .= <<DROPS
Target[$target_name]: locIfInputQueueDrops$if_ref&locIfOutputQueueDrops$if_ref:$router
SnmpOptions[$target_name]: $v3options
routers.cgi*ShortDesc[$target_name]: Drops $html_if_snmp_name - $html_if_snmp_alias
bb*host[$target_name]: $router_name
bb*svc[$target_name]: drops
bb*yellow[$target_name]: 1%
bb*red[$target_name]: 2%
Directory[$target_name]: $directory_name
MaxBytes[$target_name]: $maxpps
WithPeak[$target_name]: wmy
YLegend[$target_name]: Drops per second
ShortLegend[$target_name]: Packets
Title[$target_name]: Drops $html_if_snmp_name - $html_if_snmp_alias
PageTop[$target_name]: <H1>$html_if_snmp_alias - Drops </H1>
DROPS
;
}
}
else {
$head_lines="";
$problem_lines="";
$target_lines="";
$separator_lines="";
}