From de8aa961e484b4e4e7c50673da5fea69cf09fc1f Mon Sep 17 00:00:00 2001 From: Claudius Date: Thu, 9 May 2013 17:04:18 +0200 Subject: [PATCH] plugins/snmp/snmp__netapp_* initial checkin of my snmp__netapp_ plugins. --- plugins/snmp/snmp__netapp_cifs2 | 126 ++++++++++++ plugins/snmp/snmp__netapp_cifscalls | 140 +++++++++++++ plugins/snmp/snmp__netapp_cpu2 | 145 +++++++++++++ plugins/snmp/snmp__netapp_diskbusy | 155 ++++++++++++++ plugins/snmp/snmp__netapp_diskusage2_ | 285 ++++++++++++++++++++++++++ plugins/snmp/snmp__netapp_diskutil | 119 +++++++++++ plugins/snmp/snmp__netapp_ndmp | 126 ++++++++++++ plugins/snmp/snmp__netapp_net | 119 +++++++++++ plugins/snmp/snmp__netapp_ops | 134 ++++++++++++ plugins/snmp/snmp__netapp_reallocate | 239 +++++++++++++++++++++ plugins/snmp/snmp__netapp_sis | 239 +++++++++++++++++++++ 11 files changed, 1827 insertions(+) create mode 100755 plugins/snmp/snmp__netapp_cifs2 create mode 100755 plugins/snmp/snmp__netapp_cifscalls create mode 100755 plugins/snmp/snmp__netapp_cpu2 create mode 100755 plugins/snmp/snmp__netapp_diskbusy create mode 100755 plugins/snmp/snmp__netapp_diskusage2_ create mode 100755 plugins/snmp/snmp__netapp_diskutil create mode 100755 plugins/snmp/snmp__netapp_ndmp create mode 100755 plugins/snmp/snmp__netapp_net create mode 100755 plugins/snmp/snmp__netapp_ops create mode 100755 plugins/snmp/snmp__netapp_reallocate create mode 100755 plugins/snmp/snmp__netapp_sis diff --git a/plugins/snmp/snmp__netapp_cifs2 b/plugins/snmp/snmp__netapp_cifs2 new file mode 100755 index 00000000..8c3a22bc --- /dev/null +++ b/plugins/snmp/snmp__netapp_cifs2 @@ -0,0 +1,126 @@ +#!/usr/bin/perl +# -*- perl -*- +# vim: ft=perl + +=head1 NAME + +snmp__netapp_cifs - Munin plugin to retrieve general cifs information from NetApp storage appliances. + +=head1 APPLICABLE SYSTEMS + +cifs should be reported by any NetApp storage appliance +with SNMP agent daemon activated. See na_snmp(8) for details. + +=head1 CONFIGURATION + +Unfortunately, SNMPv3 is not fully supported on all NetApp equipments. +For this reason, this plugin will use SNMPv2 by default, which is +insecure because it doesn't encrypt the community string. + +The following parameters will help you get this plugin working : + +[snmp_*] +env.community MyCommunity + +If your community name is 'public', you should really worry about +security and immediately reconfigure your appliance. + +Please see 'perldoc Munin::Plugin::SNMP' for further configuration. + +=head1 INTERPRETATION + +The plugin reports various cifs connections, users and open files. + +=head1 MIB INFORMATION + +This plugin requires support for the NETWORK-APPLIANCE-MIB issued by +Network Appliance. It reports the content of the cifs OID. + +=head1 MAGIC MARKERS + + #%# family=snmpauto + #%# capabilities=snmpconf + +=head1 BUGS + +This plugin wasn't tested on many hardware and only on Ontap 7.3.x. + +=head1 AUTHOR + +2013, Claudius Herder +NetApp is a registered trademark and Network Appliance is a trademark +of Network Appliance, Inc. in the U.S. and other countries. + +=head1 LICENSE + +GPLv2. + +=cut + +use strict; +use warnings; +use Munin::Plugin::SNMP; + +my %oids = +( + cifsConnectedUsers => 'ConnectedUsers', + cifsNSessions => 'Sesions', + cifsNOpenFiles => 'OpenFiles', +); + +if (defined $ARGV[0] and $ARGV[0] eq 'snmpconf') +{ + print "require 1.3.6.1.4.1.789.1.7.2. [0-9]\n"; + exit 0; +} + +my $session = Munin::Plugin::SNMP->session(); + +if (defined $ARGV[0] and $ARGV[0] eq "config") +{ + my ($host, undef, undef, undef) = Munin::Plugin::SNMP->config_session(); + + print "host_name $host\n" unless $host eq 'localhost'; + print "graph_title $host CIFS sessions\n"; + print "graph_args --base 1000 --lower-limit 0 --rigid\n"; + print "graph_vlabel CIFS\n"; + print "graph_category CIFS\n"; + print "graph_info This graph shows CIFS sessions status for the $host.\n"; + print "graph_order "; + foreach (sort keys %oids) + { + print "$_ "; + } + print "\n"; + foreach my $k (sort keys %oids) + { + print "$k.info The number of CIFS $oids{$k}.\n"; + print "$k.label $oids{$k}\n"; + print "$k.min 0\n"; + print "$k.type GAUGE\n"; + } + exit 0; +} + +my $values = $session->get_hash +( + -baseoid => '1.3.6.1.4.1.789.1.7.2', + -cols => + { + 9 => 'cifsConnectedUsers', + 12 => 'cifsNSessions', + 13 => 'cifsNOpenFiles', + }, +); + +foreach my $k (keys %oids) +{ + my $v = 'U'; + + $v = $values->{0}->{$k} if (defined $values); + print "$k.value $v\n"; +} + +exit 0; + +__END__ diff --git a/plugins/snmp/snmp__netapp_cifscalls b/plugins/snmp/snmp__netapp_cifscalls new file mode 100755 index 00000000..c411461b --- /dev/null +++ b/plugins/snmp/snmp__netapp_cifscalls @@ -0,0 +1,140 @@ +#!/usr/bin/perl +# -*- perl -*- +# vim: ft=perl + +=head1 NAME + +snmp__netapp_cifscalls - Munin plugin to retrieve cifs calls types stats from NetApp storage appliances. + +=head1 APPLICABLE SYSTEMS + +cifs calls stats should be reported by any NetApp storage appliance +with SNMP agent daemon activated. See na_snmp(8) for details. + +=head1 CONFIGURATION + +Unfortunately, SNMPv3 is not fully supported on all NetApp equipments. +For this reason, this plugin will use SNMPv2 by default, which is +insecure because it doesn't encrypt the community string. + +The following parameters will help you get this plugin working : + +[snmp_*] +env.community MyCommunity + +If your community name is 'public', you should really worry about +security and immediately reconfigure your appliance. + +Please see 'perldoc Munin::Plugin::SNMP' for further configuration. + +=head1 INTERPRETATION + +The plugin reports various cifs calls by type. +This can help you determine what calls types are killing your appliance under heavy +loads. + +=head1 MIB INFORMATION + +This plugin requires support for the NETWORK-APPLIANCE-MIB issued by +Network Appliance. It reports the content of the cifs OID. + +=head1 MAGIC MARKERS + + #%# family=snmpauto + #%# capabilities=snmpconf + +=head1 BUGS + +This plugin wasn't tested on many hardware and only on Ontap 7.3.x. + +=head1 AUTHOR + +2013, Claudius Herder +NetApp is a registered trademark and Network Appliance is a trademark +of Network Appliance, Inc. in the U.S. and other countries. + +=head1 LICENSE + +GPLv2. + +=cut + + use strict; + use warnings; + use Munin::Plugin::SNMP; + +my %oids = +( + cifsBadCalls => 'BadCalls', + cifsGetAttrs => 'GetAttrs', + cifsReads => 'Reads', + cifsWrites => 'Writes', + cifsLocks => 'Locks', + cifsOpens => 'Opens', + cifsDirOps => 'DirOps', + cifsOthers => 'Others', + cifsSetAttrs => 'SetAttr', +); + +if (defined $ARGV[0] and $ARGV[0] eq 'snmpconf') +{ + print "require 1.3.6.1.4.1.789.1.7.3.1.1. [0-9]\n"; + exit 0; +} + +my $session = Munin::Plugin::SNMP->session(); + +if (defined $ARGV[0] and $ARGV[0] eq "config") +{ + my ($host, undef, undef, undef) = Munin::Plugin::SNMP->config_session(); + print "host_name $host\n" unless $host eq 'localhost'; + print "graph_title $host CIFS calls\n"; + print "graph_args --base 1000 --lower-limit 0 --rigid\n"; + print "graph_vlabel calls / \${graph_period}\n"; + print "graph_category cifs\n"; + print "graph_info This graph shows cifs calls for the $host NetApp equipment.\n"; + print "graph_order "; + foreach (sort keys %oids) + { + print "$_ "; + } + print "\n"; + foreach my $k (sort keys %oids) + { + print "$k.info The number of cifs calls received for the $oids{$k} procedure, since the last time the statistics were cleared.\n"; + print "$k.type COUNTER\n"; + print "$k.label $oids{$k}\n"; + print "$k.min 0\n"; + } + exit 0; +} + +my $values = $session->get_hash +( + -baseoid => '1.3.6.1.4.1.789.1.7.3.1.1', + -cols => + { + 1 => 'cifsTotalOps', + 2 => 'cifsTotalCalls', + 3 => 'cifsBadCalls', + 4 => 'cifsGetAttrs', + 5 => 'cifsReads', + 6 => 'cifsWrites', + 7 => 'cifsLocks', + 8 => 'cifsOpens', + 9 => 'cifsDirOps', + 10 => 'cifsOthers', + 11 => 'cifsSetAttrs', + }, +); + +foreach my $k (keys %oids) +{ + my $v = 'U'; + $v = $values->{0}->{$k} if (defined $values); + print "$k.value $v\n"; +} + +exit 0; + +__END__ diff --git a/plugins/snmp/snmp__netapp_cpu2 b/plugins/snmp/snmp__netapp_cpu2 new file mode 100755 index 00000000..8b6e9a48 --- /dev/null +++ b/plugins/snmp/snmp__netapp_cpu2 @@ -0,0 +1,145 @@ +#!/usr/bin/perl +# -*- perl -*- +# vim: ft=perl + +=head1 NAME + +snmp__netapp_cifs - Munin plugin to retrieve cpu information from NetApp storage appliances. + +=head1 APPLICABLE SYSTEMS + +cpu should be reported by any NetApp storage appliance +with SNMP agent daemon activated. See na_snmp(8) for details. + +=head1 CONFIGURATION + +Unfortunately, SNMPv3 is not fully supported on all NetApp equipments. +For this reason, this plugin will use SNMPv2 by default, which is +insecure because it doesn't encrypt the community string. + +The following parameters will help you get this plugin working : + +[snmp_*] +env.community MyCommunity + +If your community name is 'public', you should really worry about +security and immediately reconfigure your appliance. + +Please see 'perldoc Munin::Plugin::SNMP' for further configuration. + +=head1 INTERPRETATION + +The plugin reports various cpu busy and idle. + +=head1 MIB INFORMATION + +This plugin requires support for the NETWORK-APPLIANCE-MIB issued by +Network Appliance. It reports the content of the cpu OID. + +=head1 MAGIC MARKERS + + #%# family=snmpauto + #%# capabilities=snmpconf + +=head1 BUGS + +This plugin wasn't tested on many hardware and only on Ontap 7.3.x. + +=head1 AUTHOR + +2013, Claudius Herder +NetApp is a registered trademark and Network Appliance is a trademark +of Network Appliance, Inc. in the U.S. and other countries. + +=head1 LICENSE + +GPLv2. + +=cut + +use strict; +use warnings; +use Munin::Plugin::SNMP; + +my %oids = +( +# cpuUpTime => 'CPU_UPTIME', +# cpuBusyTime => 'CPU_BUSYTIME', + cpuBusyTimePerCent => 'Busy', +# cpuIdleTime => 'CPU_IDLETIME', + cpuIdleTimePerCent => 'Idle', +# cpuCount => 'CPU_COUNT', +# cpuSwitchInvocations => 'CPU_SWTICHINVOCATIONS', +# cpuContextSwitches => 'CPU_CONTEXTSWITCHES', +# cpuInterrupts => 'CPU_INTERRUPTS', +# cpuNonCPInterrupts => 'CPU_NONCPINTERRUPTS', +# cpuCPInterruptPercent => 'CPU_CPINTERRUPTPERCENT', +# cpuNonCPInterruptPercent => 'CPU_NONCPINTERRUPTPERCENT', +# cpuTotalDomainSwitches => 'CPU_TOTALDOMAINSWITCHES', +); + +if (defined $ARGV[0] and $ARGV[0] eq 'snmpconf') +{ + print "require 1.3.6.1.4.1.789.1.2.1. [0-9]\n"; + exit 0; +} + +my $session = Munin::Plugin::SNMP->session(); + +if (defined $ARGV[0] and $ARGV[0] eq "config") +{ + my ($host, undef, undef, undef) = Munin::Plugin::SNMP->config_session(); + print "host_name $host\n" unless $host eq 'localhost'; + print "graph_title $host CPU \n"; + print "graph_args --base 1000 -r --lower-limit 0 --upper-limit 100\n"; + print "graph_vlabel CPU \n"; + print "graph_category CPU\n"; + print "graph_info This graph shows cpu busy value for the $host in percent.\n"; + print "graph_order "; + foreach (sort keys %oids) + { + print "$_ "; + } + print "\n"; + foreach my $k (sort keys %oids) + { + print "$k.info The cpu $oids{$k} value in percent\n"; + print "$k.label $oids{$k}\n"; + print "$k.min 0\n"; + print "$k.draw AREASTACK\n"; + print "$k.type GAUGE\n"; + } + exit 0; +} + +my $values = $session->get_hash +( + -baseoid => '1.3.6.1.4.1.789.1.2.1', + -cols => + { +# 1 => 'cpuUpTime', +# 2 => 'cpuBusyTime', + 3 => 'cpuBusyTimePerCent', +# 4 => 'cpuIdleTime', + 5 => 'cpuIdleTimePerCent', +# 6 => 'cpuCount', +# 7 => 'cpuSwitchInvocations', +# 8 => 'cpuContextSwitches', +# 9 => 'cpuInterrupts', +# 10 => 'cpuNonCPInterrupts', +# 11 => 'cpuCPInterruptPercent', +# 12 => 'cpuNonCPInterruptPercent', +# 13 => 'cpuTotalDomainSwitches', + }, +); + +foreach my $k (keys %oids) +{ + my $v = 'U'; + $v = $values->{0}->{$k} if (defined $values); + print "$k.value $v\n"; +} + +exit 0; + +__END__ diff --git a/plugins/snmp/snmp__netapp_diskbusy b/plugins/snmp/snmp__netapp_diskbusy new file mode 100755 index 00000000..f7f3bcd3 --- /dev/null +++ b/plugins/snmp/snmp__netapp_diskbusy @@ -0,0 +1,155 @@ +#!/usr/bin/perl -w +# -*- perl -*- +# vim: ft=perl + +=head1 NAME + + +=head1 APPLICABLE SYSTEMS + + +=head1 CONFIGURATION + +You have to setup ssh with public key authentication for this plugin +SNMP is only used for getting the hostname + + [snmp_$host_netapp_diskbusy] + env.ssh /usr/bin/ssh (default) + env.sshuser munin (default) + env.sshopts -i /home/munin/.ssh/id_rsa -o UserKnownHostsFile=/home/munin/.ssh/known_hosts (no default) + env.spares 2 (no default) + +Number of spares is only used for total diskusage. + +=head1 INTERPRETATION + +This plugin only prints the disk busy status at check time. There is no +average calculated, but it still gives a goood overview if all disk are +used equally or you have got a single hot disk. + +=head1 AUTHOR + +2013, Claudius Herder + +=head1 LICENSE + +GPLv2. + +=cut + +use strict; +use Munin::Plugin; +use Munin::Plugin::SNMP; +need_multigraph(); + +my %disks; + +sub do_collect +{ + my $input; + my @tmp; + my $ssh = $ENV{'ssh'} || '/usr/bin/ssh'; + my $sshuser = $ENV{'sshuser'} || $ENV{'USER'}; + my $sshopts = $ENV{'sshopts'} || ""; + my ($host, undef, undef, undef) = Munin::Plugin::SNMP->config_session(); + + $input=`$ssh $sshopts $sshuser\@$host stats show disk:*:disk_busy`; + foreach my $line (split(/\n/, $input)) + { + @tmp = split(/:/, $line); + ($disks{$tmp[2]} = $tmp[12]) =~ s/%//; + } +} + +sub do_config_root +{ + my ($host) = @_; + + print "multigraph diskbusy\n"; + print "graph_title $host Aggregate busy status\n"; + print "graph_args --base 1000 --lower-limit 0 --rigid\n"; + print "graph_vlabel aggr busy status\n"; + print "graph_category disk\n"; + print "graph_info This graph shows the aggr busy status in percent for $host without spares\n"; + print "diskbusy.label DiskBusy\n"; + print "diskbusy.min 0\n"; + print "diskbusy.draw AREASTACK\n"; + print "diskbusy.type GAUGE\n"; +} + +sub do_config_disk +{ + my ($host,$disk) = @_; + my $extrainfo = ''; + + print "multigraph diskbusy.$disk\n"; + print "graph_title disk busy status for disk $disk\n"; + print "graph_args --base 1000 --lower-limit 0 --rigid\n"; + print "graph_vlabel disk busy status\n"; + print "graph_category disk\n"; + print "graph_info This graph shows disk busy status in percent for the $disk disk.$extrainfo\n"; + print "diskbusy.info This is the disk busy status in percent of $disk\n"; + print "diskbusy.type GAUGE\n"; + print "diskbusy.label DiskBusy\n"; + print "diskbusy.min 0\n"; + print "diskbusy.draw AREASTACK\n"; +} + +sub do_fetch_root +{ + my $spares=$ENV{'spares'} || 0; + my $busy =0; + my $numberofdisk=0; + my $diskbusy=0; + $numberofdisk =(keys %disks); + foreach my $disk (keys %disks) + { + $busy += $disks{$disk}; + } + $diskbusy=$busy/($numberofdisk-$spares); + print "multigraph diskbusy\n"; + printf("diskbusy.value %.3f \n",$diskbusy); +} + +sub do_fetch_disk +{ + my($disk) = @_; + my $busy; + $busy = $disks{$disk}; + print "multigraph diskbusy.$disk\n"; + print "diskbusy.value $busy\n"; +} + +sub do_config +{ + my ($host, undef, undef, undef) = Munin::Plugin::SNMP->config_session(); + print "host_name $host\n" unless $host eq 'localhost'; + foreach my $disk (sort keys %disks) + { + do_config_disk($host,$disk); + } + do_config_root($host); +} + +sub do_fetch +{ + foreach my $disk (sort keys %disks) + { + do_fetch_disk($disk); + } + do_fetch_root(); +} + +do_collect(); + +if ($ARGV[0] and $ARGV[0] eq "config") +{ + do_config(); + exit 0; +} + +do_fetch(); + +exit 0; + +__END__ diff --git a/plugins/snmp/snmp__netapp_diskusage2_ b/plugins/snmp/snmp__netapp_diskusage2_ new file mode 100755 index 00000000..5b481779 --- /dev/null +++ b/plugins/snmp/snmp__netapp_diskusage2_ @@ -0,0 +1,285 @@ +#!/usr/bin/perl +# -*- perl -*- +# vim: ft=perl + +=head1 NAME + +snmp__netapp_cifs - Munin plugin to retrieve general cifs information from NetApp storage appliances. + +=head1 APPLICABLE SYSTEMS + +cifs should be reported by any NetApp storage appliance +with SNMP agent daemon activated. See na_snmp(8) for details. + +=head1 CONFIGURATION + +Unfortunately, SNMPv3 is not fully supported on all NetApp equipments. +For this reason, this plugin will use SNMPv2 by default, which is +insecure because it doesn't encrypt the community string. + +The following parameters will help you get this plugin working : + +[snmp_*] +env.community MyCommunity + +If your community name is 'public', you should really worry about +security and immediately reconfigure your appliance. + +Please see 'perldoc Munin::Plugin::SNMP' for further configuration. + +=head1 INTERPRETATION + +The plugin reports various cifs connections, users and open files. + +=head1 MIB INFORMATION + +This plugin requires support for the NETWORK-APPLIANCE-MIB issued by +Network Appliance. It reports the content of the cifs OID. + +=head1 MAGIC MARKERS + + #%# family=snmpauto + #%# capabilities=snmpconf + +=head1 BUGS + +This plugin wasn't tested on many hardware and only on Ontap 7.3.x. + +=head1 AUTHOR + +2013, Claudius Herder +NetApp is a registered trademark and Network Appliance is a trademark +of Network Appliance, Inc. in the U.S. and other countries. + +=head1 LICENSE + +GPLv2. + +=cut + +use strict; +use warnings; +use Munin::Plugin; +use Munin::Plugin::SNMP; +need_multigraph(); + +my %volbytes = +( + df64TotalKBytes => 'df64TotalKBytes', + df64UsedKBytes => 'df64UsedKBytes', + df64SisSavedKBytes => 'df64SisSavedKBytes', +); +my %snapbytes = +( + df64TotalKBytes => 'df64SnapShotTotalKBytes', + df64UsedKBytes => 'df64SnapShotUsedKBytes', +); +my %config = +( + df64TotalKBytes => 'VolumeSize', + df64UsedKBytes => 'Used', + df64SisSavedKBytes => 'SisSaved', + df64SnapShotTotalKBytes => 'SnapShotReserve', + df64SnapShotUsedKBytes => 'SnapShotUsed', + df64TotalAndSnapTotalKBytes => 'Total', +); + +my $dfinfo; +my $aggrFlexvollist; +my $aggr_name; +my $aggr_id; + +sub do_collect +{ + my $session = Munin::Plugin::SNMP->session(); + + $dfinfo = $session->get_hash + ( + -baseoid => '1.3.6.1.4.1.789.1.5.4.1', + -cols => + { + 1 => 'dfIndex', + 2 => 'dfFileSys', + 29 => 'df64TotalKBytes', + 30 => 'df64UsedKBytes', + 31 => 'df64AvailKBytes', + 33 => 'df64SisSavedKBytes', + }, + ); + $aggrFlexvollist = $session->get_hash + ( + -baseoid => '1.3.6.1.4.1.789.1.5.11.1', + -cols => + { + 2 => 'aggrName', + 9 => 'aggrFlexvollist', + }, + ); +} + +sub do_config_vol +{ + my ($host,$aggr_name,$vol) = @_; + my $extrainfo = ''; + if ( $dfinfo->{$vol}->{dfFileSys} eq $aggr_name ) + { + print "multigraph diskusage2_$aggr_name\n"; + print "graph_title $host disk usage of $aggr_name\n"; + print "graph_info This graph shows the disk usage on NetApp host $host\n"; + } + else + { + print "multigraph diskusage2_$aggr_name.$dfinfo->{$vol}->{dfFileSys}\n"; + print "graph_title $host disk usage of $dfinfo->{$vol}->{dfFileSys} on $aggr_name\n"; + print "graph_info This graph shows the disk usage for $dfinfo->{$vol}->{dfFileSys} on NetApp host $host\n"; + } + print "graph_args --base 1024 --lower-limit 0\n"; + print "graph_vlabel bytes\n"; + print "graph_category disk\n"; + print "graph_order df64UsedKBytes df64SnapShotUsedKBytes df64SisSavedKBytes df64TotalKBytes df64SnapShotTotalKBytes df64TotalAndSnapTotalKBytes \n"; + + foreach my $k (sort keys %config ) + { + print "$k.info $config{$k} of Volume $dfinfo->{$vol}->{dfFileSys}.\n"; + print "$k.label $config{$k}\n"; + print "$k.min 0\n"; + + if ($k eq "df64TotalKBytes" ) + { + print "$k.draw LINE3\n"; + } + elsif ( $k eq "df64SnapShotTotalKBytes" ) + { + print "$k.draw LINE0\n"; + } + elsif ( $k eq "df64TotalAndSnapTotalKBytes" ) + { + print "$k.draw LINE3\n"; + } + else + { + print "$k.draw AREASTACK\n"; + } + print "$k.type GAUGE\n"; + print "$k.cdef $k,1024,*\n" + } +} + +sub do_fetch_vol +{ + my (undef, $aggr_name,$vol) = @_; + my $sum = 0; + my $index = 'U'; + my $v = 'U'; + + $index = $dfinfo->{$vol}->{dfIndex}; + if ( $dfinfo->{$vol}->{dfFileSys} eq $aggr_name ) + { + print "multigraph diskusage2_$aggr_name\n"; + } + else + { + print "multigraph diskusage2_$aggr_name.$dfinfo->{$vol}->{dfFileSys}\n"; + } + foreach my $k (keys %snapbytes) + { + if ( $k eq "df64TotalKBytes" ) + { + $sum += $dfinfo->{$index+1}->{$k}; + $v = $dfinfo->{$index+1}->{$k}; + } + else + { + $v = $dfinfo->{$index+1}->{$k}; + } + print "$snapbytes{$k}.value $v\n"; + } + + foreach my $k (keys %volbytes) + { + if ( $k eq "df64TotalKBytes" ) + { + $sum += $dfinfo->{$vol}->{$k}; + $v = $dfinfo->{$vol}->{$k}; + print "df64TotalAndSnapTotalKBytes.value $sum\n"; + } + else + { + $v = $dfinfo->{$vol}->{$k}; + } + print "$volbytes{$k}.value $v\n"; + } +} + +sub do_config_fetch +{ + my ($func) = @_; + my $fcall; + my %op = ( + 'config' => \&do_config_vol, + 'fetch' => \&do_fetch_vol, + ); + + my ($host, undef, undef, undef ) = Munin::Plugin::SNMP->config_session(); + if ( $func eq "config" ) + { + $fcall = $op{config}; + print "host_name $host\n" unless $host eq 'localhost'; + } + elsif ( $func eq "fetch") + { + $fcall = $op{fetch}; + } + foreach my $vol (sort {$a <=> $b} keys %{$dfinfo}) + { + $dfinfo->{$vol}->{dfFileSys} =~ s/(\/vol\/)(.*?)\//$2/; + if ( $dfinfo->{$vol}->{dfFileSys} ~~ [ split(' ',$aggrFlexvollist->{$aggr_id}->{aggrFlexvollist}), $aggr_name ]) + { + $fcall->($host,$aggr_name,$vol); + } + } +} + +sub do_setaggr { + if ( $0 =~ /netapp_diskusage2_$/) + { + die ("Can't run without a symlinked name\n") + } + elsif ($0 =~ /netapp_diskusage2_(.+)*$/) + { + $aggr_name = $1; + foreach my $aggr (keys %{$aggrFlexvollist}) + { + if ( $aggr_name =~ $aggrFlexvollist->{$aggr}->{aggrName} ) + { + $aggr_id = $aggr; + } + } + } +} + +if (defined $ARGV[0]) +{ + if ($ARGV[0] eq "config") + { + do_collect(); + do_setaggr(); + do_config_fetch("config"); + exit 0; + } + elsif ($ARGV[0] eq "snmpconf") + { + print "index 1.3.6.1.4.1.789.1.5.11.1.2.\n"; + exit 0; + } +} +else +{ + do_collect(); + do_setaggr(); + do_config_fetch("fetch"); +} + +exit 0; + +__END__ diff --git a/plugins/snmp/snmp__netapp_diskutil b/plugins/snmp/snmp__netapp_diskutil new file mode 100755 index 00000000..13b32130 --- /dev/null +++ b/plugins/snmp/snmp__netapp_diskutil @@ -0,0 +1,119 @@ +#!/usr/bin/perl +# -*- perl -*- +# vim: ft=perl + +=head1 NAME + +snmp__netapp_cifs - Munin plugin to retrieve general cifs information from NetApp storage appliances. + +=head1 APPLICABLE SYSTEMS + +cifs should be reported by any NetApp storage appliance +with SNMP agent daemon activated. See na_snmp(8) for details. + +=head1 CONFIGURATION + +Unfortunately, SNMPv3 is not fully supported on all NetApp equipments. +For this reason, this plugin will use SNMPv2 by default, which is +insecure because it doesn't encrypt the community string. + +The following parameters will help you get this plugin working : + +[snmp_*] +env.community MyCommunity + +If your community name is 'public', you should really worry about +security and immediately reconfigure your appliance. + +Please see 'perldoc Munin::Plugin::SNMP' for further configuration. + +=head1 INTERPRETATION + +The plugin reports various cifs connections, users and open files. + +=head1 MIB INFORMATION + +This plugin requires support for the NETWORK-APPLIANCE-MIB issued by +Network Appliance. It reports the content of the cifs OID. + +=head1 MAGIC MARKERS + + #%# family=snmpauto + #%# capabilities=snmpconf + +=head1 BUGS + +This plugin wasn't tested on many hardware and only on Ontap 7.3.x. + +=head1 AUTHOR + +2013, Claudius Herder +NetApp is a registered trademark and Network Appliance is a trademark +of Network Appliance, Inc. in the U.S. and other countries. + +=head1 LICENSE + +GPLv2. + +=cut + +use strict; +use warnings; +use Munin::Plugin::SNMP; + +my %oids = +( + misc64DiskReadBytes => 'DISKUTIL_DISKREADBYTES', + misc64DiskWriteBytes => 'DISKUTIL_DISKWRITEBYTES', +); + +if (defined $ARGV[0] and $ARGV[0] eq 'snmpconf') +{ + print "require 1.3.6.1.4.1.789.1.2.2.1.0 [0-9]\n"; + exit 0; +} + +my $session = Munin::Plugin::SNMP->session(); + +if (defined $ARGV[0] and $ARGV[0] eq "config") +{ + my ($host, undef, undef, undef) = Munin::Plugin::SNMP->config_session(); + print "host_name $host\n" unless $host eq 'localhost'; + print "graph_title $host Disk throughput\n"; + print "graph_args --base 1024\n"; + print "graph_vlabel Bytes/\${graph_period} write (-) / read (+)\n"; + print "graph_category disk\n"; + print "graph_info This graph shows DiskUtil calls for the $host NetApp equipment.\n"; + print "graph_order misc64DiskWriteBytes misc64DiskReadBytes\n"; + print "misc64DiskWriteBytes.type COUNTER\n"; + print "misc64DiskWriteBytes.label bps\n"; + print "misc64DiskWriteBytes.min 0\n"; + print "misc64DiskWriteBytes.graph no\n"; + print "misc64DiskReadBytes.type COUNTER\n"; + print "misc64DiskReadBytes.min 0\n"; + print "misc64DiskReadBytes.label bps\n"; + print "misc64DiskReadBytes.negative misc64DiskWriteBytes\n"; + print "misc64DiskReadBytes.info misc64DiskWriteBytes/misc64DiskReadBytes\n"; + exit 0; +} + +my $values = $session->get_hash +( + -baseoid => '1.3.6.1.4.1.789.1.2.2', + -cols => + { + 32 => 'misc64DiskReadBytes', + 33 => 'misc64DiskWriteBytes', + }, +); + +foreach my $k (keys %oids) +{ + my $v = 'U'; + $v = $values->{0}->{$k} if (defined $values); + print "$k.value $v\n"; +} + +exit 0; + +__END__ diff --git a/plugins/snmp/snmp__netapp_ndmp b/plugins/snmp/snmp__netapp_ndmp new file mode 100755 index 00000000..f9de0f56 --- /dev/null +++ b/plugins/snmp/snmp__netapp_ndmp @@ -0,0 +1,126 @@ +#!/usr/bin/perl +# -*- perl -*- +# vim: ft=perl + +=head1 NAME + +snmp__netapp_cifs - Munin plugin to retrieve general cifs information from NetApp storage appliances. + +=head1 APPLICABLE SYSTEMS + +cifs should be reported by any NetApp storage appliance +with SNMP agent daemon activated. See na_snmp(8) for details. + +=head1 CONFIGURATION + +Unfortunately, SNMPv3 is not fully supported on all NetApp equipments. +For this reason, this plugin will use SNMPv2 by default, which is +insecure because it doesn't encrypt the community string. + +The following parameters will help you get this plugin working : + +[snmp_*] +env.community MyCommunity + +If your community name is 'public', you should really worry about +security and immediately reconfigure your appliance. + +Please see 'perldoc Munin::Plugin::SNMP' for further configuration. + +=head1 INTERPRETATION + +The plugin reports various cifs connections, users and open files. + +=head1 MIB INFORMATION + +This plugin requires support for the NETWORK-APPLIANCE-MIB issued by +Network Appliance. It reports the content of the cifs OID. + +=head1 MAGIC MARKERS + + #%# family=snmpauto + #%# capabilities=snmpconf + +=head1 BUGS + +This plugin wasn't tested on many hardware and only on Ontap 7.3.x. + +=head1 AUTHOR + +2013, Claudius Herder +NetApp is a registered trademark and Network Appliance is a trademark +of Network Appliance, Inc. in the U.S. and other countries. + +=head1 LICENSE + +GPLv2. + +=cut + +use strict; +use warnings; +use Munin::Plugin::SNMP; + +my %oids = +( + ndmpSessionOpened => 'SessionsOpened', + ndmpBackupActive => 'BackupActive', + ndmpRestoreActive => 'RestoreActive', + +); + +if (defined $ARGV[0] and $ARGV[0] eq 'snmpconf') +{ + print "require 1.3.6.1.4.1.789.1.10.1.0 [0-9]\n"; + exit 0; +} + +my $session = Munin::Plugin::SNMP->session(); + +if (defined $ARGV[0] and $ARGV[0] eq "config") +{ + my ($host, undef, undef, undef) = Munin::Plugin::SNMP->config_session(); + print "host_name $host\n" unless $host eq 'localhost'; + print "graph_title $host NDMP \n"; + print "graph_args --base 1000 --lower-limit 0 --rigid\n"; + print "graph_vlabel NDMP status\n"; + print "graph_category NDMP\n"; + print "graph_info This graph shows NDMP status for the $host NetApp equipment.\n"; + print "graph_order "; + foreach (sort keys %oids) + { + print "$_ "; + } + print "\n"; + foreach my $k (sort keys %oids) + { + print "$k.info The number of NDMP $oids{$k}\n"; + print "$k.label $oids{$k}\n"; + print "$k.min 0\n"; + print "$k.draw AREASTACK\n"; + print "$k.type GAUGE\n"; + } + exit 0; +} + +my $values = $session->get_hash +( + -baseoid => '1.3.6.1.4.1.789.1.10', + -cols => + { + 2 => 'ndmpSessionOpened', + 3 => 'ndmpBackupActive', + 4 => 'ndmpRestoreActive', + }, +); + +foreach my $k (keys %oids) +{ + my $v = 'U'; + $v = $values->{0}->{$k} if (defined $values); + print "$k.value $v\n"; +} + +exit 0; + +__END__ diff --git a/plugins/snmp/snmp__netapp_net b/plugins/snmp/snmp__netapp_net new file mode 100755 index 00000000..c97e4fda --- /dev/null +++ b/plugins/snmp/snmp__netapp_net @@ -0,0 +1,119 @@ +#!/usr/bin/perl +# -*- perl -*- +# vim: ft=perl + +=head1 NAME + +snmp__netapp_cifs - Munin plugin to retrieve general cifs information from NetApp storage appliances. + +=head1 APPLICABLE SYSTEMS + +cifs should be reported by any NetApp storage appliance +with SNMP agent daemon activated. See na_snmp(8) for details. + +=head1 CONFIGURATION + +Unfortunately, SNMPv3 is not fully supported on all NetApp equipments. +For this reason, this plugin will use SNMPv2 by default, which is +insecure because it doesn't encrypt the community string. + +The following parameters will help you get this plugin working : + +[snmp_*] +env.community MyCommunity + +If your community name is 'public', you should really worry about +security and immediately reconfigure your appliance. + +Please see 'perldoc Munin::Plugin::SNMP' for further configuration. + +=head1 INTERPRETATION + +The plugin reports various cifs connections, users and open files. + +=head1 MIB INFORMATION + +This plugin requires support for the NETWORK-APPLIANCE-MIB issued by +Network Appliance. It reports the content of the cifs OID. + +=head1 MAGIC MARKERS + + #%# family=snmpauto + #%# capabilities=snmpconf + +=head1 BUGS + +This plugin wasn't tested on many hardware and only on Ontap 7.3.x. + +=head1 AUTHOR + +2013, Claudius Herder +NetApp is a registered trademark and Network Appliance is a trademark +of Network Appliance, Inc. in the U.S. and other countries. + +=head1 LICENSE + +GPLv2. + +=cut + +use strict; +use warnings; +use Munin::Plugin::SNMP; + +my %oids = +( + misc64NetRcvdBytes => 'NET_NETRCVDBYTES', + misc64NetSentBytes => 'NET_NETSENTBYTES', +); + +if (defined $ARGV[0] and $ARGV[0] eq 'snmpconf') +{ + print "require 1.3.6.1.4.1.789.1.2.2.1.0 [0-9]\n"; + exit 0; +} + +my $session = Munin::Plugin::SNMP->session(); + +if (defined $ARGV[0] and $ARGV[0] eq "config") +{ + my ($host, undef, undef, undef) = Munin::Plugin::SNMP->config_session(); + print "host_name $host\n" unless $host eq 'localhost'; + print "graph_title $host Network interface traffic\n"; + print "graph_args --base 1000\n"; + print "graph_vlabel Bytes in (-) / out (+) per \${graph_period}\n"; + print "graph_category network\n"; + print "graph_info This graph shows net stats for the $host NetApp equipment.\n"; + print "graph_order misc64NetRcvdBytes misc64NetSentBytes\n"; + print "misc64NetRcvdBytes.type COUNTER\n"; + print "misc64NetRcvdBytes.min 0\n"; + print "misc64NetRcvdBytes.graph no\n"; + print "misc64NetRcvdBytes.label bps\n"; + print "misc64NetSentBytes.type COUNTER\n"; + print "misc64NetSentBytes.label bps\n"; + print "misc64NetSentBytes.min 0\n"; + print "misc64NetSentBytes.negative misc64NetRcvdBytes\n"; + print "misc64NetSentBytes.info misc64NetRcvdBytes/misc64NetSentBytes\n"; + exit 0; +} + +my $values = $session->get_hash +( + -baseoid => '1.3.6.1.4.1.789.1.2.2', + -cols => + { + 30 => 'misc64NetRcvdBytes', + 31 => 'misc64NetSentBytes', + }, +); + +foreach my $k (keys %oids) +{ + my $v = 'U'; + $v = $values->{0}->{$k} if (defined $values); + print "$k.value $v\n"; +} + +exit 0; + +__END__ diff --git a/plugins/snmp/snmp__netapp_ops b/plugins/snmp/snmp__netapp_ops new file mode 100755 index 00000000..019751ee --- /dev/null +++ b/plugins/snmp/snmp__netapp_ops @@ -0,0 +1,134 @@ +#!/usr/bin/perl +# -*- perl -*- +# vim: ft=perl + +=head1 NAME + +snmp__netapp_cifs - Munin plugin to retrieve general cifs information from NetApp storage appliances. + +=head1 APPLICABLE SYSTEMS + +cifs should be reported by any NetApp storage appliance +with SNMP agent daemon activated. See na_snmp(8) for details. + +=head1 CONFIGURATION + +Unfortunately, SNMPv3 is not fully supported on all NetApp equipments. +For this reason, this plugin will use SNMPv2 by default, which is +insecure because it doesn't encrypt the community string. + +The following parameters will help you get this plugin working : + +[snmp_*] +env.community MyCommunity + +If your community name is 'public', you should really worry about +security and immediately reconfigure your appliance. + +Please see 'perldoc Munin::Plugin::SNMP' for further configuration. + +=head1 INTERPRETATION + +The plugin reports various cifs connections, users and open files. + +=head1 MIB INFORMATION + +This plugin requires support for the NETWORK-APPLIANCE-MIB issued by +Network Appliance. It reports the content of the cifs OID. + +=head1 MAGIC MARKERS + + #%# family=snmpauto + #%# capabilities=snmpconf + +=head1 BUGS + +This plugin wasn't tested on many hardware and only on Ontap 7.3.x. + +=head1 AUTHOR + +2013, Claudius Herder +NetApp is a registered trademark and Network Appliance is a trademark +of Network Appliance, Inc. in the U.S. and other countries. + +=head1 LICENSE + +GPLv2. + +=cut + +use strict; +use warnings; +use Munin::Plugin::SNMP; + +my %config = +( + misc64CifsOps => 'CifsOps', + misc64NfsOps => 'NfsOps', + iscsi64Ops => 'IscsiOps', + fcp64Ops => 'FcpOps', + misc64HttpOps => 'HttpOps', +); + +if (defined $ARGV[0] and $ARGV[0] eq 'snmpconf') +{ + print "require 1.3.6.1.4.1.789.1.2.2.1.0 [0-9]\n"; + exit 0; +} + +my $session = Munin::Plugin::SNMP->session(); + +if (defined $ARGV[0] and $ARGV[0] eq "config") +{ + my ($host, undef, undef, undef) = Munin::Plugin::SNMP->config_session(); + print "host_name $host\n" unless $host eq 'localhost'; + print "graph_title $host OPS \n"; + print "graph_args --base 1000 --lower-limit 0 --rigid\n"; + print "graph_vlabel OPS \n"; + print "graph_category OPS\n"; + print "graph_info This graph shows OPS for the $host NetApp equipment.\n"; + print "graph_order misc64CifsOps misc64NfsOps iscsi64Ops fcp64Ops misc64HttpOps\n"; + foreach my $k (sort keys %config) + { + print "$k.info The number of OPS for $config{$k}.\n"; + print "$k.type COUNTER\n"; + print "$k.label $config{$k}\n"; + print "$k.min 0\n"; + print "$k.draw AREASTACK\n"; + } + exit 0; +} + +my $system = $session->get_hash +( + -baseoid => '1.3.6.1.4.1.789.1.2.2', + -cols => + { + 27 => 'misc64NfsOps', + 28 => 'misc64CifsOps', + 29 => 'misc64HttpOps', + }, +); + +my $block = $session->get_hash +( + -baseoid => '1.3.6.1.4.1.789.1.17', + -cols => + { + 24 => 'iscsi64Ops', + 25 => 'fcp64Ops', + }, +); + +my $tmp->{0} = { %{$system->{0}}, %{$block->{0}}} ; + +foreach my $k (keys %config) +{ + my $v = 'U'; + $v = $tmp->{0}->{$k} if (defined $tmp); + print "$k.value $v\n"; +} + +exit 0; + +__END__ diff --git a/plugins/snmp/snmp__netapp_reallocate b/plugins/snmp/snmp__netapp_reallocate new file mode 100755 index 00000000..d9f0b4c4 --- /dev/null +++ b/plugins/snmp/snmp__netapp_reallocate @@ -0,0 +1,239 @@ +#!/usr/bin/perl -w +# -*- perl -*- +# vim: ft=perl + +=head1 NAME + + +=head1 APPLICABLE SYSTEMS + + +=head1 CONFIGURATION + +You have to setup ssh with public key authentication for this plugin +SNMP is only used for getting the hostname + + [snmp_$host_netapp_diskbusy] + env.ssh /usr/bin/ssh (default) + env.sshuser munin (default) + env.sshopts -i /home/munin/.ssh/id_rsa -o UserKnownHostsFile=/home/munin/.ssh/known_hosts (no default) + env.spares 2 (no default) + +Number of spares is only used for total diskusage. + +=head1 INTERPRETATION + +This plugin only prints the disk busy status at check time. There is no +average calculated, but it still gives a goood overview if all disk are +used equally or you have got a single hot disk. + +=head1 AUTHOR + +2013, Claudius Herder + +=head1 LICENSE + +GPLv2. + +=cut + +use strict; +use Munin::Plugin; +use Munin::Plugin::SNMP; +need_multigraph(); + +my %vols; + +sub do_collect +{ + my $input; + my @tmp; + my $ssh = $ENV{'ssh'} || '/usr/bin/ssh'; + my $sshuser = $ENV{'sshuser'} || $ENV{'USER'}; + my $sshopts = $ENV{'sshopts'} || ""; + my ($host, undef, undef, undef) = Munin::Plugin::SNMP->config_session(); + + $input=`$ssh $sshopts $sshuser\@$host reallocate status`; + + my $hit=0; + my $key=""; + my $value=0; + + foreach my $line (split(/\n/, $input)) + { + if (($line =~ m/^\/vol/ || ($line =~ m/^aggr/ ) && !$hit)) + { + ($key= "$line") =~ s/(\/vol\/|^)(.*?)\:\ /$2/; + $hit=1; + } + if ($line =~ m/State/ && $hit ) + { + @tmp = split(/:/, $line); + if ( $tmp[1] =~ "Idle") + { + $value = 0; #reallocate idle intialising + } + elsif ( $tmp[1] =~ "Reallocating" ) + { + $value = 1; #reallocate active + } + elsif ( $tmp[1] =~ "Redirect" ) + { + $value = 2; #redirect active + } + elsif ( $tmp[1] =~ "Quiesce" ) + { + $value = 3; #quiesce reallocate paused + } + else + { + $value = 5; + } + $hit=0; + $vols{$key} = $value; + } + } +} + +sub do_config_vol +{ + my ($host,$vol) = @_; + if ( ! $vol ) + { + print "multigraph reallocate_status\n"; + print "graph_title $host Reallocation status\n"; + print "graph_info This graph shows the reallocation status for $host\n"; + } + else + { + print "multigraph reallocate_status.$vol\n"; + print "graph_title reallocate_status status for vol $vol\n"; + print "graph_info This graph shows reallocate_status status for $vol\n"; + } + print "graph_args --base 1000 --lower-limit 0 --rigid\n"; + print "graph_vlabel reallocate_status status\n"; + print "graph_category reallocate\n"; + foreach my $state ("reallocating", "redirecting", "quiesce", "debug") + { + print "$state.label $state\n"; + print "$state.min 0\n"; + print "$state.draw AREASTACK\n"; + print "$state.type GAUGE\n"; + if ( $vol ) + { + print "$state.info This is the $state status of $vol.\n"; + } + } + +} + + +sub do_fetch_root +{ + my $status = 0; + my $reallocating = 0; + my $redirecting = 0; + my $quiesce = 0; + my $debug = 0; + + foreach my $vol (keys %vols) + { + $status=$vols{$vol}; + if ($status == 0) + { + #reallocate idle + } + elsif ($status == 1) + { + $reallocating++; + } + elsif ($status == 2) + { + $redirecting++; + } + elsif ($status == 3) + { + $quiesce++; + } + else + { + $debug++; + } + } + print "multigraph reallocate_status\n"; + print "reallocating.value $reallocating\n"; + print "redirecting.value $redirecting\n"; + print "quiesce.value $quiesce\n"; + print "debug.value $debug\n"; +} + +sub do_fetch_vol +{ + my($vol) = @_; + my $status = 0; + my $reallocating = 0; + my $redirecting = 0; + my $quiesce = 0; + my $debug = 0; + + $status = $vols{$vol}; + if ($status == 0) + { + #reallocate idle + } + elsif ($status == 1) + { + $reallocating = 1; + } + elsif ($status == 2) + { + $redirecting = 1; + } + elsif ($status == 3) + { + $quiesce = 1; + } + else + { + $debug = 1; + } + print "multigraph reallocate_status.$vol\n"; + print "reallocating.value $reallocating\n"; + print "redirecting.value $redirecting\n"; + print "quiesce.value $quiesce\n"; + print "debug.value $debug\n"; +} + +sub do_config +{ + my ($host, undef, undef, undef) = Munin::Plugin::SNMP->config_session(); + print "host_name $host\n" unless $host eq 'localhost'; + foreach my $vol (sort keys %vols) + { + do_config_vol($host,$vol); + } + do_config_vol($host); +} + +sub do_fetch +{ + foreach my $vol (sort keys %vols) + { + do_fetch_vol($vol); + } + do_fetch_root(); +} + +do_collect(); + +if ($ARGV[0] and $ARGV[0] eq "config") +{ + do_config(); + exit 0; +} + +do_fetch(); + +exit 0; + +__END__ diff --git a/plugins/snmp/snmp__netapp_sis b/plugins/snmp/snmp__netapp_sis new file mode 100755 index 00000000..e59c70fe --- /dev/null +++ b/plugins/snmp/snmp__netapp_sis @@ -0,0 +1,239 @@ +#!/usr/bin/perl -w +# -*- perl -*- +# vim: ft=perl + +=head1 NAME + +snmp__netapp_sis - Munin plugin to retrieve sis operation status from NetApp storage appliances. + +=head1 APPLICABLE SYSTEMS + +sis should be reported by any NetApp storage appliance +with SNMP agent daemon activated. See na_snmp(8) for details. + +=head1 CONFIGURATION + +Unfortunately, SNMPv3 is not fully supported on all NetApp equipments. +For this reason, this plugin will use SNMPv2 by default, which is +insecure because it doesn't encrypt the community string. + +The following parameters will help you get this plugin working : + +[snmp_*] +env.community MyCommunity + +If your community name is 'public', you should really worry about +security and immediately reconfigure your appliance. + +Please see 'perldoc Munin::Plugin::SNMP' for further configuration. + +=head1 INTERPRETATION + +The plugin reports sis status (initialising, running, pending) per filer and per volume. +This could be helpful for sis schedule optimization. + +=head1 MIB INFORMATION + +This plugin requires support for the NETWORK-APPLIANCE-MIB issued by +Network Appliance. It reports the content of the sis OID. + +=head1 MAGIC MARKERS + + #%# family=snmpauto + #%# capabilities=snmpconf + +=head1 BUGS + +This plugin wasn't tested on many hardware and only on Ontap 7.3.x. + +=head1 AUTHOR + +2013, Claudius Herder +NetApp is a registered trademark and Network Appliance is a trademark +of Network Appliance, Inc. in the U.S. and other countries. + +=head1 LICENSE + +GPLv2. + +=cut + +use strict; +use warnings; +use Munin::Plugin; +use Munin::Plugin::SNMP; +need_multigraph(); + +if (defined $ARGV[0] and $ARGV[0] eq "snmpconf") +{ + print "require 1.3.6.1.4.1.789.1.23.2.1.1. [0-9]\n"; + exit 0; +} + +my $volOIDBase = "1.3.6.1.4.1.789.1.23.2.1"; + +# Needed as globals +my $snmpinfo; + +sub do_collect +{ + # Collect information from SNMP agent + my $session = Munin::Plugin::SNMP->session(); + + $snmpinfo = $session->get_hash + ( + -baseoid => $volOIDBase, + -cols => + { + 2 => 'sisPath', + 4 => 'sisStatus', + } + ); +} + +sub do_config_vol +{ + my ($host,$vol) = @_; + + if ( ! $vol ) + { + print "multigraph sis_status\n"; + print "graph_title $host SIS status\n"; + print "graph_info This graph shows the sis status for $host\n"; + } + else + { + $snmpinfo->{$vol}->{sisPath} =~ s/(\/vol\/)(.*?)/$2/; + print "multigraph sis_status.$snmpinfo->{$vol}->{sisPath}\n"; + print "graph_title sis status for volume $snmpinfo->{$vol}->{sisPath}\n"; + print "graph_info This graph shows the sis status for the $snmpinfo->{$vol}->{sisPath} volume\n"; + } + print "graph_args --base 1000 --lower-limit 0 --rigid\n"; + print "graph_vlabel sis status\n"; + print "graph_category sis\n"; + print "graph_order sisInitialising sisRunning sisPending sisDebug\n"; + foreach my $state ("debug", "initialising", "running", "pending") + { + if ($vol) + { + print "$state.info This is the $state status of $snmpinfo->{$vol}->{sisPath}.\n"; + } + print "$state.label $state\n"; + print "$state.min 0\n"; + print "$state.draw AREASTACK\n"; + print "$state.type GAUGE\n"; + } +} + +sub do_fetch_root +{ + # Construct root graphs for the sis_status spaces + my $sisSumIni = 0; + my $sisSumRun = 0; + my $sisSumPen = 0; + my $sisDebug = 0; + + foreach my $vol (keys %{$snmpinfo}) + { + my $status; + $status = $snmpinfo->{$vol}->{sisStatus}; + + if ($status == 1) + { + # sis idle + } + elsif ($status == 2 ) + { + $sisSumIni++; #sis intialising + } + elsif ( $status == 3) + { + $sisSumRun++; #sis runnung + } + elsif ( $status == 5) + { + $sisSumPen++; #sis pending + } + else + { + $sisDebug++; + } + } + print "multigraph sis_status\n"; + print "initialising.value $sisSumIni\n"; + print "running.value $sisSumRun\n"; + print "pending.value $sisSumPen\n"; + print "debug.value $sisDebug\n"; +} + +sub do_fetch_vol +{ + my($vol) = @_; + my $status = $snmpinfo->{$vol}->{sisStatus}; + my $sisIni = 0; + my $sisRun = 0; + my $sisPen = 0; + my $sisDebug = 0; + + if ($status == 1) + { + # sis idle + } + elsif ($status == 2) + { + $sisIni = 1; + } + elsif ($status == 3) + { + $sisRun = 1; + } + elsif ($status == 5) + { + $sisPen = 1; + } + else + { + $sisDebug = $status; + } + $snmpinfo->{$vol}->{sisPath} =~ s/(\/vol\/)(.*?)/$2/; + print "multigraph sis_status.$snmpinfo->{$vol}->{sisPath}\n"; + print "initialising.value $sisIni\n"; + print "running.value $sisRun\n"; + print "pending.value $sisPen\n"; + print "debug.value $sisDebug\n"; +} + +sub do_config +{ + my ($host, undef, undef, undef) = Munin::Plugin::SNMP->config_session(); + + print "host_name $host\n" unless $host eq 'localhost'; + foreach my $vol (sort {$a <=> $b} keys %{$snmpinfo}) + { + do_config_vol($host,$vol); + } + do_config_vol($host); +} + +sub do_fetch +{ + foreach my $vol (sort {$a <=> $b} keys %{$snmpinfo}) + { + do_fetch_vol($vol); + } + do_fetch_root(); +} + +do_collect; + +if ($ARGV[0] and $ARGV[0] eq "config") +{ + do_config(); + exit 0; +} + +do_fetch(); + +exit 0; + +__END__