#!/usr/bin/perl -w # # Script realized by Jean-Christian BEDIER # use strict; use Getopt::Std; use Net::SNMP; my %options=(); my %value=(); my $swap_dir = "/var/lib/centreon/centplugins/"; #my $swap_dir = "/tmp/"; my %oids = ( "vpn" => ".1.3.6.1.4.1.3224.4.1.1.1.4.", ); # Nagios specific use lib "/usr/lib/nagios3"; use utils qw(%ERRORS); sub vpn { my $session = shift; my $state; my $count = "0"; my $oid = $oids{"vpn"}.$count; while (my $result = $session->get_request(-varbindlist => [ $oid ],)) { if ($result->{$oid} eq 'noSuchInstance') { #FIX STATE ET MSG OUTPUT $state = "UNKNOWN"; my $output = sprintf("Unknown VPN ; %s\n", $options{n}); print $output; exit($ERRORS{$state}); } if ($result->{$oid} eq $options{n}) { my $vol = $result->{$oid}; my @row = split(/\./, $oid); $row[12] = "35"; my $in = join(".", @row); my $temp = $session->get_request(-varbindlist => [ $in ],); $in = $temp->{$in}; $row[12] = "36"; my $out = join(".", @row); $temp = $session->get_request(-varbindlist => [ $out],); $out = $temp->{$out}; my $file_in = sprintf("%s/juniper_vpn_in_%s_%s_%s", $swap_dir, $options{n}, $options{H}, $options{P}); my $file_out = sprintf("%s/juniper_vpn_out_%s_%s_%s", $swap_dir, $options{n}, $options{H}, $options{P}); my $delta_in = grab_io_read($file_in, $in); my $delta_out = grab_io_read($file_out, $out); my $output = sprintf("%s traffic IN:%s OUT:%s; OK | traffic_in=%d traffic_out=%d\n", $options{n}, convert_byte(int(($delta_in*8)/$value{'epoch'})), convert_byte(int(($delta_out*8)/$value{'epoch'})), ($delta_in*8)/$value{'epoch'}, ($delta_out*8)/$value{'epoch'}); print $output; $state = "OK"; exit($ERRORS{$state}) } $count++; $oid = $oids{"vpn"}.$count; } $state = "UNKNOWN"; my $output = sprintf("Unknown VPN ; %s\n", $state); print $output; exit($ERRORS{$state}); } sub vpn_list { print "Available VPN are:\n"; my $session = shift; my $count = "0"; my $oid = $oids{"vpn"}.$count; while (my $result = $session->get_request(-varbindlist => [ $oid ],)) { if ($result->{$oid} eq 'noSuchInstance') { return; } print $result->{$oid}."\n"; $count++; $oid = $oids{"vpn"}.$count; } } sub grab_io_read { my $fileto = shift; my $disk = shift; my $past; if (!(-e $fileto)) { open(DATA, ">".$fileto) or die $! ; close DATA or die $!; } open(DATA, "<".$fileto) or die $!; my @lines = ; close DATA; my $delta; my $newval = $disk; if (defined($lines[0])) { my @temp = split(' ',$lines[0]); if (!exists($temp[1])) { $value{'epoch'} = 1; } else { $value{'epoch'} = time() - $temp[1]; } if ($value{'epoch'} eq 0) { $value{'epoch'} = 1; } $past = $temp[0]; if ($past > $newval) { $delta = 4294967296 - $past + $newval; } else { $delta = $newval - $past; } } else { $delta = 0; $value{'epoch'} = 1; } open(DATA2, ">".$fileto) or die $!; print DATA2 $newval." ".time(); close DATA2 or die $!; return $delta; } sub convert_byte { my $octet = shift; my $kilooctet = 0; my $megaoctet = 0; my $gigaoctet = 0; my $teraoctet = 0; for (; $octet > 1024; $octet = $octet - 1024 ) { $kilooctet++; } for (; $kilooctet > 1024; $kilooctet = $kilooctet - 1024) { $megaoctet++; } for (; $megaoctet > 1024; $megaoctet = $megaoctet - 1024) { $gigaoctet++; } for (; $gigaoctet > 1024; $gigaoctet = $gigaoctet - 1024) { $teraoctet++; } if ($teraoctet > 0) { return $teraoctet."Tb"; } elsif ($gigaoctet > 0) { return $gigaoctet."Gb"; } elsif ($megaoctet > 0) { return $megaoctet."Mb"; } elsif ($kilooctet > 0) { return $kilooctet."kb"; } else { return $octet."b"; } } sub usage { print "Check script for Juniper\n"; print "Available Commands:\n"; print "$0 -C -H -P -t traffic -n \n"; print " \t Community\n"; print " \t\t Juniper IP\n"; print " \t\t Juniper SNMP port\n"; print " \t VPN name\n"; print "Use [-t traffic] without -n to have a list of available VPNs\n"; } sub main { getopts("P:C:H:t:n:",\%options); if ($options{H} && $options{C} && $options{P}) { my ($session, $error) = Net::SNMP->session( -hostname => $options{H}, -community => $options{C}, -port => $options{P}, -timeout => 5, -retries => 3, -version => 2, ); if (!defined $session) { printf "ERROR: %s.\n", $error; exit 1; } if ($options{t} eq 'traffic' && !$options{n}) { vpn_list($session); } elsif ($options{t} eq 'traffic' && $options{n}) { vpn($session); } else { usage(); } } else { usage(); } } main();