diff --git a/cacti/flexlmMonitor/flexlm-feature-monitor.py b/cacti/flexlmMonitor/flexlm-feature-monitor.py new file mode 100755 index 0000000..cd38612 --- /dev/null +++ b/cacti/flexlmMonitor/flexlm-feature-monitor.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python + +# Info +# parses lmstat utility to get license usage of a specific feature + +# Modules +import subprocess +import re +import sys +import os.path + +# Settings +lmutil = os.path.dirname(sys.argv[0]) + +# Validate settings +if len(sys.argv) != 4 : + print "Syntax error" + print sys.argv[0] + ' [port] [server name] [feature]' + quit(3) +if os.path.isfile(lmutil) == False : + print 'The lmutil binary ' + lmutil + ' does not exists' + quit(3) + +# Vars +port = sys.argv[1] +server = sys.argv[2] +feature = sys.argv[3] +errorString = re.escape('Users of ' + feature + ': (Error:') + +# Initiate lmstat +lmstat = subprocess.Popen([lmutil, 'lmstat' , '-c', port+'@'+server, '-f', feature], shell=False, stdout=subprocess.PIPE, stderr=None, stdin=None) +out = lmstat.communicate()[0].splitlines( ) +exitCode = lmstat.returncode +line2Parse = None + +# If an erroe occured -> out +if exitCode != 0 : + for line in out : print line + quit(1) + +# search for the data in stdout +for i in range(len(out)): + if re.search(re.escape(feature), out[i]) : + line2Parse = out[i] + break + +# Make sure stdout is valid +if line2Parse == None : + print 'Can not find feature \"' + feature + '\" in host ' + port+'@'+server + quit(1) +elif re.search(errorString, line2Parse) : + print 'Error in license server:' + print line2Parse + quit(1) + +# Host is up & Data is valid +# parse usage +usage = re.findall(r' \d\d* ', line2Parse) +total = usage[len(usage)-2].strip() +used = usage[len(usage)-1].strip() + +# Output usage +sys.stdout.write('total:'+total + ' ' + 'used:' + used) +quit(0); diff --git a/cacti/flexlmMonitor/lmutil b/cacti/flexlmMonitor/lmutil new file mode 100755 index 0000000..95d69ae Binary files /dev/null and b/cacti/flexlmMonitor/lmutil differ diff --git a/cacti/oge-jobs.py b/cacti/oge-jobs.py new file mode 100755 index 0000000..ae26a7f --- /dev/null +++ b/cacti/oge-jobs.py @@ -0,0 +1,70 @@ +#!/bin/env python + +# Info +# Check via the qhost command the number a running jobs on a specific execution host +# +# Settings +# 1. set the gridSettings variable +# 2. queues can be excluded by settings the excludeQueues list +# 3. the cacti server needs to be configured as the submit host (qconf -as CACTISERVER) + +# Modules +import subprocess +import re +import string +import sys + +# Exclude function +def isInList(string, dst) : + res = False + for i in range(len(dst)): + if string == dst[i]: + res = True + break + return res + + +# Settings +gridSettings = '/path/to/common/settings.sh' +excludeQueues = [] + +# Validate command arguments +if len(sys.argv) != 2: + print "Syntax error" + print sys.argv[0] + ' [execHost]' + quit(1) + +# Vars +execHost = sys.argv[1] +execHostEscaped = '' +foundExecHost = False +jobsCounter = 0 + +# Initiate qhost -q +qhost = subprocess.Popen('source ' + gridSettings + '; ' + 'qhost -q', shell=True, stdout=subprocess.PIPE, stderr=None, stdin=None) +out = qhost.communicate()[0].splitlines( ) +exitCode = qhost.returncode + +# If an error occured -> quit +if exitCode != 0 : + for line in out : print line + quit(1) + +# Parse out +execHostEscaped = re.escape(execHost) + ' ' +for i in range(len(out)): + if foundExecHost and re.search('^ ' ,out[i]) : + if not isInList(out[i].split()[0], excludeQueues): + jobsCounter += int(string.split(out[i].split()[2],'/')[0]) + elif foundExecHost and re.search('^\w' ,out[i]) : + break + else : + if re.search(execHostEscaped, out[i]) : + foundExecHost = True + +# Print Result +if foundExecHost : + sys.stdout.write('jobs:'+str(jobsCounter)) +else : + sys.stdout.write('-1') + quit(1) diff --git a/cacti/oge-queue.py b/cacti/oge-queue.py new file mode 100755 index 0000000..29524a6 --- /dev/null +++ b/cacti/oge-queue.py @@ -0,0 +1,53 @@ +#!/bin/env python + +# Info: +# Get queue usage via qstat -g c command +# Note: it will exclude host in error/disable hosts +# +# Settings: +# add the cacti server as submit host +# set the gridSettings variable + +# Modules +import subprocess +import sys + +# Settings +gridSettings = '/path/to/common/settings.sh' + +if len(sys.argv) != 2: + print "Syntax error" + print sys.argv[0] + ' [full queue name]' + quit(1) + +# Vars +queue = sys.argv[1] +jobsCounter = 0 +foundQueue = False +running = 0 +total = 0 + +# Initiate qstat -g c +qstat = subprocess.Popen('source ' + gridSettings + '; ' + 'qstat -g c', shell=True, stdout=subprocess.PIPE, stderr=None, stdin=None) +out = qstat.communicate()[0].splitlines( ) +exitCode = qstat.returncode + +# If an error occured -> out +if exitCode != 0 : + for line in out : print line + quit(1) + +# Parse out +for i in range(len(out)): + queueInfo = out[i].split() + if queueInfo[0] == queue: + foundQueue = True + total = int(queueInfo[2]) + int(queueInfo[4]) + running = int(queueInfo[2]) + +# Print Result +if foundQueue : + sys.stdout.write('total:'+str(total) + ' ' + 'running:'+str(running)) +else : + sys.stdout.write('-1') + quit(1) diff --git a/nagios/check-cisco-po.pl b/nagios/check-cisco-po.pl new file mode 100755 index 0000000..bb038a9 --- /dev/null +++ b/nagios/check-cisco-po.pl @@ -0,0 +1,141 @@ +#!/usr/bin/env perl + +# Modules +use strict; +use Net::SNMP; +use Getopt::Long; +Getopt::Long::Configure('bundling'); + +# Interfaces +my $S_int_entry = ".1.3.6.1.2.1.2.2.1"; +my $S_int_desc = "$S_int_entry.2"; +my $S_int_operstatus = "$S_int_entry.8"; +my $S_int_speed = '.1.3.6.1.2.1.31.1.1.1.15'; + +# Status of operstatus +my %int_status_index = ( + 1 => 'up', + 2 => 'down', + 3 => 'testing', + 4 => 'unknown', + 5 => 'notPresent', + 6 => 'lowerLayerDown', +); + +# Nagios Exit codes +my $OK = 0; +my $WARNING = 1; +my $CRITICAL = 2; +my $UNKNOWN = 3; + +# Output & exit code +my $stat = $OK; +my $msg; +my $perf; + +### Functions +############### +sub _create_session +{ + my ($server, $comm) = @_; + my $version = 1; + my ($sess, $err) = Net::SNMP->session( -hostname => $server, -version => $version, -community => $comm); + if (!defined($sess)) { + print "Can't create SNMP session to $server\n"; + exit(1); + } + return $sess; +} + +sub _get_oid_value(@) +{ + my $sess = shift; + my $local_oid = shift; + my $r_return = $sess->get_request(-varbindlist => [$local_oid]); + return($r_return->{$local_oid}); +} + +sub _syntax_err(@) +{ + my $msg = shift; + print <get_table($S_int_desc); +my $is_int_exists = 0; +foreach my $oid ( keys %$R_tbl) { + if($$R_tbl{$oid} =~ "[Pp]ort-channel$opt{'interface'}\$") + { + $snmpId = "$oid"; + $snmpId =~ s/$S_int_desc\.//; + } +} + +# Exit if non-were found +_syntax_err("Can't find Port-channel$opt{'interface'}") if($snmpId eq ""); + +# Check operstatus +my $operationStatus = _get_oid_value($snmp_session,"$S_int_operstatus.$snmpId"); + +# Quit if po is down totally +if($operationStatus ne 1) +{ + $stat = $CRITICAL; + $msg = "CRIT: Port-channel$opt{'interface'} is $int_status_index{$operationStatus}"; + $perf = "upInts=0"; +} + +# Check speed of the po and cross reference with $opt{'numIfInts'}*$opt{'speed'}; +if($stat == $OK) +{ + my $speed = _get_oid_value($snmp_session,"$S_int_speed.$snmpId"); + my $expectedSpeed = $opt{'numIfInts'} * $opt{'speed'}; + if($speed == $expectedSpeed) # Everthing is ok + { + $stat = $OK; + $msg = "OK: Port-channel$opt{'interface'} is $int_status_index{$operationStatus}"; + $perf = "upInts=$opt{'numIfInts'}"; + } + else # at least one or more interfaces are down, calculate how many + { + my $upInts = $opt{'numIfInts'} - int($speed / $opt{'speed'}); + $stat = $WARNING; + $msg = "WARNING: $upInts/$opt{'numIfInts'} in Port-channel$opt{'interface'} are down"; + $perf = "upInts=$upInts"; + } +} + +# Exit +print "$msg | $perf\n"; +exit($stat); + diff --git a/nagios/check-cisco.example b/nagios/check-cisco.example new file mode 100644 index 0000000..c567565 --- /dev/null +++ b/nagios/check-cisco.example @@ -0,0 +1,31 @@ +Commands.cfg +----------------- +define command { + command_name cisco-module + command_line $USER1$/check-cisco.pl -H $HOSTADDRESS$ -C $ARG1$ -t module -w $ARG2$ -c $ARG3$ + } +define command { + command_name cisco-temp + command_line $USER1$/check-cisco.pl -H $HOSTADDRESS$ -C $ARG1$ -t temp -w $ARG2$ -c $ARG3$ + } +define command { + command_name cisco-fan + command_line $USER1$/check-cisco.pl -H $HOSTADDRESS$ -C $ARG1$ -t fan + } +define command { + command_name cisco-ps + command_line $USER1$/check-cisco.pl -H $HOSTADDRESS$ -C $ARG1$ -t ps + } + +define command { + command_name cisco-int + command_line $USER1$/check-cisco.pl -H $HOSTADDRESS$ -C $ARG1$ -t int -w $ARG2$ -c $ARG3$ -o $ARG4$ + } +define command { + command_name cisco-cpu + command_line $USER1$/check-cisco.pl -H $HOSTADDRESS$ -C $ARG1$ -t cpu -w $ARG2$ -c $ARG3$ + } +define command { + command_name cisco-mem + command_line $USER1$/check-cisco.pl -H $HOSTADDRESS$ -C $ARG1$ -t mem -w $ARG2$ -c $ARG3$ + } diff --git a/nagios/check-cisco.pl b/nagios/check-cisco.pl new file mode 100755 index 0000000..d6ed570 --- /dev/null +++ b/nagios/check-cisco.pl @@ -0,0 +1,507 @@ +#!/usr/bin/env perl + +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +use strict; +use Net::SNMP; +my $stat; +my $msg; +my $perf; +my $days = 14; +my $script_name = "check-cisco.pl"; + +### SNMP OIDs +############### +# Temperature +my $S_temp = ".1.3.6.1.4.1.9.9.13.1.3.1.3"; +# Memory +my $S_mem_used = ".1.3.6.1.4.1.9.9.48.1.1.1.5.1"; # Byte +my $S_mem_free = ".1.3.6.1.4.1.9.9.48.1.1.1.6.1"; # Byte +# CPU Load +my $S_load_5s = ".1.3.6.1.4.1.9.2.1.56.0"; +my $S_load_1m = ".1.3.6.1.4.1.9.2.1.57.0"; +my $S_load_5m = ".1.3.6.1.4.1.9.2.1.58.0"; +# Power Supply +my $S_ps = ".1.3.6.1.4.1.9.9.13.1.5.1"; +my $S_ps_name = "$S_ps.2"; +my $S_ps_stat = "$S_ps.3"; +# Fan +my $S_fan = ".1.3.6.1.4.1.9.9.13.1.4.1"; +my $S_fan_name = "$S_fan.2"; +my $S_fan_stat = "$S_fan.3"; +# Module +my $S_module_status = ".1.3.6.1.4.1.9.9.117.1.2.1.1.2"; +# Interfaces +my $S_int_entry = ".1.3.6.1.2.1.2.2.1"; +my $S_int_desc = "$S_int_entry.2"; +my $S_int_adminstatus = "$S_int_entry.7"; +my $S_int_operstatus = "$S_int_entry.8"; +my $S_int_lastchange = "$S_int_entry.9"; +my $S_int_InOctets = "$S_int_entry.10"; +my $S_int_OutOctets = "$S_int_entry.16"; +my $S_int_number = ".1.3.6.1.2.1.2.1.0"; + +# SNMP Status Codes +my %phy_dev_status = ( + 1 => 'normal', + 2 => 'warning', + 3 => 'critical', + 4 => 'shutdown', + 5 => 'notPresent', + 6 => 'notFunctioning', +); +my %module_status_code = ( + 1 => 'unknown', + 2 => 'ok', + 3 => 'disabled', + 4 => 'okButDiagFailed', + 5 => 'boot', + 6 => 'selfTest', + 7 => 'failed', + 8 => 'missing', + 9 => 'mismatchWithParent', + 10 => 'mismatchConfig', + 11 => 'diagFailed', + 12 => 'dormant', + 13 => 'outOfServiceAdmin', + 14 => 'outOfServiceEnvTemp', + 15 => 'poweredDown', + 16 => 'poweredUp', + 17 => 'powerDenied', + 18 => 'powerCycled', + 19 => 'okButPowerOverWarning', + 20 => 'okButPowerOverCritical', + 21 => 'syncInProgress', +); +my %int_status_index = ( + 1 => 'up', + 2 => 'down', + 3 => 'testing', + 4 => 'unknown', + 5 => 'notPresent', + 6 => 'lowerLayerDown', +); + +### Functions +############### +sub _create_session { + my ($server, $comm) = @_; + my $version = 1; + my ($sess, $err) = Net::SNMP->session( -hostname => $server, -version => $version, -community => $comm); + if (!defined($sess)) { + print "Can't create SNMP session to $server\n"; + exit(1); + } + return $sess; +} + +sub FSyntaxError { + print "Syntax Error !\n"; +# print "$0 -H [ip|dnsname] -C [snmp community] -t [temp|fan|ps|cpu|mem|module|freeint] -w [warning value] -c [critical value] -d [days]\n"; + print "$script_name\n"; + print "-H = Ip/Dns Name of the Switch\n"; + print "-C = SNMP Community\n"; + print "-t = Check type\n"; + print "\ttemp - Temperature\n"; + print "\tfan - Fan Fail\n"; + print "\tps - Power Supply Fail\n"; + print "\tcpu - CPU Load\n"; + print "\tmem - Memory\n"; + print "\tmodule - Module Health\n"; + print "\tfreeint - Free eth interfaces for X days (-d)\n"; + print "\tint - Interface Operation Stat (use with -i or -o)\n"; + print "-w = Warning Value\n"; + print "-c = Critical Value\n"; + print "-d = number of days that th ethernet interface hasn't change state, default is 14 (only for -t freeint)\n"; + print "-i = Interface Name (only for -t int)\n"; + print "-o = Interface OID (only for -t int)\n"; + exit(3); +} + +if($#ARGV < 5 or $#ARGV > 11) { + FSyntaxError; +} + +### Gather input from user +############################# +my $switch; +my $community; +my $check_type; +my $warn = 0; +my $crit = 0; +my $int; +my $oidint; + +while(@ARGV) { + my $temp = shift(@ARGV); + if("$temp" eq '-H') { + $switch = shift(@ARGV); + } elsif("$temp" eq '-C') { + $community = shift(@ARGV); + } elsif("$temp" eq '-t') { + $check_type = shift(@ARGV); + } elsif("$temp" eq '-w') { + $warn = shift(@ARGV); + } elsif("$temp" eq '-c') { + $crit = shift(@ARGV); + } elsif("$temp" eq '-i') { + $int = shift(@ARGV); + } elsif("$temp" eq '-o') { + $oidint = shift(@ARGV); + } elsif("$temp" eq '-d') { + $days = shift(@ARGV); + if("$days" eq "") { + $days = 14; + } + } else { + FSyntaxError(); + } +} + +# Validate Warning +if("$check_type" ne "temp") { + if($warn > $crit and "$check_type" ne "freeint" and "$check_type" ne "mem") { + print "Warning can't be larger then Critical: $warn > $crit\n"; + FSyntaxError(); + } elsif($warn < $crit and "$check_type" eq "freeint") { + print "Warning can't be smaller then Critical: $warn < $crit in intfree check\n"; + FSyntaxError(); + } elsif($warn < $crit and "$check_type" eq "mem") { + print "Warning can't be smaller then Critical: $warn < $crit in intfree check\n"; + FSyntaxError(); + } +} + +# Establish SNMP Session +our $snmp_session = _create_session($switch,$community); + +### Temperature ### +if($check_type =~ /^temp/) { + my $temp; + my $R_tbl = $snmp_session->get_table($S_temp); + foreach my $oid ( keys %$R_tbl) { + $temp = "$$R_tbl{$oid}"; + last; + } + + if("$temp" eq "") { + print "The switch $switch can't report temperature via SNMP\n"; + FSyntaxError(); + } + + if($temp > 1) { + if($warn > $crit and "$check_type") { + print "Warning can't be larger then Critical: $warn > $crit\n"; + FSyntaxError(); + } + if($temp <= $warn) { + $stat = 0; + $msg = "Temperature: OK - Tempeture is $temp Celsius"; + } elsif($temp > $warn and $temp < $crit) { + $stat = 1; + $msg = "Temperature: Warn - Tempeture is $temp Celsius"; + } elsif($temp >= $crit) { + $stat = 2; + $msg = "Temperature: CRIT - Tempeture is $temp Celsius"; + } + $perf = "temperature=$temp;$warn;$crit"; + } else { + if($warn > 0 or $crit > 0) { + print "ERR:\nSome switches only show boolean value 0=OK 1=ERROR\nplease dont use -w and -c arguments\n\n"; + FSyntaxError(); + } + if($temp == 1) { + $stat = 0; + $msg = "Temperature: OK"; + } else { + $stat = 2; + $msg = "Temperature: CRIT"; + } + $perf = "temperature=$temp"; + } + +### Memory ### + +} elsif($check_type eq "mem") { + my $R_mem_used = $snmp_session->get_request(-varbindlist => [$S_mem_used]); + my $mem_used = "$R_mem_used->{$S_mem_used}"; + my $R_mem_free = $snmp_session->get_request(-varbindlist => [$S_mem_free]); + my $mem_free = "$R_mem_free->{$S_mem_free}"; + my $mem_total = $mem_free + $mem_used; + + $mem_used = int($mem_used / 1024 / 1024); + $mem_free = int($mem_free / 1024 / 1024); + $mem_total = int($mem_total / 1024 / 1024); + + my $mem_free_perc = int($mem_free / $mem_total * 100); + + if($mem_free_perc > $warn) { + $stat = 0; + $msg = "Memory: OK - Free Memory $mem_free_perc%"; + } elsif($mem_free_perc <= $warn and $mem_free_perc > $crit) { + $stat = 1; + $msg = "Memory: Warn - Free Memory $mem_free_perc %"; + } elsif($mem_free_perc <= $crit) { + $stat = 2; + $msg = "Memory: CRIT - Free Memory $mem_free_perc %"; + } + + $perf = "memory_total=$mem_total\MB memory_used=$mem_used\MB"; + +### Interface Stat ### + +} elsif($check_type eq "int") { + my $R_tbl; + if ($oidint) { + $R_tbl = $snmp_session->get_request(-varbindlist => ["$oidint"]); + $int = $$R_tbl{"$oidint"}; + } else { + $R_tbl = $snmp_session->get_table($S_int_desc); + } + my $is_int_exists = 0; + foreach my $oid ( keys %$R_tbl) { + my $name = "$$R_tbl{$oid}"; + if($name eq $int) { + $is_int_exists++; + my $id = "$oid"; + $id =~ s/$S_int_desc\.//; + my $R_stat = $snmp_session->get_request(-varbindlist => ["$S_int_operstatus.$id"]); + my $int_stat = $R_stat->{"$S_int_operstatus.$id"}; + if($int_stat != 1) { + $stat = 2; + $msg = "CRIT: $int -> $int_status_index{$int_stat}"; + $perf = "int=0"; + } else { + $stat = 0; + $msg = "OK: $int -> $int_status_index{$int_stat}"; + $perf = "int=1"; + } + last; + } + + } + + if($is_int_exists == 0) { + $stat = 3; + $msg = "UNKNOWN: $int does not exists"; + $perf = "int=0"; + } + +### CPU Load ### + +} elsif($check_type eq "cpu") { + my $R_load_5s = $snmp_session->get_request(-varbindlist => [$S_load_5s]); + my $load_5s = "$R_load_5s->{$S_load_5s}"; + my $R_load_1m = $snmp_session->get_request(-varbindlist => [$S_load_1m]); + my $load_1m = "$R_load_1m->{$S_load_1m}"; + my $R_load_5m = $snmp_session->get_request(-varbindlist => [$S_load_5m]); + my $load_5m = "$R_load_5m->{$S_load_5m}"; + + if($load_5s <= $warn) { + $stat = 0; + $msg = "Cpu: OK - Cpu Load $load_5s% $load_1m% $load_5m%"; + } elsif($load_5s > $warn and $load_5s < $crit) { + $stat = 1; + $msg = "Cpu: Warn - Cpu Load $load_5s% $load_1m% $load_5m%"; + } elsif($load_5s >= $crit) { + $stat = 2; + $msg = "Cpu: CRIT - Cpu Load $load_5s% $load_1m% $load_5m%"; + } + + $perf = "cpu_5s=$load_5s\percent;$warn;$crit cpu_1m=$load_1m\percent cpu_5m=$load_5m\percent"; + +### Fan Status ### + +} elsif($check_type eq "fan") { + my $R_tbl = $snmp_session->get_table($S_fan_name); + my $total_err = 0; + my $err_msg; + my $sum = 0; + foreach my $oid ( keys %$R_tbl) { + $sum = $sum + 1; + my $name = "$$R_tbl{$oid}"; + my $id = "$oid"; + $id =~ s/$S_fan_name\.//; + my $R_stat = $snmp_session->get_request(-varbindlist => ["$S_fan_stat.$id"]); + my $stat = $R_stat->{"$S_fan_stat.$id"}; + if($stat != 1) { + $total_err = $total_err + 1; + $err_msg = "$err_msg $name -> $phy_dev_status{$stat}"; + } + } + + if($total_err != 0) { + $err_msg = ", $err_msg have an error"; + } else { + $err_msg = "all good"; + } + + if($total_err <= $warn) { + $stat = 0; + $msg = "Fans: OK - $sum Fans are running $err_msg"; + } elsif($total_err > $warn and $total_err < $crit) { + $stat = 1; + $msg = "Fans: Warn - $sum Fans are running $err_msg"; + } elsif($total_err >= $crit) { + $stat = 2; + $msg = "Fans: Crit - $sum Fans are running $err_msg"; + } + + $perf = "total=$sum err=$total_err"; + +### Power Supplies ### + +} elsif($check_type eq "ps") { + my $R_tbl = $snmp_session->get_table($S_ps_name); + my $total_err = 0; + my $err_msg; + my $sum = 0; + foreach my $oid ( keys %$R_tbl) { + $sum = $sum + 1; + my $name = "$$R_tbl{$oid}"; + my $id = "$oid"; + $id =~ s/$S_ps_name\.//; + my $R_stat = $snmp_session->get_request(-varbindlist => ["$S_ps_stat.$id"]); + my $stat = $R_stat->{"$S_ps_stat.$id"}; + if($stat != 1) { + $total_err = $total_err + 1; + $err_msg = "$err_msg $name -> $phy_dev_status{$stat}"; + } + } + + if($total_err != 0) { + $err_msg = ", $err_msg have an error"; + } else { + $err_msg = "all good"; + } + + if($total_err <= $warn) { + $stat = 0; + $msg = "PS: OK - $sum PS are running $err_msg"; + } elsif($total_err > $warn and $total_err < $crit) { + $stat = 1; + $msg = "PS: Warn - $sum PS are running $err_msg"; + } elsif($total_err >= $crit) { + $stat = 2; + $msg = "PS: Crit - $sum PS are running $err_msg"; + } + + $perf = "total=$sum err=$total_err"; + +### Module Status ### + +} elsif($check_type eq "module") { + my $R_tbl = $snmp_session->get_table($S_module_status); + my $total_err = 0; + my $err_msg; + my $sum = 0; + foreach my $oid ( keys %$R_tbl) { + $sum = $sum + 1; + my $module_status = "$$R_tbl{$oid}"; + my $id = "$oid"; + $id =~ s/$S_module_status\.//; + if($module_status != 2) { + $total_err = $total_err + 1; + $err_msg = "$err_msg $id -> $module_status_code{$module_status}"; + } + } + + if($sum == 0) { + print "The switch $switch doesn't have any modules\n"; + FSyntaxError(); + } + + if($total_err != 0) { + $err_msg = ", $err_msg have an error"; + } else { + $err_msg = "all good"; + } + + if($total_err <= $warn) { + $stat = 0; + $msg = "Modules: OK - $sum Modules are running $err_msg"; + } elsif($total_err > $warn and $total_err < $crit) { + $stat = 1; + $msg = "Modules: Warn - $sum Modules are running $err_msg"; + } elsif($total_err >= $crit) { + $stat = 2; + $msg = "Modules: Crit - $sum Modules are running $err_msg"; + } + + $perf = "total=$sum err=$total_err"; + +### Free Interfaces ### + +} elsif($check_type eq "freeint") { + + my $R_int_number = $snmp_session->get_request(-varbindlist => [$S_int_number]); + my $int_number = $R_int_number->{$S_int_number}; + + my $R_tbl = $snmp_session->get_table($S_int_desc); + my @ints; + my $down = 0; + my $sum = 0; + + foreach my $oid ( keys %$R_tbl) { + if($$R_tbl{$oid} =~ /Ethernet/) { + $sum++; + my $id = "$oid"; + $id =~ s/$S_int_desc\.//; + + # Admin Status + my $R_int_adminstatus = $snmp_session->get_request(-varbindlist => ["$S_int_adminstatus.$id"]); + my $int_adminstatus = $R_int_adminstatus->{"$S_int_adminstatus.$id"}; + # Oper Status + my $R_int_operstatus = $snmp_session->get_request(-varbindlist => ["$S_int_operstatus.$id"]); + my $int_operstatus = $R_int_operstatus->{"$S_int_operstatus.$id"}; + # Inbout + my $R_int_InOctets = $snmp_session->get_request(-varbindlist => ["$S_int_InOctets.$id"]); + my $int_InOctets = $R_int_InOctets->{"$S_int_InOctets.$id"}; + # Outbound + my $R_int_OutOctets = $snmp_session->get_request(-varbindlist => ["$S_int_OutOctets.$id"]); + my $int_OutOctets = $R_int_OutOctets->{"$S_int_OutOctets.$id"}; + # Last Change + my $R_int_lastchange = $snmp_session->get_request(-varbindlist => ["$S_int_lastchange.$id"]); + my $int_lastchange = $R_int_lastchange->{"$S_int_lastchange.$id"}; + my @lastchanged = split(" ",$int_lastchange); + + if($int_adminstatus == 2 or $int_operstatus == 2) { + if(("$lastchanged[1]" eq "days," and $lastchanged[1] => $days) or ($int_OutOctets == 0 and $int_InOctets == 0)) { + $down++; + } + } + + } + } + + if($down >= $warn) { + $stat = 0; + $msg = "Free Interfaces: OK - $down/$sum free interfaces for $days days"; + } elsif($down < $warn and $down > $crit) { + $stat = 1; + $msg = "Free Interfaces: Warn - $down/$sum free interfaces for $days days"; + } elsif($down <= $crit) { + $stat = 2; + $msg = "Free Interfaces: CRIT - $down/$sum free interfaces for $days days"; + } + + $perf = "total_int=$int_number total_eth=$sum total_eth_free=$down"; + +### Bad Syntax ### + +} else { + FSyntaxError(); +} + + +print "$msg | $perf\n"; +exit($stat); diff --git a/nagios/check-file-exists.pl b/nagios/check-file-exists.pl new file mode 100755 index 0000000..f248ebc --- /dev/null +++ b/nagios/check-file-exists.pl @@ -0,0 +1,103 @@ +#!/usr/bin/perl + +# Modules +use strict; +use Getopt::Long; +Getopt::Long::Configure('bundling'); + +# Functions +sub _syntax_err(@) +{ + my $msg = shift; + print <= than -c") if ($opt{'warn'} >= $opt{'crit'}); + +# Variables +my $OK = 0; +my $WARNING = 1; +my $CRITICAL = 2; +my $UNKNOWN = 3; +my $status = $OK; +my $msg; +my $perf; + +# Take mtime and systems's epoc if file exists +if( -f $opt{'file'}) +{ + my $filestat = (stat($opt{'file'}))[9]; + my $epoc = time; + my $timediff = $epoc - $filestat; + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); + $year += 1900; + $mon += 1; + my $timestamp = "$mday/$mon/$year $hour:$min:$sec"; + + # Decide exit status + if ($timediff < $opt{'warn'}) + { + $msg = "OK: look's good"; + $status = $OK; + } + elsif ($timediff >= $opt{'warn'} && $timediff < $opt{'crit'}) + { + $msg = "WARN: $opt{'file'} mtime is $timestamp"; + $status = $WARNING; + } + else + { + $msg = "CRIT: $opt{'file'} mtime is $timestamp"; + $status = $CRITICAL; + } + + $perf = "mtime=$timediff"."s".";$opt{'warn'};$opt{'crit'}"; +} +# If file doesn't exists exit OK nothing to check (or UNKNOWN in case of -v) +else +{ + if($opt{'verify'}) + { + $msg = "UNKNOWN: $opt{'file'} doesn't exists"; + $perf = "mtime=0s;$opt{'warn'};$opt{'crit'}"; + $status = $UNKNOWN; + } + else + { + $msg = "OK: $opt{'file'} doesn't exists, nothing to check"; + $perf = "mtime=0s;$opt{'warn'};$opt{'crit'}"; + $status = $OK; + } +} + +# Exit +print "$msg | $perf\n"; +exit($status); diff --git a/nagios/check-juniper-vpn.pl b/nagios/check-juniper-vpn.pl new file mode 100755 index 0000000..c2e2642 --- /dev/null +++ b/nagios/check-juniper-vpn.pl @@ -0,0 +1,225 @@ +#!/usr/bin/env perl + +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +use strict; +use lib "/path/to/nagios/libexec"; +use utils qw($TIMEOUT %ERRORS); +use Net::SNMP; +use Getopt::Long; +Getopt::Long::Configure('bundling'); + +my $stat = 0; +my $msg; +my $perf; +my $script_name = "check-juniper-vpn.pl"; + +### SNMP OIDs +############### +# IVE +my $snmp_juniper_ive = '.1.3.6.1.4.1.12532'; +my $snmp_juniper_logFullPercent = "$snmp_juniper_ive.1.0"; +my $snmp_juniper_WebUsers = "$snmp_juniper_ive.2.0"; +my $snmp_juniper_MailUsers = "$snmp_juniper_ive.3.0"; +my $snmp_juniper_MeetingUsers = "$snmp_juniper_ive.9.0"; +my $snmp_juniper_iveCpuUtil = "$snmp_juniper_ive.10.0"; +my $snmp_juniper_iveMemoryUtil = "$snmp_juniper_ive.11.0"; +my $snmp_juniper_iveConcurrentUsers = "$snmp_juniper_ive.12.0"; +my $snmp_juniper_MeetingCount = "$snmp_juniper_ive.22.0"; +my $snmp_juniper_iveSwapUtil = "$snmp_juniper_ive.24.0"; +my $snmp_juniper_fanDescription = "$snmp_juniper_ive.32.0"; +my $snmp_juniper_psDescription = "$snmp_juniper_ive.33.0"; +my $snmp_juniper_raidDescription = "$snmp_juniper_ive.34.0"; + +my $snmp_juniper_ucdavis = '.1.3.6.1.4.1.2021'; +# Memory +my $snmp_juniper_Memory = "$snmp_juniper_ucdavis.4"; +my $snmp_juniper_Memory_TotalSwap = "$snmp_juniper_Memory.3.0"; +my $snmp_juniper_Memory_AvailSwap = "$snmp_juniper_Memory.4.0"; +my $snmp_juniper_Memory_TotalMem = "$snmp_juniper_Memory.5.0"; +my $snmp_juniper_Memory_AvailMem = "$snmp_juniper_Memory.6.0"; +my $snmp_juniper_Memory_TotalFree = "$snmp_juniper_Memory.11.0"; +my $snmp_juniper_Memory_Shared = "$snmp_juniper_Memory.13.0"; +my $snmp_juniper_Memory_Buffer = "$snmp_juniper_Memory.14.0"; +my $snmp_juniper_Memory_Cached = "$snmp_juniper_Memory.15.0"; +# Disk +my $snmp_juniper_Disk = "$snmp_juniper_ucdavis.9.1"; +my $snmp_juniper_Disk_Index = "$snmp_juniper_Disk.1"; +my $snmp_juniper_Disk_Total = "$snmp_juniper_Disk.6.1"; +my $snmp_juniper_Disk_Avail = "$snmp_juniper_Disk.7.1"; +my $snmp_juniper_Disk_Used = "$snmp_juniper_Disk.8.1"; +my $snmp_juniper_Disk_Used_Percent = "$snmp_juniper_Disk.9.1"; +# Load +my $snmp_juniper_Load = "$snmp_juniper_ucdavis.10.1"; +my $snmp_juniper_Load_Index = "$snmp_juniper_Load.1"; +my $snmp_juniper_Load_Load = "$snmp_juniper_Load.3"; +my $snmp_juniper_Load_Load_1 = "$snmp_juniper_Load_Load.1"; +my $snmp_juniper_Load_Load_5 = "$snmp_juniper_Load_Load.2"; +my $snmp_juniper_Load_Load_15 = "$snmp_juniper_Load_Load.3"; + + + +### Functions +############### +sub _create_session(@) { + my ($server, $comm) = @_; + my $version = 1; + my ($sess, $err) = Net::SNMP->session( -hostname => $server, -version => $version, -community => $comm); + if (!defined($sess)) { + print "Can't create SNMP session to $server\n"; + exit(1); + } + return $sess; +} + +sub FSyntaxError($) { + my $err = shift; + print <get_request(-varbindlist => [$local_oid]); + return($r_return->{$local_oid}); +} + +sub _clac_err_stat(@) { + my $value = shift; + my $value_type = shift; + my $tmp_warn = shift; + my $tmp_crit = shift; + my $unit = shift; + my $r_msg; + my $r_stat; + if($value <= $tmp_warn) { + $r_stat = $ERRORS{'OK'}; + $r_msg = "OK: $value_type $value$unit"; + } elsif($value > $tmp_warn and $value < $tmp_crit) { + $r_stat = $ERRORS{'WARNING'}; + $r_msg = "WARN: $value_type $value$unit"; + } elsif($value >= $tmp_crit) { + $r_stat = $ERRORS{'CRITICAL'}; + $r_msg = "CRIT: $value_type $value$unit"; + } + return($r_msg,$r_stat); +} + +### Gather input from user +############################# +my %opt; +$opt{'crit'} = 500; +$opt{'warn'} = 500; +my $result = GetOptions(\%opt, + 'host|H=s', + 'community|C=s', + 'check_type|T=s', + 'warn|w=f', + 'crit|c=f', +); + +FSyntaxError("Missing -H") unless defined $opt{'host'}; +FSyntaxError("Missing -C") unless defined $opt{'community'}; +FSyntaxError("Missing -T") unless defined $opt{'check_type'}; +if($opt{'warn'} > $opt{'crit'}) { + FSyntaxError("Warning can't be larger then Critical: $opt{'warn'} > $opt{'crit'}"); +} + +# Starting Alaram +alarm($TIMEOUT); + +# Establish SNMP Session +our $snmp_session = _create_session($opt{'host'},$opt{'community'}); + +### LOG ### +if("$opt{'check_type'}" eq "LOG") { + my $check = _get_oid_value($snmp_session,$snmp_juniper_logFullPercent); + ($msg,$stat) = _clac_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'},'%'); + $perf = "logsize=$check\%"; +### Users ### +} elsif("$opt{'check_type'}" eq "USERS") { + my $check = _get_oid_value($snmp_session,$snmp_juniper_iveConcurrentUsers); + my $u_web = _get_oid_value($snmp_session,$snmp_juniper_WebUsers); + my $u_mail = _get_oid_value($snmp_session,$snmp_juniper_MailUsers); + my $u_meet = _get_oid_value($snmp_session,$snmp_juniper_MeetingUsers); + + unless($u_web) { $u_web = 0; } + unless($u_mail) { $u_mail = 0; } + unless($u_meet) { $u_meet = 0; } + + ($msg,$stat) = _clac_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + $perf = "all_users=$check web_users=$u_web mail_users=$u_mail meeting_users=$u_meet"; +### MEETINGS ### +} elsif("$opt{'check_type'}" eq "MEETINGS") { + my $check = _get_oid_value($snmp_session,$snmp_juniper_MeetingCount); + unless($check) { $check = 0; } + ($msg,$stat) = _clac_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + $perf = "meetings=$check"; +### CPULOAD ### +} elsif("$opt{'check_type'}" eq "CPULOAD") { + my $load1 = _get_oid_value($snmp_session,$snmp_juniper_Load_Load_1); + my $load5 = _get_oid_value($snmp_session,$snmp_juniper_Load_Load_5); + my $load15 = _get_oid_value($snmp_session,$snmp_juniper_Load_Load_15); + + ($msg,$stat) = _clac_err_stat($load1,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + $perf = "load1min=$load1 load5min=$load5 load15min=$load15"; +### MEM ### +} elsif("$opt{'check_type'}" eq "MEM") { + my $r_mem_tbl = $snmp_session->get_table($snmp_juniper_Memory); + my $Used_Mem = $$r_mem_tbl{$snmp_juniper_Memory_TotalMem} - $$r_mem_tbl{$snmp_juniper_Memory_AvailMem}; + my $Used_Percent = int(($Used_Mem / $$r_mem_tbl{$snmp_juniper_Memory_TotalMem}) * 100); + ($msg,$stat) = _clac_err_stat($Used_Percent,$opt{'check_type'},$opt{'warn'},$opt{'crit'},'%'); + $perf = "total=$$r_mem_tbl{$snmp_juniper_Memory_TotalMem}\k used=$Used_Mem shared=$$r_mem_tbl{$snmp_juniper_Memory_Shared}\k buffer=$$r_mem_tbl{$snmp_juniper_Memory_Buffer}\k cached=$$r_mem_tbl{$snmp_juniper_Memory_Cached}\k"; +### SWAP ### +} elsif("$opt{'check_type'}" eq "SWAP") { + my $r_mem_tbl = $snmp_session->get_table($snmp_juniper_Memory); + my $Used_Mem = $$r_mem_tbl{$snmp_juniper_Memory_TotalSwap} - $$r_mem_tbl{$snmp_juniper_Memory_AvailSwap}; + my $Used_Percent = int(($Used_Mem / $$r_mem_tbl{$snmp_juniper_Memory_TotalSwap}) * 100); + ($msg,$stat) = _clac_err_stat($Used_Percent,$opt{'check_type'},$opt{'warn'},$opt{'crit'},'%'); + $perf = "total=$$r_mem_tbl{$snmp_juniper_Memory_TotalSwap}\k used=$Used_Mem\k"; +### DISK ### +} elsif("$opt{'check_type'}" eq "DISK") { + my $r_disk_tbl = $snmp_session->get_table($snmp_juniper_Disk); + ($msg,$stat) = _clac_err_stat($$r_disk_tbl{$snmp_juniper_Disk_Used_Percent},$opt{'check_type'},$opt{'warn'},$opt{'crit'},'%'); + $perf = "total=$$r_disk_tbl{$snmp_juniper_Disk_Total} used=$$r_disk_tbl{$snmp_juniper_Disk_Used}"; +### Syntax Error ### +} else { + FSyntaxError("$opt{'check_type'} invalid parameter !"); +} + + +print "$msg | $perf\n"; +exit($stat); + diff --git a/nagios/check-netapp-ng.pl b/nagios/check-netapp-ng.pl new file mode 100755 index 0000000..ff1c8e2 --- /dev/null +++ b/nagios/check-netapp-ng.pl @@ -0,0 +1,399 @@ +#!/usr/bin/env perl + +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +use strict; +use lib "/path/to/nagios/libexec"; +use utils qw($TIMEOUT %ERRORS); +use Net::SNMP; +use Getopt::Long; +Getopt::Long::Configure('bundling'); + +my $stat = 0; +my $msg; +my $perf; +my $script_name = "check-netapp-ng.pl"; + +### SNMP OIDs +############### +my $snmpFailedFanCount = '.1.3.6.1.4.1.789.1.2.4.2.0'; +my $snmpFailPowerSupplyCount = '.1.3.6.1.4.1.789.1.2.4.4.0'; +my $snmpcpuBusyTimePerCent = '.1.3.6.1.4.1.789.1.2.1.3.0'; +my $snmpenvOverTemperature = '.1.3.6.1.4.1.789.1.2.4.1.0'; +my $snmpnvramBatteryStatus = '.1.3.6.1.4.1.789.1.2.5.1.0'; +my $snmpFailedDiskCount = '.1.3.6.1.4.1.789.1.6.4.7.0'; +my $snmpUpTime = '.1.3.6.1.2.1.1.3.0'; +my $snmpCacheAge = '.1.3.6.1.4.1.789.1.2.2.23.0'; +my $snmpGlobalStatus = '.1.3.6.1.4.1.789.1.2.2.4.0'; +my $snmpGlobalStatus_text = '.1.3.6.1.4.1.789.1.2.2.25.0'; +my $snmpNdmpSessions = '.1.3.6.1.4.1.789.1.10.2.0'; + +my $snmpfilesysvolTable = '.1.3.6.1.4.1.789.1.5.8'; +my $snmpfilesysvolTablevolEntryOptions = "$snmpfilesysvolTable.1.7"; +my $snmpfilesysvolTablevolEntryvolName = "$snmpfilesysvolTable.1.2"; + +my $snmp_netapp_volume_id_table_df = ".1.3.6.1.4.1.789.1.5.4.1"; +my $snmp_netapp_volume_id_table_df_name = "$snmp_netapp_volume_id_table_df.2"; +my $snmp_netapp_volume_id_table_df_total = "$snmp_netapp_volume_id_table_df.3"; +my $snmp_netapp_volume_id_table_df_used = "$snmp_netapp_volume_id_table_df.4"; +my $snmp_netapp_volume_id_table_df_free = "$snmp_netapp_volume_id_table_df.5"; +my $snmp_netapp_volume_id_table_df_used_prec = "$snmp_netapp_volume_id_table_df.6"; + +my $snmpEnclTable = '.1.3.6.1.4.1.789.1.21.1.2.1'; +my $snmpEnclTableIndex = "$snmpEnclTable.1"; +my $snmpEnclTableState = "$snmpEnclTable.2"; +my $snmpEnclTableShelfAddr = "$snmpEnclTable.3"; +my $snmpEnclTablePsFailed = "$snmpEnclTable.15"; +my $snmpEnclTableFanFailed = "$snmpEnclTable.18"; +my $snmpEnclTableTempOverFail = "$snmpEnclTable.21"; +my $snmpEnclTableTempOverWarn = "$snmpEnclTable.22"; +my $snmpEnclTableTempUnderFail = "$snmpEnclTable.23"; +my $snmpEnclTableTempUnderWarn = "$snmpEnclTable.24"; +my $snmpEnclTableElectronicFailed = "$snmpEnclTable.33"; +my $snmpEnclTableVoltOverFail = "$snmpEnclTable.36"; +my $snmpEnclTableVoltOverWarn = "$snmpEnclTable.37"; +my $snmpEnclTableVoltUnderFail = "$snmpEnclTable.38"; +my $snmpEnclTableVoltUnderWarn = "$snmpEnclTable.39"; + + +# SNMP Status Codes +my %nvramBatteryStatus = ( + 1 => 'ok', + 2 => 'partially discharged', + 3 => 'fully discharged', + 4 => 'not present', + 5 => 'near end of life', + 6 => 'at end of life', + 7 => 'unknown', +); +my %GlobalStatusIndex = ( + 1 => 'other', + 2 => 'unknown', + 3 => 'ok', + 4 => 'nonCritical', + 5 => 'critical', + 6 => 'nonRecoverable', +); +my %EcnlStatusIndex = ( + 1 => 'initializing', + 2 => 'transitioning', + 3 => 'active', + 4 => 'inactive', + 5 => 'reconfiguring', + 6 => 'nonexistent', +); +### Functions +############### +sub _create_session(@) { + my ($server, $comm) = @_; + my $version = 1; + my ($sess, $err) = Net::SNMP->session( -hostname => $server, -version => $version, -community => $comm); + if (!defined($sess)) { + print "Can't create SNMP session to $server\n"; + exit(1); + } + return $sess; +} + +sub FSyntaxError($) { + my $err = shift; + print <get_request(-varbindlist => [$local_oid]); + return($r_return->{$local_oid}); +} + +sub _clac_err_stat(@) { + my $value = shift; + my $value_type = shift; + my $tmp_warn = shift; + my $tmp_crit = shift; + my $r_msg; + my $r_stat; + if($value <= $tmp_warn) { + $r_stat = $ERRORS{'OK'}; + $r_msg = "OK: $value_type $value%"; + } elsif($value > $tmp_warn and $value < $tmp_crit) { + $r_stat = $ERRORS{'WARNING'}; + $r_msg = "WARN: $value_type $value%"; + } elsif($value >= $tmp_crit) { + $r_stat = $ERRORS{'CRITICAL'}; + $r_msg = "CRIT: $value_type $value%"; + } + return($r_msg,$r_stat); +} + +### Gather input from user +############################# +my %opt; +$opt{'crit'} = 500; +$opt{'warn'} = 500; +my $result = GetOptions(\%opt, + 'filer|H=s', + 'community|C=s', + 'check_type|T=s', + 'warn|w=i', + 'crit|c=i', + 'vol|v=s', + 'exclude|e=s', + ); + +FSyntaxError("Missing -H") unless defined $opt{'filer'}; +FSyntaxError("Missing -C") unless defined $opt{'community'}; +FSyntaxError("Missing -T") unless defined $opt{'check_type'}; +if($opt{'vol'}) { + if($opt{'vol'} !~ /^\/.*\/$/) { + FSyntaxError("$opt{'vol'} format is /vol/volname/ !"); + } +} +if($opt{'crit'} and $opt{'warn'}) { + if($opt{'warn'} > $opt{'crit'}) { + FSyntaxError("Warning can't be larger then Critical: $opt{'warn'} > $opt{'crit'}"); + } +} + +# Starting Alaram +alarm($TIMEOUT); + +# Establish SNMP Session +our $snmp_session = _create_session($opt{'filer'},$opt{'community'}); + +### Temperature ### +if("$opt{'check_type'}" eq "TEMP") { + my $check = _get_oid_value($snmp_session,$snmpenvOverTemperature); + if($check == 1) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} is ok"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: Over $opt{'check_type'} !"; + } + $perf = "overtemperature=$check"; +### Fan ### +} elsif("$opt{'check_type'}" eq "FAN") { + my $check = _get_oid_value($snmp_session,$snmpFailedFanCount); + if($check == 0) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} $check"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} $check !"; + } + $perf = "failedfans=$check"; +### PS ### +} elsif("$opt{'check_type'}" eq "PS") { + my $check = _get_oid_value($snmp_session,$snmpFailPowerSupplyCount); + if($check == 0) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} Fail $check"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} Fail $check !"; + } + $perf = "failedpowersupplies=$check"; +### CPULOAD ### +} elsif("$opt{'check_type'}" eq "CPULOAD") { + my $check = _get_oid_value($snmp_session,$snmpcpuBusyTimePerCent); + ($msg,$stat) = _clac_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + $perf = "cpuload=$check\percent"; +### NVRAM ### +} elsif("$opt{'check_type'}" eq "NVRAM") { + my $check = _get_oid_value($snmp_session,$snmpnvramBatteryStatus); + if($check == 1) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} $nvramBatteryStatus{$check}"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} $nvramBatteryStatus{$check}"; + } + $perf = "nvrambatterystatus=$check"; +### DISKUSED ### +} elsif("$opt{'check_type'}" eq "DISKUSED") { + + FSyntaxError("Missing -vol") unless defined $opt{'vol'}; + + my $r_vol_tbl = $snmp_session->get_table($snmp_netapp_volume_id_table_df_name); + foreach my $key ( keys %$r_vol_tbl) { + if("$$r_vol_tbl{$key}" eq "$opt{'vol'}") { + my @tmp_arr = split(/\./, $key); + my $oid = pop(@tmp_arr); + + my $used = _get_oid_value($snmp_session,"$snmp_netapp_volume_id_table_df_used.$oid"); + my $used_prec = _get_oid_value($snmp_session,"$snmp_netapp_volume_id_table_df_used_prec.$oid"); + + ($msg,$stat) = _clac_err_stat($used_prec,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + + $perf = "$$r_vol_tbl{$key}=$used\k"; + } + } +### SNAPSHOT ### +} elsif("$opt{'check_type'}" eq "SNAPSHOT") { + my @exc_list = split(',',$opt{'exclude'}); + my @vol_err; + my $r_vol_tbl = $snmp_session->get_table($snmpfilesysvolTablevolEntryvolName); + foreach my $key ( keys %$r_vol_tbl) { + my @tmp_arr = split(/\./, $key); + my $oid = pop(@tmp_arr); + my $vol_tmp = "$$r_vol_tbl{$key}"; + + my $volopt = _get_oid_value($snmp_session,"$snmpfilesysvolTablevolEntryOptions.$oid"); + + if($volopt !~ /nosnap=off/) { + my $volcheck = 0; + foreach my $exvol (@exc_list) { + if($exvol eq $vol_tmp) { + $volcheck++; + last; + } + } + if($volcheck == 0) { + push(@vol_err,"$vol_tmp"); + } + } + } + + my $err_count = $#vol_err + 1; + if($err_count == 0) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} all ok"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} @vol_err not configured"; + } + $perf = "snapoff=$err_count"; +### FAILEDDISK ### +} elsif("$opt{'check_type'}" eq "FAILEDDISK") { + my $check = _get_oid_value($snmp_session,$snmpFailedDiskCount); + if($check == 0) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} $check"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} $check"; + } + $perf = "faileddisks=$check"; + +### UPTIME ### +} elsif("$opt{'check_type'}" eq "UPTIME") { + my $check = _get_oid_value($snmp_session,$snmpUpTime); + $msg = "$opt{'check_type'}: $check"; +### CACHEAGE ### +} elsif("$opt{'check_type'}" eq "CACHEAGE") { + my $check = _get_oid_value($snmp_session,$snmpCacheAge); + ($msg,$stat) = _clac_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + $perf = "cache_age=$check"; +### GLOBALSTATUS ### +} elsif("$opt{'check_type'}" eq "GLOBALSTATUS") { + my $check = _get_oid_value($snmp_session,$snmpGlobalStatus); + my $global_stat_txt = _get_oid_value($snmp_session,$snmpGlobalStatus_text); + if($check == 3) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} $GlobalStatusIndex{$check} $check $global_stat_txt"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} $GlobalStatusIndex{$check} $check $global_stat_txt"; + } + $perf = "globalstatus=$check"; +### NDMPSESSIONS ### +} elsif("$opt{'check_type'}" eq "NDMPSESSIONS") { + my $check = _get_oid_value($snmp_session,$snmpNdmpSessions); + ($msg,$stat) = _clac_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + $perf = "ndmpsess=$check"; +### SHELF ### +} elsif("$opt{'check_type'}" eq "SHELF") { + my @errs; + my $r_shelf = $snmp_session->get_table($snmpEnclTableIndex); + foreach my $key ( keys %$r_shelf) { + my @tmp_arr = split(/\./, $key); + my $oid = pop(@tmp_arr); + + my %shelf; + my @shelf_err; + my $addr = _get_oid_value($snmp_session,"$snmpEnclTableShelfAddr.$oid"); + + my $shelf_state = _get_oid_value($snmp_session,"$snmpEnclTableState.$oid"); + + if($shelf_state != 3) { + push(@shelf_err,"$addr state $EcnlStatusIndex{$shelf_state},"); + } + + $shelf{'PsFail'} = _get_oid_value($snmp_session,"$snmpEnclTablePsFailed.$oid"); + $shelf{'FanFail'} = _get_oid_value($snmp_session,"$snmpEnclTableFanFailed.$oid"); + $shelf{'ElectFail'} = _get_oid_value($snmp_session,"$snmpEnclTableElectronicFailed.$oid"); + $shelf{'TempOverFail'} = _get_oid_value($snmp_session,"$snmpEnclTableTempOverFail.$oid"); + $shelf{'TempOver'} = _get_oid_value($snmp_session,"$snmpEnclTableTempOverWarn.$oid"); + $shelf{'TempUnderFail'} = _get_oid_value($snmp_session,"$snmpEnclTableTempUnderFail.$oid"); + $shelf{'TempUnderWarn'} = _get_oid_value($snmp_session,"$snmpEnclTableTempUnderWarn.$oid"); + $shelf{'VoltOverFail'} = _get_oid_value($snmp_session,"$snmpEnclTableVoltOverFail.$oid"); + $shelf{'VoltOverWarn'} = _get_oid_value($snmp_session,"$snmpEnclTableVoltOverWarn.$oid"); + $shelf{'VoltUnderFail'} = _get_oid_value($snmp_session,"$snmpEnclTableVoltUnderFail.$oid"); + $shelf{'VoltUnderWarn'} = _get_oid_value($snmp_session,"$snmpEnclTableVoltUnderWarn.$oid"); + + foreach my $subkey ( keys %shelf) { + print "$subkey\t$shelf{$subkey}\n"; + if($shelf{$subkey}) { push(@shelf_err,"$addr $subkey,") } + } + if($#shelf_err != -1) { + push(@errs,@shelf_err) + } + } + + if($#errs == -1) { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} ok"; + $perf = "shelf=0"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} Errors -"; + foreach(@errs) { + $msg = "$msg $_"; + } + $perf = "shelf=1"; + } +### Syntax Error ### +} else { + FSyntaxError("$opt{'check_type'} invalid parameter !"); +} + + +print "$msg | $perf\n"; +exit($stat); + diff --git a/nagios/check-paloalto-A500.pl b/nagios/check-paloalto-A500.pl new file mode 100755 index 0000000..4713c77 --- /dev/null +++ b/nagios/check-paloalto-A500.pl @@ -0,0 +1,117 @@ +#!/usr/bin/env perl + +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +use strict; +use Net::SNMP; +my $stat; +my $msg; +my $perf; +my $script_name = "check-paloalto-A500.pl"; + +### SNMP OIDs +############### +my $s_cpu_mgmt = '.1.3.6.1.2.1.25.3.3.1.2.1'; +my $s_cpu_data = '.1.3.6.1.2.1.25.3.3.1.2.2'; + +### Functions +############### +sub _create_session { + my ($server, $comm) = @_; + my $version = 1; + my ($sess, $err) = Net::SNMP->session( -hostname => $server, -version => $version, -community => $comm); + if (!defined($sess)) { + print "Can't create SNMP session to $server\n"; + exit(1); + } + return $sess; +} + +sub FSyntaxError { + print "Syntax Error !\n"; +# print "$0 -H [ip|dnsname] -C [snmp community] -t [temp|fan|ps|cpu|mem|module|freeint] -w [warning value] -c [critical value] -d [days]\n"; + print "$script_name\n"; + print "-H = Ip/Dns Name of the FW\n"; + print "-C = SNMP Community\n"; + print "-t = Check type (currently only cpu)\n"; + print "-w = Warning Value\n"; + print "-c = Critical Value\n"; + exit(3); +} + +if($#ARGV != 9) { + FSyntaxError; +} + +### Gather input from user +############################# +my $switch; +my $community; +my $check_type; +my $warn = 0; +my $crit = 0; +my $int; + +while(@ARGV) { + my $temp = shift(@ARGV); + if("$temp" eq '-H') { + $switch = shift(@ARGV); + } elsif("$temp" eq '-C') { + $community = shift(@ARGV); + } elsif("$temp" eq '-t') { + $check_type = shift(@ARGV); + } elsif("$temp" eq '-w') { + $warn = shift(@ARGV); + } elsif("$temp" eq '-c') { + $crit = shift(@ARGV); + } else { + FSyntaxError(); + } +} + +# Validate Warning +if($warn > $crit) { + print "Warning can't be larger then Critical: $warn > $crit\n"; + FSyntaxError(); +} + +# Establish SNMP Session +our $snmp_session = _create_session($switch,$community); + +### CPU ### +if($check_type eq "cpu") { + my $R_mgmt = $snmp_session->get_request(-varbindlist => [$s_cpu_mgmt]); + my $mgmt = "$R_mgmt->{$s_cpu_mgmt}"; + my $R_data = $snmp_session->get_request(-varbindlist => [$s_cpu_data]); + my $data = "$R_data->{$s_cpu_data}"; + + if($mgmt > $crit or $data > $crit) { + $msg = "CRIT: Mgmt - $mgmt, Data - $data"; + $stat = 2; + } elsif($mgmt > $warn or $data > $warn) { + $msg = "WARN: Mgmt - $mgmt, Data - $data"; + $stat = 1; + } else { + $msg = "OK: Mgmt - $mgmt, Data - $data"; + $stat = 0; + } + $perf = "mgmt=$mgmt;data=$data;$warn;$crit"; + +### Bad Syntax ### + +} else { + FSyntaxError(); +} + + +print "$msg | $perf\n"; +exit($stat); diff --git a/nagios/check-pineapp.pl b/nagios/check-pineapp.pl new file mode 100755 index 0000000..d3bf518 --- /dev/null +++ b/nagios/check-pineapp.pl @@ -0,0 +1,208 @@ +#!/usr/bin/env perl + +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +use strict; +use lib "/path/to/nagios/libexec"; +use utils qw($TIMEOUT %ERRORS); +use Net::SNMP; +use Getopt::Long; +Getopt::Long::Configure('bundling'); + +my $stat = $ERRORS{'OK'}; +my $msg; +my $perf; +my $script_name = "check-pineapp.pl"; + +### SNMP OIDs +############### +# CPULOAD +my $snmp_pineapp_cpuload = '.1.3.6.1.4.1.19801.1.1.3'; +my $snmp_pineapp_cpuload_1min = "$snmp_pineapp_cpuload.1.0"; +my $snmp_pineapp_cpuload_5min = "$snmp_pineapp_cpuload.2.0"; +my $snmp_pineapp_cpuload_15min = "$snmp_pineapp_cpuload.3.0"; +# Services +my $snmp_pineapp_services = '.1.3.6.1.4.1.19801.2.1'; +my $snmp_pineapp_services_smtp = "$snmp_pineapp_services.1.0"; +my $snmp_pineapp_services_pop3 = "$snmp_pineapp_services.2.0"; +my $snmp_pineapp_services_imap4 = "$snmp_pineapp_services.3.0"; +my $snmp_pineapp_services_av = '.1.3.6.1.4.1.19801.2.5.1.0'; +# Queue +my $snmp_pineapp_queues = "$snmp_pineapp_services.10"; +my $snmp_pineapp_queues_in = "$snmp_pineapp_queues.1.0"; +my $snmp_pineapp_queues_out = "$snmp_pineapp_queues.2.0"; +my $snmp_pineapp_queues_high = "$snmp_pineapp_queues.3.1.0"; +my $snmp_pineapp_queues_normal = "$snmp_pineapp_queues.3.2.0"; +my $snmp_pineapp_queues_low = "$snmp_pineapp_queues.3.3.0"; +my $snmp_pineapp_queues_total = "$snmp_pineapp_queues.3.4.0"; +my $snmp_pineapp_averageProcessingTimePerMsg = ".1.3.6.1.4.1.19801.2.2.1.4.0"; +# Misc +my $snmp_pineapp_storage = '.1.3.6.1.4.1.19801.1.4.0'; + +### Functions +############### +sub _create_session(@) { + my ($server, $comm) = @_; + my $version = 1; + my ($sess, $err) = Net::SNMP->session( -hostname => $server, -version => $version, -community => $comm); + if (!defined($sess)) { + print "Can't create SNMP session to $server\n"; + exit(1); + } + return $sess; +} + +sub FSyntaxError($) { + my $err = shift; + print <get_request(-varbindlist => [$local_oid]); + return($r_return->{$local_oid}); +} + +sub _clac_err_stat(@) { + my $value = shift; + my $value_type = shift; + my $tmp_warn = shift; + my $tmp_crit = shift; + my $unit = shift; + my $r_msg; + my $r_stat; + if($value <= $tmp_warn) { + $r_stat = $ERRORS{'OK'}; + $r_msg = "OK: $value_type $value$unit"; + } elsif($value > $tmp_warn and $value < $tmp_crit) { + $r_stat = $ERRORS{'WARNING'}; + $r_msg = "WARN: $value_type $value$unit"; + } elsif($value >= $tmp_crit) { + $r_stat = $ERRORS{'CRITICAL'}; + $r_msg = "CRIT: $value_type $value$unit"; + } + return($r_msg,$r_stat); +} + +### Gather input from user +############################# +my %opt; +$opt{'crit'} = 500; +$opt{'warn'} = 500; +my $result = GetOptions(\%opt, + 'host|H=s', + 'community|C=s', + 'check_type|T=s', + 'warn|w=f', + 'crit|c=f', +); + +FSyntaxError("Missing -H") unless defined $opt{'host'}; +FSyntaxError("Missing -C") unless defined $opt{'community'}; +FSyntaxError("Missing -T") unless defined $opt{'check_type'}; +if($opt{'warn'} > $opt{'crit'}) { + FSyntaxError("Warning can't be larger then Critical: $opt{'warn'} > $opt{'crit'}"); +} + +# Starting Alaram +alarm($TIMEOUT); + +# Establish SNMP Session +our $snmp_session = _create_session($opt{'host'},$opt{'community'}); + +# Start Check ! +### CPULOAD ### +if("$opt{'check_type'}" eq "CPULOAD") { + my $check = $snmp_session->get_table($snmp_pineapp_cpuload); + ($msg,$stat) = _clac_err_stat($$check{$snmp_pineapp_cpuload_1min},$opt{'check_type'},$opt{'warn'},$opt{'crit'}); + $perf = "load1=$$check{$snmp_pineapp_cpuload_1min} load5=$$check{$snmp_pineapp_cpuload_5min} load15=$$check{$snmp_pineapp_cpuload_15min}"; +### SERVICES ### +} elsif("$opt{'check_type'}" eq "SERVICES") { + my %check = ( + 'smtp' => _get_oid_value($snmp_session,$snmp_pineapp_services_smtp), + 'pop3' => _get_oid_value($snmp_session,$snmp_pineapp_services_pop3), + 'imap4' => _get_oid_value($snmp_session,$snmp_pineapp_services_imap4), + 'av' => _get_oid_value($snmp_session,$snmp_pineapp_services_av) + ); + + my $count = 0; + foreach my $srv ( keys %check) { + if($check{$srv} == 0 ){ + $msg = "$msg, $srv is down"; + $stat = $ERRORS{'CRITICAL'}; + $count++; + } + } + + if($count == 0) { + $msg = "OK: All Services Ok !"; + } else { + $msg = "CRIT: $msg"; + } + + $perf = "down_srv=$count"; +### DISK ### +} elsif("$opt{'check_type'}" eq "DISK") { + my $check = _get_oid_value($snmp_session,$snmp_pineapp_storage); + if($check eq "OK") { + $stat = $ERRORS{'OK'}; + $msg = "OK: $opt{'check_type'} $check"; + $perf = "disk_err=0"; + } else { + $stat = $ERRORS{'CRITICAL'}; + $msg = "CRIT: $opt{'check_type'} $check"; + $perf = "disk_err=1"; + } +### MSGPERSEC ### +} elsif("$opt{'check_type'}" eq "MSGPERSEC") { + my $check = _get_oid_value($snmp_session,$snmp_pineapp_averageProcessingTimePerMsg); + ($msg,$stat) = _clac_err_stat($check,$opt{'check_type'},$opt{'warn'},$opt{'crit'},"sec"); + $perf = "msgPersec=$check\sec"; +### INOUT ### +} elsif("$opt{'check_type'}" eq "INOUT") { + my $in = _get_oid_value($snmp_session,$snmp_pineapp_queues_in); + my $out = _get_oid_value($snmp_session,$snmp_pineapp_queues_out); + $msg = "OK: $opt{'check_type'} (Preformance Only)"; + $perf = "in=$in\msg out=-$out\msg"; +### QUEUE ### +} elsif("$opt{'check_type'}" eq "QUEUE") { + my $high = _get_oid_value($snmp_session,$snmp_pineapp_queues_high); + my $normal = _get_oid_value($snmp_session,$snmp_pineapp_queues_normal); + my $low = _get_oid_value($snmp_session,$snmp_pineapp_queues_low); + my $total = _get_oid_value($snmp_session,$snmp_pineapp_queues_total); + ($msg,$stat) = _clac_err_stat($total,$opt{'check_type'},$opt{'warn'},$opt{'crit'},"msg"); + $perf = "total=$total\msg low=$low\msg normal=$normal\msg high=$high\msg"; +} else { + FSyntaxError("$opt{'check_type'} invalid parameter !"); +} + + +print "$msg | $perf\n"; +exit($stat); diff --git a/nagios/check-roomalert.pl b/nagios/check-roomalert.pl new file mode 100755 index 0000000..6d4652d --- /dev/null +++ b/nagios/check-roomalert.pl @@ -0,0 +1,131 @@ +#!/usr/bin/env perl + +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +# Info +# Checks AVTECH Room alert devices tempeture via SNMP + +use strict; +use Net::SNMP; +use Getopt::Long; Getopt::Long::Configure('bundling'); + +my $stat = 0; +my $msg = "RoomAlert"; +my $perf; +my $script_name = "check-roomalert.pl"; + +### SNMP OIDs +############### +my $s_internal = '.1.3.6.1.4.1.20916.1.6.1.1.1.2.0'; +my $s_external = '.1.3.6.1.4.1.20916.1.6.1.2.1.1.0'; + +### Functions +############### +sub _create_session { + my ($server, $comm) = @_; + my $version = 1; + my ($sess, $err) = Net::SNMP->session( -hostname => $server, -version => $version, -community => $comm); + if (!defined($sess)) { + print "Can't create SNMP session to $server\n"; + exit(1); + } + return $sess; +} + +sub _get_oid_value(@) { + my $sess = shift; + my $local_oid = shift; + my $r_return = $sess->get_request(-varbindlist => [$local_oid]); + return($r_return->{$local_oid}); +} + +sub FSyntaxError($) { + my $err = shift; + print < internal,external + -c = Critical Value -> internal,external +EOU + exit(1); +} + +my %opt; +my $result = GetOptions(\%opt, + 'host|H=s', + 'com|C=s', + 'warn|w=s', + 'crit|c=s', +); + +FSyntaxError("Missing -H") unless defined $opt{'host'}; +FSyntaxError("Missing -C") unless defined $opt{'com'}; +FSyntaxError("Missing -w") unless defined $opt{'warn'}; +FSyntaxError("Missing -c") unless defined $opt{'crit'}; + + +# Validate Warning +my @warn = split(",",$opt{'warn'}); +my @crit = split(",",$opt{'crit'}); +if($warn[0] > $crit[0]) { + FSyntaxError("Warning can't be larger then Critical: $warn[0] > $crit[0]"); +} +if($warn[1] > $crit[1]) { + FSyntaxError("Warning can't be larger then Critical: $warn[1] > $crit[1]"); +} + +# Establish SNMP Session +our $snmp_session = _create_session($opt{'host'},$opt{'com'}); +my $internal = _get_oid_value($snmp_session,$s_internal); +my $external = _get_oid_value($snmp_session,$s_external); +$internal = int(substr($internal,0,2) . "." . substr($internal,2,2)); +$external = int(substr($external,0,2) . "." . substr($external,2,2)); + +my $istat = 0; +my $estat = 0; + +# Check Internal +if($internal >= $crit[0]) { + $istat=2; +} elsif($internal >= $warn[0] and $internal < $crit[0]) { + $istat=1; +} else { + $istat=0; +} + +# Check External +if($external >= $crit[1]) { + $estat=2; +} elsif($external >= $warn[1] and $external < $crit[1]) { + $estat=1; +} else { + $estat=0; +} + +if($istat == 2 or $estat == 2) { + $stat = 2; + $msg = "CRIT: $msg"; +} elsif($istat == 1 or $estat == 1) { + $stat = 1; + $msg = "WARN: $msg"; +} else { + $stat = 0; + $msg = "OK: $msg"; +} + +# Perf Data +$perf="internal=$internal external=$external"; + +print "$msg | $perf\n"; +exit($stat); diff --git a/nagios/check_flexlm.pl b/nagios/check_flexlm.pl new file mode 100755 index 0000000..faa6932 --- /dev/null +++ b/nagios/check_flexlm.pl @@ -0,0 +1,43 @@ +#!/usr/bin/env perl + +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +# Info +# This script is mainly for performance graph using pnp the usage of the license + +use strict; + +sub FSyntaxError { + print "Syntax Error !\n"; + print "$0 [absolute path to lmutil] [absolute path to license file] [feature full name (from lmstat)]\n"; + exit(1); +} + +if($#ARGV != 3) { + FSyntaxError; +} + +# General Settings +my $lmutil = "$ARGV[0]"; chomp($lmutil); +my $lm_file = "$ARGV[1]"; chomp($lm_file); +my $feature = "$ARGV[2]"; chomp($feature); +my $daemon = "$ARGV[3]"; +my $vendor = `basename $lm_file | sed 's/.lic//g'`; chomp($vendor); + +my @lmstat_out = split(";",`$lmutil lmstat -c $lm_file -S $daemon | grep ^Users\\ of\\ $feature: | sed -e 's/:/;/g' -e 's/ (Total of //g' -e 's/ Total of //g' -e 's/ licenses issued//g' -e 's/ licenses in use)\$//g' -e 's/ license issued//g' -e 's/ license in use)\$//g' -e 's/^Users of //g'`); +if($#lmstat_out < 1) { + print "$vendor $daemon Is Down\n"; + exit(2); +} + +print "$vendor $daemon $feature | total=$lmstat_out[1] used=$lmstat_out[2]\n"; +exit(0); diff --git a/nagios/check_flexlm_up.sh b/nagios/check_flexlm_up.sh new file mode 100755 index 0000000..80aab13 --- /dev/null +++ b/nagios/check_flexlm_up.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +# Settings + +lmutil="/path/to/lmutil" + +function FError() { + echo "Syntax:" + echo "$0 [licesnse server dns name] [port #]" + exit 3 +} + +if [ $# != 2 ] +then + FError +fi + +server=$1 +port=$2 + +$lmutil lmstat -c ${port}@${server} &> /dev/null +ERR=$? +if [ $ERR == 0 ] +then + echo "Flexlm: OK - ${port}@${server}| flexlm=1" + exit 0 +else + echo "Flexlm: Crit - ${port}@${server} | flexlm=0" + exit 2 +fi diff --git a/nagios/check_internet.sh b/nagios/check_internet.sh new file mode 100755 index 0000000..cc384b1 --- /dev/null +++ b/nagios/check_internet.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +# Checking User Input +function FError() +{ + echo "Syntax:" + echo "$0 [url] [number of tries] [time out]" + echo "Example:" + echo "$0 www.google.com 2 5" + exit 1 +} + +if [ $# != 3 ] +then + FError +fi + +url="$1" + +if [ `echo $2 | grep -q ^[[:digit:]]*$ ; echo $?` == 0 ] +then + tries="$2" +else + FError +fi + +if [ `echo $3 | grep -q ^[[:digit:]]*$ ; echo $?` == 0 ] +then + timeout="$3" +else + FError +fi + +wget=`which wget` + + +wget_code=`$wget $url -q -O /dev/null -t $tries --timeout $timeout ; echo $?` + +if [ $wget_code == 0 ] +then + echo "Internet Access Ok - $url | internet=1;0;0" + exit 0 +else + echo "Internet Access Failed - $url | internet=0;0;0" + exit 2 +fi + diff --git a/nagios/check_sgeexec.pl b/nagios/check_sgeexec.pl new file mode 100755 index 0000000..7173bba --- /dev/null +++ b/nagios/check_sgeexec.pl @@ -0,0 +1,116 @@ +#!/usr/bin/env perl + +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +use strict; +use XML::Simple; + +sub FSyntaxError { + print "Syntax Error !\n"; + print "$0 [s|q] [absolute path to settings.sh] [hostname] [queue name]\n"; + print "s = Status of the exec hosts: check for Error status, and if he has a queue instance enabled\n"; + print "q = check via qrsh is the host accepts jobs (you can configure a queue for all the exec hosts with access list only to nagios for the sake of this check)\n\n" + print "Example:\n"; + print "$0 q /path/to/settings.sh quad-8g1 nagios.q\n"; + print "$0 s /path/to/settings.sh quad-8g1 [queues,to,exclude]\n"; + exit(1); +} + +# User Input +if($#ARGV < 2) { + FSyntaxError; +} +my $check_type = shift(@ARGV); +my $sge_settings = shift(@ARGV); +my $sgeexecd = shift(@ARGV); + + +# General Settings +my $exit = 0; +my $perf; +my $msg; + +if("$check_type" eq "q") { + # Check via qrsh + my $queue = shift(@ARGV); + my $qrsh = `source $sge_settings ; qrsh -q $queue\@$sgeexecd hostname &> /dev/null ; echo \$?`; + chomp($qrsh); + if($qrsh != 0) { + $exit = 2; + $perf = "qrsh=0"; + $msg = "$queue\@$sgeexecd cant execute jobs"; + } else { + $perf = "qrsh=1"; + $msg = "$queue\@$sgeexecd can execute jobs"; + } +} elsif("$check_type" eq "s") { + # Check Host's queue instance Status + my $queue_list_2_exclude = shift(@ARGV); + my @queues2ex = split(',',$queue_list_2_exclude); + my $queue_instances = 0; + my $queue_instances_err = 0; + $perf = "qstatus=1"; + my @qstat_out = split("\n",`source $sge_settings ; qhost -q -h $sgeexecd`); shift(@qstat_out);shift(@qstat_out);shift(@qstat_out);shift(@qstat_out); + + foreach my $line (@qstat_out) { + my @cline = split(" ",$line); + my $yes_exclude = 0; + foreach my $q (@queues2ex) { + if($q eq $cline[0]) { + $yes_exclude++; + last; + } + } + + if($yes_exclude == 0) { + if($cline[3] =~ /E/) { + $msg = "$msg $cline[0]\@$sgeexecd in Error status."; + $queue_instances_err++; + } + unless($cline[3] =~ /d/) { + $queue_instances++; + } + } + } + + if($queue_instances == 0 or $queue_instances_err > 0) { + if($queue_instances_err > 0) { + $perf = "qstatus=$queue_instances_err"; + } else { + $perf = "qstatus=0"; + } + if($queue_instances == 0) { + $perf = "$perf qconfigured=0"; + $msg = "$msg $sgeexecd dont have any queue configured."; + } else { + $perf = "$perf qconfigured=$queue_instances"; + } + $exit = 2; + } else { + $exit = 0; + $msg = "$sgeexecd is OK"; + $perf = "qstatus=0 qconfigured=$queue_instances"; + } +} else { + FSyntaxError; +} + + +# Display Message +if($exit == 0) { + $msg = "OK: $msg"; +} else { + $msg = "Error: $msg"; +} +print "$msg | $perf\n"; +exit($exit); + diff --git a/nagios/check_svn.sh b/nagios/check_svn.sh new file mode 100755 index 0000000..779081e --- /dev/null +++ b/nagios/check_svn.sh @@ -0,0 +1,129 @@ +#!/bin/bash + +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +function FError() +{ + echo "Syntax:" + echo "$0 [svn server] [http | svn | https] [repos path] [location to check-out] [username] [password]" + echo "for this check you'll need to create a repository name nagios" + echo "Example:" + echo "$0 svnsrv http,https CM ${RANDOM}" + exit 1 +} + +function FCheckHttps() +{ +mkdir -p $WORKINGCOPY +cd $WORKINGCOPY +svn co https://${SVNSRV}/${REPOPATH}/nagios --no-auth-cache --config-dir /home/nagios/.subversion --username $SVNUSER --password $SVNPASS $WORKINGCOPY &> /dev/null +if [ $? != 0 ] +then + rm -rf $WORKINGCOPY + ERR=`expr $ERR + 1` + MSG="$MSG https: Error" + PERF="$PERF https=0;0;0;;" +else + rm -rf $WORKINGCOPY + ERR=`expr $ERR + 0` + MSG="$MSG https: ok" + PERF="$PERF https=1;0;0;;" +fi +} + +function FCheckHttp() +{ +mkdir -p $WORKINGCOPY +cd $WORKINGCOPY +svn co http://${SVNSRV}/${REPOPATH}/nagios --no-auth-cache --config-dir /home/nagios/.subversion --username $SVNUSER --password $SVNPASS $WORKINGCOPY &> /dev/null +if [ $? != 0 ] +then + rm -rf $WORKINGCOPY + ERR=`expr $ERR + 1` + MSG="$MSG http: Error" + PERF="$PERF http=0;0;0;;" +else + rm -rf $WORKINGCOPY + ERR=`expr $ERR + 0` + MSG="$MSG http: ok" + PERF="$PERF http=1;0;0;;" +fi +} + +function FCheckSvn() +{ +mkdir -p $WORKINGCOPY +cd $WORKINGCOPY +svn co svn://${SVNSRV}/nagios --no-auth-cache --config-dir /home/nagios/.subversion --username $SVNUSER --password $SVNPASS $WORKINGCOPY &> /dev/null +if [ $? != 0 ] +then + rm -rf $WORKINGCOPY + ERR=`expr $ERR + 1` + MSG="$MSG svn: Error" + PERF="$PERF svn=0;0;0;;" +else + rm -rf $WORKINGCOPY + ERR=`expr $ERR + 0` + MSG="$MSG svn: ok" + PERF="$PERF svn=1;0;0;;" +fi +} + +if [ $# != 4 ] +then + FError +fi + +SVNSRV="$1" +PROTOCOL=`echo $2 | sed 's/,/ /g'` +REPOPATH="$3" +WORKINGCOPY="$4" +SVNPORT="3690" +HTTPPORT="80" +HTTPSPORT="443" +SVNUSER="$5" +SVNPASS="$6" +MSG="" +PREF="" +ERR="0" + +for proto in $PROTOCOL +do + case $proto in + "https" ) + FCheckHttps + ;; + "http" ) + FCheckHttp + ;; + "svn" ) + FCheckSvn + ;; + * ) + FError + ;; + esac +done + + + +if [ $ERR = 0 ] +then + echo "$MSG = OK | $PERF" + exit 0 +else + echo "$MSG = CRITICAL | $PERF" + exit 2 +fi + +echo "Looking OK | Server:$SVNSRV Protocols:$PROTOCOL" + diff --git a/nagios/check_w32_mem.pl b/nagios/check_w32_mem.pl new file mode 100755 index 0000000..7b92827 --- /dev/null +++ b/nagios/check_w32_mem.pl @@ -0,0 +1,117 @@ +#!/usr/bin/env perl + +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +use strict; +use Net::SNMP; +my $stat; +my $msg; +my $perf; + +### SNMP OIDs +############### +my $S_Mem_Total = ".1.3.6.1.2.1.25.2.2.0"; # Byte +my $S_Process_Mem_Util = ".1.3.6.1.2.1.25.5.1.1.2"; + +### Functions +############### + +sub _create_session { + my ($server, $comm) = @_; + my $version = 1; + my ($sess, $err) = Net::SNMP->session( -hostname => $server, -version => $version, -community => $comm); + if (!defined($sess)) { + print "Can't create SNMP session to $server\n"; + exit(1); + } + return $sess; +} + +sub FSyntaxError { + print "Syntax Error !\n"; + print "$0 -H [ip|dnsname] -C [snmp community] -w [warning value] -c [critical value]\n"; + print "To disable warning and critical values type 200 as the value"; + exit(3); +} + +if($#ARGV != 7) { + FSyntaxError; +} + +### Gather input from user +############################# +my $switch; +my $community; +my $check_type; +my $warn; +my $crit; + +while(@ARGV) { + my $temp = shift(@ARGV); + if("$temp" eq '-H') { + $switch = shift(@ARGV); + } elsif("$temp" eq '-C') { + $community = shift(@ARGV); + } elsif("$temp" eq '-w') { + $warn = shift(@ARGV); + } elsif("$temp" eq '-c') { + $crit = shift(@ARGV); + } else { + FSyntaxError(); + } +} + +if($warn > $crit) { + print "Warning can't be larger then Critical: $warn > $crit\n"; + FSyntaxError(); +} + +# Establish SNMP Session +our $snmp_session = _create_session($switch,$community); + +# Total Memory +my $R_Mem_Total = $snmp_session->get_request(-varbindlist => [$S_Mem_Total]); +my $Mem_Total = "$R_Mem_Total->{$S_Mem_Total}"; + +# Used Memory +my $R_proc_tbl = $snmp_session->get_table($S_Process_Mem_Util); +my $Mem_Used = 0; +foreach my $oid ( keys %$R_proc_tbl) { +# print "$oid\t$$R_proc_tbl{$oid}\n"; + $Mem_Used = $Mem_Used + $$R_proc_tbl{$oid}; +} + +# Free Memory +my $Mem_Free = $Mem_Total - $Mem_Used; +my $Mem_Free_P = int($Mem_Free / $Mem_Total * 100); + +# Humen Readable +my $Mem_Total_H = int($Mem_Total / 1024); +my $Mem_Used_H = int($Mem_Used / 1024); +my $Mem_Free_H = int($Mem_Free / 1024); + +# Calculate Exit Status +if($Mem_Free_P < $warn) { + $stat = 0; + $msg = "Memory: OK - Free Memory $Mem_Free_P%"; +} elsif($Mem_Free_P > $warn and $Mem_Free_P < $crit) { + $stat = 1; + $msg = "Memory: Warn - Free Memory $Mem_Free_P%"; +} elsif($Mem_Free_P > $crit) { + $stat = 2; + $msg = "Memory: CRIT - Free Memory $Mem_Free_P%"; +} + +$perf = "total=$Mem_Total_H used=$Mem_Used_H"; + +print "$msg | $perf\n"; +exit($stat); diff --git a/nagios/perf-linux-cpu.pl b/nagios/perf-linux-cpu.pl new file mode 100755 index 0000000..f72501d --- /dev/null +++ b/nagios/perf-linux-cpu.pl @@ -0,0 +1,47 @@ +#!/usr/bin/env perl +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +# Info +# +# Used only for performance monitoring via check_by_ssh + +my $msg = "MPSTAT Performance |"; +my $x = 0; +my %header; +my $fcount = -1; +my $mpstat = `which mpstat`; chomp($mpstat); +my @out = split("\n",`$mpstat |tail -n 2`); +foreach my $line (@out) { + my @chopped = split(" ",$line); + shift(@chopped);shift(@chopped);shift(@chopped); + + my $count = 0; + if($x == 0) { + foreach my $field (@chopped) { + if($field =~ /^%/) { + $field =~ s/^%//; chomp($field); + $fcount++; + $header{"$fcount"} = $field; + $count++; + } + } + } else { + for(my $i=0;$i<=$fcount;$i++) { + my $tmp = int($chopped[$i]); chomp($tmp); + $msg = "$msg $header{$i}=$tmp;0;0;0"; + } + } + $x++; +} + +print "$msg\n"; +exit(0); \ No newline at end of file diff --git a/nagios/perf-sge.pl b/nagios/perf-sge.pl new file mode 100755 index 0000000..90dcc12 --- /dev/null +++ b/nagios/perf-sge.pl @@ -0,0 +1,132 @@ +#!/usr/bin/env perl + +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +use strict; +use Time::Local; + +# Used only for performance via pnp4Nagios + +sub FSyntaxError { + print "Syntax Error !\n"; + print "$0 cjs \n"; + print "\tcjs = Cell Job Summary\n"; + print "$0 qjs \"queue name\"\n"; + print "\tqjs = Queue Job Summary\n"; + exit(3); +} + +if($#ARGV < 0) { + FSyntaxError; +} + +my $sge_settings = "/path/to/sge/settings.sh"; +my $perf_data; +my $msg; +my $queue; + +sub cjs { + my @qstat_grid_jobs = split("\n",`source $sge_settings ; qstat | sed '1,2d' | awk '{print \$5}' | sort`); + my %sum_grid_jobs; + $sum_grid_jobs{'r'} = 0; + $sum_grid_jobs{'Eqw'} = 0; + $sum_grid_jobs{'qw'} = 0; + $sum_grid_jobs{'t'} = 0; + $sum_grid_jobs{'other'} = 0; + my $grid_job_sum = 0; + $msg = "Cell Job Summary"; + + foreach my $state (@qstat_grid_jobs) { + chomp($state); + $grid_job_sum++; + if($state eq "r") { + $sum_grid_jobs{'r'}++; + } elsif($state eq "Eqw") { + $sum_grid_jobs{'Eqw'}++; + } elsif($state eq "qw") { + $sum_grid_jobs{'qw'}++; + } elsif($state eq "t") { + $sum_grid_jobs{'t'}++; + } else { + $sum_grid_jobs{'other'}++; + } + } + + $perf_data = "Sum=$grid_job_sum;0;0 r=$sum_grid_jobs{'r'};0;0 qw=$sum_grid_jobs{'qw'};0;0 Eqw=$sum_grid_jobs{'Eqw'};0;0 t=$sum_grid_jobs{'t'};0;0 others=$sum_grid_jobs{'other'};0;0"; +} + +sub qjs { + my @months = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"); + my @qstat_queue_info = split(" ",`source $sge_settings ; qstat -g c | sed '1,2d' | grep ^$queue\\ `); + my @jobs_id = split("\n",`source $sge_settings ; qstat | sed '1,2d' | grep $queue\@ | awk '{print \$1" "\$6" "\$7}'`); + my %diff; + $diff{'count'} = 0; + $diff{'sum'} = 0; + $msg = "$queue monitor"; + + foreach my $jobsid (@jobs_id) { + $diff{'count'}++; + chomp($jobsid); + my @jobsid_arr = split(" ",$jobsid); + my @submit_time_raw = split(" ",`source $sge_settings ; qstat -j $jobsid_arr[0] | grep ^submission_time: | awk '{print \$3" "\$4" "\$5" "\$6}'`); + my $mon_submit; + my $x = 1; + foreach my $month (@months) { + if($month eq $submit_time_raw[0]) { + $mon_submit = "$x"; + } + $x = $x + 1; + } + + my @submit_time_raw2 = split(":",$submit_time_raw[2]); + my @exec_time_raw2 = split(":",$jobsid_arr[2]); + my @exec_date_raw2 = split("/",$jobsid_arr[1]); + + ###time=timelocal($sec, $min, $hours, $day, $mon, $year) + my $submit_time=timelocal($submit_time_raw2[2], $submit_time_raw2[1], $submit_time_raw2[0], $submit_time_raw[1], $mon_submit, $submit_time_raw[3]); + my $exec_time=timelocal($exec_time_raw2[2], $exec_time_raw2[1], $exec_time_raw2[0], $exec_date_raw2[1], $exec_date_raw2[0], $exec_date_raw2[2]); + my $diff = $exec_time - $submit_time; + $diff{'sum'} = $diff{'sum'} + $diff; + } + my $job_avg; + if($diff{'sum'} == 0) { + $job_avg = 0; + } else { + $job_avg = $diff{'sum'} / $diff{'count'}; + } + my $avail = $qstat_queue_info[2] + $qstat_queue_info[4]; + $perf_data = "$perf_data $qstat_queue_info[0]_used=$qstat_queue_info[2];0;0 $qstat_queue_info[0]_total=$avail;0;0 job_waiting_avg=$job_avg\sec;0;0"; +} + + + + +if("$ARGV[0]" eq "cjs") { + cjs(); +} elsif("$ARGV[0]" eq "qjs") { + if($#ARGV < 1) { + FSyntaxError; + } + $queue = "$ARGV[1]"; + my $is_queue_exists = `source $sge_settings ; qstat -g c | sed '1,2d' | grep -q ^$queue\\ ; echo \$?`; + chomp($is_queue_exists); + if("0" ne "$is_queue_exists") { + FSyntaxError; + } + qjs(); + +} else { + FSyntaxError; +} + +print "$msg | $perf_data \n"; +exit(0); diff --git a/nagios/perf_ghs-float.sh b/nagios/perf_ghs-float.sh new file mode 100755 index 0000000..7a8dd9f --- /dev/null +++ b/nagios/perf_ghs-float.sh @@ -0,0 +1,110 @@ +#!/bin/bash + +##################################### +##################################### +### ______ _ =) ### +### | ___ \ | | ### +### | |_/ / __ _ _ __ | | ### +### | / / _` || '_ \ | | ### +### | |\ \| (_| || | | || |____ ### +### \_| \_|\__,_||_| |_|\_____/ ### +##################################### +##################################### + +# Info +# +# Get usage data from a GHS license server via the web managment console +# use mainly for performance monitoring + +function FError() { + echo "Syntax Error !" + echo "$0 [license server name] [port] [feature name] [/path/to/ghs/log/file]" + echo "port = port of the license web port" + exit 1 +} + +if [ $# != 4 ] +then + FError +fi + +if [ `echo $2 | grep -q ^[[:digit:]]*$ ; echo $?` != 0 ] +then + FError +fi + +if [ ! -f "$4" ] +then + FError +fi + +server="$1" +port="$2" +feature="$3" +log_file="$4" + +min=`date +%M | cut -c 2` +log_date_search="`date +%d``date +%b``date +%y` `date +%H`:`date +%M | cut -c 1`" +if [ $min -lt 5 ] +then + min_list="0 1 2 3 4" +else + min_list="5 6 7 8 9 10" +fi + +random_file=/tmp/$RANDOM +while_file=/tmp/$RANDOM +denied_file=/tmp/$RANDOM +export msg="$server:$port is up" +export perf_data="" + +if [ ! -f $log_file ] +then + echo "$log_file doesn't exists !" + exit 2 +fi + +wget http://$server:$port -q -O $random_file +if [ $? != 0 ] +then + msg="$server:$port is down" + echo "$msg" + exit 2 +fi + +cat $random_file | grep -v ^\< | grep -v ^$ | grep -v ^\ | sed -n '1,4!p' | sed -e 's///g' -e 's/<\/TD>//g' | sed -n /^$feature\$/,+2p > $while_file + +feature_exists=`head -n 1 $while_file | grep -q ^$feature$ ; echo $?` + +if [ $feature_exists != 0 ] +then + FError +fi + +export counter=0 +while read line +do + counter=`expr $counter + 1` + case $counter in + 2 ) + export total="$line" + ;; + 3 ) + export used="$line" + + # Missed Licensed request + for m in $min_list + do + grep "^${log_date_search}${m}" $log_file | grep "license denied: no $feature licenses available"$ | awk '{print $3}' >> $denied_file + done + miss_count=`awk '{print $1}' $denied_file | sort | uniq | wc -l` + + perf_data="total=${total};0;0 used=${used};0;0 missed_users=${miss_count};0;0" + ;; + esac + +done < $while_file + +rm -rf $random_file $denied_file $while_file +echo "$msg | ${perf_data}" +exit 0 diff --git a/nagios/pnp/check-cisco-cpu.php b/nagios/pnp/check-cisco-cpu.php new file mode 100755 index 0000000..e78195b --- /dev/null +++ b/nagios/pnp/check-cisco-cpu.php @@ -0,0 +1,33 @@ + diff --git a/nagios/pnp/check-cisco-fan.php b/nagios/pnp/check-cisco-fan.php new file mode 100755 index 0000000..1c9acc4 --- /dev/null +++ b/nagios/pnp/check-cisco-fan.php @@ -0,0 +1,19 @@ + diff --git a/nagios/pnp/check-cisco-freeint.php b/nagios/pnp/check-cisco-freeint.php new file mode 100755 index 0000000..a40f22f --- /dev/null +++ b/nagios/pnp/check-cisco-freeint.php @@ -0,0 +1,48 @@ + diff --git a/nagios/pnp/check-cisco-mem.php b/nagios/pnp/check-cisco-mem.php new file mode 100755 index 0000000..b1e14d9 --- /dev/null +++ b/nagios/pnp/check-cisco-mem.php @@ -0,0 +1,19 @@ + diff --git a/nagios/pnp/check-cisco-module.php b/nagios/pnp/check-cisco-module.php new file mode 100755 index 0000000..ceaa127 --- /dev/null +++ b/nagios/pnp/check-cisco-module.php @@ -0,0 +1,19 @@ + diff --git a/nagios/pnp/check-cisco-ps.php b/nagios/pnp/check-cisco-ps.php new file mode 100755 index 0000000..0dcad16 --- /dev/null +++ b/nagios/pnp/check-cisco-ps.php @@ -0,0 +1,19 @@ + diff --git a/nagios/pnp/check-cisco-totalbw.php b/nagios/pnp/check-cisco-totalbw.php new file mode 100755 index 0000000..5092d04 --- /dev/null +++ b/nagios/pnp/check-cisco-totalbw.php @@ -0,0 +1,37 @@ + diff --git a/nagios/pnp/check-juniper-vpn-load.php b/nagios/pnp/check-juniper-vpn-load.php new file mode 100755 index 0000000..8b35ad7 --- /dev/null +++ b/nagios/pnp/check-juniper-vpn-load.php @@ -0,0 +1,33 @@ + diff --git a/nagios/pnp/check-juniper-vpn-mem.php b/nagios/pnp/check-juniper-vpn-mem.php new file mode 100755 index 0000000..07c467d --- /dev/null +++ b/nagios/pnp/check-juniper-vpn-mem.php @@ -0,0 +1,55 @@ + diff --git a/nagios/pnp/check-juniper-vpn-swap.php b/nagios/pnp/check-juniper-vpn-swap.php new file mode 100755 index 0000000..0b0b4d2 --- /dev/null +++ b/nagios/pnp/check-juniper-vpn-swap.php @@ -0,0 +1,39 @@ + diff --git a/nagios/pnp/check-pineapp-inout.php b/nagios/pnp/check-pineapp-inout.php new file mode 100755 index 0000000..fa033b2 --- /dev/null +++ b/nagios/pnp/check-pineapp-inout.php @@ -0,0 +1,37 @@ + diff --git a/nagios/pnp/check-pineapp-load.php b/nagios/pnp/check-pineapp-load.php new file mode 100755 index 0000000..3180876 --- /dev/null +++ b/nagios/pnp/check-pineapp-load.php @@ -0,0 +1,33 @@ + diff --git a/nagios/pnp/check-pineapp-queue.php b/nagios/pnp/check-pineapp-queue.php new file mode 100755 index 0000000..c2d539c --- /dev/null +++ b/nagios/pnp/check-pineapp-queue.php @@ -0,0 +1,49 @@ + diff --git a/nagios/pnp/check_cpus_linux.php b/nagios/pnp/check_cpus_linux.php new file mode 100755 index 0000000..e767e38 --- /dev/null +++ b/nagios/pnp/check_cpus_linux.php @@ -0,0 +1,66 @@ + '#00CC00', + 'nice' => '#000000', + 'sys' => '#6600FF', + 'system' => '#6600FF', + 'iowait' => '#FF0000', + 'irq' => '#663300', + 'soft' => '#FFFF00', + 'steal' => '#4596DD', + 'idle' => '#4557DD', + 'guest' => '#A445DD', + 'idle' => '#66FFCC', +); + + +$current = 0; +$var = 0; + +foreach ($DS as $i) { + if($NAME[$i] == 'user' ) { + $current = $i; + $var = 1; + $vlabel = ""; + if ($UNIT[$i] == "%%") { + $vlabel = "%"; + } + else { + $vlabel = $UNIT[$i]; + } + + $opt[$current] = '--lower-limit 0 --upper-limit 100 --vertical-label "' . $vlabel . '" --title "' . $hostname . ' / ' . $servicedesc . '"' . $lower; + + $def[$current] = "DEF:var$var=$rrdfile:$DS[$i]:AVERAGE "; +// $def[$current] .= "AREA:var$var" . _AREA . ":\"$NAME[$i] \" "; + $def[$current] .= "LINE3:var$var" . $colors[$NAME[$i]] . ":\"$NAME[$i] \" "; + $def[$current] .= "GPRINT:var$var:LAST:\"%3.4lf $UNIT[$i] LAST \" "; + $def[$current] .= "GPRINT:var$var:MAX:\"%3.4lf $UNIT[$i] MAX \" "; + $def[$current] .= "GPRINT:var$var:AVERAGE:\"%3.4lf $UNIT[$i] AVERAGE \\n\" "; + } else { + $var = $var + 1; + $def[$current] .= "DEF:var$var=$rrdfile:$DS[$i]:AVERAGE "; + $def[$current] .= "LINE3:var$var" . $colors[$NAME[$i]] . ":\"$NAME[$i] \" "; + $def[$current] .= "GPRINT:var$var:LAST:\"%3.4lf $UNIT[$i] LAST \" "; + $def[$current] .= "GPRINT:var$var:MAX:\"%3.4lf $UNIT[$i] MAX \" "; + $def[$current] .= "GPRINT:var$var:AVERAGE:\"%3.4lf $UNIT[$i] AVERAGE \\n\" "; + } +} +?> diff --git a/nagios/pnp/check_flexlm_new.php b/nagios/pnp/check_flexlm_new.php new file mode 100755 index 0000000..35f1504 --- /dev/null +++ b/nagios/pnp/check_flexlm_new.php @@ -0,0 +1,19 @@ + diff --git a/nagios/pnp/check_load_srv.php b/nagios/pnp/check_load_srv.php new file mode 100755 index 0000000..3180876 --- /dev/null +++ b/nagios/pnp/check_load_srv.php @@ -0,0 +1,33 @@ + diff --git a/nagios/pnp/perf-ghs-float.php b/nagios/pnp/perf-ghs-float.php new file mode 100755 index 0000000..b7bb64f --- /dev/null +++ b/nagios/pnp/perf-ghs-float.php @@ -0,0 +1,30 @@ + diff --git a/nagios/pnp/perf-sge-cjs.php b/nagios/pnp/perf-sge-cjs.php new file mode 100755 index 0000000..8cb2db8 --- /dev/null +++ b/nagios/pnp/perf-sge-cjs.php @@ -0,0 +1,67 @@ + diff --git a/nagios/pnp/perf-sge-qjs.php b/nagios/pnp/perf-sge-qjs.php new file mode 100755 index 0000000..818895e --- /dev/null +++ b/nagios/pnp/perf-sge-qjs.php @@ -0,0 +1,43 @@ + diff --git a/zabbix/scripts/activemq-monitor.py b/zabbix/scripts/activemq-monitor.py new file mode 100755 index 0000000..6762e14 --- /dev/null +++ b/zabbix/scripts/activemq-monitor.py @@ -0,0 +1,161 @@ +#!/usr/bin/env python + +''' +Monitor ActiveMQ server via its http web interface +''' + +from HTMLParser import HTMLParser +from optparse import OptionParser +import xml.etree.ElementTree as ET +import json +import urllib2 +import urllib + +# Functions & Classes +def prepareOpts(): + ''' + Parse option from the shell + ''' + + cmds = ['queue_prop', 'discovery', 'subscriber_exists'] + datas = ['size', 'consumerCount', 'enqueueCount', 'dequeueCount'] + + def err( string ): + print 'Error: {0}'.format( string ) + parser.print_help() + print __doc__ + exit(1) + + parser = OptionParser() + parser.add_option('-s', '--server', dest='server', type='string', help='ActiveMQ fqdn or ip', default='localhost') + parser.add_option('-p', '--port', dest='port', type='int', help='ActiveMQ web interface port', default=8161) + parser.add_option('-t', '--timeout', dest='timeout', type='float', help='how many seconds to wait for each http request', default=5) + parser.add_option('-c', '--cmd', dest='cmd', type='choice', choices=cmds, help='what to check: {0}'.format(cmds) ) + parser.add_option('-q', '--queue', dest='queue', type='string', help='the name of the queue (implies -c queue_prop or -c subscriber_exists)') + parser.add_option('-d', '--data', dest='data', type='choice', choices=datas, help='the name of the property to return {0} (implies -c queue_prop or -c subscriber_exists)'.format(datas) ) + parser.add_option('-C', '--client', dest='client', type='string', help='the client prefix to search (implies -c subscriber_exists and -q)' ) + (opts, args) = parser.parse_args() + + + if not opts.cmd: + err('missing -c') + + if opts.cmd == 'queue_prop' and (not opts.queue or not opts.data): + err('missing -q or -d') + elif opts.cmd == 'subscriber_exists' and ( not opts.queue or not opts.client ): + err('missing -q or -C') + + return opts + +class ConsumerHTMLParser(HTMLParser): + ''' + Parse the consumers id from http://url/admin/queueConsumers.jsp?JMSDestination=QUEUENAME + ''' + + consumers = [] + table = False + body = False + tr = False + td = False + a = False + + def reset_vars(self): + ConsumerHTMLParser.consumers = [] + ConsumerHTMLParser.table = False + ConsumerHTMLParser.body = False + ConsumerHTMLParser.tr = False + ConsumerHTMLParser.td = False + ConsumerHTMLParser.a = False + + def handle_starttag(self, tag, attrs): + if ConsumerHTMLParser.td and tag == 'a': + ConsumerHTMLParser.a = True + elif ConsumerHTMLParser.tr and tag == 'td': + ConsumerHTMLParser.td = True + elif ConsumerHTMLParser.body and tag == 'tr': + ConsumerHTMLParser.tr = True + elif ConsumerHTMLParser.table and tag == 'tbody': + ConsumerHTMLParser.body = True + elif tag == 'table': + ConsumerHTMLParser.table = ('id', 'messages') in attrs + + def handle_data(self, data): + if ConsumerHTMLParser.a: + tmp = data.split('-')[0] + if not tmp in ConsumerHTMLParser.consumers: + ConsumerHTMLParser.consumers.append( tmp ) + ConsumerHTMLParser.a = False + ConsumerHTMLParser.td = False + ConsumerHTMLParser.tr = False + + def get_consumers(self): + return ConsumerHTMLParser.consumers + + +class ActivemqMonitor(): + ''' + Monitor ActiveMQ via http web interface + ''' + + def __init__(self, server, port, timeout): + self.url = 'http://{0}:{1}'.format(server, port) + self.server = server + self.port = port + self.timeout = timeout + + def discovery(self, **kwargs): + ''' + return a json of all the queues in the server + ''' + ret = {"data": []} + for q in ET.fromstring( urllib2.urlopen(self.url+'/admin/xml/queues.jsp', timeout=self.timeout).read() ).findall('queue'): + ret['data'].append( { + '{#ACTIVEMQ_Q}': q.get('name') + } + ) + return ret + + def queue_prop(self, **kwargs): + ''' + return the property of the queue in the server + ''' + for q in ET.fromstring( urllib2.urlopen(self.url+'/admin/xml/queues.jsp', timeout=self.timeout).read() ).findall('queue'): + if q.get('name') == kwargs['queue']: + return int(q.find('stats').get(kwargs['data'])) + + return 'couldnt find the queue' + + def subscriber_exists(self, **kwargs): + ''' + check if the clientid is configured as a subscriber on the queue + ''' + + url = '{0}/admin/queueConsumers.jsp?{1}'.format( + self.url, + urllib.urlencode( { 'JMSDestination': kwargs['queue'] } ), + ) + consumer_parser = ConsumerHTMLParser() + consumer_parser.feed( urllib2.urlopen(url, timeout=self.timeout).read() ) + + if kwargs['client'] in consumer_parser.get_consumers(): + return 1 + else: + return 0 + + +# Global Settings +opts = prepareOpts() +monitor = ActivemqMonitor( opts.server, opts.port, opts.timeout ) +k = { + 'queue': opts.queue, + 'data': opts.data, + 'client': opts.client, +} + +# Do the work +method = getattr(monitor, opts.cmd) +res = method(**k) +if type(res) is dict: + print json.dumps( res ) +else: + print res diff --git a/zabbix/scripts/list_ips.py b/zabbix/scripts/list_ips.py new file mode 100755 index 0000000..7371e36 --- /dev/null +++ b/zabbix/scripts/list_ips.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +''' +Uses the zabbix python api to retrieve a list the all servers names & ips + +Need to configure the server, username & passwords settings +''' + +from zabbix_api import ZabbixAPI + +server="https://url.of.zabbix.site" +username="user of read on all hosts" +password="pass" + +zapi = ZabbixAPI(server=server, path="") +zapi.login(username, password) + +hosts=zapi.host.get({"selectInterfaces": "extend", "output": "extend"}) +for host in hosts: + for int in host['interfaces']: + print "{}\t{}".format(host['host'],host['interfaces'][int]['ip']) + break diff --git a/zabbix/scripts/rss.py b/zabbix/scripts/rss.py new file mode 100755 index 0000000..c8dc9d5 --- /dev/null +++ b/zabbix/scripts/rss.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python27 + +''' +Info: +This python script is used as an Zabbix alert script to create simple RSS feed +of the notifications + +To make it work: +- Configure the Settings section in the script +- add as an alert script in zabbix + - notice that the subject won't be in the rss, only the message +- add the xml code below to the rssFile + + + en + + +''' + +# libs +import xml.etree.ElementTree as ET +import datetime +import sys + +# Settings +link_data = "https://path/to/zabbix/tr_status.php?form_refresh=1&groupid=0&hostid=0&fullscreen=1" +rssFile = "/path/to/zabbix/web/interface/rss" +item_2_keep = 20 +title_data = sys.argv[3] + +# get root +tree = ET.parse(rssFile) +root = tree.getroot() + +# update time +root[0][4].text = str(datetime.datetime.now()) + +# add new item +new_item = ET.SubElement(root[0],"item") +title = ET.SubElement(new_item,"title") +title.text = str(title_data) +link = ET.SubElement(new_item,"link") +link.text = str(link_data) + +# keep only x latest items +itemRoot = root[0] +items = itemRoot.findall('item') +i=0 +for item in items: + i=i+1 + if i > len(items)-item_2_keep: + break + itemRoot.remove(item) + + +# write to file +tree.write(rssFile) diff --git a/zabbix/scripts/smx-bundle.py b/zabbix/scripts/smx-bundle.py new file mode 100755 index 0000000..5e93a3d --- /dev/null +++ b/zabbix/scripts/smx-bundle.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python +''' +Info: +check via ssh if a bundle is in Active mode +in an Apache ServiceMix setup +''' + +import argparse +import subprocess +import re + +# Functions +def myShell(cmd): + """ + will execute the cmd in a Shell and will return the hash res + res['out'] -> array of the stdout (bylines) + res['err'] -> same as above only stderr + res['exit'] -> the exit code of the command + """ + + res = {} + proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=None) + tmp = proc.communicate() + res['out'] = tmp[0].splitlines() + res['err'] = tmp[1].splitlines() + res['exit'] = proc.returncode + return res + + +# Parser +parser = argparse.ArgumentParser(description="check via ssh-smx if the bundle is in Active mode in an Apache ServiceMix setup") +parser.add_argument("srv", type=str, help="hostname or ip of the smx server") +parser.add_argument("port", type=int, help="port of the smx daemon") +parser.add_argument("user", type=str, help="servicemix username") +parser.add_argument("passwd", type=str, help="servicemix password") +parser.add_argument("bundle", type=str, help="bundle name") +args = parser.parse_args() + +# Settings +ssh = "timeout 3 sshpass -p "+str(args.passwd)+" ssh -l "+str(args.user)+" -o ConnectTimeout=3 -o StrictHostKeyChecking=no -p "+str(args.port)+" "+args.srv+" osgi:list" + +# Start script +output = myShell(ssh) +if output['exit'] != 0: + print 0 + exit(1) + +output['out'].pop(0) +output['out'].pop(0) + +found = False +for line in output['out']: + if re.search('\[Active', line): + linePars = line.split("]") + name = linePars.pop() + name.strip() + if re.search(re.escape(args.bundle), name): + found = True + break + +if found: + print 1 +else: + print 0 + diff --git a/zabbix/scripts/solr.py b/zabbix/scripts/solr.py new file mode 100755 index 0000000..913700d --- /dev/null +++ b/zabbix/scripts/solr.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python + +''' +Monitor Apache Solr via HTTP for Zabbix +''' + +from optparse import OptionParser +import xml.etree.ElementTree as ET +import urllib2 + + +def prepareOpts(): + ''' + Parse option from the shell + ''' + + cmds = [ + 'ping', + 'dataimportDocumentsProcessed', + 'indexBehindMaster' + ] + + def err( string ): + print 'Error: {0}'.format( string ) + parser.print_help() + print __doc__ + exit(1) + + parser = OptionParser() + parser.add_option('-u', '--url', dest='url', type='string', help='solr url', default=None) + parser.add_option('-U', '--user', dest='user', type='string', help='username', default=None) + parser.add_option('-P', '--passwd', dest='passwd', type='string', help='password', default=None) + parser.add_option('-t', '--timeout', dest='timeout', type='float', help='how many seconds to wait for each http request', default=5) + parser.add_option('-c', '--cmd', dest='cmd', type='choice', choices=cmds, help='what to check: {0}'.format(cmds) ) + parser.add_option('-C', '--core', dest='core', type='string', help='core id', default=None) + parser.add_option('-H', '--handler', dest='handler', type='string', help='dataimport handler name', default=None) + (opts, args) = parser.parse_args() + + if not opts.cmd: + err('missing -c') + if (opts.user and not opts.passwd) or (not opts.user and opts.passwd): + err('missing username or password') + if not opts.url: + err('missing solr http url') + if opts.cmd == 'dataimportDocumentsProcessed': + if opts.core is None: + err('missing core id !') + if opts.handler is None: + err('missing handler name !') + + return opts + + +class SolrMonitor(): + ''' + Monitor Apache Solr via http + ''' + + def __init__(self, url, timeout=5, username=None, passwd=None): + self.url = url + self.timeout = timeout + self.username = username + self.passwd = passwd + + if self.url.endswith('/'): + self.url = self.url[:-1] + + self._get_auth() + + def _get_auth(self): + ''' + Build an Auth opener for HTTP connection + ''' + if not self.username or not self.passwd: + return + basic = urllib2.HTTPBasicAuthHandler() + basic.add_password( + realm='Solr', + uri=self.url, + user=self.username, + passwd=self.passwd + ) + digest = urllib2.HTTPDigestAuthHandler() + digest.add_password( + realm='Solr', + uri=self.url, + user=self.username, + passwd=self.passwd + ) + + urllib2.install_opener( + urllib2.build_opener(basic, digest)) + + def _getXmlData(self, url): + ''' + create an http request to url and return the data + in case of a problem return None + ''' + + try: + return ET.fromstring( + urllib2.urlopen( + url, + timeout=self.timeout + ).read() + ) + except urllib2.URLError: + return None + + def ping(self): + ''' + Check if solr ping returns True + ''' + + ret = 0 + root = self._getXmlData(self.url + '/admin/ping') + if root is None: + return 0 + + if root.find('str').text == 'OK': + ret = 1 + + return ret + + def dataimportDocumentsProcessed(self, core, handler): + ''' + Return the number of processed documents + from the dataimport handler + + url: http://solr:port/solr/core0/dataimportName?command=status + ''' + + url = '{0}/{1}/{2}?command=status'.format( + self.url, + core, + handler + ) + root = self._getXmlData(url) + if root is None: + return -1 + + for lst in root.findall('lst'): + if lst.attrib['name'] == 'statusMessages': + for str in lst.findall('str'): + if str.attrib['name'] == 'Total Documents Processed': + return int(str.text) + + return -1 + +# Python 2.7 +# return int( +# root.findall( +# "lst[@name='statusMessages']/str[@name='Total Documents Processed']" +# )[0].text +# ) + + def indexBehindMaster(self): + ''' + Returns the difference bewteen the slave index + and the master replicable index + ''' + + slave = None + master = None + root = self._getXmlData( + self.url + '/replication?command=details' + ) + if root is None: + return -1 + + for lst in root.findall('lst'): + if lst.attrib['name'] == 'details': + + # Slave + for lng in lst.findall('long'): + if lng.attrib['name'] == 'indexVersion': + slave = long(lng.text) + break + + # Master + for lstm in lst.findall('lst'): + if lstm.attrib['name'] == 'slave': + for lstms in lstm.findall('lst'): + if lstms.attrib['name'] == 'masterDetails': + for lstMaster in lstms.findall('lst'): + if lstMaster.attrib['name'] == 'master': + for rep in lstMaster.findall('long'): + if rep.attrib['name'] == 'replicableVersion': + master = long(rep.text) + break + + if master and slave: + break + +# Python 2.7 +# slave = root.findall( +# "./*[@name='details']/arr[@name='commits']/lst/long[@name='indexVersion']" +# )[0].text +# master = root.findall( +# "./lst[@name='details']/lst[@name='slave']/lst[@name='masterDetails']/lst[@name='master']/long[@name='replicableVersion']" +# )[0].text + return long(master - slave) + + @staticmethod + def main(): + ''' + Main function + ''' + + opts = prepareOpts() + solr = SolrMonitor( opts.url, opts.timeout, opts.user, opts.passwd ) + + method = getattr(solr, opts.cmd) + k = {} + if opts.core: + k.update({'core': opts.core}) + if opts.handler: + k.update({'handler': opts.handler}) + print method(**k) + + +if __name__ == '__main__': + SolrMonitor.main() diff --git a/zabbix/user_param/apache.conf b/zabbix/user_param/apache.conf new file mode 100644 index 0000000..c52c99a --- /dev/null +++ b/zabbix/user_param/apache.conf @@ -0,0 +1,21 @@ +#################### +### Apache HTTPD ### +#################### +# get data from mod_status +# $1 - Variable name +UserParameter=apache.server-status[*],data=$(wget --no-check-certificate http://localhost/server-status?auto -O - -q --timeout=3 -t 1 | grep ^"$1:" | awk '{print $NF}') ; [ "$data" == "" ] && data=0 ; echo $data | sed 's/^\./0./' +# count a scoreboard status from mod_status +# $1 : +# "_" Waiting for Connection +# "S" Starting up +# "R" Reading Request +# "W" Sending Reply +# "K" Keepalive (read) +# "D" DNS Lookup +# "C" Closing connection +# "L" Logging +# "G" Gracefully finishing, +# "I" Idle cleanup of worker +# "." Open slot with no current process +UserParameter=apache.scoreboard[*],wget --no-check-certificate http://localhost/server-status?auto -O - -q --timeout=3 -t 1 | grep ^Scoreboard: | awk '{print $NF}' | grep -o '\'$1 | wc -l + diff --git a/zabbix/user_param/fs_discovery.conf b/zabbix/user_param/fs_discovery.conf new file mode 100644 index 0000000..935206f --- /dev/null +++ b/zabbix/user_param/fs_discovery.conf @@ -0,0 +1,5 @@ +########################## +### / & /mnt Discovery ### +########################## +UserParameter=mount.discovery,echo { \"data\":[ { \"{#MOUNT_NAME}\":\"\\/\", \"{#MOUNT_DEVICE}\":\"$(df / | sed -n '2p' | awk '{print $1}' | sed 's/\//\\\//g')\" }, { \"{#MOUNT_NAME}\":\"\\/mnt\", \"{#MOUNT_DEVICE}\":\"$(df /mnt | sed -n '2p' | awk '{print $1}' | sed 's/\//\\\//g')\" } ] } + diff --git a/zabbix/user_param/mysql.conf b/zabbix/user_param/mysql.conf new file mode 100644 index 0000000..ddfce7a --- /dev/null +++ b/zabbix/user_param/mysql.conf @@ -0,0 +1,21 @@ +#################### +### MySQL Server ### +#################### +# GRANT SELECT ON *.* TO zabbix@localhost IDENTIFIED BY '*******'; +# 1 - user +# 2 - password +UserParameter=mysql.com_select[*],data=$(mysql --connect_timeout 2 -N -u $1 -p$2 -e "SHOW GLOBAL STATUS where Variable_name = 'Com_select';" 2> /dev/null | awk '{print $NF}') ; [ -z "$data" ] && data=0 ; echo $data +UserParameter=mysql.qcache_hits[*],data=$(mysql --connect_timeout 2 -N -u $1 -p$2 -e "SHOW GLOBAL STATUS where Variable_name = 'Qcache_hits';" 2> /dev/null | awk '{print $NF}') ; [ -z "$data" ] && data=0 ; echo $data +UserParameter=mysql.threads_connected[*],data=$(mysql --connect_timeout 2 -N -u $1 -p$2 -e "SHOW GLOBAL STATUS where Variable_name = 'Threads_connected';" 2> /dev/null | awk '{print $NF}') ; [ -z "$data" ] && data=0 ; echo $data +UserParameter=mysql.table_locks_waited[*],data=$(mysql--connect_timeout 2 -N -u $1 -p$2 -e "SHOW GLOBAL STATUS where Variable_name = 'Table_locks_waited';" 2> /dev/null | awk '{print $NF}') ; [ -z "$data" ] && data=0 ; echo $data +UserParameter=mysql.created_tmp_tables[*],data=$(mysql --connect_timeout 2 -N -u $1 -p$2 -e "SHOW GLOBAL STATUS where Variable_name = 'Created_tmp_tables';" 2> /dev/null | awk '{print $NF}') ; [ -z "$data" ] && data=0 ; echo $data +UserParameter=mysql.created_tmp_disk_tables[*],data=$(mysql --connect_timeout 2 -N -u $1 -p$2 -e "SHOW GLOBAL STATUS where Variable_name = 'Created_tmp_disk_tables';" 2> /dev/null | awk '{print $NF}') ; [ -z "$data" ] && data=0 ; echo $data +UserParameter=mysql.slow_queries[*],data=$(mysql --connect_timeout 2 -N -u $1 -p$2 -e "SHOW GLOBAL STATUS where Variable_name = 'Slow_queries';" 2> /dev/null | awk '{print $NF}') ; [ -z "$data" ] && data=0 ; echo $data +UserParameter=mysql.aborted_connects[*],data=$(mysql --connect_timeout 2 -N -u $1 -p$2 -e "SHOW GLOBAL STATUS where Variable_name = 'Aborted_connects';" 2> /dev/null | awk '{print $NF}') ; [ -z "$data" ] && data=0 ; echo $data +UserParameter=mysql.innodb_buffer_pool_read_requests[*],data=$(mysql --connect_timeout 2 -N -u $1 -p$2 -e "SHOW GLOBAL STATUS where Variable_name = 'Innodb_buffer_pool_read_requests';" 2> /dev/null | awk '{print $NF}') ; [ -z "$data" ] && data=0 ; echo $data +UserParameter=mysql.innodb_buffer_pool_reads[*],data=$(mysql --connect_timeout 2 -N -u $1 -p$2 -e "SHOW GLOBAL STATUS where Variable_name = 'Innodb_buffer_pool_reads';" 2> /dev/null | awk '{print $NF}') ; [ -z "$data" ] && data=0 ; echo $data +UserParameter=mysql.slave_io_running[*],mysql --connect_timeout 2 -u $1 -p$2 -e "SHOW SLAVE STATUS\G;" 2> /dev/null | sed '1d' |grep Slave_IO_Running | awk '{print $NF}' | grep -c Yes +UserParameter=mysql.slave_sql_running[*],mysql --connect_timeout 2 -u $1 -p$2 -e "SHOW SLAVE STATUS\G;" 2> /dev/null | sed '1d' |grep Slave_SQL_Running | awk '{print $NF}' | grep -c Yes +UserParameter=mysql.seconds_behind_master[*],data=$(mysql --connect_timeout 2 -u $1 -p$2 -e "SHOW SLAVE STATUS\G;" 2> /dev/null | sed '1d' |grep Seconds_Behind_Master | awk '{print $NF}') ; [ -z "$data" ] && data=0 ; echo $data +UserParameter=mysql.slave_io_last_error[*],msg=$(mysql --connect_timeout 2 -u $1 -p$2 -e "SHOW SLAVE STATUS\G;" 2> /dev/null | sed '1d' | grep Last_IO_Error: | sed 's/\s*Last_IO_Error: //g') ; [ -z "$msg" ] && msg="-1" ; echo $msg +UserParameter=mysql.slave_sql_last_error[*],msg=$(mysql --connect_timeout 2 -u $1 -p$2 -e "SHOW SLAVE STATUS\G;" 2> /dev/null | sed '1d' | grep Last_SQL_Error: | sed 's/\s*Last_SQL_Error: //g') ; [ -z "$msg" ] && msg="-1" ; echo $msg diff --git a/zabbix/user_param/solr.conf b/zabbix/user_param/solr.conf new file mode 100644 index 0000000..bb336a6 --- /dev/null +++ b/zabbix/user_param/solr.conf @@ -0,0 +1,8 @@ +############ +### Solr ### +############ +UserParameter=solr.ping[*],wget -q -O - --timeout=3 -t 1 $1/admin/ping 2> /dev/null | grep -c "OK" +UserParameter=solr.slave_up[*],wget -q -O - --timeout=3 -t 1 $1/admin/replication/index.jsp 2> /dev/null |grep -A 3 'Master' | tail -n 1 | sed 's/\s//g' | wc -l +UserParameter=solr.slave_index_behind_master[*],out=$(expr $(echo $( wget $1/admin/replication/index.jsp -q -O - --timeout=3 -t 1 2> /dev/null |grep 'Index Version:' | grep -v 'Latest' | awk '{print $$3}' | grep -E -o "[0-9]+") | sed 's/\ /\ -\ /g' )) ; [ -z "$out" ] && out=0 ; echo $out +UserParameter=solr.docs_indexing[*],docs=$(wget $1/dataimport -q -O - --timeout=3 -t 1 2> /dev/null | grep -o '[0-9]*' | sed -e 's///g' -e 's/<\/str>//g') ; [ -z "$docs" ] && docs=0 ; echo $docs +