git-svn-id: svn://192.168.202.10@2888 3d104415-ff17-0410-8863-d5cf3c621b8a
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
Alias /homer "/srv/www/vhosts/homer"
|
||||
|
||||
<Directory /srv/www/vhosts/homer/>
|
||||
Options Indexes FollowSymLinks MultiViews
|
||||
AllowOverride all
|
||||
Require all granted
|
||||
</Directory>
|
||||
@@ -0,0 +1,26 @@
|
||||
<IfDefine SMOKEPING>
|
||||
# please read how to enable smokeping be a lot faster in
|
||||
# /usr/share/doc/packages/smokeping/README.SUSE
|
||||
Alias /smokeping/cache /var/lib/smokeping/cache
|
||||
<IfModule mod_fastcgi.c>
|
||||
<Location /cgi-bin/smokeping>
|
||||
SetHandler fastcgi-script
|
||||
Require all granted
|
||||
</Location>
|
||||
</IfModule>
|
||||
<Directory /var/lib/smokeping/cache>
|
||||
Options None
|
||||
AllowOverride None
|
||||
Require all denied
|
||||
Require ip 127.0.0.1
|
||||
Require ip 192.168.0.0/16
|
||||
Require ip 10.0.0.0/8
|
||||
Require ip ::1
|
||||
</Directory>
|
||||
</IfDefine>
|
||||
|
||||
# this code will forbid access to frontend
|
||||
# no need to remove it in case when system is not configured correctly
|
||||
<IfDefine !SMOKEPING>
|
||||
Redirect 403 /cgi-bin/smokeping
|
||||
</IfDefine>
|
||||
Binary file not shown.
@@ -0,0 +1,149 @@
|
||||
#! /bin/sh
|
||||
# Copyright (C) 2018 James Pearson <jamesp@vicidial.com> LICENSE: AGPLv2
|
||||
# All rights reserved.
|
||||
#
|
||||
# Author: James Pearson <jamesp@vicidial.com
|
||||
#
|
||||
# /etc/init.d/homersips
|
||||
#
|
||||
### BEGIN INIT INFO
|
||||
# Provides: homersips
|
||||
# Required-Start: $network $remote_fs
|
||||
# Should-Start: mysql
|
||||
# Required-Stop: $network $remote_fs
|
||||
# Should-Stop: mysql
|
||||
# Default-Start: 3 5
|
||||
# Default-Stop: 0 1 2 6
|
||||
# Short-Description: HomerSIPS
|
||||
# Description: Start OpenSIPS for HOMER SIP capture
|
||||
### END INIT INFO
|
||||
|
||||
# Check for missing binaries (stale symlinks should not happen)
|
||||
# Copy over new opensips binary for homersips if it exists
|
||||
HOMERSIPS_BIN=/usr/sbin/homersips
|
||||
OPENSIPS_BIN=/usr/sbin/opensips
|
||||
OPENMD5=`md5sum ${OPENSIPS_BIN} | awk '{ print $1 }'`
|
||||
HOMERMD5=`md5sum ${HOMERSIPS_BIN} | awk '{ print $1 }'`
|
||||
if [ $OPENMD5 != $HOMERMD5 ]
|
||||
then
|
||||
echo "Copying new opensips binary to homersips"
|
||||
cp $OPENSIPS_BIN $HOMERSIPS_BIN
|
||||
chmod 755 $HOMERSIPS_BIN
|
||||
fi
|
||||
test -x $HOMERSIPS_BIN || exit 5
|
||||
|
||||
# Check for existence of needed config file and read it
|
||||
HOMERSIPS_CONFIG=/etc/opensips/homer.cfg
|
||||
test -r $HOMERSIPS_CONFIG || exit 6
|
||||
#. $HOMERSIPS_CONFIG
|
||||
|
||||
# Shell functions sourced from /etc/rc.status:
|
||||
# rc_check check and set local and overall rc status
|
||||
# rc_status check and set local and overall rc status
|
||||
# rc_status -v ditto but be verbose in local rc status
|
||||
# rc_status -v -r ditto and clear the local rc status
|
||||
# rc_status -s display "skipped" and exit with status 3
|
||||
# rc_status -u display "unused" and exit with status 3
|
||||
# rc_failed set local and overall rc status to failed
|
||||
# rc_failed <num> set local and overall rc status to <num>
|
||||
# rc_reset clear local rc status (overall remains)
|
||||
# rc_exit exit appropriate to overall rc status
|
||||
# rc_active checks whether a service is activated by symlinks
|
||||
# rc_splash arg sets the boot splash screen to arg (if active)
|
||||
. /etc/rc.status
|
||||
|
||||
# Reset status of this service
|
||||
rc_reset
|
||||
|
||||
# Return values acc. to LSB for all commands but status:
|
||||
# 0 - success
|
||||
# 1 - generic or unspecified error
|
||||
# 2 - invalid or excess argument(s)
|
||||
# 3 - unimplemented feature (e.g. "reload")
|
||||
# 4 - user had insufficient privileges
|
||||
# 5 - program is not installed
|
||||
# 6 - program is not configured
|
||||
# 7 - program is not running
|
||||
# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
|
||||
#
|
||||
# Note that starting an already running service, stopping
|
||||
# or restarting a not-running service as well as the restart
|
||||
# with force-reload (in case signaling is not supported) are
|
||||
# considered a success.
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
echo -n "Starting HomerSIPS "
|
||||
## Start daemon with startproc(8). If this fails
|
||||
## the return value is set appropriately by startproc.
|
||||
/sbin/startproc $HOMERSIPS_BIN -f $HOMERSIPS_CONFIG
|
||||
|
||||
# Remember status and be verbose
|
||||
rc_status -v
|
||||
;;
|
||||
stop)
|
||||
echo -n "Shutting down HomerSIPS "
|
||||
## Stop daemon with killproc(8) and if this fails
|
||||
## killproc sets the return value according to LSB.
|
||||
/sbin/killproc -TERM $HOMERSIPS_BIN
|
||||
|
||||
# Remember status and be verbose
|
||||
rc_status -v
|
||||
;;
|
||||
restart)
|
||||
## Stop the service and regardless of whether it was
|
||||
## running or not, start it again.
|
||||
$0 stop
|
||||
$0 start
|
||||
|
||||
# Remember status and be quiet
|
||||
rc_status
|
||||
;;
|
||||
force-reload)
|
||||
## Signal the daemon to reload its config. Most daemons
|
||||
## do this on signal 1 (SIGHUP).
|
||||
## If it does not support it, restart.
|
||||
|
||||
echo -n "Reload service OpenSIPS "
|
||||
## Otherwise:
|
||||
$0 stop && $0 start
|
||||
|
||||
# Remember status and be quiet
|
||||
rc_status
|
||||
;;
|
||||
reload)
|
||||
## Like force-reload, but if daemon does not support
|
||||
## signaling, do nothing (!)
|
||||
|
||||
## Otherwise if it does not support reload:
|
||||
rc_failed 3
|
||||
|
||||
# Remember status and be verbose
|
||||
rc_status -v
|
||||
;;
|
||||
status)
|
||||
echo -n "Checking for service HomerSIPS "
|
||||
## Check status with checkproc(8), if process is running
|
||||
## checkproc will return with exit status 0.
|
||||
|
||||
# Return value is slightly different for the status command:
|
||||
# 0 - service up and running
|
||||
# 1 - service dead, but /var/run/ pid file exists
|
||||
# 2 - service dead, but /var/lock/ lock file exists
|
||||
# 3 - service not running (unused)
|
||||
# 4 - service status unknown :-(
|
||||
# 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)
|
||||
|
||||
# NOTE: checkproc returns LSB compliant status values.
|
||||
/sbin/checkproc $HOMERSIPS_BIN
|
||||
# NOTE: rc_status knows that we called this init script with
|
||||
# "status" option and adapts its messages accordingly.
|
||||
# Remember status and be verbose
|
||||
rc_status -v
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 {start|stop|status|restart}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
rc_exit
|
||||
@@ -0,0 +1 @@
|
||||
object IcingaApplication "app" { }
|
||||
@@ -0,0 +1,38 @@
|
||||
/* Command objects */
|
||||
|
||||
object NotificationCommand "mail-host-notification" {
|
||||
command = [ SysconfDir + "/icinga2/scripts/mail-host-notification.sh" ]
|
||||
|
||||
env = {
|
||||
NOTIFICATIONTYPE = "$notification.type$"
|
||||
HOSTALIAS = "$host.display_name$"
|
||||
HOSTADDRESS = "$address$"
|
||||
HOSTSTATE = "$host.state$"
|
||||
LONGDATETIME = "$icinga.long_date_time$"
|
||||
HOSTOUTPUT = "$host.output$"
|
||||
NOTIFICATIONAUTHORNAME = "$notification.author$"
|
||||
NOTIFICATIONCOMMENT = "$notification.comment$"
|
||||
HOSTDISPLAYNAME = "$host.display_name$"
|
||||
USEREMAIL = "$user.email$"
|
||||
}
|
||||
}
|
||||
|
||||
object NotificationCommand "mail-service-notification" {
|
||||
command = [ SysconfDir + "/icinga2/scripts/mail-service-notification.sh" ]
|
||||
|
||||
env = {
|
||||
NOTIFICATIONTYPE = "$notification.type$"
|
||||
SERVICEDESC = "$service.name$"
|
||||
HOSTALIAS = "$host.display_name$"
|
||||
HOSTADDRESS = "$address$"
|
||||
SERVICESTATE = "$service.state$"
|
||||
LONGDATETIME = "$icinga.long_date_time$"
|
||||
SERVICEOUTPUT = "$service.output$"
|
||||
NOTIFICATIONAUTHORNAME = "$notification.author$"
|
||||
NOTIFICATIONCOMMENT = "$notification.comment$"
|
||||
HOSTDISPLAYNAME = "$host.display_name$"
|
||||
SERVICEDISPLAYNAME = "$service.display_name$"
|
||||
USEREMAIL = "$user.email$"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
object CheckCommand "apache-status2" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/check_apachestatus.pl" ]
|
||||
arguments = {
|
||||
"-H" = "$web_address$"
|
||||
"-t" = "$web_timeout$"
|
||||
"-w" = "$web_warning$"
|
||||
"-c" = "$web_critical$"
|
||||
}
|
||||
vars.web_address = "$address$"
|
||||
vars.web_timeout = "3"
|
||||
vars.web_warning = "150"
|
||||
vars.web_critical = "100"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
object CheckCommand "asterisk-status" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/check_ast_chans.pl", "-f" ]
|
||||
arguments = {
|
||||
"-H" = "$ast_address$"
|
||||
"-U" = "$ast_user$"
|
||||
"-P" = "$ast_pass$"
|
||||
"-p" = "$ast_port$";
|
||||
"-t" = "$ast_timeout$"
|
||||
"-w" = "$ast_warning$"
|
||||
"-c" = "$ast_critical$"
|
||||
}
|
||||
vars.ast_address = "$address$"
|
||||
vars.ast_timeout = "3"
|
||||
vars.ast_warning = "475"
|
||||
vars.ast_critical = "500"
|
||||
vars.ast_user = "cron"
|
||||
vars.ast_pass = "1234"
|
||||
vars.ast_port = "5038"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
object CheckCommand "smart-check" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/check_ide_smart" ]
|
||||
arguments = {
|
||||
"-d" = "$drive_device$"
|
||||
}
|
||||
vars.drive_device = "/dev/sda"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
object CheckCommand "mysql-slavechk" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/check_mysql", "-S" ]
|
||||
arguments = {
|
||||
"-H" = "$mysqls_address$"
|
||||
"-u" = "$mysqls_user$"
|
||||
"-p" = "$mysqls_pass$"
|
||||
"-P" = "$mysqls_port$"
|
||||
"-w" = "$mysqls_warn$"
|
||||
"-c" = "$mysqls_crit$"
|
||||
}
|
||||
vars.mysqls_address = "$address$"
|
||||
vars.mysqls_user = "nagios"
|
||||
vars.mysqls_pass = "pass4NAGIOS"
|
||||
vars.mysqls_port = "3306"
|
||||
vars.mysqls_warn = "3600"
|
||||
vars.mysqls_crit = "18000"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
object CheckCommand "mysql-stdchk" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/check_mysql" ]
|
||||
arguments = {
|
||||
"-H" = "$mysql_address$"
|
||||
"-u" = "$mysql_user$"
|
||||
"-p" = "$mysql_pass$"
|
||||
"-P" = "$mysql_port$"
|
||||
}
|
||||
vars.mysql_address = "$address$"
|
||||
vars.mysql_user = "nagios"
|
||||
vars.mysql_pass = "pass4NAGIOS"
|
||||
vars.mysql_port = "3306"
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
object CheckCommand "ntp-check" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/check_ntp_time" ]
|
||||
arguments = {
|
||||
"-H" = "$ntp_address$"
|
||||
"-w" = "$ntp_warning$"
|
||||
"-c" = "$ntp_critical$"
|
||||
}
|
||||
vars.ntp_address = "$address$"
|
||||
vars.ntp_warning = "2"
|
||||
vars.ntp_critical = "3"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
object CheckCommand "md-raid-stat" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/nagios-linux-swraid.pl" ]
|
||||
arguments = {
|
||||
"--device" = "$raid_device$"
|
||||
}
|
||||
vars.raid_device = "/dev/md0"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
object CheckCommand "sip-check" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/check_sip" ]
|
||||
arguments = {
|
||||
"-u" = "sip:$sip_address$"
|
||||
"-H" = "$sip_address$"
|
||||
"-p" = "$sip_port$"
|
||||
"-s" = ""
|
||||
}
|
||||
vars.sip_address = "$address$"
|
||||
vars.sip_port = "5060"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
object CheckCommand "snmp-cpu-use" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/check_snmp_load.pl" ]
|
||||
arguments = {
|
||||
"-H" = "$cpu_address$"
|
||||
"-w" = "$cpu_warning$"
|
||||
"-c" = "$cpu_critical$"
|
||||
"-C" = "public"
|
||||
"-t" = "$cpu_timeout$"
|
||||
"-T" = "stand"
|
||||
"-f" = ""
|
||||
}
|
||||
vars.cpu_address = "$address$"
|
||||
vars.cpu_warning = "80"
|
||||
vars.cpu_critical = "90"
|
||||
vars.cpu_timeout = "3"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
object CheckCommand "snmp-digitemp" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/check_by_snmp.pl" ]
|
||||
arguments = {
|
||||
"-H" = "$digitemp_address$"
|
||||
"-E" = "digitemp"
|
||||
"-C" = "public"
|
||||
"-t" = "$digitemp_timeout$"
|
||||
}
|
||||
vars.digitemp_address = "$address$"
|
||||
#vars.digitemp_device = "digitemp"
|
||||
vars.digitemp_timeout = "5"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
object CheckCommand "snmp-drive-use" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/check_snmp_storage.pl", "-S0" ]
|
||||
arguments = {
|
||||
"-H" = "$stor_address$"
|
||||
"-w" = "$stor_warning$"
|
||||
"-c" = "$stor_critical$"
|
||||
"-C" = "public"
|
||||
"-t" = "$stor_timeout$"
|
||||
"-m" = "$stor_directory$"
|
||||
}
|
||||
vars.stor_address = "$address$"
|
||||
vars.stor_warning = "80"
|
||||
vars.stor_critical = "90"
|
||||
vars.stor_timeout = "3"
|
||||
vars.stor_directory = "/"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
object CheckCommand "snmp-mem-chk" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/check_snmp_mem.pl" ]
|
||||
arguments = {
|
||||
"-H" = "$mem_address$"
|
||||
"-w" = "$mem_wrta$,$mem_wpl$%"
|
||||
"-c" = "$mem_crta$,$mem_cpl$%"
|
||||
"-t" = "$mem_timeout$"
|
||||
"-C" = "public"
|
||||
"-f" = ""
|
||||
}
|
||||
vars.mem_address = "$address$"
|
||||
vars.mem_wrta = 95
|
||||
vars.mem_wpl = 65
|
||||
vars.mem_crta = 99
|
||||
vars.mem_cpl = 80
|
||||
vars.mem_timeout = 3
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
object CheckCommand "snmp-raid-stat" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/check_by_snmp.pl" ]
|
||||
arguments = {
|
||||
"-H" = "$raid_address$"
|
||||
"-E" = "$raid_device$"
|
||||
"-C" = "public"
|
||||
"-t" = "$raid_timeout$"
|
||||
}
|
||||
vars.raid_address = "$address$"
|
||||
vars.raid_device = "raid-md0"
|
||||
vars.raid_timeout = "3"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
object CheckCommand "snmp-smart" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/check_by_snmp.pl" ]
|
||||
arguments = {
|
||||
"-H" = "$drive_address$"
|
||||
"-E" = "$drive_device$"
|
||||
"-C" = "public"
|
||||
"-t" = "$drive_timeout$"
|
||||
}
|
||||
vars.drive_address = "$address$"
|
||||
vars.drive_device = "smart-sda"
|
||||
vars.drive_timeout = "3"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
object CheckCommand "http-check" {
|
||||
import "plugin-check-command"
|
||||
command = [ PluginDir + "/check_http" ]
|
||||
arguments = {
|
||||
"-I" = "$web_address$"
|
||||
"-p" = "$web_port$"
|
||||
"-u" = "$web_url$"
|
||||
"-t" = "$web_timeout$"
|
||||
"-w" = "$web_warning$"
|
||||
"-c" = "$web_critical$"
|
||||
}
|
||||
vars.web_address = "$address$"
|
||||
vars.web_timeout = "5"
|
||||
vars.web_warning = "2"
|
||||
vars.web_critical = "3"
|
||||
vars.web_port = "$web_port$"
|
||||
vars.web_url = "$web_uri$"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
/**
|
||||
* The example downtime apply rule.
|
||||
*/
|
||||
|
||||
apply ScheduledDowntime "backup-downtime" to Service {
|
||||
author = "icingaadmin"
|
||||
comment = "Scheduled downtime for backup"
|
||||
|
||||
ranges = {
|
||||
monday = service.vars.backup_downtime
|
||||
tuesday = service.vars.backup_downtime
|
||||
wednesday = service.vars.backup_downtime
|
||||
thursday = service.vars.backup_downtime
|
||||
friday = service.vars.backup_downtime
|
||||
saturday = service.vars.backup_downtime
|
||||
sunday = service.vars.backup_downtime
|
||||
}
|
||||
|
||||
assign where service.vars.backup_downtime != ""
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
/**
|
||||
* Host group examples.
|
||||
*/
|
||||
|
||||
object HostGroup "dialers" {
|
||||
display_name = "Telephony Servers"
|
||||
assign where host.vars.servertype == "dialer"
|
||||
}
|
||||
|
||||
object HostGroup "web" {
|
||||
display_name = "Web Servers"
|
||||
assign where host.vars.servertype == "web"
|
||||
}
|
||||
|
||||
object HostGroup "database" {
|
||||
display_name = "Database Servers"
|
||||
assign where host.vars.servertype == "database"
|
||||
}
|
||||
|
||||
object HostGroup "misc" {
|
||||
display_name = "Miscellaneous Servers"
|
||||
assign where host.vars.servertype == "misc"
|
||||
}
|
||||
|
||||
object HostGroup "windows-servers" {
|
||||
display_name = "Windows Servers"
|
||||
|
||||
assign where host.vars.os == "Windows"
|
||||
}
|
||||
|
||||
/**
|
||||
* Service group examples.
|
||||
*/
|
||||
|
||||
object ServiceGroup "ping" {
|
||||
display_name = "Ping Checks"
|
||||
|
||||
assign where match("ping*", service.name)
|
||||
}
|
||||
|
||||
object ServiceGroup "http" {
|
||||
display_name = "HTTP Checks"
|
||||
|
||||
assign where match("http*", service.check_command)
|
||||
}
|
||||
|
||||
object ServiceGroup "disk" {
|
||||
display_name = "Disk Checks"
|
||||
|
||||
assign where match("disk*", service.check_command)
|
||||
}
|
||||
|
||||
object ServiceGroup "smart" {
|
||||
display_name = "Drive SMART Status"
|
||||
assign where match("smart*", service.check_command) || match("snmp-smart*", service.check_command)
|
||||
}
|
||||
|
||||
object ServiceGroup "all-services" {
|
||||
display_name = "All Services"
|
||||
}
|
||||
|
||||
object ServiceGroup "memory" {
|
||||
display_name = "Memory Usage"
|
||||
assign where match("snmp-mem*", service.check_command)
|
||||
}
|
||||
|
||||
object ServiceGroup "mysql" {
|
||||
display_name = "MySQL Processes"
|
||||
assign where match("mysql*", service.check_command)
|
||||
}
|
||||
|
||||
object ServiceGroup "ntp" {
|
||||
display_name = "NTP Sync"
|
||||
assign where match("ntp*", service.check_command)
|
||||
}
|
||||
|
||||
object ServiceGroup "drive" {
|
||||
display_name = "Drive Usage"
|
||||
assign where match("snmp-drive*", service.check_command)
|
||||
}
|
||||
|
||||
object ServiceGroup "cpu" {
|
||||
display_name = "CPU Usage"
|
||||
assign where match("snmp-cpu*", service.check_command)
|
||||
}
|
||||
|
||||
object ServiceGroup "raid" {
|
||||
display_name = "RAID Status"
|
||||
assign where match("snmp-raid*", service.check_command) || match("md-raid*", service.check_command)
|
||||
}
|
||||
|
||||
object ServiceGroup "asterisk" {
|
||||
display_name = "Asterisk Channels"
|
||||
assign where match("asterisk*", service.check_command)
|
||||
}
|
||||
|
||||
object ServiceGroup "sip" {
|
||||
display_name = "SIP Status"
|
||||
assign where match("sip-*", service.check_command)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Host definitions with object attributes
|
||||
* used for apply rules for Service, Notification,
|
||||
* Dependency and ScheduledDowntime objects.
|
||||
*
|
||||
* Tip: Use `icinga2 object list --type Host` to
|
||||
* list all host objects after running
|
||||
* configuration validation (`icinga2 daemon -C`).
|
||||
*/
|
||||
|
||||
/*
|
||||
* This is an example host based on your
|
||||
* local host's FQDN. Specify the NodeName
|
||||
* constant in `constants.conf` or use your
|
||||
* own description, e.g. "db-host-1".
|
||||
*/
|
||||
|
||||
object Host NodeName {
|
||||
/* Import the default host template defined in `templates.conf`. */
|
||||
import "generic-host"
|
||||
|
||||
/* Specify the address attributes for checks e.g. `ssh` or `http`. */
|
||||
address = "127.0.0.1"
|
||||
|
||||
/* Set custom attribute `os` for hostgroup assignment in `groups.conf`. */
|
||||
vars.os = "Linux"
|
||||
vars.servertype = "misc"
|
||||
|
||||
/* Define http vhost attributes for service apply rules in `services.conf`. */
|
||||
vars.http_vhosts["http"] = {
|
||||
http_uri = "/"
|
||||
}
|
||||
/* Uncomment if you've sucessfully installed Icinga Web 2. */
|
||||
//vars.http_vhosts["Icinga Web 2"] = {
|
||||
// http_uri = "/icingaweb2"
|
||||
//}
|
||||
|
||||
/* Define disks and attributes for service apply rules in `services.conf`. */
|
||||
vars.disks["disk"] = {
|
||||
/* No parameters. */
|
||||
}
|
||||
vars.disks["disk /"] = {
|
||||
disk_partitions = "/"
|
||||
}
|
||||
|
||||
/* Define notification mail attributes for notification apply rules in `notifications.conf`. */
|
||||
vars.notification["mail"] = {
|
||||
/* The UserGroup `icingaadmins` is defined in `users.conf`. */
|
||||
groups = [ "icingaadmins" ]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
object Host "dbX" {
|
||||
import "generic-host"
|
||||
display_name = "DBX"
|
||||
address = "X.X.X.X"
|
||||
vars.os = "Linux"
|
||||
vars.servertype = "database"
|
||||
vars.smart1 = "0"
|
||||
vars.smart2 = "0"
|
||||
vars.raid = "0"
|
||||
vars.raid2 = "0"
|
||||
vars.dbtype = "master"
|
||||
vars.backup_downtime = "03:00-07:00"
|
||||
vars.notification["mail"] = { groups = [ "icingaadmins" ] }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
object Host "dialX" {
|
||||
import "generic-host"
|
||||
display_name = "dialX"
|
||||
address = "X.X.X.X"
|
||||
vars.os = "Linux"
|
||||
vars.servertype = "dialer"
|
||||
vars.smart = "0"
|
||||
vars.smart2 = "0"
|
||||
vars.raid = "0"
|
||||
vars.raid2 = "0"
|
||||
vars.externip = "dialX.mycompany.com"
|
||||
vars.backup_downtime = "03:00-07:00"
|
||||
vars.notification["mail"] = { groups = [ "icingaadmins" ] }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
object Host "webX" {
|
||||
import "generic-host"
|
||||
display_name = "WebX"
|
||||
address = "X.X.X.X"
|
||||
vars.os = "Linux"
|
||||
vars.servertype = "web"
|
||||
vars.smart = "0"
|
||||
vars.smart2 = "0"
|
||||
vars.raid = "0"
|
||||
vars.raid2 = "0"
|
||||
vars.externip = "Y.Y.Y.Y"
|
||||
vars.webport = "80"
|
||||
vars.weburi = "http://X.X.X.X"
|
||||
vars.httpcheck = "1"
|
||||
vars.apachestat = "0"
|
||||
vars.backup_downtime = "03:00-07:00"
|
||||
vars.notification["mail"] = { groups = [ "icingaadmins" ] }
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* The example notification apply rules.
|
||||
*
|
||||
* Only applied if host/service objects have
|
||||
* the custom attribute `notification` defined
|
||||
* and containing `mail` as key.
|
||||
*
|
||||
* Check `hosts.conf` for an example.
|
||||
*/
|
||||
|
||||
apply Notification "mail-icingaadmin" to Host {
|
||||
import "mail-host-notification"
|
||||
|
||||
user_groups = host.vars.notification.mail.groups
|
||||
users = host.vars.notification.mail.users
|
||||
|
||||
assign where host.vars.notification.mail
|
||||
}
|
||||
|
||||
apply Notification "mail-icingaadmin" to Service {
|
||||
import "mail-service-notification"
|
||||
|
||||
user_groups = host.vars.notification.mail.groups
|
||||
users = host.vars.notification.mail.users
|
||||
|
||||
assign where host.vars.notification.mail
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Host and Service templates for the Agent Setup.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Provides settings for satellite hosts managed by 'icinga2 repository'.
|
||||
* Define your global attributes here, for example custom
|
||||
* attributes used for notifications, etc.
|
||||
*/
|
||||
template Host "satellite-host" {
|
||||
vars.notification["mail"] = {
|
||||
groups = [ "icingaadmins" ]
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides settings for satellite services managed by 'icinga2 repository'.
|
||||
* Define your global satellite attributes here, for example custom
|
||||
* attributes used for notifications, etc.
|
||||
*/
|
||||
template Service "satellite-service" {
|
||||
vars.notification["mail"] = {
|
||||
groups = [ "icingaadmins" ]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
apply Dependency "satellite-host" to Host {
|
||||
parent_host_name = host.zone
|
||||
|
||||
assign where host.zone != "" && "satellite-host" in host.templates
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Service apply rules.
|
||||
*
|
||||
* The CheckCommand objects `ping4`, `ping6`, etc
|
||||
* are provided by the plugin check command templates.
|
||||
* Check the documentation for details.
|
||||
*
|
||||
* Tip: Use `icinga2 object list --type Service` to
|
||||
* list all service objects after running
|
||||
* configuration validation (`icinga2 daemon -C`).
|
||||
*/
|
||||
|
||||
/*
|
||||
* This is an example host based on your
|
||||
* local host's FQDN. Specify the NodeName
|
||||
* constant in `constants.conf` or use your
|
||||
* own description, e.g. "db-host-1".
|
||||
*/
|
||||
|
||||
/*
|
||||
* These are generic `ping4` and `ping6`
|
||||
* checks applied to all hosts having the
|
||||
* `address` resp. `address6` attribute
|
||||
* defined.
|
||||
*/
|
||||
apply Service "ping4" {
|
||||
import "generic-service"
|
||||
|
||||
check_command = "ping4"
|
||||
|
||||
assign where host.address
|
||||
}
|
||||
|
||||
apply Service "ping6" {
|
||||
import "generic-service"
|
||||
|
||||
check_command = "ping6"
|
||||
|
||||
assign where host.address6
|
||||
}
|
||||
|
||||
|
||||
apply Service for (http_vhost => config in host.vars.http_vhosts) {
|
||||
import "generic-service"
|
||||
|
||||
check_command = "http"
|
||||
|
||||
vars += config
|
||||
}
|
||||
|
||||
apply Service for (disk => config in host.vars.disks) {
|
||||
import "generic-service"
|
||||
|
||||
check_command = "disk"
|
||||
|
||||
vars += config
|
||||
}
|
||||
|
||||
apply Service "icinga" {
|
||||
import "generic-service"
|
||||
|
||||
check_command = "icinga"
|
||||
|
||||
assign where host.name == NodeName
|
||||
}
|
||||
|
||||
apply Service "load" {
|
||||
import "generic-service"
|
||||
|
||||
check_command = "load"
|
||||
|
||||
/* Used by the ScheduledDowntime apply rule in `downtimes.conf`. */
|
||||
vars.backup_downtime = "02:00-03:00"
|
||||
|
||||
assign where host.name == NodeName
|
||||
}
|
||||
|
||||
apply Service "procs" {
|
||||
import "generic-service"
|
||||
|
||||
check_command = "procs"
|
||||
|
||||
assign where host.name == NodeName
|
||||
}
|
||||
|
||||
apply Service "swap" {
|
||||
import "generic-service"
|
||||
|
||||
check_command = "swap"
|
||||
|
||||
assign where host.name == NodeName
|
||||
}
|
||||
|
||||
apply Service "users" {
|
||||
import "generic-service"
|
||||
|
||||
check_command = "users"
|
||||
|
||||
assign where host.name == NodeName
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
apply Service "asterisk" {
|
||||
import "service-1minhigh"
|
||||
check_command = "asterisk-status"
|
||||
enable_flapping = 0
|
||||
assign where host.vars.servertype == "dialer"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
apply Service "mysql" {
|
||||
import "service-1minhigh"
|
||||
check_command = "mysql-stdchk"
|
||||
assign where host.vars.servertype == "database" && host.vars.dbtype == "master"
|
||||
}
|
||||
|
||||
apply Service "mysql" {
|
||||
import "service-1minhigh"
|
||||
check_command = "mysql-slavechk"
|
||||
assign where host.vars.servertype == "database" && host.vars.dbtype == "slave"
|
||||
}
|
||||
|
||||
apply Service "mysql" {
|
||||
import "service-1minhigh"
|
||||
check_command = "mysql-slavechk"
|
||||
assign where host.vars.dbslave == "1"
|
||||
}
|
||||
|
||||
apply Service "mysql" {
|
||||
import "service-1minhigh"
|
||||
check_command = "mysql-stdchk"
|
||||
assign where host.vars.dbmaster == "1"
|
||||
}
|
||||
|
||||
apply Service "mysql" {
|
||||
import "service-1minhigh"
|
||||
check_command = "mysql-slavechk"
|
||||
assign where host.vars.servertype == "sips"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
apply Service "ntp" {
|
||||
import "service-1minhigh"
|
||||
check_command = "ntp-check"
|
||||
assign where host.address != "127.0.0.1"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
apply Service "sip" {
|
||||
import "service-1minhigh"
|
||||
check_command = "sip-check"
|
||||
vars.sip_address = host.vars.externip
|
||||
assign where host.vars.servertype == "sips"
|
||||
}
|
||||
|
||||
apply Service "sip" {
|
||||
import "service-1minhigh"
|
||||
check_command = "sip-check"
|
||||
vars.sip_address = host.vars.externip
|
||||
assign where host.vars.checksip == "1"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
apply Service "cpu" {
|
||||
import "service-5minhigh"
|
||||
check_command = "snmp-cpu-use"
|
||||
enable_flapping = 1
|
||||
assign where host.address != "127.0.0.1"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
apply Service "root" {
|
||||
import "service-5minlow"
|
||||
check_command = "snmp-drive-use"
|
||||
assign where host.address != "127.0.0.1"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
apply Service "memory" {
|
||||
import "service-5minhigh"
|
||||
check_command = "snmp-mem-chk"
|
||||
enable_flapping = 1
|
||||
assign where host.address != "127.0.0.1"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
apply Service "raid" {
|
||||
import "service-5minlow"
|
||||
check_command = "snmp-raid-stat"
|
||||
assign where host.address != "127.0.0.1" && host.vars.raid == "1"
|
||||
}
|
||||
|
||||
apply Service "raid2" {
|
||||
import "service-5minlow"
|
||||
check_command = "snmp-raid-stat"
|
||||
vars.raid_device = "raid-md1"
|
||||
assign where host.address != "127.0.0.1" && host.vars.raid2 == "1"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
apply Service "Smart1" {
|
||||
import "service-5minlow"
|
||||
check_command = "snmp-smart"
|
||||
vars.drive_device = "smart-sda"
|
||||
assign where host.address != "127.0.0.1" && host.vars.smart1 == "1"
|
||||
}
|
||||
|
||||
apply Service "Smart2" {
|
||||
import "service-5minlow"
|
||||
check_command = "snmp-smart"
|
||||
vars.drive_device = "smart-sdb"
|
||||
assign where host.address != "127.0.0.1" && host.vars.smart2 == "1"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
apply Service "apache" {
|
||||
import "service-1minhigh"
|
||||
check_command = "apache-status2"
|
||||
vars.web_address = host.vars.externip
|
||||
assign where host.vars.apachestat == "1"
|
||||
}
|
||||
|
||||
apply Service "apache" {
|
||||
import "service-1minhigh"
|
||||
check_command = "http-check"
|
||||
vars.web_address = host.vars.externip
|
||||
vars.web_port = host.vars.webport
|
||||
vars.web_uri = host.vars.weburi
|
||||
assign where host.vars.httpcheck == "1"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* Generic template examples.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Provides default settings for hosts. By convention
|
||||
* all hosts should import this template.
|
||||
*
|
||||
* The CheckCommand object `hostalive` is provided by
|
||||
* the plugin check command templates.
|
||||
* Check the documentation for details.
|
||||
*/
|
||||
template Host "generic-host" {
|
||||
max_check_attempts = 3
|
||||
check_interval = 1m
|
||||
retry_interval = 30s
|
||||
|
||||
check_command = "hostalive"
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides default settings for services. By convention
|
||||
* all services should import this template.
|
||||
*/
|
||||
template Service "generic-service" {
|
||||
max_check_attempts = 5
|
||||
check_interval = 1m
|
||||
retry_interval = 30s
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides default settings for users. By convention
|
||||
* all users should inherit from this template.
|
||||
*/
|
||||
|
||||
template User "generic-user" {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides default settings for host notifications.
|
||||
* By convention all host notifications should import
|
||||
* this template.
|
||||
*/
|
||||
template Notification "mail-host-notification" {
|
||||
command = "mail-host-notification"
|
||||
|
||||
states = [ Up, Down ]
|
||||
types = [ Problem, Acknowledgement, Recovery, Custom,
|
||||
FlappingStart, FlappingEnd,
|
||||
DowntimeStart, DowntimeEnd, DowntimeRemoved ]
|
||||
|
||||
period = "24x7"
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides default settings for service notifications.
|
||||
* By convention all service notifications should import
|
||||
* this template.
|
||||
*/
|
||||
template Notification "mail-service-notification" {
|
||||
command = "mail-service-notification"
|
||||
|
||||
states = [ OK, Warning, Critical, Unknown ]
|
||||
types = [ Problem, Acknowledgement, Recovery, Custom,
|
||||
FlappingStart, FlappingEnd,
|
||||
DowntimeStart, DowntimeEnd, DowntimeRemoved ]
|
||||
|
||||
period = "24x7"
|
||||
}
|
||||
|
||||
|
||||
template Service "service-1minhigh" {
|
||||
max_check_attempts = 1
|
||||
check_interval = 1m
|
||||
retry_interval = 30s
|
||||
}
|
||||
|
||||
template Service "service-5minlow" {
|
||||
max_check_attempts = 3
|
||||
check_interval = 5m
|
||||
retry_interval = 5m
|
||||
}
|
||||
|
||||
template Service "service-5minhigh" {
|
||||
max_check_attempts = 1
|
||||
check_interval = 5m
|
||||
retry_interval = 1m
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* Sample timeperiods for Icinga 2 requiring
|
||||
* 'legacy-timeperiod' template from the Icinga
|
||||
* Template Library (ITL).
|
||||
* Check the documentation for details.
|
||||
*/
|
||||
|
||||
object TimePeriod "24x7" {
|
||||
import "legacy-timeperiod"
|
||||
|
||||
display_name = "Icinga 2 24x7 TimePeriod"
|
||||
ranges = {
|
||||
"monday" = "00:00-24:00"
|
||||
"tuesday" = "00:00-24:00"
|
||||
"wednesday" = "00:00-24:00"
|
||||
"thursday" = "00:00-24:00"
|
||||
"friday" = "00:00-24:00"
|
||||
"saturday" = "00:00-24:00"
|
||||
"sunday" = "00:00-24:00"
|
||||
}
|
||||
}
|
||||
|
||||
object TimePeriod "9to5" {
|
||||
import "legacy-timeperiod"
|
||||
|
||||
display_name = "Icinga 2 9to5 TimePeriod"
|
||||
ranges = {
|
||||
"monday" = "09:00-17:00"
|
||||
"tuesday" = "09:00-17:00"
|
||||
"wednesday" = "09:00-17:00"
|
||||
"thursday" = "09:00-17:00"
|
||||
"friday" = "09:00-17:00"
|
||||
}
|
||||
}
|
||||
|
||||
object TimePeriod "never" {
|
||||
import "legacy-timeperiod"
|
||||
|
||||
display_name = "Icinga 2 never TimePeriod"
|
||||
ranges = {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* The example user 'icingaadmin' and the example
|
||||
* group 'icingaadmins'.
|
||||
*/
|
||||
|
||||
object User "icingaadmin" {
|
||||
import "generic-user"
|
||||
|
||||
display_name = "Icinga 2 Admin"
|
||||
groups = [ "icingaadmins" ]
|
||||
|
||||
email = "icinga@localhost"
|
||||
}
|
||||
|
||||
object UserGroup "icingaadmins" {
|
||||
display_name = "Icinga 2 Admin Group"
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
create database icinga;
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE, DROP, CREATE VIEW, INDEX, EXECUTE ON icinga.* TO 'icinga'@'localhost' IDENTIFIED BY 'icinga';
|
||||
@@ -0,0 +1,244 @@
|
||||
#!/usr/bin/perl -w
|
||||
####################### check_apachestatus.pl #######################
|
||||
# Version : 1.1
|
||||
# Date : 27 Jul 2007
|
||||
# Author : De Bodt Lieven (Lieven.DeBodt at gmail.com)
|
||||
# Licence : GPL - http://www.fsf.org/licenses/gpl.txt
|
||||
#############################################################
|
||||
#
|
||||
# 20080912 <karsten at behrens dot in> v1.2
|
||||
# added output of Requests/sec, kB/sec, kB/request
|
||||
# changed perfdata output so that PNP accepts it
|
||||
# http://www.behrens.in/download/check_apachestatus.pl.txt
|
||||
#
|
||||
# 20080930 <karsten at behrens dot in> v1.3
|
||||
# Fixed bug in perfdata regexp when Apache output was
|
||||
# "nnn B/sec" instead of "nnn kB/sec"
|
||||
#
|
||||
# 20081231 <geoff.mcqueen at hiivesystems dot com > v1.4
|
||||
# Made the scale logic more robust to byte only, kilobyte
|
||||
# and provided capacity for MB and GB scale options
|
||||
# on bytes per second and bytes per request (untested)
|
||||
#
|
||||
# help : ./check_apachestatus.pl -h
|
||||
|
||||
use strict;
|
||||
use Getopt::Long;
|
||||
use LWP::UserAgent;
|
||||
use Time::HiRes qw(gettimeofday tv_interval);
|
||||
|
||||
# Nagios specific
|
||||
|
||||
use lib "/usr/lib/nagios/plugins";
|
||||
use utils qw(%ERRORS $TIMEOUT);
|
||||
#my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
|
||||
|
||||
# Globals
|
||||
|
||||
my $Version='1.4';
|
||||
my $Name=$0;
|
||||
|
||||
my $o_host = undef; # hostname
|
||||
my $o_help= undef; # want some help ?
|
||||
my $o_port = undef; # port
|
||||
my $o_version= undef; # print version
|
||||
my $o_warn_level= undef; # Number of available slots that will cause a warning
|
||||
my $o_crit_level= undef; # Number of available slots that will cause an error
|
||||
my $o_timeout= 15; # Default 15s Timeout
|
||||
|
||||
# functions
|
||||
|
||||
sub show_versioninfo { print "$Name version : $Version\n"; }
|
||||
|
||||
sub print_usage {
|
||||
print "Usage: $Name -H <host> [-p <port>] [-t <timeout>] [-w <warn_level> -c <crit_level>] [-V]\n";
|
||||
}
|
||||
|
||||
# Get the alarm signal
|
||||
$SIG{'ALRM'} = sub {
|
||||
print ("ERROR: Alarm signal (Nagios time-out)\n");
|
||||
exit $ERRORS{"CRITICAL"};
|
||||
};
|
||||
|
||||
sub help {
|
||||
print "Apache Monitor for Nagios version ",$Version,"\n";
|
||||
print "GPL licence, (c)2006-2007 De Bodt Lieven\n\n";
|
||||
print_usage();
|
||||
print <<EOT;
|
||||
-h, --help
|
||||
print this help message
|
||||
-H, --hostname=HOST
|
||||
name or IP address of host to check
|
||||
-p, --port=PORT
|
||||
Http port
|
||||
-t, --timeout=INTEGER
|
||||
timeout in seconds (Default: $o_timeout)
|
||||
-w, --warn=MIN
|
||||
number of available slots that will cause a warning
|
||||
-1 for no warning
|
||||
-c, --critical=MIN
|
||||
number of available slots that will cause an error
|
||||
-V, --version
|
||||
prints version number
|
||||
Note :
|
||||
The script will return
|
||||
* Without warn and critical options:
|
||||
OK if we are able to connect to the apache server's status page,
|
||||
CRITICAL if we aren't able to connect to the apache server's status page,,
|
||||
* With warn and critical options:
|
||||
OK if we are able to connect to the apache server's status page and #available slots > <warn_level>,
|
||||
WARNING if we are able to connect to the apache server's status page and #available slots <= <warn_level>,
|
||||
CRITICAL if we are able to connect to the apache server's status page and #available slots <= <crit_level>,
|
||||
UNKNOWN if we aren't able to connect to the apache server's status page
|
||||
|
||||
Perfdata legend:
|
||||
"_;S;R;W;K;D;C;L;G;I;.;1;2;3"
|
||||
_ : 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
|
||||
1 : Requests per sec
|
||||
2 : kB per sec
|
||||
3 : kB per Request
|
||||
|
||||
EOT
|
||||
}
|
||||
|
||||
sub check_options {
|
||||
Getopt::Long::Configure ("bundling");
|
||||
GetOptions(
|
||||
'h' => \$o_help, 'help' => \$o_help,
|
||||
'H:s' => \$o_host, 'hostname:s' => \$o_host,
|
||||
'p:i' => \$o_port, 'port:i' => \$o_port,
|
||||
'V' => \$o_version, 'version' => \$o_version,
|
||||
'w:i' => \$o_warn_level, 'warn:i' => \$o_warn_level,
|
||||
'c:i' => \$o_crit_level, 'critical:i' => \$o_crit_level,
|
||||
't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
|
||||
|
||||
);
|
||||
|
||||
if (defined ($o_help)) { help(); exit $ERRORS{"UNKNOWN"}};
|
||||
if (defined($o_version)) { show_versioninfo(); exit $ERRORS{"UNKNOWN"}};
|
||||
if (((defined($o_warn_level) && !defined($o_crit_level)) || (!defined($o_warn_level) && defined($o_crit_level))) || ((defined($o_warn_level) && defined($o_crit_level)) && (($o_warn_level != -1) && ($o_warn_level <= $o_crit_level)))) {
|
||||
print "Check warn and crit!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}
|
||||
}
|
||||
# Check compulsory attributes
|
||||
if (!defined($o_host)) { print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||
}
|
||||
|
||||
########## MAIN ##########
|
||||
|
||||
check_options();
|
||||
|
||||
my $ua = LWP::UserAgent->new( protocols_allowed => ['http'], timeout => $o_timeout);
|
||||
my $timing0 = [gettimeofday];
|
||||
my $response = undef;
|
||||
if (!defined($o_port)) {
|
||||
$response = $ua->get('http://' . $o_host . '/server-status');
|
||||
} else {
|
||||
$response = $ua->get('http://' . $o_host . ':' . $o_port . '/server-status');
|
||||
}
|
||||
my $timeelapsed = tv_interval ($timing0, [gettimeofday]);
|
||||
|
||||
my $webcontent = undef;
|
||||
if ($response->is_success) {
|
||||
$webcontent=$response->content;
|
||||
my @webcontentarr = split("\n", $webcontent);
|
||||
my $i = 0;
|
||||
my $BusyWorkers=undef;
|
||||
my $IdleWorkers=undef;
|
||||
# Get the amount of idle and busy workers(Apache2)/servers(Apache1)
|
||||
while (($i < @webcontentarr) && ((!defined($BusyWorkers)) || (!defined($IdleWorkers)))) {
|
||||
if ($webcontentarr[$i] =~ /(\d+)\s+requests\s+currently\s+being\s+processed,\s+(\d+)\s+idle\s+....ers/) {
|
||||
($BusyWorkers, $IdleWorkers) = ($webcontentarr[$i] =~ /(\d+)\s+requests\s+currently\s+being\s+processed,\s+(\d+)\s+idle\s+....ers/);
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
|
||||
# get requests/sec, kb/sec, kb/req
|
||||
$i = 0;
|
||||
my $ReqPerSec=undef;
|
||||
my $KbPerSec=undef;
|
||||
my $KbPerReq=undef;
|
||||
|
||||
my $KbRatios = {
|
||||
g => 1048576,
|
||||
m => 1024,
|
||||
k => 1,
|
||||
empty => 0.0009765625,
|
||||
};
|
||||
|
||||
while (($i < @webcontentarr) && ((!defined($ReqPerSec)) || (!defined($KbPerSec)) || (!defined($KbPerReq)))) {
|
||||
if ($webcontentarr[$i] =~ /([0-9]*\.?[0-9]+)\s+requests\/sec\s+-\s+([0-9]*\.?[0-9]+)\s+(\w)*B\/second\s+-\s+([0-9]*\.?[0-9]+)\s+(\w)*B\/request/) {
|
||||
my ($Requests, $bPerSec, $sPerSec, $bPerReq, $sPerReq) = ($webcontentarr[$i] =~ /([0-9]*\.?[0-9]+)\s+requests\/sec\s+-\s+([0-9]*\.?[0-9]+)\s+(\w)*B\/second\s+-\s+([0-9]*\.?[0-9]+)\s+(\w)*B\/request/);
|
||||
$ReqPerSec=$Requests;
|
||||
if ($sPerSec) {
|
||||
$KbPerSec = $bPerSec*$KbRatios->{lc($sPerSec)};
|
||||
} else {
|
||||
$KbPerSec = $bPerSec*$KbRatios->{empty};
|
||||
}
|
||||
if ($sPerReq) {
|
||||
$KbPerReq = $bPerReq*$KbRatios->{lc($sPerReq)};
|
||||
} else {
|
||||
$KbPerReq = $bPerReq*$KbRatios->{empty};
|
||||
}
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
|
||||
# Get the scoreboard
|
||||
my $ScoreBoard = "";
|
||||
$i = 0;
|
||||
my $PosPreBegin = undef;
|
||||
my $PosPreEnd = undef;
|
||||
while (($i < @webcontentarr) && ((!defined($PosPreBegin)) || (!defined($PosPreEnd)))) {
|
||||
if (!defined($PosPreBegin)) {
|
||||
if ( $webcontentarr[$i] =~ m/<pre>/i ) {
|
||||
$PosPreBegin = $i;
|
||||
}
|
||||
}
|
||||
if (defined($PosPreBegin)) {
|
||||
if ( $webcontentarr[$i] =~ m/<\/pre>/i ) {
|
||||
$PosPreEnd = $i;
|
||||
}
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
for ($i = $PosPreBegin; $i <= $PosPreEnd; $i++) {
|
||||
$ScoreBoard = $ScoreBoard . $webcontentarr[$i];
|
||||
}
|
||||
$ScoreBoard =~ s/^.*<[Pp][Rr][Ee]>//;
|
||||
$ScoreBoard =~ s/<\/[Pp][Rr][Ee].*>//;
|
||||
|
||||
my $CountOpenSlots = ($ScoreBoard =~ tr/\.//);
|
||||
if (defined($o_crit_level) && ($o_crit_level != -1)) {
|
||||
if (($CountOpenSlots + $IdleWorkers) <= $o_crit_level) {
|
||||
printf("CRITICAL %f seconds response time. Idle %d, busy %d, open slots %d | 'Waiting for Connection'=%d 'Starting Up'=%d 'Reading Request'=%d 'Sending Reply'=%d 'Keepalive (read)'=%d 'DNS Lookup'=%d 'Closing Connection'=%d 'Logging'=%d 'Gracefully finishing'=%d 'Idle cleanup'=%d 'Open slot'=%d 'Requests/sec'=%0.1f 'kB per sec'=%0.1fKB 'kB per Request'=%0.1fKB\n", $timeelapsed, $IdleWorkers, $BusyWorkers, $CountOpenSlots, ($ScoreBoard =~ tr/\_//), ($ScoreBoard =~ tr/S//),($ScoreBoard =~ tr/R//),($ScoreBoard =~ tr/W//),($ScoreBoard =~ tr/K//),($ScoreBoard =~ tr/D//),($ScoreBoard =~ tr/C//),($ScoreBoard =~ tr/L//),($ScoreBoard =~ tr/G//),($ScoreBoard =~ tr/I//), $CountOpenSlots, $ReqPerSec, $KbPerSec, $KbPerReq);
|
||||
exit $ERRORS{"CRITICAL"}
|
||||
}
|
||||
}
|
||||
if (defined($o_warn_level) && ($o_warn_level != -1)) {
|
||||
if (($CountOpenSlots + $IdleWorkers) <= $o_warn_level) {
|
||||
printf("WARNING %f seconds response time. Idle %d, busy %d, open slots %d | 'Waiting for Connection'=%d 'Starting Up'=%d 'Reading Request'=%d 'Sending Reply'=%d 'Keepalive (read)'=%d 'DNS Lookup'=%d 'Closing Connection'=%d 'Logging'=%d 'Gracefully finishing'=%d 'Idle cleanup'=%d 'Open slot'=%d 'Requests/sec'=%0.1f 'kB per sec'=%0.1fKB 'kB per Request'=%0.1fKB\n", $timeelapsed, $IdleWorkers, $BusyWorkers, $CountOpenSlots, ($ScoreBoard =~ tr/\_//), ($ScoreBoard =~ tr/S//),($ScoreBoard =~ tr/R//),($ScoreBoard =~ tr/W//),($ScoreBoard =~ tr/K//),($ScoreBoard =~ tr/D//),($ScoreBoard =~ tr/C//),($ScoreBoard =~ tr/L//),($ScoreBoard =~ tr/G//),($ScoreBoard =~ tr/I//), $CountOpenSlots, $ReqPerSec, $KbPerSec, $KbPerReq);
|
||||
exit $ERRORS{"WARNING"}
|
||||
}
|
||||
}
|
||||
printf("OK %f seconds response time. Idle %d, busy %d, open slots %d | 'Waiting for Connection'=%d 'Starting Up'=%d 'Reading Request'=%d 'Sending Reply'=%d 'Keepalive (read)'=%d 'DNS Lookup'=%d 'Closing Connection'=%d 'Logging'=%d 'Gracefully finishing'=%d 'Idle cleanup'=%d 'Open slot'=%d 'Requests/sec'=%0.1f 'kB per sec'=%0.1fKB 'kB per Request'=%0.1fKB\n", $timeelapsed, $IdleWorkers, $BusyWorkers, $CountOpenSlots, ($ScoreBoard =~ tr/\_//), ($ScoreBoard =~ tr/S//),($ScoreBoard =~ tr/R//),($ScoreBoard =~ tr/W//),($ScoreBoard =~ tr/K//),($ScoreBoard =~ tr/D//),($ScoreBoard =~ tr/C//),($ScoreBoard =~ tr/L//),($ScoreBoard =~ tr/G//),($ScoreBoard =~ tr/I//), $CountOpenSlots, $ReqPerSec, $KbPerSec, $KbPerReq);
|
||||
exit $ERRORS{"OK"}
|
||||
}
|
||||
else {
|
||||
if (defined($o_warn_level) || defined($o_crit_level)) {
|
||||
printf("UNKNOWN %s\n", $response->status_line);
|
||||
exit $ERRORS{"UNKNOWN"}
|
||||
} else {
|
||||
printf("CRITICAL %s\n", $response->status_line);
|
||||
exit $ERRORS{"CRITICAL"}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# check_ast_chans.pl - Icinga plugin to check total asterisk channel usage
|
||||
#
|
||||
# Copyright (C) 2018 James Pearson <jamesp@vicidial.com> LICENSE: AGPLv2
|
||||
#
|
||||
|
||||
### All my lovely little modules
|
||||
use warnings;
|
||||
use Net::Telnet ();
|
||||
use Getopt::Long;
|
||||
|
||||
# Nagios specific
|
||||
use lib "/usr/lib/nagios/plugins";
|
||||
our $TIMEOUT;
|
||||
our %ERRORS;
|
||||
eval 'use utils qw(%ERRORS $TIMEOUT)';
|
||||
if ($@) {
|
||||
$TIMEOUT = 30;
|
||||
%ERRORS = ('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
|
||||
}
|
||||
my $version='1.0';
|
||||
|
||||
|
||||
### Set-up some useful defaults
|
||||
$DB=0;
|
||||
$channel_warn = 0;
|
||||
$channel_crit = 0;
|
||||
$asterisk_host = "127.0.0.1";
|
||||
$asterisk_port = "5038";
|
||||
$asterisk_user = "cron";
|
||||
$asterisk_pass = "1234";
|
||||
$timeout = 3;
|
||||
$return_code = 3; # By default, our return state is unknown unless specifically set otherwise
|
||||
$return_perf_data = 0;
|
||||
$max_chan_ct=450;
|
||||
$min_chan_ct=0;
|
||||
|
||||
sub debugoutput {
|
||||
# I got tired of repeating this code snippet, so this gives debug output, with optional critical die
|
||||
my $debugline = shift;
|
||||
my $debugdie = 0;
|
||||
$debugdie = shift;
|
||||
if ($DB==1 and $debugdie==0) {
|
||||
# We are just giving output, nothing more
|
||||
print "$debugline\n";
|
||||
} elsif ($DB==1 and $debugdie==1) {
|
||||
# Evidently it was a critical error, so we die on output
|
||||
die("$debugline\n");
|
||||
}
|
||||
}
|
||||
|
||||
sub usage {
|
||||
print "\n\nAsterisk channel monitoring through AMI for Nagios/Icinga\n\n";
|
||||
print "allowed run time options:\n";
|
||||
print " [-H $asterisk_host] = Asterisk Host or IP\n";
|
||||
print " [-U $asterisk_user] = AMI Username\n";
|
||||
print " [-P $asterisk_pass] = AMI Password\n";
|
||||
print " [-p $asterisk_port] = AMI port\n";
|
||||
print " [-w $channel_warn] = Warning Level, none if not specified\n";
|
||||
print " [-c $channel_crit] = Critical Level, none if not specified\n";
|
||||
print " [-t $timeout] = Timeout to wait for AMI connection\n";
|
||||
print " [-f] = Return performance data\n";
|
||||
print " [--debug] = Debug Output for testing\n";
|
||||
print " [--help] = This help screen\n";
|
||||
exit $ERRORS{'UNKNOWN'};
|
||||
}
|
||||
|
||||
Getopt::Long::Configure('bundling', 'no_ignore_case');
|
||||
GetOptions(
|
||||
'host|H=s' => \$asterisk_host,
|
||||
'user|U=s' => \$asterisk_user,
|
||||
'pass|P=s' => \$asterisk_pass,
|
||||
'port|p=i' => \$asterisk_port,
|
||||
'warn|w=i' => \$channel_warn,
|
||||
'crit|c=i' => \$channel_crit,
|
||||
'timeout|t=i' => \$timeout,
|
||||
'f' => \$return_perf_data,
|
||||
'debug' => \$DB,
|
||||
'help' => sub { &usage(); },
|
||||
);
|
||||
|
||||
if ($channel_warn>0 or $channel_crit>0 ) {
|
||||
if ($channel_warn==0 or $channel_crit==0) {
|
||||
print "Warning and Critical must both be specified!\n";
|
||||
exit $ERRORS{'UNKNOWN'};
|
||||
}
|
||||
if ($channel_warn > $channel_crit) {
|
||||
print "Critical level must be higher then Warning level!\n";
|
||||
exit $ERRORS{'UNKNOWN'};
|
||||
}
|
||||
}
|
||||
|
||||
if ($DB==1) {
|
||||
print "\n\nAsterisk channel monitoring through AMI for Nagios/Icinga\n\n";
|
||||
print "\n----- DEBUG -----\n\n";
|
||||
print " Host: $asterisk_host\n";
|
||||
print " User: $asterisk_user\n";
|
||||
print " Pass: $asterisk_pass\n";
|
||||
print " Port: $asterisk_port\n";
|
||||
print " Time: $timeout\n";
|
||||
if ($channel_warn>0 or $channel_crit>0) {
|
||||
print " Warn: $channel_warn\n";
|
||||
print " Crit: $channel_crit\n";
|
||||
} else {
|
||||
print " Not checking for warn/crit\n";
|
||||
}
|
||||
if ($return_perf_data==1) { print " Perf: Enabled\n";}
|
||||
}
|
||||
|
||||
# Lets login
|
||||
$t = new Net::Telnet (Port => $asterisk_port,
|
||||
Timeout => $timeout,
|
||||
Prompt => '/.*[\$%#>] $/',
|
||||
Output_record_separator => '',
|
||||
Errmode => 'return' );
|
||||
#$fh = $t->dump_log("$telnetlog"); # uncomment for telnet log
|
||||
|
||||
# Login to the AMI and get our channel list
|
||||
$t->open("$asterisk_host");
|
||||
if ($t->errmsg) { print "Could not connect to Asterisk!\n"; exit $ERRORS{'UNKNOWN'}; }
|
||||
$t->waitfor('/[0123]\n$/'); # print login
|
||||
if ($t->errmsg) { print "Login Prompt not Received!\n"; exit $ERRORS{'UNKNOWN'}; }
|
||||
$t->print("Action: Login\nUsername: $asterisk_user\nSecret: $asterisk_pass\n\n");
|
||||
if ($t->errmsg) { print "Login Information Incorrect!\n"; exit $ERRORS{'UNKNOWN'}; }
|
||||
$t->waitfor('/Authentication accepted/'); # waitfor auth accepted
|
||||
if ($t->errmsg) { print "Command not Accepted!\n"; exit $ERRORS{'UNKNOWN'};}
|
||||
@list_channels = $t->cmd(String => "Action: Status\n\n", Prompt => '/Event: StatusComplete.*/');
|
||||
$t->print("Action: Logoff\n\n");
|
||||
$t->close;
|
||||
|
||||
# Now loop through the channel listing and figure out what we got
|
||||
$test_zap_count=0;
|
||||
$test_iax_count=0;
|
||||
$test_local_count=0;
|
||||
$test_sip_count=0;
|
||||
$active_channels = 0;
|
||||
$s=0;
|
||||
foreach(@list_channels) {
|
||||
if ($list_channels[$s] =~ /^Channel: SIP/) {$test_sip_count++; $active_channels++; debugoutput("Found SIP Channel",0);}
|
||||
if ($list_channels[$s] =~ /^Channel: Local/) {$test_local_count++; $active_channels++; debugoutput("Found Local Channel",0);}
|
||||
if ($list_channels[$s] =~ /^Channel: IAX2/) {$test_iax_count++; $active_channels++; debugoutput("Found IAX Channel",0);}
|
||||
if ($list_channels[$s] =~ /^Channel: ZAP/) {$test_zap_count++; $active_channels++; debugoutput("Found ZAP/DAHDI Channel",0);}
|
||||
if ($list_channels[$s] =~ /^Channel: DAHDI/) {$test_zap_count++; $active_channels++; debugoutput("Found ZAP/DAHDI Channel",0);}
|
||||
#debugoutput("Channel Line: $list_channels[$s]",0)
|
||||
$s++;
|
||||
}
|
||||
$return_string = "Active: $active_channels , SIP: $test_sip_count , IAX: $test_iax_count , ZAP/DAH: $test_zap_count, Local: $test_local_count";
|
||||
debugoutput("Init Channel Return String: $return_string",0);
|
||||
|
||||
# Do our crit/warning checking and perfdata processing
|
||||
if ($s>0) { $return_code=0; } # Basically, if we had any output then we got a channel listing, even if no channels
|
||||
if ($channel_warn>0 && $active_channels>$channel_warn) { $return_code=1;}
|
||||
if ($channel_crit>0 && $active_channels>$channel_crit) { $return_code=2;}
|
||||
if ($return_perf_data==1) {
|
||||
if ($channel_warn > 0) {
|
||||
$return_string = $return_string . " | astchannels=$active_channels;$channel_warn;$channel_crit;$min_chan_ct;$max_chan_ct";
|
||||
} else {
|
||||
$return_string = $return_string . " | channels=$active_channels";
|
||||
}
|
||||
debugoutput("Perf Channel Return String: $return_string",0);
|
||||
}
|
||||
|
||||
if ($return_code==0) { $return_string = "OK : " . $return_string; print "$return_string\n"; exit $ERRORS{'OK'};}
|
||||
if ($return_code==1) { $return_string = "WARNING : " . $return_string; print "$return_string\n"; exit $ERRORS{'WARNING'};}
|
||||
if ($return_code==2) { $return_string = "CRITICAL : " . $return_string; print "$return_string\n"; exit $ERRORS{'CRITICAL'};}
|
||||
@@ -0,0 +1,794 @@
|
||||
#!/usr/bin/perl -w
|
||||
############################## check_snmp_load #################
|
||||
my $Version='1.3.3';
|
||||
# Date : Oct 12 2007
|
||||
# Author : Patrick Proy ( patrick at proy.org)
|
||||
# Help : http://nagios.manubulon.com/
|
||||
# Licence : GPL - http://www.fsf.org/licenses/gpl.txt
|
||||
# Contributors : F. Lacroix and many others !!!
|
||||
#################################################################
|
||||
# Contributor: M. Pagano
|
||||
# Date : Jan 20 2011
|
||||
# Added support for Cisco ASA 5500
|
||||
# Date : Nov 13 2012
|
||||
# Changed Perfdata to allow better use of data.
|
||||
#
|
||||
# Help : ./check_snmp_load.pl -h
|
||||
#
|
||||
|
||||
use strict;
|
||||
use Net::SNMP;
|
||||
use Getopt::Long;
|
||||
|
||||
# Nagios specific
|
||||
|
||||
my $TIMEOUT = 15;
|
||||
my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
|
||||
|
||||
# SNMP Datas
|
||||
|
||||
# Generic with host-ressource-mib
|
||||
my $base_proc = "1.3.6.1.2.1.25.3.3.1"; # oid for all proc info
|
||||
my $proc_id = "1.3.6.1.2.1.25.3.3.1.1"; # list of processors (product ID)
|
||||
my $proc_load = "1.3.6.1.2.1.25.3.3.1.2"; # %time the proc was not idle over last minute
|
||||
|
||||
# Linux load
|
||||
|
||||
my $linload_table= "1.3.6.1.4.1.2021.10.1"; # net-snmp load table
|
||||
my $linload_name = "1.3.6.1.4.1.2021.10.1.2"; # text 'Load-1','Load-5', 'Load-15'
|
||||
my $linload_load = "1.3.6.1.4.1.2021.10.1.3"; # effective load table
|
||||
|
||||
# Cisco cpu/load
|
||||
|
||||
my $cisco_cpu_5m = "1.3.6.1.4.1.9.2.1.58.0"; # Cisco CPU load (5min %)
|
||||
my $cisco_cpu_1m = "1.3.6.1.4.1.9.2.1.57.0"; # Cisco CPU load (1min %)
|
||||
my $cisco_cpu_5s = "1.3.6.1.4.1.9.2.1.56.0"; # Cisco CPU load (5sec %)
|
||||
|
||||
# Cisco catalyst cpu/load
|
||||
|
||||
my $ciscocata_cpu_5m = ".1.3.6.1.4.1.9.9.109.1.1.1.1.5.9"; # Cisco CPU load (5min %)
|
||||
my $ciscocata_cpu_1m = ".1.3.6.1.4.1.9.9.109.1.1.1.1.3.9"; # Cisco CPU load (1min %)
|
||||
my $ciscocata_cpu_5s = ".1.3.6.1.4.1.9.9.109.1.1.1.1.4.9"; # Cisco CPU load (5sec %)
|
||||
|
||||
# Cisco ASA5500 cpu/load
|
||||
|
||||
my $ciscoasa_cpu_5m = "1.3.6.1.4.1.9.9.109.1.1.1.1.5.1"; # Cisco CPU load (5min %)
|
||||
my $ciscoasa_cpu_1m = "1.3.6.1.4.1.9.9.109.1.1.1.1.4.1"; # Cisco CPU load (1min %)
|
||||
my $ciscoasa_cpu_5s = "1.3.6.1.4.1.9.9.109.1.1.1.1.3.1"; # Cisco CPU load (5sec %)
|
||||
|
||||
# Netscreen cpu/load
|
||||
|
||||
my $nsc_cpu_5m = "1.3.6.1.4.1.3224.16.1.4.0"; # NS CPU load (5min %)
|
||||
my $nsc_cpu_1m = "1.3.6.1.4.1.3224.16.1.2.0"; # NS CPU load (1min %)
|
||||
my $nsc_cpu_5s = "1.3.6.1.4.1.3224.16.1.3.0"; # NS CPU load (5sec %)
|
||||
|
||||
# AS/400 CPU
|
||||
|
||||
my $as400_cpu = "1.3.6.1.4.1.2.6.4.5.1.0"; # AS400 CPU load (10000=100%);
|
||||
|
||||
# Net-SNMP CPU
|
||||
|
||||
my $ns_cpu_idle = "1.3.6.1.4.1.2021.11.11.0"; # Net-snmp cpu idle
|
||||
my $ns_cpu_user = "1.3.6.1.4.1.2021.11.9.0"; # Net-snmp user cpu usage
|
||||
my $ns_cpu_system = "1.3.6.1.4.1.2021.11.10.0"; # Net-snmp system cpu usage
|
||||
|
||||
# Procurve CPU
|
||||
my $procurve_cpu = "1.3.6.1.4.1.11.2.14.11.5.1.9.6.1.0"; # Procurve CPU Counter
|
||||
|
||||
# Nokia CPU
|
||||
my $nokia_cpu = "1.3.6.1.4.1.94.1.21.1.7.1.0"; # Nokia CPU % usage
|
||||
|
||||
# Bluecoat Appliance
|
||||
my $bluecoat_cpu = "1.3.6.1.4.1.3417.2.4.1.1.1.4.1"; # Bluecoat %cpu usage.
|
||||
|
||||
# Fortigate CPU
|
||||
my $fortigate_cpu = ".1.3.6.1.4.1.12356.1.8.0"; # Fortigate CPU % usage
|
||||
|
||||
# Linkproof Appliance
|
||||
my $linkproof_cpu= "1.3.6.1.4.1.89.35.1.55.0"; # CPU RE (Routing Engine Tasks)
|
||||
# 1.3.6.1.4.1.89.35.1.53.0 : Ressource utilisation (%) Considers network utilization and internal CPU utilization
|
||||
# 1.3.6.1.4.1.89.35.1.54 : CPU only (%)
|
||||
# 1.3.6.1.4.1.89.35.1.55 : network only (%)
|
||||
|
||||
# HP-UX cpu usage (thanks to krizb for the OIDs).
|
||||
my $hpux_load_1_min="1.3.6.1.4.1.11.2.3.1.1.3.0";
|
||||
my $hpux_load_5_min="1.3.6.1.4.1.11.2.3.1.1.4.0";
|
||||
my $hpux_load_15_min="1.3.6.1.4.1.11.2.3.1.1.5.0";
|
||||
|
||||
# valid values
|
||||
my @valid_types = ("stand","netsc","netsl","as400","cisco","cata","c5500","nsc","fg","bc","nokia","hp","lp","hpux");
|
||||
# CPU OID array
|
||||
my %cpu_oid = ("netsc",$ns_cpu_idle,"as400",$as400_cpu,"bc",$bluecoat_cpu,"nokia",$nokia_cpu,"hp",$procurve_cpu,"lp",$linkproof_cpu,"fg",$fortigate_cpu);
|
||||
|
||||
# Globals
|
||||
|
||||
|
||||
my $o_host = undef; # hostname
|
||||
my $o_community = undef; # community
|
||||
my $o_port = 161; # port
|
||||
my $o_help= undef; # wan't some help ?
|
||||
my $o_verb= undef; # verbose mode
|
||||
my $o_version= undef; # print version
|
||||
# check type : stand | netsc | netsl | as400 | cisco | cata | c5500 | nsc | fg | bc | nokia | hp | lp | hpux
|
||||
my $o_check_type= "stand";
|
||||
# End compatibility
|
||||
my $o_warn= undef; # warning level
|
||||
my @o_warnL= undef; # warning levels for Linux Load or Cisco CPU
|
||||
my $o_crit= undef; # critical level
|
||||
my @o_critL= undef; # critical level for Linux Load or Cisco CPU
|
||||
my $o_timeout= undef; # Timeout (Default 5)
|
||||
my $o_perf= undef; # Output performance data
|
||||
my $o_version2= undef; # use snmp v2c
|
||||
# SNMPv3 specific
|
||||
my $o_login= undef; # Login for snmpv3
|
||||
my $o_passwd= undef; # Pass for snmpv3
|
||||
my $v3protocols=undef; # V3 protocol list.
|
||||
my $o_authproto='md5'; # Auth protocol
|
||||
my $o_privproto='des'; # Priv protocol
|
||||
my $o_privpass= undef; # priv password
|
||||
|
||||
# functions
|
||||
|
||||
sub p_version { print "check_snmp_load version : $Version\n"; }
|
||||
|
||||
sub print_usage {
|
||||
print "Usage: $0 [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd [-X pass -L <authp>,<privp>]) [-p <port>] -w <warn level> -c <crit level> -T=[stand|netsl|netsc|as400|cisco|cata|c5500|nsc|fg|bc|nokia|hp|lp|hpux] [-f] [-t <timeout>] [-V]\n";
|
||||
}
|
||||
|
||||
sub isnnum { # Return true if arg is not a number
|
||||
my $num = shift;
|
||||
if ( $num =~ /^(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;}
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub help {
|
||||
print "\nSNMP Load & CPU Monitor for Nagios version ",$Version,"\n";
|
||||
print "GPL licence, (c)2004-2007 Patrick Proy\n\n";
|
||||
print_usage();
|
||||
print <<EOT;
|
||||
-v, --verbose
|
||||
print extra debugging information
|
||||
-h, --help
|
||||
print this help message
|
||||
-H, --hostname=HOST
|
||||
name or IP address of host to check
|
||||
-C, --community=COMMUNITY NAME
|
||||
community name for the host's SNMP agent (implies v1 protocol)
|
||||
-2, --v2c
|
||||
Use snmp v2c
|
||||
-l, --login=LOGIN ; -x, --passwd=PASSWD
|
||||
Login and auth password for snmpv3 authentication
|
||||
If no priv password exists, implies AuthNoPriv
|
||||
-X, --privpass=PASSWD
|
||||
Priv password for snmpv3 (AuthPriv protocol)
|
||||
-L, --protocols=<authproto>,<privproto>
|
||||
<authproto> : Authentication protocol (md5|sha : default md5)
|
||||
<privproto> : Priv protocole (des|aes : default des)
|
||||
-P, --port=PORT
|
||||
SNMP port (Default 161)
|
||||
-w, --warn=INTEGER | INT,INT,INT
|
||||
1 value check : warning level for cpu in percent (on one minute)
|
||||
3 value check : comma separated level for load or cpu for 1min, 5min, 15min
|
||||
-c, --crit=INTEGER | INT,INT,INT
|
||||
critical level for cpu in percent (on one minute)
|
||||
1 value check : critical level for cpu in percent (on one minute)
|
||||
3 value check : comma separated level for load or cpu for 1min, 5min, 15min
|
||||
-T, --type=stand|netsl|netsc|as400|cisco|cata|c5500|bc|nokia|hp|lp
|
||||
CPU check :
|
||||
stand : standard MIBII (works with Windows),
|
||||
can handle multiple CPU.
|
||||
netsl : linux load provided by Net SNMP (1,5 & 15 minutes values)
|
||||
netsc : cpu usage given by net-snmp (100-idle)
|
||||
as400 : as400 CPU usage
|
||||
cisco : Cisco CPU usage
|
||||
cata : Cisco catalyst CPU usage
|
||||
c5500 : Cisco ASA 5500 CPU usage
|
||||
nsc : NetScreen CPU usage
|
||||
fg : Fortigate CPU usage
|
||||
bc : Bluecoat CPU usage
|
||||
nokia : Nokia CPU usage
|
||||
hp : HP procurve switch CPU usage
|
||||
lp : Linkproof CPU usage
|
||||
hpux : HP-UX load (1,5 & 15 minutes values)
|
||||
-f, --perfparse
|
||||
Perfparse compatible output
|
||||
-t, --timeout=INTEGER
|
||||
timeout for SNMP in seconds (Default: 5)
|
||||
-V, --version
|
||||
prints version number
|
||||
EOT
|
||||
}
|
||||
|
||||
# For verbose output
|
||||
sub verb { my $t=shift; print $t,"\n" if defined($o_verb) ; }
|
||||
|
||||
sub check_options {
|
||||
Getopt::Long::Configure ("bundling");
|
||||
GetOptions(
|
||||
'v' => \$o_verb, 'verbose' => \$o_verb,
|
||||
'h' => \$o_help, 'help' => \$o_help,
|
||||
'H:s' => \$o_host, 'hostname:s' => \$o_host,
|
||||
'p:i' => \$o_port, 'port:i' => \$o_port,
|
||||
'C:s' => \$o_community, 'community:s' => \$o_community,
|
||||
'l:s' => \$o_login, 'login:s' => \$o_login,
|
||||
'x:s' => \$o_passwd, 'passwd:s' => \$o_passwd,
|
||||
'X:s' => \$o_privpass, 'privpass:s' => \$o_privpass,
|
||||
'L:s' => \$v3protocols, 'protocols:s' => \$v3protocols,
|
||||
't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
|
||||
'V' => \$o_version, 'version' => \$o_version,
|
||||
'2' => \$o_version2, 'v2c' => \$o_version2,
|
||||
'c:s' => \$o_crit, 'critical:s' => \$o_crit,
|
||||
'w:s' => \$o_warn, 'warn:s' => \$o_warn,
|
||||
'f' => \$o_perf, 'perfparse' => \$o_perf,
|
||||
'T:s' => \$o_check_type, 'type:s' => \$o_check_type
|
||||
);
|
||||
# check the -T option
|
||||
my $T_option_valid=0;
|
||||
foreach (@valid_types) { if ($_ eq $o_check_type) {$T_option_valid=1} };
|
||||
if ( $T_option_valid == 0 )
|
||||
{print "Invalid check type (-T)!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
# Basic checks
|
||||
if (defined($o_timeout) && (isnnum($o_timeout) || ($o_timeout < 2) || ($o_timeout > 60)))
|
||||
{ print "Timeout must be >1 and <60 !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
if (!defined($o_timeout)) {$o_timeout=5;}
|
||||
if (defined ($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}};
|
||||
if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}};
|
||||
if ( ! defined($o_host) ) # check host and filter
|
||||
{ print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
# check snmp information
|
||||
if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) )
|
||||
{ print "Put snmp login info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
if ((defined($o_login) || defined($o_passwd)) && (defined($o_community) || defined($o_version2)) )
|
||||
{ print "Can't mix snmp v1,2c,3 protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
if (defined ($v3protocols)) {
|
||||
if (!defined($o_login)) { print "Put snmp V3 login info with protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
my @v3proto=split(/,/,$v3protocols);
|
||||
if ((defined ($v3proto[0])) && ($v3proto[0] ne "")) {$o_authproto=$v3proto[0]; } # Auth protocol
|
||||
if (defined ($v3proto[1])) {$o_privproto=$v3proto[1]; } # Priv protocol
|
||||
if ((defined ($v3proto[1])) && (!defined($o_privpass))) {
|
||||
print "Put snmp V3 priv login info with priv protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
}
|
||||
# Check warnings and critical
|
||||
if (!defined($o_warn) || !defined($o_crit))
|
||||
{ print "put warning and critical info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
# Get rid of % sign
|
||||
$o_warn =~ s/\%//g;
|
||||
$o_crit =~ s/\%//g;
|
||||
# Check for multiple warning and crit in case of -L
|
||||
if (($o_check_type eq "netsl") || ($o_check_type eq "cisco") || ($o_check_type eq "cata") ||
|
||||
($o_check_type eq "c5500") || ($o_check_type eq "nsc") || ($o_check_type eq "hpux")) {
|
||||
@o_warnL=split(/,/ , $o_warn);
|
||||
@o_critL=split(/,/ , $o_crit);
|
||||
if (($#o_warnL != 2) || ($#o_critL != 2))
|
||||
{ print "3 warnings and critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
for (my $i=0;$i<3;$i++) {
|
||||
if ( isnnum($o_warnL[$i]) || isnnum($o_critL[$i]))
|
||||
{ print "Numeric value for warning or critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
if ($o_warnL[$i] > $o_critL[$i])
|
||||
{ print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
}
|
||||
} else {
|
||||
if (($o_warn =~ /,/) || ($o_crit =~ /,/)) {
|
||||
{ print "Multiple warning/critical levels not available for this check\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
}
|
||||
if ( isnnum($o_warn) || isnnum($o_crit) )
|
||||
{ print "Numeric value for warning or critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
if ($o_warn > $o_crit)
|
||||
{ print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
}
|
||||
}
|
||||
|
||||
########## MAIN #######
|
||||
|
||||
check_options();
|
||||
|
||||
# Check gobal timeout if snmp screws up
|
||||
if (defined($TIMEOUT)) {
|
||||
verb("Alarm at $TIMEOUT + 5");
|
||||
alarm($TIMEOUT+5);
|
||||
} else {
|
||||
verb("no global timeout defined : $o_timeout + 10");
|
||||
alarm ($o_timeout+10);
|
||||
}
|
||||
|
||||
$SIG{'ALRM'} = sub {
|
||||
print "No answer from host\n";
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
};
|
||||
|
||||
# Connect to host
|
||||
my ($session,$error);
|
||||
if ( defined($o_login) && defined($o_passwd)) {
|
||||
# SNMPv3 login
|
||||
verb("SNMPv3 login");
|
||||
if (!defined ($o_privpass)) {
|
||||
verb("SNMPv3 AuthNoPriv login : $o_login, $o_authproto");
|
||||
($session, $error) = Net::SNMP->session(
|
||||
-hostname => $o_host,
|
||||
-version => '3',
|
||||
-username => $o_login,
|
||||
-authpassword => $o_passwd,
|
||||
-authprotocol => $o_authproto,
|
||||
-timeout => $o_timeout
|
||||
);
|
||||
} else {
|
||||
verb("SNMPv3 AuthPriv login : $o_login, $o_authproto, $o_privproto");
|
||||
($session, $error) = Net::SNMP->session(
|
||||
-hostname => $o_host,
|
||||
-version => '3',
|
||||
-username => $o_login,
|
||||
-authpassword => $o_passwd,
|
||||
-authprotocol => $o_authproto,
|
||||
-privpassword => $o_privpass,
|
||||
-privprotocol => $o_privproto,
|
||||
-timeout => $o_timeout
|
||||
);
|
||||
}
|
||||
} else {
|
||||
if (defined ($o_version2)) {
|
||||
# SNMPv2 Login
|
||||
verb("SNMP v2c login");
|
||||
($session, $error) = Net::SNMP->session(
|
||||
-hostname => $o_host,
|
||||
-version => 2,
|
||||
-community => $o_community,
|
||||
-port => $o_port,
|
||||
-timeout => $o_timeout
|
||||
);
|
||||
} else {
|
||||
# SNMPV1 login
|
||||
verb("SNMP v1 login");
|
||||
($session, $error) = Net::SNMP->session(
|
||||
-hostname => $o_host,
|
||||
-community => $o_community,
|
||||
-port => $o_port,
|
||||
-timeout => $o_timeout
|
||||
);
|
||||
}
|
||||
}
|
||||
if (!defined($session)) {
|
||||
printf("ERROR opening session: %s.\n", $error);
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
my $exit_val=undef;
|
||||
########### Linux load check ##############
|
||||
|
||||
if ($o_check_type eq "netsl") {
|
||||
|
||||
verb("Checking linux load");
|
||||
# Get load table
|
||||
my $resultat = (Net::SNMP->VERSION lt 4) ?
|
||||
$session->get_table($linload_table)
|
||||
: $session->get_table(Baseoid => $linload_table);
|
||||
|
||||
if (!defined($resultat)) {
|
||||
printf("ERROR: Description table : %s.\n", $session->error);
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
$session->close;
|
||||
|
||||
my @load = undef;
|
||||
my @iload = undef;
|
||||
my @oid=undef;
|
||||
my $exist=0;
|
||||
foreach my $key ( keys %$resultat) {
|
||||
verb("OID : $key, Desc : $$resultat{$key}");
|
||||
if ( $key =~ /$linload_name/ ) {
|
||||
@oid=split (/\./,$key);
|
||||
$iload[0]= pop(@oid) if ($$resultat{$key} eq "Load-1");
|
||||
$iload[1]= pop(@oid) if ($$resultat{$key} eq "Load-5");
|
||||
$iload[2]= pop(@oid) if ($$resultat{$key} eq "Load-15");
|
||||
$exist=1
|
||||
}
|
||||
}
|
||||
|
||||
if ($exist == 0) {
|
||||
print "Can't find snmp information on load : UNKNOWN\n";
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
for (my $i=0;$i<3;$i++) { $load[$i] = $$resultat{$linload_load . "." . $iload[$i]}};
|
||||
|
||||
print "Load : $load[0] $load[1] $load[2] :";
|
||||
|
||||
$exit_val=$ERRORS{"OK"};
|
||||
for (my $i=0;$i<3;$i++) {
|
||||
if ( $load[$i] > $o_critL[$i] ) {
|
||||
print " $load[$i] > $o_critL[$i] : CRITICAL";
|
||||
$exit_val=$ERRORS{"CRITICAL"};
|
||||
}
|
||||
if ( $load[$i] > $o_warnL[$i] ) {
|
||||
# output warn error only if no critical was found
|
||||
if ($exit_val eq $ERRORS{"OK"}) {
|
||||
print " $load[$i] > $o_warnL[$i] : WARNING";
|
||||
$exit_val=$ERRORS{"WARNING"};
|
||||
}
|
||||
}
|
||||
}
|
||||
print " OK" if ($exit_val eq $ERRORS{"OK"});
|
||||
if (defined($o_perf)) {
|
||||
print " | load_5_sec=$load[0];$o_warnL[0];$o_critL[0] ";
|
||||
print "load_1_min=$load[1];$o_warnL[1];$o_critL[1] ";
|
||||
print "load_5_min=$load[2];$o_warnL[2];$o_critL[2]\n";
|
||||
} else {
|
||||
print "\n";
|
||||
}
|
||||
exit $exit_val;
|
||||
}
|
||||
|
||||
############## Cisco CPU check ################
|
||||
|
||||
if ($o_check_type eq "cisco") {
|
||||
my @oidlists = ($cisco_cpu_5m, $cisco_cpu_1m, $cisco_cpu_5s);
|
||||
my $resultat = (Net::SNMP->VERSION lt 4) ?
|
||||
$session->get_request(@oidlists)
|
||||
: $session->get_request(-varbindlist => \@oidlists);
|
||||
|
||||
if (!defined($resultat)) {
|
||||
printf("ERROR: Description table : %s.\n", $session->error);
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
$session->close;
|
||||
|
||||
if (!defined ($$resultat{$cisco_cpu_5s})) {
|
||||
print "No CPU information : UNKNOWN\n";
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
my @load = undef;
|
||||
|
||||
$load[0]=$$resultat{$cisco_cpu_5s};
|
||||
$load[1]=$$resultat{$cisco_cpu_1m};
|
||||
$load[2]=$$resultat{$cisco_cpu_5m};
|
||||
|
||||
print "CPU : $load[0] $load[1] $load[2] :";
|
||||
|
||||
$exit_val=$ERRORS{"OK"};
|
||||
for (my $i=0;$i<3;$i++) {
|
||||
if ( $load[$i] > $o_critL[$i] ) {
|
||||
print " $load[$i] > $o_critL[$i] : CRITICAL";
|
||||
$exit_val=$ERRORS{"CRITICAL"};
|
||||
}
|
||||
if ( $load[$i] > $o_warnL[$i] ) {
|
||||
# output warn error only if no critical was found
|
||||
if ($exit_val eq $ERRORS{"OK"}) {
|
||||
print " $load[$i] > $o_warnL[$i] : WARNING";
|
||||
$exit_val=$ERRORS{"WARNING"};
|
||||
}
|
||||
}
|
||||
}
|
||||
print " OK" if ($exit_val eq $ERRORS{"OK"});
|
||||
if (defined($o_perf)) {
|
||||
print " | load_5_sec=$load[0];$o_warnL[0];$o_critL[0] ";
|
||||
print "load_1_min=$load[1];$o_warnL[1];$o_critL[1] ";
|
||||
print "load_5_min=$load[2];$o_warnL[2];$o_critL[2]\n";
|
||||
} else {
|
||||
print "\n";
|
||||
}
|
||||
|
||||
exit $exit_val;
|
||||
}
|
||||
|
||||
############## Cisco Catalyst CPU check ################
|
||||
|
||||
if ($o_check_type eq "cata") {
|
||||
my @oidlists = ($ciscocata_cpu_5m, $ciscocata_cpu_1m, $ciscocata_cpu_5s);
|
||||
my $resultat = (Net::SNMP->VERSION lt 4) ?
|
||||
$session->get_request(@oidlists)
|
||||
: $session->get_request(-varbindlist => \@oidlists);
|
||||
|
||||
if (!defined($resultat)) {
|
||||
printf("ERROR: Description table : %s.\n", $session->error);
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
$session->close;
|
||||
|
||||
if (!defined ($$resultat{$ciscocata_cpu_5s})) {
|
||||
print "No CPU information : UNKNOWN\n";
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
my @load = undef;
|
||||
|
||||
$load[0]=$$resultat{$ciscocata_cpu_5s};
|
||||
$load[1]=$$resultat{$ciscocata_cpu_1m};
|
||||
$load[2]=$$resultat{$ciscocata_cpu_5m};
|
||||
|
||||
print "CPU : $load[0] $load[1] $load[2] :";
|
||||
|
||||
$exit_val=$ERRORS{"OK"};
|
||||
for (my $i=0;$i<3;$i++) {
|
||||
if ( $load[$i] > $o_critL[$i] ) {
|
||||
print " $load[$i] > $o_critL[$i] : CRITICAL";
|
||||
$exit_val=$ERRORS{"CRITICAL"};
|
||||
}
|
||||
if ( $load[$i] > $o_warnL[$i] ) {
|
||||
# output warn error only if no critical was found
|
||||
if ($exit_val eq $ERRORS{"OK"}) {
|
||||
print " $load[$i] > $o_warnL[$i] : WARNING";
|
||||
$exit_val=$ERRORS{"WARNING"};
|
||||
}
|
||||
}
|
||||
}
|
||||
print " OK" if ($exit_val eq $ERRORS{"OK"});
|
||||
if (defined($o_perf)) {
|
||||
print " | load_5_sec=$load[0];$o_warnL[0];$o_critL[0] ";
|
||||
print "load_1_min=$load[1];$o_warnL[1];$o_critL[1] ";
|
||||
print "load_5_min=$load[2];$o_warnL[2];$o_critL[2]\n";
|
||||
} else {
|
||||
print "\n";
|
||||
}
|
||||
|
||||
exit $exit_val;
|
||||
}
|
||||
|
||||
############## Cisco ASA 5500 CPU check ################
|
||||
|
||||
if ($o_check_type eq "c5500") {
|
||||
my @oidlists = ($ciscoasa_cpu_5m, $ciscoasa_cpu_1m, $ciscoasa_cpu_5s);
|
||||
my $resultat = (Net::SNMP->VERSION lt 4) ?
|
||||
$session->get_request(@oidlists)
|
||||
: $session->get_request(-varbindlist => \@oidlists);
|
||||
|
||||
if (!defined($resultat)) {
|
||||
printf("ERROR: Description table : %s.\n", $session->error);
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
$session->close;
|
||||
|
||||
if (!defined ($$resultat{$ciscoasa_cpu_5s})) {
|
||||
print "No CPU information : UNKNOWN\n";
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
my @load = undef;
|
||||
|
||||
$load[0]=$$resultat{$ciscoasa_cpu_5s};
|
||||
$load[1]=$$resultat{$ciscoasa_cpu_1m};
|
||||
$load[2]=$$resultat{$ciscoasa_cpu_5m};
|
||||
|
||||
print "CPU : $load[0] $load[1] $load[2] :";
|
||||
|
||||
$exit_val=$ERRORS{"OK"};
|
||||
for (my $i=0;$i<3;$i++) {
|
||||
if ( $load[$i] > $o_critL[$i] ) {
|
||||
print " $load[$i] > $o_critL[$i] : CRITICAL";
|
||||
$exit_val=$ERRORS{"CRITICAL"};
|
||||
}
|
||||
if ( $load[$i] > $o_warnL[$i] ) {
|
||||
# output warn error only if no critical was found
|
||||
if ($exit_val eq $ERRORS{"OK"}) {
|
||||
print " $load[$i] > $o_warnL[$i] : WARNING";
|
||||
$exit_val=$ERRORS{"WARNING"};
|
||||
}
|
||||
}
|
||||
}
|
||||
print " OK" if ($exit_val eq $ERRORS{"OK"});
|
||||
if (defined($o_perf)) {
|
||||
print " | load_5_sec=$load[0];$o_warnL[0];$o_critL[0] ";
|
||||
print "load_1_min=$load[1];$o_warnL[1];$o_critL[1], ";
|
||||
print "load_5_min=$load[2];$o_warnL[2];$o_critL[2]\n";
|
||||
} else {
|
||||
print "\n";
|
||||
}
|
||||
|
||||
exit $exit_val;
|
||||
}
|
||||
|
||||
############## Netscreen CPU check ################
|
||||
|
||||
if ($o_check_type eq "nsc") {
|
||||
my @oidlists = ($nsc_cpu_5m, $nsc_cpu_1m, $nsc_cpu_5s);
|
||||
my $resultat = (Net::SNMP->VERSION lt 4) ?
|
||||
$session->get_request(@oidlists)
|
||||
: $session->get_request(-varbindlist => \@oidlists);
|
||||
|
||||
if (!defined($resultat)) {
|
||||
printf("ERROR: Description table : %s.\n", $session->error);
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
$session->close;
|
||||
|
||||
if (!defined ($$resultat{$nsc_cpu_5s})) {
|
||||
print "No CPU information : UNKNOWN\n";
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
my @load = undef;
|
||||
|
||||
$load[0]=$$resultat{$nsc_cpu_5s};
|
||||
$load[1]=$$resultat{$nsc_cpu_1m};
|
||||
$load[2]=$$resultat{$nsc_cpu_5m};
|
||||
|
||||
print "CPU : $load[0] $load[1] $load[2] :";
|
||||
|
||||
$exit_val=$ERRORS{"OK"};
|
||||
for (my $i=0;$i<3;$i++) {
|
||||
if ( $load[$i] > $o_critL[$i] ) {
|
||||
print " $load[$i] > $o_critL[$i] : CRITICAL";
|
||||
$exit_val=$ERRORS{"CRITICAL"};
|
||||
}
|
||||
if ( $load[$i] > $o_warnL[$i] ) {
|
||||
# output warn error only if no critical was found
|
||||
if ($exit_val eq $ERRORS{"OK"}) {
|
||||
print " $load[$i] > $o_warnL[$i] : WARNING";
|
||||
$exit_val=$ERRORS{"WARNING"};
|
||||
}
|
||||
}
|
||||
}
|
||||
print " OK" if ($exit_val eq $ERRORS{"OK"});
|
||||
if (defined($o_perf)) {
|
||||
print " | load_5_sec=$load[0];$o_warnL[0];$o_critL[0] ";
|
||||
print "load_1_min=$load[1];$o_warnL[1];$o_critL[1], ";
|
||||
print "load_5_min=$load[2];$o_warnL[2];$o_critL[2]\n";
|
||||
} else {
|
||||
print "\n";
|
||||
}
|
||||
|
||||
exit $exit_val;
|
||||
}
|
||||
|
||||
################## CPU for : AS/400 , Netsnmp, HP, Bluecoat, linkproof, fortigate ###########
|
||||
if ( $o_check_type =~ /netsc|as400|bc|nokia|^hp$|lp|fg/ ) {
|
||||
|
||||
# Get load table
|
||||
my @oidlist = $cpu_oid{$o_check_type};
|
||||
verb("Checking OID : @oidlist");
|
||||
my $resultat = (Net::SNMP->VERSION lt 4) ?
|
||||
$session->get_request(@oidlist)
|
||||
: $session->get_request(-varbindlist => \@oidlist);
|
||||
if (!defined($resultat)) {
|
||||
printf("ERROR: Description table : %s.\n", $session->error);
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
$session->close;
|
||||
|
||||
if (!defined ($$resultat{$cpu_oid{$o_check_type}})) {
|
||||
print "No CPU information : UNKNOWN\n";
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
my $load=$$resultat{$cpu_oid{$o_check_type}};
|
||||
verb("OID returned $load");
|
||||
# for AS400, divide by 100
|
||||
if ($o_check_type eq "as400") {$load /= 100; };
|
||||
# for Net-snmp : oid returned idle time so load = 100-idle.
|
||||
if ($o_check_type eq "netsc") {$load = 100 - $load; };
|
||||
|
||||
printf("CPU used %.1f%% (",$load);
|
||||
|
||||
$exit_val=$ERRORS{"OK"};
|
||||
if ($load > $o_crit) {
|
||||
print ">$o_crit) : CRITICAL";
|
||||
$exit_val=$ERRORS{"CRITICAL"};
|
||||
} else {
|
||||
if ($load > $o_warn) {
|
||||
print ">$o_warn) : WARNING";
|
||||
$exit_val=$ERRORS{"WARNING"};
|
||||
}
|
||||
}
|
||||
print "<$o_warn) : OK" if ($exit_val eq $ERRORS{"OK"});
|
||||
(defined($o_perf)) ?
|
||||
print " | cpu_prct_used=$load\%;$o_warn;$o_crit\n"
|
||||
: print "\n";
|
||||
exit $exit_val;
|
||||
|
||||
}
|
||||
|
||||
##### Checking hpux load
|
||||
if ($o_check_type eq "hpux") {
|
||||
|
||||
verb("Checking hpux load");
|
||||
|
||||
my @oidlists = ($hpux_load_1_min, $hpux_load_5_min, $hpux_load_15_min);
|
||||
my $resultat = (Net::SNMP->VERSION lt 4) ?
|
||||
$session->get_request(@oidlists)
|
||||
: $session->get_request(-varbindlist => \@oidlists);
|
||||
|
||||
if (!defined($resultat)) {
|
||||
printf("ERROR: Load table : %s.\n", $session->error);
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
$session->close;
|
||||
|
||||
if (!defined ($$resultat{$hpux_load_1_min})) {
|
||||
print "No Load information : UNKNOWN\n";
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
my @load = undef;
|
||||
|
||||
$load[0]=$$resultat{$hpux_load_1_min}/100;
|
||||
$load[1]=$$resultat{$hpux_load_5_min}/100;
|
||||
$load[2]=$$resultat{$hpux_load_15_min}/100;
|
||||
|
||||
print "Load : $load[0] $load[1] $load[2] :";
|
||||
|
||||
$exit_val=$ERRORS{"OK"};
|
||||
for (my $i=0;$i<3;$i++) {
|
||||
if ( $load[$i] > $o_critL[$i] ) {
|
||||
print " $load[$i] > $o_critL[$i] : CRITICAL";
|
||||
$exit_val=$ERRORS{"CRITICAL"};
|
||||
}
|
||||
if ( $load[$i] > $o_warnL[$i] ) {
|
||||
# output warn error only if no critical was found
|
||||
if ($exit_val eq $ERRORS{"OK"}) {
|
||||
print " $load[$i] > $o_warnL[$i] : WARNING";
|
||||
$exit_val=$ERRORS{"WARNING"};
|
||||
}
|
||||
}
|
||||
}
|
||||
print " OK" if ($exit_val eq $ERRORS{"OK"});
|
||||
if (defined($o_perf)) {
|
||||
print " | load_5_sec=$load[0];$o_warnL[0];$o_critL[0] ";
|
||||
print "load_1_min=$load[1];$o_warnL[1];$o_critL[1] ";
|
||||
print "load_5_min=$load[2];$o_warnL[2];$o_critL[2]\n";
|
||||
} else {
|
||||
print "\n";
|
||||
}
|
||||
|
||||
exit $exit_val;
|
||||
}
|
||||
|
||||
########## Standard cpu usage check ############
|
||||
# Get desctiption table
|
||||
my $resultat = (Net::SNMP->VERSION lt 4) ?
|
||||
$session->get_table($base_proc)
|
||||
: $session->get_table(Baseoid => $base_proc);
|
||||
|
||||
if (!defined($resultat)) {
|
||||
printf("ERROR: Description table : %s.\n", $session->error);
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
$session->close;
|
||||
|
||||
my ($cpu_used,$ncpu)=(0,0);
|
||||
foreach my $key ( keys %$resultat) {
|
||||
verb("OID : $key, Desc : $$resultat{$key}");
|
||||
if ( $key =~ /$proc_load/) {
|
||||
$cpu_used += $$resultat{$key};
|
||||
$ncpu++;
|
||||
}
|
||||
}
|
||||
|
||||
if ($ncpu==0) {
|
||||
print "Can't find CPU usage information : UNKNOWN\n";
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
$cpu_used /= $ncpu;
|
||||
|
||||
print "$ncpu CPU, ", $ncpu==1 ? "load" : "average load";
|
||||
printf(" %.1f%%",$cpu_used);
|
||||
$exit_val=$ERRORS{"OK"};
|
||||
|
||||
if ($cpu_used > $o_crit) {
|
||||
print " > $o_crit% : CRITICAL";
|
||||
$exit_val=$ERRORS{"CRITICAL"};
|
||||
} else {
|
||||
if ($cpu_used > $o_warn) {
|
||||
print " > $o_warn% : WARNING";
|
||||
$exit_val=$ERRORS{"WARNING"};
|
||||
}
|
||||
}
|
||||
print " < $o_warn% : OK" if ($exit_val eq $ERRORS{"OK"});
|
||||
(defined($o_perf)) ?
|
||||
print " | cpu_prct_used=$cpu_used\%;$o_warn;$o_crit\n"
|
||||
: print "\n";
|
||||
exit $exit_val;
|
||||
|
||||
@@ -0,0 +1,524 @@
|
||||
#!/usr/bin/perl -w
|
||||
############################## check_snmp_mem ##############
|
||||
my $Version='1.5';
|
||||
# Date : 17 October 2007
|
||||
# Author : Patrick Proy (nagios at proy.org)
|
||||
# Help : http://nagios.manubulon.com/
|
||||
# Licence : GPL - http://www.fsf.org/licenses/gpl.txt
|
||||
# Contrib : Jan Jungmann, Patrick Griffin
|
||||
# TODO :
|
||||
#################################################################
|
||||
#
|
||||
# Help : ./check_snmp_mem.pl -h
|
||||
#
|
||||
|
||||
use strict;
|
||||
use Net::SNMP;
|
||||
use Getopt::Long;
|
||||
|
||||
# Nagios specific
|
||||
|
||||
my $TIMEOUT = 15;
|
||||
my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
|
||||
|
||||
# SNMP Datas
|
||||
|
||||
# Net-snmp memory
|
||||
|
||||
my $nets_ram_free = "1.3.6.1.4.1.2021.4.6.0"; # Real memory free
|
||||
my $nets_ram_total = "1.3.6.1.4.1.2021.4.5.0"; # Real memory total
|
||||
my $nets_ram_buffer = "1.3.6.1.4.1.2021.4.14.0"; # Real memory buffered
|
||||
my $nets_ram_cache = "1.3.6.1.4.1.2021.4.15.0"; # Real memory cached
|
||||
my $nets_swap_free = "1.3.6.1.4.1.2021.4.4.0"; # swap memory free
|
||||
my $nets_swap_total = "1.3.6.1.4.1.2021.4.3.0"; # Swap memory total
|
||||
my @nets_oids = ($nets_ram_free,$nets_ram_total,$nets_swap_free,$nets_swap_total,$nets_ram_cache,$nets_ram_buffer);
|
||||
|
||||
# Cisco
|
||||
|
||||
my $cisco_mem_pool = "1.3.6.1.4.1.9.9.48.1.1.1"; # Cisco memory pool
|
||||
my $cisco_index = "1.3.6.1.4.1.9.9.48.1.1.1.2"; # memory pool name and index
|
||||
my $cisco_valid = "1.3.6.1.4.1.9.9.48.1.1.1.4"; # Valid memory if 1
|
||||
my $cisco_used = "1.3.6.1.4.1.9.9.48.1.1.1.5"; # Used memory
|
||||
my $cisco_free = "1.3.6.1.4.1.9.9.48.1.1.1.6"; # Free memory
|
||||
# .1 : type, .2 : name, .3 : alternate, .4 : valid, .5 : used, .6 : free, .7 : max free
|
||||
|
||||
# HP Procurve
|
||||
|
||||
my $hp_mem_pool = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1"; # HP memory pool
|
||||
my $hp_mem_index = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1.1"; # memory slot index
|
||||
my $hp_mem_total = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1.5"; # Total Bytes
|
||||
my $hp_mem_free = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1.6"; # Free Bytes
|
||||
my $hp_mem_free_seg = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1.3"; # Free segments
|
||||
|
||||
# AS/400
|
||||
|
||||
# Windows NT/2K/(XP?)
|
||||
|
||||
# check_snmp_storage.pl -C <community> -H <hostIP> -m "^Virtual Memory$" -w <warn %> -c <crit %>
|
||||
|
||||
|
||||
# Globals
|
||||
|
||||
|
||||
my $o_host = undef; # hostname
|
||||
my $o_community = undef; # community
|
||||
my $o_port = 161; # port
|
||||
my $o_help= undef; # wan't some help ?
|
||||
my $o_verb= undef; # verbose mode
|
||||
my $o_version= undef; # print version
|
||||
my $o_netsnmp= 1; # Check with netsnmp (default)
|
||||
my $o_cisco= undef; # Check cisco router mem
|
||||
my $o_hp= undef; # Check hp procurve mem
|
||||
my $o_warn= undef; # warning level option
|
||||
my $o_warnR= undef; # warning level for Real memory
|
||||
my $o_warnS= undef; # warning levels for swap
|
||||
my $o_crit= undef; # Critical level option
|
||||
my $o_critR= undef; # critical level for Real memory
|
||||
my $o_critS= undef; # critical level for swap
|
||||
my $o_perf= undef; # Performance data option
|
||||
my $o_cache= undef; # Include cached memory as used memory
|
||||
my $o_buffer= undef; # Exclude buffered memory as used memory
|
||||
my $o_timeout= undef; # Timeout (Default 5)
|
||||
my $o_version2= undef; # use snmp v2c
|
||||
# SNMPv3 specific
|
||||
my $o_login= undef; # Login for snmpv3
|
||||
my $o_passwd= undef; # Pass for snmpv3
|
||||
my $v3protocols=undef; # V3 protocol list.
|
||||
my $o_authproto='md5'; # Auth protocol
|
||||
my $o_privproto='des'; # Priv protocol
|
||||
my $o_privpass= undef; # priv password
|
||||
|
||||
# functions
|
||||
|
||||
sub p_version { print "check_snmp_mem version : $Version\n"; }
|
||||
|
||||
sub print_usage {
|
||||
print "Usage: $0 [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd [-X pass -L <authp>,<privp>]) [-p <port>] -w <warn level> -c <crit level> [-I|-N|-E] [-f] [-m -b] [-t <timeout>] [-V]\n";
|
||||
}
|
||||
|
||||
sub isnnum { # Return true if arg is not a number
|
||||
my $num = shift;
|
||||
if ( $num =~ /^(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;}
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub round ($$) {
|
||||
sprintf "%.$_[1]f", $_[0];
|
||||
}
|
||||
|
||||
sub help {
|
||||
print "\nSNMP Memory Monitor for Nagios version ",$Version,"\n";
|
||||
print "GPL licence, (c)2004-2007 Patrick Proy\n\n";
|
||||
print_usage();
|
||||
print <<EOT;
|
||||
-v, --verbose
|
||||
print extra debugging information
|
||||
-h, --help
|
||||
print this help message
|
||||
-H, --hostname=HOST
|
||||
name or IP address of host to check
|
||||
-C, --community=COMMUNITY NAME
|
||||
community name for the host's SNMP agent (implies SNMP v1 or v2c with option)
|
||||
-2, --v2c
|
||||
Use snmp v2c
|
||||
-l, --login=LOGIN ; -x, --passwd=PASSWD
|
||||
Login and auth password for snmpv3 authentication
|
||||
If no priv password exists, implies AuthNoPriv
|
||||
-X, --privpass=PASSWD
|
||||
Priv password for snmpv3 (AuthPriv protocol)
|
||||
-L, --protocols=<authproto>,<privproto>
|
||||
<authproto> : Authentication protocol (md5|sha : default md5)
|
||||
<privproto> : Priv protocole (des|aes : default des)
|
||||
-P, --port=PORT
|
||||
SNMP port (Default 161)
|
||||
-w, --warn=INTEGER | INT,INT
|
||||
warning level for memory in percent (0 for no checks)
|
||||
Default (-N switch) : comma separated level for Real Memory and Swap
|
||||
-I switch : warning level
|
||||
-c, --crit=INTEGER | INT,INT
|
||||
critical level for memory in percent (0 for no checks)
|
||||
Default (-N switch) : comma separated level for Real Memory and Swap
|
||||
-I switch : critical level
|
||||
-N, --netsnmp (default)
|
||||
check linux memory & swap provided by Net SNMP
|
||||
-m, --memcache
|
||||
include cached memory in used memory (only with Net-SNMP)
|
||||
-b, --membuffer
|
||||
exclude buffered memory in used memory (only with Net-SNMP)
|
||||
-I, --cisco
|
||||
check cisco memory (sum of all memory pools)
|
||||
-E, --hp
|
||||
check HP proccurve memory
|
||||
-f, --perfdata
|
||||
Performance data output
|
||||
-t, --timeout=INTEGER
|
||||
timeout for SNMP in seconds (Default: 5)
|
||||
-V, --version
|
||||
prints version number
|
||||
EOT
|
||||
}
|
||||
|
||||
# For verbose output
|
||||
sub verb { my $t=shift; print $t,"\n" if defined($o_verb) ; }
|
||||
|
||||
# Get the alarm signal (just in case snmp timout screws up)
|
||||
$SIG{'ALRM'} = sub {
|
||||
print ("ERROR: Alarm signal (Nagios time-out)\n");
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
};
|
||||
|
||||
sub check_options {
|
||||
Getopt::Long::Configure ("bundling");
|
||||
GetOptions(
|
||||
'v' => \$o_verb, 'verbose' => \$o_verb,
|
||||
'h' => \$o_help, 'help' => \$o_help,
|
||||
'H:s' => \$o_host, 'hostname:s' => \$o_host,
|
||||
'p:i' => \$o_port, 'port:i' => \$o_port,
|
||||
'C:s' => \$o_community, 'community:s' => \$o_community,
|
||||
'l:s' => \$o_login, 'login:s' => \$o_login,
|
||||
'x:s' => \$o_passwd, 'passwd:s' => \$o_passwd,
|
||||
'X:s' => \$o_privpass, 'privpass:s' => \$o_privpass,
|
||||
'L:s' => \$v3protocols, 'protocols:s' => \$v3protocols,
|
||||
't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
|
||||
'V' => \$o_version, 'version' => \$o_version,
|
||||
'I' => \$o_cisco, 'cisco' => \$o_cisco,
|
||||
'N' => \$o_netsnmp, 'netsnmp' => \$o_netsnmp,
|
||||
'E' => \$o_hp, 'hp' => \$o_hp,
|
||||
'2' => \$o_version2, 'v2c' => \$o_version2,
|
||||
'c:s' => \$o_crit, 'critical:s' => \$o_crit,
|
||||
'w:s' => \$o_warn, 'warn:s' => \$o_warn,
|
||||
'm' => \$o_cache, 'memcache' => \$o_cache,
|
||||
'b' => \$o_buffer, 'membuffer' => \$o_buffer,
|
||||
'f' => \$o_perf, 'perfdata' => \$o_perf
|
||||
);
|
||||
if (defined ($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}};
|
||||
if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}};
|
||||
if ( ! defined($o_host) ) # check host and filter
|
||||
{ print "No host defined!\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
# check snmp information
|
||||
if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) )
|
||||
{ print "Put snmp login info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
if ((defined($o_login) || defined($o_passwd)) && (defined($o_community) || defined($o_version2)) )
|
||||
{ print "Can't mix snmp v1,2c,3 protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
if (defined ($v3protocols)) {
|
||||
if (!defined($o_login)) { print "Put snmp V3 login info with protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
my @v3proto=split(/,/,$v3protocols);
|
||||
if ((defined ($v3proto[0])) && ($v3proto[0] ne "")) {$o_authproto=$v3proto[0]; } # Auth protocol
|
||||
if (defined ($v3proto[1])) {$o_privproto=$v3proto[1]; } # Priv protocol
|
||||
if ((defined ($v3proto[1])) && (!defined($o_privpass))) {
|
||||
print "Put snmp V3 priv login info with priv protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
}
|
||||
if (defined($o_timeout) && (isnnum($o_timeout) || ($o_timeout < 2) || ($o_timeout > 60)))
|
||||
{ print "Timeout must be >1 and <60 !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
if (!defined($o_timeout)) {$o_timeout=5;}
|
||||
#Check Warning and crit are present
|
||||
if ( ! defined($o_warn) || ! defined($o_crit))
|
||||
{ print "Put warning and critical values!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
# Get rid of % sign
|
||||
$o_warn =~ s/\%//g;
|
||||
$o_crit =~ s/\%//g;
|
||||
# if -N or -E switch , undef $o_netsnmp
|
||||
if (defined($o_cisco) || defined($o_hp) ) {
|
||||
$o_netsnmp=undef;
|
||||
if ( isnnum($o_warn) || isnnum($o_crit))
|
||||
{ print "Numeric value for warning or critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"} }
|
||||
if ( ($o_crit != 0) && ($o_warn > $o_crit) )
|
||||
{ print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
}
|
||||
if (defined($o_netsnmp)) {
|
||||
my @o_warnL=split(/,/ , $o_warn);
|
||||
my @o_critL=split(/,/ , $o_crit);
|
||||
if (($#o_warnL != 1) || ($#o_critL != 1))
|
||||
{ print "2 warnings and critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
for (my $i=0;$i<2;$i++) {
|
||||
if ( isnnum($o_warnL[$i]) || isnnum($o_critL[$i]))
|
||||
{ print "Numeric value for warning or critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"} }
|
||||
if (($o_critL[$i]!= 0) && ($o_warnL[$i] > $o_critL[$i]))
|
||||
{ print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
if ( $o_critL[$i] > 100)
|
||||
{ print "critical percent must be < 100 !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
}
|
||||
$o_warnR=$o_warnL[0];$o_warnS=$o_warnL[1];
|
||||
$o_critR=$o_critL[0];$o_critS=$o_critL[1];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
########## MAIN #######
|
||||
|
||||
check_options();
|
||||
|
||||
# Check gobal timeout if snmp screws up
|
||||
if (defined($TIMEOUT)) {
|
||||
verb("Alarm at $TIMEOUT");
|
||||
alarm($TIMEOUT);
|
||||
} else {
|
||||
verb("no timeout defined : $o_timeout + 10");
|
||||
alarm ($o_timeout+10);
|
||||
}
|
||||
|
||||
# Connect to host
|
||||
my ($session,$error);
|
||||
if ( defined($o_login) && defined($o_passwd)) {
|
||||
# SNMPv3 login
|
||||
if (!defined ($o_privpass)) {
|
||||
verb("SNMPv3 AuthNoPriv login : $o_login, $o_authproto");
|
||||
($session, $error) = Net::SNMP->session(
|
||||
-hostname => $o_host,
|
||||
-version => '3',
|
||||
-username => $o_login,
|
||||
-authpassword => $o_passwd,
|
||||
-authprotocol => $o_authproto,
|
||||
-port => $o_port,
|
||||
-timeout => $o_timeout
|
||||
);
|
||||
} else {
|
||||
verb("SNMPv3 AuthPriv login : $o_login, $o_authproto, $o_privproto");
|
||||
($session, $error) = Net::SNMP->session(
|
||||
-hostname => $o_host,
|
||||
-version => '3',
|
||||
-username => $o_login,
|
||||
-authpassword => $o_passwd,
|
||||
-authprotocol => $o_authproto,
|
||||
-privpassword => $o_privpass,
|
||||
-privprotocol => $o_privproto,
|
||||
-port => $o_port,
|
||||
-timeout => $o_timeout
|
||||
);
|
||||
}
|
||||
} else {
|
||||
if (defined ($o_version2)) {
|
||||
# SNMPv2 Login
|
||||
verb("SNMP v2c login");
|
||||
($session, $error) = Net::SNMP->session(
|
||||
-hostname => $o_host,
|
||||
-version => 2,
|
||||
-community => $o_community,
|
||||
-port => $o_port,
|
||||
-timeout => $o_timeout
|
||||
);
|
||||
} else {
|
||||
# SNMPV1 login
|
||||
verb("SNMP v1 login");
|
||||
($session, $error) = Net::SNMP->session(
|
||||
-hostname => $o_host,
|
||||
-community => $o_community,
|
||||
-port => $o_port,
|
||||
-timeout => $o_timeout
|
||||
);
|
||||
}
|
||||
}
|
||||
if (!defined($session)) {
|
||||
printf("ERROR opening session: %s.\n", $error);
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
# Global variable
|
||||
my $resultat=undef;
|
||||
|
||||
########### Cisco memory check ############
|
||||
if (defined ($o_cisco)) {
|
||||
|
||||
# Get Cisco memory table
|
||||
$resultat = $session->get_table(Baseoid => $cisco_mem_pool);
|
||||
|
||||
if (!defined($resultat)) {
|
||||
printf("ERROR: Description table : %s.\n", $session->error);
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
my (@oid,@index)=(undef,undef);
|
||||
my $nindex=0;
|
||||
foreach my $key ( keys %$resultat) {
|
||||
verb("OID : $key, Desc : $$resultat{$key}");
|
||||
if ( $key =~ /$cisco_index/ ) {
|
||||
@oid=split (/\./,$key);
|
||||
$index[$nindex++] = pop(@oid);
|
||||
}
|
||||
}
|
||||
|
||||
# Check if at least 1 memory pool exists
|
||||
if ($nindex == 0) {
|
||||
printf("ERROR: No memory pools found");
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
# Test every memory pool
|
||||
my ($c_output,$prct_free)=(undef,undef);
|
||||
my ($warn_s,$crit_s)=(0,0);
|
||||
my ($used,$free)=(0,0);
|
||||
foreach (@index) {
|
||||
$c_output .="," if defined ($c_output);
|
||||
if ( $$resultat{$cisco_valid . "." . $_} == 1 ) {
|
||||
$used += $$resultat{$cisco_used . "." . $_};
|
||||
$free += $$resultat{$cisco_free . "." . $_};
|
||||
$prct_free=round($$resultat{$cisco_used . "." . $_}*100/($$resultat{$cisco_free . "." . $_}+$$resultat{$cisco_used . "." . $_}) ,0);
|
||||
$c_output .= $$resultat{$cisco_index . "." . $_} . ":" . $prct_free . "%";
|
||||
if (($o_crit!=0)&&($o_crit <= $prct_free)) {
|
||||
$crit_s =1;
|
||||
} elsif (($o_warn!=0)&&($o_warn <= $prct_free)) {
|
||||
$warn_s=1;
|
||||
}
|
||||
} else {
|
||||
$c_output .= $$resultat{$cisco_index . "." . $_} . ": INVALID";
|
||||
$crit_s =1;
|
||||
}
|
||||
}
|
||||
my $total=$used+$free;
|
||||
$prct_free=round($used*100/($total),0);
|
||||
verb("Total used : $used, free: $free, output : $c_output");
|
||||
my $c_status="OK";
|
||||
$c_output .=" : " . $prct_free ."% : ";
|
||||
if ($crit_s == 1 ) {
|
||||
$c_output .= " > " . $o_crit ;
|
||||
$c_status="CRITICAL";
|
||||
} else {
|
||||
if ($warn_s == 1 ) {
|
||||
$c_output.=" > " . $o_warn;
|
||||
$c_status="WARNING";
|
||||
}
|
||||
}
|
||||
$c_output .= " ; ".$c_status;
|
||||
if (defined ($o_perf)) {
|
||||
$c_output .= " | ram_used=" . $used.";";
|
||||
$c_output .= ($o_warn ==0)? ";" : round($o_warn * $total/100,0).";";
|
||||
$c_output .= ($o_crit ==0)? ";" : round($o_crit * $total/100,0).";";
|
||||
$c_output .= "0;" . $total ;
|
||||
}
|
||||
$session->close;
|
||||
print "$c_output \n";
|
||||
exit $ERRORS{$c_status};
|
||||
}
|
||||
|
||||
########### HP Procurve memory check ############
|
||||
if (defined ($o_hp)) {
|
||||
|
||||
# Get hp memory table
|
||||
$resultat = $session->get_table(Baseoid => $hp_mem_pool);
|
||||
|
||||
if (!defined($resultat)) {
|
||||
printf("ERROR: Description table : %s.\n", $session->error);
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
my (@oid,@index)=(undef,undef);
|
||||
my $nindex=0;
|
||||
foreach my $key ( keys %$resultat) {
|
||||
verb("OID : $key, Desc : $$resultat{$key}");
|
||||
if ( $key =~ /$hp_mem_index/ ) {
|
||||
@oid=split (/\./,$key);
|
||||
$index[$nindex++] = pop(@oid);
|
||||
}
|
||||
}
|
||||
|
||||
# Check if at least 1 memory slots exists
|
||||
if ($nindex == 0) {
|
||||
printf("ERROR: No memory slots found");
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
# Consolidate the datas
|
||||
my ($total,$free)=(0,0);
|
||||
my ($c_output,$prct_free)=(undef,undef);
|
||||
foreach (@index) {
|
||||
$c_output .="," if defined ($c_output);
|
||||
$total += $$resultat{$hp_mem_total . "." . $_};
|
||||
$free += $$resultat{$hp_mem_free . "." . $_};
|
||||
$c_output .= "Slot " . $$resultat{$hp_mem_index . "." . $_} . ":"
|
||||
.round(
|
||||
100 - ($$resultat{$hp_mem_free . "." . $_} *100 /
|
||||
$$resultat{$hp_mem_total . "." . $_}) ,0)
|
||||
. "%";
|
||||
}
|
||||
my $used = $total - $free;
|
||||
$prct_free=round($used*100/($total),0);
|
||||
verb("Used : $used, Free: $free, Output : $c_output");
|
||||
my $c_status="OK";
|
||||
$c_output .=" : " . $prct_free ."% : ";
|
||||
if (($o_crit!=0)&&($o_crit <= $prct_free)) {
|
||||
$c_output .= " > " . $o_crit ;
|
||||
$c_status="CRITICAL";
|
||||
} else {
|
||||
if (($o_warn!=0)&&($o_warn <= $prct_free)) {
|
||||
$c_output.=" > " . $o_warn;
|
||||
$c_status="WARNING";
|
||||
}
|
||||
}
|
||||
$c_output .= " ; ".$c_status;
|
||||
if (defined ($o_perf)) {
|
||||
$c_output .= " | ram_used=" . $used.";";
|
||||
$c_output .= ($o_warn ==0)? ";" : round($o_warn * $total/100,0).";";
|
||||
$c_output .= ($o_crit ==0)? ";" : round($o_crit * $total/100,0).";";
|
||||
$c_output .= "0;" . $total ;
|
||||
}
|
||||
$session->close;
|
||||
print "$c_output \n";
|
||||
exit $ERRORS{$c_status};
|
||||
}
|
||||
|
||||
########### Net snmp memory check ############
|
||||
if (defined ($o_netsnmp)) {
|
||||
|
||||
# Get NetSNMP memory values
|
||||
$resultat = $session->get_request(-varbindlist => \@nets_oids);
|
||||
|
||||
if (!defined($resultat)) {
|
||||
printf("ERROR: netsnmp : %s.\n", $session->error);
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
my ($realused,$swapused)=(undef,undef);
|
||||
my $totalcachedbuffered = 0;
|
||||
if (defined($o_buffer)) {
|
||||
$totalcachedbuffered = $$resultat{$nets_ram_buffer};
|
||||
}
|
||||
if (!defined($o_cache)) {
|
||||
$totalcachedbuffered = $totalcachedbuffered + $$resultat{$nets_ram_cache};
|
||||
}
|
||||
|
||||
$realused = ($$resultat{$nets_ram_total}-($$resultat{$nets_ram_free}+$totalcachedbuffered)) / $$resultat{$nets_ram_total};
|
||||
|
||||
if($$resultat{$nets_ram_total} == 0) { $realused = 0; }
|
||||
|
||||
$swapused= ($$resultat{$nets_swap_total} == 0) ? 0 :
|
||||
($$resultat{$nets_swap_total}-$$resultat{$nets_swap_free})/$$resultat{$nets_swap_total};
|
||||
$realused=round($realused*100,0);
|
||||
$swapused=round($swapused*100,0);
|
||||
verb ("Ram : $$resultat{$nets_ram_free} ($$resultat{$nets_ram_cache} cached, $$resultat{$nets_ram_buffer} buff) / $$resultat{$nets_ram_total} : $realused");
|
||||
verb ("Swap : $$resultat{$nets_swap_free} / $$resultat{$nets_swap_total} : $swapused");
|
||||
|
||||
my $n_status="OK";
|
||||
my $n_output="Ram : " . $realused . "%, Swap : " . $swapused . "% :";
|
||||
if ((($o_critR!=0)&&($o_critR <= $realused)) || (($o_critS!=0)&&($o_critS <= $swapused))) {
|
||||
$n_output .= " > " . $o_critR . ", " . $o_critS;
|
||||
$n_status="CRITICAL";
|
||||
} else {
|
||||
if ((($o_warnR!=0)&&($o_warnR <= $realused)) || (($o_warnS!=0)&&($o_warnS <= $swapused))) {
|
||||
$n_output.=" > " . $o_warnR . ", " . $o_warnS;
|
||||
$n_status="WARNING";
|
||||
}
|
||||
}
|
||||
$n_output .= " ; ".$n_status;
|
||||
if (defined ($o_perf)) {
|
||||
if (defined ($o_cache)) {
|
||||
$n_output .= " | ram_used=" . ($$resultat{$nets_ram_total}-$$resultat{$nets_ram_free}).";";
|
||||
}
|
||||
else {
|
||||
$n_output .= " | ram_used=" . ($$resultat{$nets_ram_total}-$$resultat{$nets_ram_free}-$$resultat{$nets_ram_cache}).";";
|
||||
}
|
||||
$n_output .= ($o_warnR ==0)? ";" : round($o_warnR * $$resultat{$nets_ram_total}/100,0).";";
|
||||
$n_output .= ($o_critR ==0)? ";" : round($o_critR * $$resultat{$nets_ram_total}/100,0).";";
|
||||
$n_output .= "0;" . $$resultat{$nets_ram_total}. " ";
|
||||
$n_output .= "swap_used=" . ($$resultat{$nets_swap_total}-$$resultat{$nets_swap_free}).";";
|
||||
$n_output .= ($o_warnS ==0)? ";" : round($o_warnS * $$resultat{$nets_swap_total}/100,0).";";
|
||||
$n_output .= ($o_critS ==0)? ";" : round($o_critS * $$resultat{$nets_swap_total}/100,0).";";
|
||||
$n_output .= "0;" . $$resultat{$nets_swap_total};
|
||||
}
|
||||
$session->close;
|
||||
print "$n_output \n";
|
||||
exit $ERRORS{$n_status};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,653 @@
|
||||
#!/usr/bin/perl -w
|
||||
############################## check_snmp_storage ##############
|
||||
# Version : 1.3.3
|
||||
# Date : Jun 1 2007
|
||||
# Author : Patrick Proy ( patrick at proy.org)
|
||||
# Help : http://nagios.manubulon.com
|
||||
# Licence : GPL - http://www.fsf.org/licenses/gpl.txt
|
||||
# TODO :
|
||||
# Contribs : Dimo Velev, Makina Corpus, A. Greiner-B?
|
||||
#################################################################
|
||||
#
|
||||
# help : ./check_snmp_storage -h
|
||||
|
||||
use strict;
|
||||
use Net::SNMP;
|
||||
use Getopt::Long;
|
||||
|
||||
# Nagios specific
|
||||
|
||||
use lib "/usr/lib/nagios/plugins";
|
||||
use utils qw(%ERRORS $TIMEOUT);
|
||||
#my $TIMEOUT = 15;
|
||||
#my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
|
||||
|
||||
# SNMP Datas
|
||||
my $storage_table= '1.3.6.1.2.1.25.2.3.1';
|
||||
my $storagetype_table = '1.3.6.1.2.1.25.2.3.1.2';
|
||||
my $index_table = '1.3.6.1.2.1.25.2.3.1.1';
|
||||
my $descr_table = '1.3.6.1.2.1.25.2.3.1.3';
|
||||
my $size_table = '1.3.6.1.2.1.25.2.3.1.5.';
|
||||
my $used_table = '1.3.6.1.2.1.25.2.3.1.6.';
|
||||
my $alloc_units = '1.3.6.1.2.1.25.2.3.1.4.';
|
||||
|
||||
#Storage types definition - from /usr/share/snmp/mibs/HOST-RESOURCES-TYPES.txt
|
||||
my %hrStorage;
|
||||
$hrStorage{"Other"} = '1.3.6.1.2.1.25.2.1.1';
|
||||
$hrStorage{"1.3.6.1.2.1.25.2.1.1"} = 'Other';
|
||||
$hrStorage{"Ram"} = '1.3.6.1.2.1.25.2.1.2';
|
||||
$hrStorage{"1.3.6.1.2.1.25.2.1.2"} = 'Ram';
|
||||
$hrStorage{"VirtualMemory"} = '1.3.6.1.2.1.25.2.1.3';
|
||||
$hrStorage{"1.3.6.1.2.1.25.2.1.3"} = 'VirtualMemory';
|
||||
$hrStorage{"FixedDisk"} = '1.3.6.1.2.1.25.2.1.4';
|
||||
$hrStorage{"1.3.6.1.2.1.25.2.1.4"} = 'FixedDisk';
|
||||
$hrStorage{"RemovableDisk"} = '1.3.6.1.2.1.25.2.1.5';
|
||||
$hrStorage{"1.3.6.1.2.1.25.2.1.5"} = 'RemovableDisk';
|
||||
$hrStorage{"FloppyDisk"} = '1.3.6.1.2.1.25.2.1.6';
|
||||
$hrStorage{"1.3.6.1.2.1.25.2.1.6"} = 'FloppyDisk';
|
||||
$hrStorage{"CompactDisk"} = '1.3.6.1.2.1.25.2.1.7';
|
||||
$hrStorage{"1.3.6.1.2.1.25.2.1.7"} = 'CompactDisk';
|
||||
$hrStorage{"RamDisk"} = '1.3.6.1.2.1.25.2.1.8';
|
||||
$hrStorage{"1.3.6.1.2.1.25.2.1.8"} = 'RamDisk';
|
||||
$hrStorage{"FlashMemory"} = '1.3.6.1.2.1.25.2.1.9';
|
||||
$hrStorage{"1.3.6.1.2.1.25.2.1.9"} = 'FlashMemory';
|
||||
$hrStorage{"NetworkDisk"} = '1.3.6.1.2.1.25.2.1.10';
|
||||
$hrStorage{"1.3.6.1.2.1.25.2.1.10"} = 'NetworkDisk';
|
||||
|
||||
# Globals
|
||||
|
||||
my $Name='check_snmp_storage';
|
||||
my $Version='1.3.3';
|
||||
|
||||
my $o_host = undef; # hostname
|
||||
my $o_community = undef; # community
|
||||
my $o_port = 161; # port
|
||||
my $o_version2 = undef; #use snmp v2c
|
||||
my $o_descr = undef; # description filter
|
||||
my $o_storagetype = undef; # parse storage type also
|
||||
my $o_warn = undef; # warning limit
|
||||
my $o_crit= undef; # critical limit
|
||||
my $o_help= undef; # wan't some help ?
|
||||
my $o_type= undef; # pl, pu, mbl, mbu
|
||||
my @o_typeok= ("pu","pl","bu","bl"); # valid values for o_type
|
||||
my $o_verb= undef; # verbose mode
|
||||
my $o_version= undef; # print version
|
||||
my $o_noreg= undef; # Do not use Regexp for name
|
||||
my $o_sum= undef; # add all storage before testing
|
||||
my $o_index= undef; # Parse index instead of description
|
||||
my $o_negate= undef; # Negate the regexp if set
|
||||
my $o_timeout= 5; # Default 5s Timeout
|
||||
my $o_perf= undef; # Output performance data
|
||||
my $o_short= undef; # Short output parameters
|
||||
my @o_shortL= undef; # output type,where,cut
|
||||
my $o_reserve= 0; # % reserved blocks (A. Greiner-B? patch)
|
||||
my $o_giga= undef; # output and levels in gigabytes instead of megabytes
|
||||
# SNMPv3 specific
|
||||
my $o_login= undef; # Login for snmpv3
|
||||
my $o_passwd= undef; # Pass for snmpv3
|
||||
my $v3protocols=undef; # V3 protocol list.
|
||||
my $o_authproto='md5'; # Auth protocol
|
||||
my $o_privproto='des'; # Priv protocol
|
||||
my $o_privpass= undef; # priv password
|
||||
# SNMP Message size parameter (Makina Corpus contrib)
|
||||
my $o_octetlength=undef;
|
||||
|
||||
# functions
|
||||
|
||||
sub p_version { print "$Name version : $Version\n"; }
|
||||
|
||||
sub print_usage {
|
||||
print "Usage: $Name [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd [-X pass -L <authp>,<privp>]) [-p <port>] -m <name in desc_oid> [-q storagetype] -w <warn_level> -c <crit_level> [-t <timeout>] [-T pl|pu|bl|bu ] [-r -s -i -G] [-e] [-S 0|1[,1,<car>]] [-o <octet_length>] [-R <% reserved>]\n";
|
||||
}
|
||||
|
||||
sub round ($$) {
|
||||
sprintf "%.$_[1]f", $_[0];
|
||||
}
|
||||
|
||||
sub is_pattern_valid { # Test for things like "<I\s*[^>" or "+5-i"
|
||||
my $pat = shift;
|
||||
if (!defined($pat)) { $pat=" ";} # Just to get rid of compilation time warnings
|
||||
return eval { "" =~ /$pat/; 1 } || 0;
|
||||
}
|
||||
|
||||
# Get the alarm signal (just in case snmp timout screws up)
|
||||
$SIG{'ALRM'} = sub {
|
||||
print ("ERROR: General time-out (Alarm signal)\n");
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
};
|
||||
|
||||
sub isnnum { # Return true if arg is not a number
|
||||
my $num = shift;
|
||||
if ( $num =~ /^-?(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;}
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub help {
|
||||
print "\nSNMP Disk Monitor for Nagios version ",$Version,"\n";
|
||||
print "(c)2004-2007 Patrick Proy\n\n";
|
||||
print_usage();
|
||||
print <<EOT;
|
||||
By default, plugin will monitor %used on drives :
|
||||
warn if %used > warn and critical if %used > crit
|
||||
-v, --verbose
|
||||
print extra debugging information (and lists all storages)
|
||||
-h, --help
|
||||
print this help message
|
||||
-H, --hostname=HOST
|
||||
name or IP address of host to check
|
||||
-C, --community=COMMUNITY NAME
|
||||
community name for the host's SNMP agent (implies SNMP v1)
|
||||
-2, --v2c
|
||||
Use snmp v2c
|
||||
-l, --login=LOGIN ; -x, --passwd=PASSWD
|
||||
Login and auth password for snmpv3 authentication
|
||||
If no priv password exists, implies AuthNoPriv
|
||||
-X, --privpass=PASSWD
|
||||
Priv password for snmpv3 (AuthPriv protocol)
|
||||
-L, --protocols=<authproto>,<privproto>
|
||||
<authproto> : Authentication protocol (md5|sha : default md5)
|
||||
<privproto> : Priv protocole (des|aes : default des)
|
||||
-x, --passwd=PASSWD
|
||||
Password for snmpv3 authentication
|
||||
-p, --port=PORT
|
||||
SNMP port (Default 161)
|
||||
-m, --name=NAME
|
||||
Name in description OID (can be mounpoints '/home' or 'Swap Space'...)
|
||||
This is treated as a regexp : -m /var will match /var , /var/log, /opt/var ...
|
||||
Test it before, because there are known bugs (ex : trailling /)
|
||||
No trailing slash for mountpoints !
|
||||
-q, --storagetype=[Other|Ram|VirtualMemory|FixedDisk|RemovableDisk|FloppyDisk
|
||||
CompactDisk|RamDisk|FlashMemory|NetworkDisk]
|
||||
Also check the storage type in addition of the name
|
||||
It is possible to use regular expressions ( "FixedDisk|FloppyDisk" )
|
||||
-r, --noregexp
|
||||
Do not use regexp to match NAME in description OID
|
||||
-s, --sum
|
||||
Add all storages that match NAME (used space and total space)
|
||||
THEN make the tests.
|
||||
-i, --index
|
||||
Parse index table instead of description table to select storage
|
||||
-e, --exclude
|
||||
Select all storages except the one(s) selected by -m
|
||||
No action on storage type selection
|
||||
-T, --type=TYPE
|
||||
pl : calculate percent left
|
||||
pu : calculate percent used (Default)
|
||||
bl : calculate MegaBytes left
|
||||
bu : calculate MegaBytes used
|
||||
-w, --warn=INTEGER
|
||||
percent / MB of disk used to generate WARNING state
|
||||
you can add the % sign
|
||||
-c, --critical=INTEGER
|
||||
percent / MB of disk used to generate CRITICAL state
|
||||
you can add the % sign
|
||||
-R, --reserved=INTEGER
|
||||
% reserved blocks for superuser
|
||||
For ext2/3 filesystems, it is 5% by default
|
||||
-G, --gigabyte
|
||||
output, warning & critical levels in gigabytes
|
||||
-f, --perfparse
|
||||
Perfparse compatible output
|
||||
-S, --short=<type>[,<where>,<cut>]
|
||||
<type>: Make the output shorter :
|
||||
0 : only print the global result except the disk in warning or critical
|
||||
ex: "< 80% : OK"
|
||||
1 : Don't print all info for every disk
|
||||
ex : "/ : 66 %used (< 80) : OK"
|
||||
<where>: (optional) if = 1, put the OK/WARN/CRIT at the beginning
|
||||
<cut>: take the <n> first caracters or <n> last if n<0
|
||||
-o, --octetlength=INTEGER
|
||||
max-size of the SNMP message, usefull in case of Too Long responses.
|
||||
Be carefull with network filters. Range 484 - 65535, default are
|
||||
usually 1472,1452,1460 or 1440.
|
||||
-t, --timeout=INTEGER
|
||||
timeout for SNMP in seconds (Default: 5)
|
||||
-V, --version
|
||||
prints version number
|
||||
Note :
|
||||
with T=pu or T=bu : OK < warn < crit
|
||||
with T=pl ot T=bl : crit < warn < OK
|
||||
|
||||
If multiple storage are selected, the worse condition will be returned
|
||||
i.e if one disk is critical, the return is critical
|
||||
|
||||
example :
|
||||
Browse storage list : <script> -C <community> -H <host> -m <anything> -w 1 -c 2 -v
|
||||
the -m option allows regexp in perl format :
|
||||
Test drive C,F,G,H,I on Windows : -m ^[CFGHI]:
|
||||
Test all mounts containing /var : -m /var
|
||||
Test all mounts under /var : -m ^/var
|
||||
Test only /var : -m /var -r
|
||||
Test all swap spaces : -m ^Swap
|
||||
Test all but swap spaces : -m ^Swap -e
|
||||
|
||||
EOT
|
||||
}
|
||||
|
||||
sub verb { my $t=shift; print $t,"\n" if defined($o_verb) ; }
|
||||
|
||||
sub check_options {
|
||||
Getopt::Long::Configure ("bundling");
|
||||
GetOptions(
|
||||
'v' => \$o_verb, 'verbose' => \$o_verb,
|
||||
'h' => \$o_help, 'help' => \$o_help,
|
||||
'H:s' => \$o_host, 'hostname:s' => \$o_host,
|
||||
'p:i' => \$o_port, 'port:i' => \$o_port,
|
||||
'C:s' => \$o_community, 'community:s' => \$o_community,
|
||||
'2' => \$o_version2, 'v2c' => \$o_version2,
|
||||
'l:s' => \$o_login, 'login:s' => \$o_login,
|
||||
'x:s' => \$o_passwd, 'passwd:s' => \$o_passwd,
|
||||
'X:s' => \$o_privpass, 'privpass:s' => \$o_privpass,
|
||||
'L:s' => \$v3protocols, 'protocols:s' => \$v3protocols,
|
||||
'c:s' => \$o_crit, 'critical:s' => \$o_crit,
|
||||
'w:s' => \$o_warn, 'warn:s' => \$o_warn,
|
||||
't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
|
||||
'm:s' => \$o_descr, 'name:s' => \$o_descr,
|
||||
'T:s' => \$o_type, 'type:s' => \$o_type,
|
||||
'r' => \$o_noreg, 'noregexp' => \$o_noreg,
|
||||
's' => \$o_sum, 'sum' => \$o_sum,
|
||||
'i' => \$o_index, 'index' => \$o_index,
|
||||
'e' => \$o_negate, 'exclude' => \$o_negate,
|
||||
'V' => \$o_version, 'version' => \$o_version,
|
||||
'q:s' => \$o_storagetype, 'storagetype:s'=> \$o_storagetype,
|
||||
'S:s' => \$o_short, 'short:s' => \$o_short,
|
||||
'o:i' => \$o_octetlength, 'octetlength:i' => \$o_octetlength,
|
||||
'f' => \$o_perf, 'perfparse' => \$o_perf,
|
||||
'R:i' => \$o_reserve, 'reserved:i' => \$o_reserve,
|
||||
'G' => \$o_giga, 'gigabyte' => \$o_giga
|
||||
);
|
||||
if (defined($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}};
|
||||
if (defined($o_version) ) { p_version(); exit $ERRORS{"UNKNOWN"}};
|
||||
# check mount point regexp
|
||||
if (!is_pattern_valid($o_descr))
|
||||
{ print "Bad pattern for mount point !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
# check snmp information
|
||||
if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) )
|
||||
{ print "Put snmp login info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
if ((defined($o_login) || defined($o_passwd)) && (defined($o_community) || defined($o_version2)) )
|
||||
{ print "Can't mix snmp v1,2c,3 protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
if (defined ($v3protocols)) {
|
||||
if (!defined($o_login)) { print "Put snmp V3 login info with protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
my @v3proto=split(/,/,$v3protocols);
|
||||
if ((defined ($v3proto[0])) && ($v3proto[0] ne "")) {$o_authproto=$v3proto[0]; } # Auth protocol
|
||||
if (defined ($v3proto[1])) {$o_privproto=$v3proto[1]; } # Priv protocol
|
||||
if ((defined ($v3proto[1])) && (!defined($o_privpass))) {
|
||||
print "Put snmp V3 priv login info with priv protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
|
||||
}
|
||||
# Check types
|
||||
if ( !defined($o_type) ) { $o_type="pu" ;}
|
||||
if ( ! grep( /^$o_type$/ ,@o_typeok) ) { print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||
# Check compulsory attributes
|
||||
if ( ! defined($o_descr) || ! defined($o_host) || !defined($o_warn) ||
|
||||
!defined($o_crit)) { print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||
# Get rid of % sign if any
|
||||
$o_warn =~ s/\%//;
|
||||
$o_crit =~ s/\%//;
|
||||
# Check for positive numbers
|
||||
if (($o_warn < 0) || ($o_crit < 0)) { print " warn and critical > 0 \n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||
# check if warn or crit in % and MB is tested
|
||||
if ( ( ( $o_warn =~ /%/ ) || ($o_crit =~ /%/)) && ( ( $o_type eq 'bu' ) || ( $o_type eq 'bl' ) ) ) {
|
||||
print "warning or critical cannot be in % when MB are tested\n";
|
||||
print_usage(); exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
# Check warning and critical values
|
||||
if ( ( $o_type eq 'pu' ) || ( $o_type eq 'bu' )) {
|
||||
if ($o_warn >= $o_crit) { print " warn < crit if type=",$o_type,"\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||
}
|
||||
if ( ( $o_type eq 'pl' ) || ( $o_type eq 'bl' )) {
|
||||
if ($o_warn <= $o_crit) { print " warn > crit if type=",$o_type,"\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||
}
|
||||
if ( ($o_warn < 0 ) || ($o_crit < 0 )) { print "warn and crit must be > 0\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||
if ( ( $o_type eq 'pl' ) || ( $o_type eq 'pu' )) {
|
||||
if ( ($o_warn > 100 ) || ($o_crit > 100 )) { print "percent must be < 100\n";print_usage(); exit $ERRORS{"UNKNOWN"}};
|
||||
}
|
||||
# Check short values
|
||||
if ( defined ($o_short)) {
|
||||
@o_shortL=split(/,/,$o_short);
|
||||
if ((isnnum($o_shortL[0])) || ($o_shortL[0] !=0) && ($o_shortL[0]!=1)) {
|
||||
print "-S first option must be 0 or 1\n";print_usage(); exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
if (defined ($o_shortL[1])&& $o_shortL[1] eq "") {$o_shortL[1]=undef};
|
||||
if (defined ($o_shortL[2]) && isnnum($o_shortL[2]))
|
||||
{print "-S last option must be an integer\n";print_usage(); exit $ERRORS{"UNKNOWN"};}
|
||||
}
|
||||
#### octet length checks
|
||||
if (defined ($o_octetlength) && (isnnum($o_octetlength) || $o_octetlength > 65535 || $o_octetlength < 484 )) {
|
||||
print "octet lenght must be < 65535 and > 484\n";print_usage(); exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
#### reserved blocks checks (A. Greiner-B? patch).
|
||||
if (defined ($o_reserve) && (isnnum($o_reserve) || $o_reserve > 99 || $o_reserve < 0 )) {
|
||||
print "reserved blocks must be < 100 and >= 0\n";print_usage(); exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
}
|
||||
|
||||
########## MAIN #######
|
||||
|
||||
check_options();
|
||||
|
||||
# Check gobal timeout
|
||||
if (defined($TIMEOUT)) {
|
||||
verb("Alarm at $TIMEOUT");
|
||||
alarm($TIMEOUT);
|
||||
} else {
|
||||
verb("no timeout defined : $o_timeout + 10");
|
||||
alarm ($o_timeout+10);
|
||||
}
|
||||
|
||||
# Connect to host
|
||||
my ($session,$error);
|
||||
if ( defined($o_login) && defined($o_passwd)) {
|
||||
# SNMPv3 login
|
||||
verb("SNMPv3 login");
|
||||
if (!defined ($o_privpass)) {
|
||||
verb("SNMPv3 AuthNoPriv login : $o_login, $o_authproto");
|
||||
($session, $error) = Net::SNMP->session(
|
||||
-hostname => $o_host,
|
||||
-version => '3',
|
||||
-username => $o_login,
|
||||
-authpassword => $o_passwd,
|
||||
-authprotocol => $o_authproto,
|
||||
-port => $o_port,
|
||||
-timeout => $o_timeout
|
||||
);
|
||||
} else {
|
||||
verb("SNMPv3 AuthPriv login : $o_login, $o_authproto, $o_privproto");
|
||||
($session, $error) = Net::SNMP->session(
|
||||
-hostname => $o_host,
|
||||
-version => '3',
|
||||
-username => $o_login,
|
||||
-authpassword => $o_passwd,
|
||||
-authprotocol => $o_authproto,
|
||||
-privpassword => $o_privpass,
|
||||
-privprotocol => $o_privproto,
|
||||
-port => $o_port,
|
||||
-timeout => $o_timeout
|
||||
);
|
||||
}
|
||||
} else {
|
||||
if (defined ($o_version2)) {
|
||||
# SNMPv2 Login
|
||||
verb("SNMP v2c login");
|
||||
($session, $error) = Net::SNMP->session(
|
||||
-hostname => $o_host,
|
||||
-version => 2,
|
||||
-community => $o_community,
|
||||
-port => $o_port,
|
||||
-timeout => $o_timeout
|
||||
);
|
||||
} else {
|
||||
# SNMPV1 login
|
||||
verb("SNMP v1 login");
|
||||
($session, $error) = Net::SNMP->session(
|
||||
-hostname => $o_host,
|
||||
-community => $o_community,
|
||||
-port => $o_port,
|
||||
-timeout => $o_timeout
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (!defined($session)) {
|
||||
printf("ERROR: %s.\n", $error);
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
if (defined($o_octetlength)) {
|
||||
my $oct_resultat=undef;
|
||||
my $oct_test= $session->max_msg_size();
|
||||
verb(" actual max octets:: $oct_test");
|
||||
$oct_resultat = $session->max_msg_size($o_octetlength);
|
||||
if (!defined($oct_resultat)) {
|
||||
printf("ERROR: Session settings : %s.\n", $session->error);
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
$oct_test= $session->max_msg_size();
|
||||
verb(" new max octets:: $oct_test");
|
||||
}
|
||||
|
||||
my $resultat=undef;
|
||||
my $stype=undef;
|
||||
# Get rid of UTF8 translation in case of accentuated caracters (thanks to Dimo Velev).
|
||||
$session->translate(Net::SNMP->TRANSLATE_NONE);
|
||||
if (defined ($o_index)){
|
||||
$resultat = $session->get_table(Baseoid => $index_table);
|
||||
} else {
|
||||
$resultat = $session->get_table(Baseoid => $descr_table);
|
||||
}
|
||||
#get storage typetable for reference
|
||||
if (defined($o_storagetype)){
|
||||
$stype = $session->get_table(Baseoid => $storagetype_table);
|
||||
}
|
||||
if (!defined($resultat) | (!defined($stype) && defined($o_storagetype))) {
|
||||
printf("ERROR: Description/Type table : %s.\n", $session->error);
|
||||
$session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
my @tindex = undef;
|
||||
my @oids = undef;
|
||||
my @descr = undef;
|
||||
my $num_int = 0;
|
||||
my $count_oid = 0;
|
||||
my $test = undef;
|
||||
my $perf_out= undef;
|
||||
# Select storage by regexp of exact match
|
||||
# and put the oid to query in an array
|
||||
|
||||
verb("Filter : $o_descr");
|
||||
|
||||
foreach my $key ( keys %$resultat) {
|
||||
verb("OID : $key, Desc : $$resultat{$key}");
|
||||
# test by regexp or exact match / include or exclude
|
||||
if (defined($o_negate)) {
|
||||
$test = defined($o_noreg)
|
||||
? $$resultat{$key} ne $o_descr
|
||||
: $$resultat{$key} !~ /$o_descr/;
|
||||
} else {
|
||||
$test = defined($o_noreg)
|
||||
? $$resultat{$key} eq $o_descr
|
||||
: $$resultat{$key} =~ /$o_descr/;
|
||||
}
|
||||
if ($test) {
|
||||
# get the index number of the interface
|
||||
my @oid_list = split (/\./,$key);
|
||||
$tindex[$num_int] = pop (@oid_list);
|
||||
# Check if storage type is OK
|
||||
if (defined($o_storagetype)) {
|
||||
my($skey)=$storagetype_table.".".$tindex[$num_int];
|
||||
verb(" OID : $skey, Storagetype: $hrStorage{$$stype{$skey}} ?= $o_storagetype");
|
||||
if ( $hrStorage{$$stype{$skey}} !~ $o_storagetype) {
|
||||
$test=undef;
|
||||
}
|
||||
}
|
||||
if ($test) {
|
||||
# get the full description
|
||||
$descr[$num_int]=$$resultat{$key};
|
||||
# put the oid in an array
|
||||
$oids[$count_oid++]=$size_table . $tindex[$num_int];
|
||||
$oids[$count_oid++]=$used_table . $tindex[$num_int];
|
||||
$oids[$count_oid++]=$alloc_units . $tindex[$num_int];
|
||||
|
||||
verb(" Name : $descr[$num_int], Index : $tindex[$num_int]");
|
||||
$num_int++;
|
||||
}
|
||||
}
|
||||
}
|
||||
verb("storages selected : $num_int");
|
||||
if ( $num_int == 0 ) { print "Unknown storage : $o_descr : ERROR\n" ; exit $ERRORS{"UNKNOWN"};}
|
||||
|
||||
my $result=undef;
|
||||
|
||||
if ($session->version == 0) {
|
||||
# snmpv1
|
||||
$result = $session->get_request(Varbindlist => \@oids);
|
||||
} else {
|
||||
# snmp v2c or v3 : get_bulk_request is not really good for this, so do simple get
|
||||
$result = $session->get_request(Varbindlist => \@oids);
|
||||
foreach my $key ( keys %$result) { verb("$key : $$result{$key}"); }
|
||||
}
|
||||
|
||||
if (!defined($result)) { printf("ERROR: Size table :%s.\n", $session->error); $session->close;
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
$session->close;
|
||||
|
||||
# Only a few ms left...
|
||||
alarm(0);
|
||||
|
||||
# Sum everything if -s and more than one storage
|
||||
if ( defined ($o_sum) && ($num_int > 1) ) {
|
||||
verb("Adding all entries");
|
||||
$$result{$size_table . $tindex[0]} *= $$result{$alloc_units . $tindex[0]};
|
||||
$$result{$used_table . $tindex[0]} *= $$result{$alloc_units . $tindex[0]};
|
||||
$$result{$alloc_units . $tindex[0]} = 1;
|
||||
for (my $i=1;$i<$num_int;$i++) {
|
||||
$$result{$size_table . $tindex[0]} += ($$result{$size_table . $tindex[$i]}
|
||||
* $$result{$alloc_units . $tindex[$i]});
|
||||
$$result{$used_table . $tindex[0]} += ($$result{$used_table . $tindex[$i]}
|
||||
* $$result{$alloc_units . $tindex[$i]});
|
||||
}
|
||||
$num_int=1;
|
||||
$descr[0]="Sum of all $o_descr";
|
||||
}
|
||||
|
||||
my $i=undef;
|
||||
my $warn_state=0;
|
||||
my $crit_state=0;
|
||||
my ($p_warn,$p_crit);
|
||||
my $output=undef;
|
||||
my $output_metric_val = 1024**2;
|
||||
my $output_metric = "M";
|
||||
# Set the metric
|
||||
if (defined($o_giga)) {
|
||||
$output_metric_val *= 1024;
|
||||
$output_metric='G';
|
||||
}
|
||||
|
||||
for ($i=0;$i<$num_int;$i++) {
|
||||
verb("Descr : $descr[$i]");
|
||||
verb("Size : $$result{$size_table . $tindex[$i]}");
|
||||
verb("Used : $$result{$used_table . $tindex[$i]}");
|
||||
verb("Alloc : $$result{$alloc_units . $tindex[$i]}");
|
||||
if (!defined($$result{$size_table . $tindex[$i]}) ||
|
||||
!defined($$result{$used_table . $tindex[$i]}) ||
|
||||
!defined ($$result{$alloc_units . $tindex[$i]})) {
|
||||
print "Data not fully defined for storage ",$descr[$i]," : UNKNOWN\n";
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
my $to = $$result{$size_table . $tindex[$i]} * ( ( 100 - $o_reserve ) / 100 ) * $$result{$alloc_units . $tindex[$i]} / $output_metric_val;
|
||||
my $pu=undef;
|
||||
if ( $$result{$used_table . $tindex[$i]} != 0 ) {
|
||||
$pu = $$result{$used_table . $tindex[$i]}* 100 / ( $$result{$size_table . $tindex[$i]} * ( 100 - $o_reserve ) / 100 );
|
||||
}else {
|
||||
$pu=0;
|
||||
}
|
||||
my $bu = $$result{$used_table . $tindex[$i]} * $$result{$alloc_units . $tindex[$i]} / $output_metric_val;
|
||||
my $pl = 100 - $pu;
|
||||
my $bl = ( ( $$result{$size_table . $tindex[$i]} * ( ( 100 - $o_reserve ) / 100 ) - ( $$result{$used_table . $tindex[$i]} ) ) * $$result{$alloc_units . $tindex[$i]} / $output_metric_val );
|
||||
# add a ' ' if some data exists in $perf_out
|
||||
$perf_out .= " " if (defined ($perf_out)) ;
|
||||
##### Ouputs and checks
|
||||
# Keep complete description fot performance output (in MB)
|
||||
my $Pdescr=$descr[$i];
|
||||
$Pdescr =~ s/[`~!\$%\^&\*'"<>|\?,\(= )]/_/g;
|
||||
##### TODO : subs "," with something
|
||||
if (defined($o_shortL[2])) {
|
||||
if ($o_shortL[2] < 0) {$descr[$i]=substr($descr[$i],$o_shortL[2]);}
|
||||
else {$descr[$i]=substr($descr[$i],0,$o_shortL[2]);}
|
||||
}
|
||||
if ($o_type eq "pu") { # Checks % used
|
||||
my $locstate=0;
|
||||
$p_warn=$o_warn*$to/100;$p_crit=$o_crit*$to/100;
|
||||
(($pu >= $o_crit) && ($locstate=$crit_state=1))
|
||||
|| (($pu >= $o_warn) && ($locstate=$warn_state=1));
|
||||
if (defined($o_shortL[2])) {}
|
||||
if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state
|
||||
$output.=sprintf ("%s: %.0f%%used(%.0f%sB/%.0f%sB) ",$descr[$i],$pu,$bu,$output_metric,$to,$output_metric);
|
||||
} elsif ($o_shortL[0] == 1) {
|
||||
$output.=sprintf ("%s: %.0f%% ",$descr[$i],$pu);
|
||||
}
|
||||
}
|
||||
|
||||
if ($o_type eq 'bu') { # Checks MBytes used
|
||||
my $locstate=0;
|
||||
$p_warn=$o_warn;$p_crit=$o_crit;
|
||||
( ($bu >= $o_crit) && ($locstate=$crit_state=1) )
|
||||
|| ( ($bu >= $o_warn) && ($locstate=$warn_state=1) );
|
||||
if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state
|
||||
$output.=sprintf("%s: %.0f%sBused/%.0f%sB (%.0f%%) ",$descr[$i],$bu,$output_metric,$to,$output_metric,$pu);
|
||||
} elsif ($o_shortL[0] == 1) {
|
||||
$output.=sprintf("%s: %.0f%sB ",$descr[$i],$bu,$output_metric);
|
||||
}
|
||||
}
|
||||
|
||||
if ($o_type eq 'bl') {
|
||||
my $locstate=0;
|
||||
$p_warn=$to-$o_warn;$p_crit=$to-$o_crit;
|
||||
( ($bl <= $o_crit) && ($locstate=$crit_state=1) )
|
||||
|| ( ($bl <= $o_warn) && ($locstate=$warn_state=1) );
|
||||
if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state
|
||||
$output.=sprintf ("%s: %.0f%sBleft/%.0f%sB (%.0f%%) ",$descr[$i],$bl,$output_metric,$to,$output_metric,$pl);
|
||||
} elsif ($o_shortL[0] == 1) {
|
||||
$output.=sprintf ("%s: %.0f%sB ",$descr[$i],$bl,$output_metric);
|
||||
}
|
||||
}
|
||||
|
||||
if ($o_type eq 'pl') {
|
||||
my $locstate=0;
|
||||
$p_warn=(100-$o_warn)*$to/100;$p_crit=(100-$o_crit)*$to/100;
|
||||
( ($pl <= $o_crit) && ($locstate=$crit_state=1) )
|
||||
|| ( ($pl <= $o_warn) && ($locstate=$warn_state=1) );
|
||||
if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state
|
||||
$output.=sprintf ("%s: %.0f%%left(%.0f%sB/%.0f%sB) ",$descr[$i],$pl,$bl,$output_metric,$to,$output_metric);
|
||||
} elsif ($o_shortL[0] == 1) {
|
||||
$output.=sprintf ("%s: %.0f%% ",$descr[$i],$pl);
|
||||
}
|
||||
}
|
||||
# Performance output (in MB)
|
||||
$perf_out .= "'".$Pdescr. "'=" . round($bu,0) . $output_metric ."B;" . round($p_warn,0)
|
||||
. ";" . round($p_crit,0) . ";0;" . round($to,0);
|
||||
}
|
||||
|
||||
verb ("Perf data : $perf_out");
|
||||
|
||||
my $comp_oper=undef;
|
||||
my $comp_unit=undef;
|
||||
($o_type eq "pu") && ($comp_oper ="<") && ($comp_unit ="%");
|
||||
($o_type eq "pl") && ($comp_oper =">") && ($comp_unit ="%");
|
||||
($o_type eq "bu") && ($comp_oper ="<") && ($comp_unit = $output_metric."B");
|
||||
($o_type eq 'bl') && ($comp_oper =">") && ($comp_unit =$output_metric."B");
|
||||
|
||||
if (!defined ($output)) { $output="All selected storages "; }
|
||||
|
||||
if ( $crit_state == 1) {
|
||||
$comp_oper = ($comp_oper eq "<") ? ">" : "<"; # Inverse comp operator
|
||||
if (defined($o_shortL[1])) {
|
||||
print "CRITICAL : (",$comp_oper,$o_crit,$comp_unit,") ",$output;
|
||||
} else {
|
||||
print $output,"(",$comp_oper,$o_crit,$comp_unit,") : CRITICAL";
|
||||
}
|
||||
(defined($o_perf)) ? print " | ",$perf_out,"\n" : print "\n";
|
||||
exit $ERRORS{"CRITICAL"};
|
||||
}
|
||||
if ( $warn_state == 1) {
|
||||
$comp_oper = ($comp_oper eq "<") ? ">" : "<"; # Inverse comp operator
|
||||
if (defined($o_shortL[1])) {
|
||||
print "WARNING : (",$comp_oper,$o_warn,$comp_unit,") ",$output;
|
||||
} else {
|
||||
print $output,"(",$comp_oper,$o_warn,$comp_unit,") : WARNING";
|
||||
}
|
||||
(defined($o_perf)) ? print " | ",$perf_out,"\n" : print "\n";
|
||||
exit $ERRORS{"WARNING"};
|
||||
}
|
||||
if (defined($o_shortL[1])) {
|
||||
print "OK : (",$comp_oper,$o_warn,$comp_unit,") ",$output;
|
||||
} else {
|
||||
print $output,"(",$comp_oper,$o_warn,$comp_unit,") : OK";
|
||||
}
|
||||
(defined($o_perf)) ? print " | ",$perf_out,"\n" : print "\n";
|
||||
|
||||
exit $ERRORS{"OK"};
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
use opensips;
|
||||
ALTER TABLE `acc` ADD `sip_from` CHAR(64) NOT NULL AFTER `created`, ADD `sip_to` CHAR(64) NOT NULL AFTER `sip_from`, ADD `destination_ip` CHAR(64) NOT NULL AFTER `sip_to`, ADD `source_ip` CHAR(64) NOT NULL AFTER `destination_ip`, ADD `direction` ENUM('Term','Orig') NOT NULL DEFAULT 'Term' AFTER `source_ip`, ADD `failure` ENUM('Y','N') NOT NULL DEFAULT 'N' AFTER `direction`;
|
||||
use opensips_local;
|
||||
ALTER TABLE `acc` ADD `sip_from` CHAR(64) NOT NULL AFTER `created`, ADD `sip_to` CHAR(64) NOT NULL AFTER `sip_from`, ADD `destination_ip` CHAR(64) NOT NULL AFTER `sip_to`, ADD `source_ip` CHAR(64) NOT NULL AFTER `destination_ip`, ADD `direction` ENUM('Term','Orig') NOT NULL DEFAULT 'Term' AFTER `source_ip`, ADD `failure` ENUM('Y','N') NOT NULL DEFAULT 'N' AFTER `direction`;
|
||||
@@ -0,0 +1,4 @@
|
||||
CREATE DATABASE IF NOT EXISTS `opensips` default CHARSET=latin1 collate latin1_swedish_ci;
|
||||
CREATE DATABASE IF NOT EXISTS `opensips_local` default CHARSET=latin1 collate latin1_swedish_ci;
|
||||
grant select,insert,update,delete on opensips.* to 'opensips'@'localhost' identified by 'opensips';
|
||||
grant select,insert,update,delete on opensips.* to 'opensips_local'@'localhost' identified by 'opensips';
|
||||
@@ -0,0 +1,524 @@
|
||||
# opensips.cfg - OpenSIPS v.2.2 config for ViciNOC
|
||||
#
|
||||
# Copyright (C) 2018 James Pearson <jamesp@vicidial.com> LICENSE: AGPLv2
|
||||
#
|
||||
|
||||
####### Global Parameters #########
|
||||
|
||||
log_level=3
|
||||
log_stderror=no
|
||||
log_facility=LOG_LOCAL0
|
||||
log_name="opensips"
|
||||
children=4
|
||||
|
||||
### Some core config stuff
|
||||
server_signature=no
|
||||
server_header="Server: Deluxe Club Sandwhich V2"
|
||||
#disable_tcp=yes
|
||||
#disable_tls=yes
|
||||
disable_dns_blacklist=yes
|
||||
auto_aliases=no
|
||||
dns_use_search_list=no
|
||||
rev_dns=off
|
||||
|
||||
### network information
|
||||
listen=udp:0.0.0.0:5060
|
||||
mhomed=1
|
||||
|
||||
### This might be needed for NAT traversal, handle with care
|
||||
#alias=sip.mycompany.com
|
||||
#advertised_port=5060
|
||||
#advertised_address="X.X.X.X"
|
||||
|
||||
|
||||
####### Modules Section ########
|
||||
|
||||
### set module path
|
||||
mpath="/usr/lib64/opensips/modules/"
|
||||
|
||||
### Our modules to load
|
||||
loadmodule "proto_udp.so"
|
||||
loadmodule "db_mysql.so"
|
||||
loadmodule "signaling.so"
|
||||
loadmodule "sl.so"
|
||||
loadmodule "tm.so"
|
||||
loadmodule "rr.so"
|
||||
loadmodule "maxfwd.so"
|
||||
loadmodule "usrloc.so"
|
||||
loadmodule "textops.so"
|
||||
loadmodule "mi_fifo.so"
|
||||
loadmodule "uri.so"
|
||||
loadmodule "acc.so"
|
||||
loadmodule "options.so"
|
||||
loadmodule "permissions.so"
|
||||
loadmodule "nathelper.so"
|
||||
loadmodule "avpops.so"
|
||||
loadmodule "drouting.so"
|
||||
loadmodule "dialog.so"
|
||||
loadmodule "load_balancer.so"
|
||||
loadmodule "sipmsgops.so"
|
||||
loadmodule "topology_hiding.so"
|
||||
loadmodule "proto_udp.so"
|
||||
|
||||
# ----------------- setting module-specific parameters ---------------
|
||||
|
||||
### Default MySQL Connection Info use by all modules unless specified otherwise
|
||||
db_default_url="mysql://opensips:opensips@localhost/opensips"
|
||||
modparam("permissions", "db_url", "mysql://opensips:opensips@localhost/opensips")
|
||||
|
||||
### For a slave setup you'll want the following to go to a different database
|
||||
### The slave replication should be for all other tables. These are kept for local use
|
||||
#modparam("acc", "db_url", "mysql://opensips:opensips@localhost/opensips_local")
|
||||
#modparam("avpops","db_url","mysql://opensips:opensips@localhost/opensips_local")
|
||||
#modparam("dialog", "db_url", "mysql://opensips:opensips@localhost/opensips_local")
|
||||
|
||||
# ----- mi_fifo params -----
|
||||
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
|
||||
|
||||
# ----- rr params -----
|
||||
modparam("rr", "append_fromtag", 1)
|
||||
|
||||
# -- tm params --
|
||||
modparam("tm", "fr_inv_timeout", 60)
|
||||
modparam("tm", "fr_timeout", 10)
|
||||
|
||||
### Load Balancer options
|
||||
modparam("load_balancer", "probing_interval", 60)
|
||||
modparam("load_balancer", "probing_method", "OPTIONS")
|
||||
modparam("load_balancer", "probing_from", "sip:lbprobe@sip.vicinoc.com")
|
||||
modparam("load_balancer", "probing_reply_codes", "501, 403, 404, 484")
|
||||
|
||||
### Dynamic Routing
|
||||
modparam("drouting", "rule_id_avp", '$avp(rule_id)')
|
||||
modparam("drouting", "ruri_avp", '$avp(dr_ruri)')
|
||||
modparam("drouting", "use_domain", 0)
|
||||
modparam("drouting", "probing_interval", 60)
|
||||
modparam("drouting", "probing_from", "sip:pinger@sip.vicinoc.com")
|
||||
modparam("drouting", "probing_reply_codes", "501, 403, 404, 200, 484")
|
||||
|
||||
### acc
|
||||
modparam("acc", "detect_direction", 1)
|
||||
#modparam("acc", "early_media", 1)
|
||||
modparam("acc", "report_cancels", 1)
|
||||
modparam("acc", "db_extra", "sip_from=$fu ; sip_to=$tu ; domain=$rd ; source_ip=$si ; direction=$avp(direction) ; route_info=$avp(route_info)")
|
||||
|
||||
# ----- usrloc params -----
|
||||
modparam("usrloc", "db_mode", 0)
|
||||
|
||||
# ----- uri params -----
|
||||
modparam("uri", "use_uri_table", 0)
|
||||
|
||||
# Dialog params
|
||||
modparam("dialog", "dlg_match_mode", 1)
|
||||
modparam("dialog", "db_mode", 2)
|
||||
modparam("dialog", "profiles_with_value", "channelcount")
|
||||
|
||||
|
||||
####### Routing Logic ########
|
||||
|
||||
###### main routing block - everything starts here
|
||||
route{
|
||||
|
||||
### Simple sanity checks before real processing begins
|
||||
# Max forwards to prevent loops
|
||||
if (!mf_process_maxfwd_header("10")) {
|
||||
sl_send_reply("483","Too Many Hops");
|
||||
exit;
|
||||
}
|
||||
|
||||
# Prevent buffer overflows
|
||||
if (msg:len > max_len) {
|
||||
sl_send_reply("513", "Message Overflow");
|
||||
exit;
|
||||
}
|
||||
|
||||
# Drop any unsupported METHODs here
|
||||
if (is_method("REGISTER|SUBSCRIBE|PUBLISH|MESSAGE|UPDATE")) {
|
||||
xlog("$rm $si $ru $ci - Dropping");
|
||||
sl_send_reply("405", "Method Not Allowed");
|
||||
exit;
|
||||
}
|
||||
|
||||
# Reply to OPTIONS packets to let people know /we/ are alive, asterisk likes this
|
||||
if (is_method("OPTIONS")) {
|
||||
options_reply();
|
||||
exit;
|
||||
}
|
||||
|
||||
### Process sequential requests in-dialog and forward
|
||||
if (has_totag()) {
|
||||
# sequential request within a dialog should take the path determined by record-routing
|
||||
|
||||
if (loose_route() || match_dialog()) {
|
||||
# sequential request after routing and dialog matching
|
||||
if ($DLG_status!=NULL) {
|
||||
# request matched against a dialog
|
||||
$var(x) = validate_dialog() ;
|
||||
switch ( $var(x) ) {
|
||||
case -2:
|
||||
case -3:
|
||||
# invalid request, but fixable
|
||||
fix_route_dialog();
|
||||
break;
|
||||
case -1:
|
||||
case -4:
|
||||
# invalid request, but not fixable
|
||||
send_reply("488","No such dialog");
|
||||
exit;
|
||||
case 1:
|
||||
# ok
|
||||
break;
|
||||
default:
|
||||
# bug unknown ret code, so do nothing I guess
|
||||
}
|
||||
}
|
||||
if (is_method("ACK")) {
|
||||
if (t_check_trans()) {
|
||||
t_relay();
|
||||
exit;
|
||||
}
|
||||
} else if (is_method("INVITE")) {
|
||||
sl_send_reply("100", "Trying");
|
||||
route(topohiding);
|
||||
}
|
||||
# Route out based on our loose route
|
||||
route(1);
|
||||
} else {
|
||||
# Unsequential or orphan transactions, handle appropriately
|
||||
if ( is_method("ACK") ) {
|
||||
if ( t_check_trans() ) {
|
||||
# non loose-route, but stateful ACK; must be an ACK after a 487 or e.g. 404 from upstream server
|
||||
t_relay();
|
||||
exit;
|
||||
} else {
|
||||
# ACK without matching transaction ignore and discard
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
sl_send_reply("404","Not here");
|
||||
exit;
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
# Make sure we have a destination from them
|
||||
if ($rU==NULL) {
|
||||
# request with no Username in RURI
|
||||
sl_send_reply("484","Address Incomplete");
|
||||
exit;
|
||||
}
|
||||
|
||||
# CANCEL processing
|
||||
if (is_method("CANCEL")) {
|
||||
if (t_check_trans()) {
|
||||
t_relay();
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
# See if we are stateful at this point, and if we are, load our runtime vars
|
||||
t_check_trans();
|
||||
|
||||
# preloaded route checking
|
||||
if (loose_route()) {
|
||||
xlog("L_ERR", "Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");
|
||||
if (!is_method("ACK"))
|
||||
sl_send_reply("403","Preload Route denied");
|
||||
exit;
|
||||
}
|
||||
|
||||
# At this point, if it's an invite handle it, or just route whatever the hell else we got
|
||||
if (is_method("INVITE")) {
|
||||
route(2); # Figure out what we got before we process
|
||||
exit;
|
||||
} else {
|
||||
if(!t_relay()) {
|
||||
sl_reply_error();
|
||||
return(0);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
route[1] {
|
||||
# Basic stateful transaction relaying without progression
|
||||
# By default does all the work after initial routing until teardown
|
||||
if (!t_relay("0x01")) {
|
||||
sl_reply_error();
|
||||
};
|
||||
exit;
|
||||
}
|
||||
|
||||
route[2] {
|
||||
# This is where we handle initial invites and figure out how to further route them
|
||||
# Basically if they are carriers, telephony servers, etc
|
||||
|
||||
# Group 1 is termination from telephony servers to carriers
|
||||
if (check_source_address("1")) {
|
||||
sl_send_reply("100", "Trying");
|
||||
route(term);
|
||||
exit;
|
||||
}
|
||||
|
||||
# Group 1 is origination from carriers to telephony server
|
||||
if (check_source_address("2")) {
|
||||
sl_send_reply("100", "Trying");
|
||||
route(orig);
|
||||
exit;
|
||||
}
|
||||
|
||||
# We don't know who this is, so tell them to get lost, and be done with them.
|
||||
sl_send_reply("401", "Unauthorized");
|
||||
exit;
|
||||
}
|
||||
|
||||
route[term] {
|
||||
# Dynamic routing block for sending telephony servers to carriers
|
||||
|
||||
# Normalize calls first
|
||||
route(normterm);
|
||||
|
||||
# Create call dialog
|
||||
create_dialog("B");
|
||||
set_dlg_profile("channelcount","$si");
|
||||
avp_printf("$avp(direction)", "Term");
|
||||
do_accounting("db", "cdr|missed|failed", "acc");
|
||||
|
||||
# Look up our dynamic routing entries courtesy of droute
|
||||
if (!do_routing("1")) {
|
||||
sl_send_reply("500", "DR do_routing failure");
|
||||
exit;
|
||||
}
|
||||
#xlog("DR successfully done: ruri=$ru, destinations are: $ru $(avp(dr_ruri)[*])");
|
||||
|
||||
# Setup up response handling and route
|
||||
t_on_failure("term");
|
||||
t_on_reply("stripcid");
|
||||
route(topohiding);
|
||||
route(1);
|
||||
}
|
||||
|
||||
failure_route[term] {
|
||||
# Dynamic routing failover
|
||||
xlog("DR failure $T_reply_code : destinations are: $ru $(avp(dr_ruri)[*])");
|
||||
|
||||
# If the transaction was cancelled, quit processing this route
|
||||
if (t_was_cancelled()) {
|
||||
exit;
|
||||
}
|
||||
|
||||
# Treat a 486 from the carrier as legit
|
||||
if (t_check_status("486")) {
|
||||
t_reply("486", "Busy");
|
||||
exit;
|
||||
}
|
||||
|
||||
# Timeout from carrier, this is HORRIBLY bad, so give feedback and optionally do something
|
||||
if (t_check_status("408")) {
|
||||
xlog("Carrier timeout! This is bad!");
|
||||
#t_reply("486", "Busy");
|
||||
}
|
||||
|
||||
# Redirects just get forwarded since it's likely taking us out of the way
|
||||
if (t_check_status("3[0-9][0-9]")) {
|
||||
exit;
|
||||
}
|
||||
|
||||
# log the failed call
|
||||
route(failedcall);
|
||||
|
||||
# If we got an error that wasn't some sort of far-end error, use another GW
|
||||
if (use_next_gw()) {
|
||||
# Since we have more gateways, keep coming back, and forward
|
||||
t_on_failure("term");
|
||||
route(1);
|
||||
exit;
|
||||
|
||||
} else {
|
||||
t_reply("503", "DROUTE use_next_gw failure no more gateways");
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
route[orig] {
|
||||
# Load Balance block. Send calls from carriers to telephony servers
|
||||
# based upon the active number of calls each server is handling based
|
||||
# as a percentage of configured max trunks.
|
||||
|
||||
# normalize calls first
|
||||
route(normorig);
|
||||
|
||||
# Create call dialog
|
||||
create_dialog("B");
|
||||
avp_printf("$avp(direction)", "Orig");
|
||||
do_accounting("db", "cdr|missed|failed", "acc");
|
||||
|
||||
# Look up our dynamic routing entries courtesy of droute
|
||||
if (!load_balance("1","trunk")) {
|
||||
sl_send_reply("500", "LOADBALANCE failure");
|
||||
exit;
|
||||
}
|
||||
|
||||
# Since the LB call merely sets the destination IP without modifying the RURI
|
||||
# We have to modify it here so the remote end will like us
|
||||
$rd=$dd;
|
||||
set_dlg_profile("channelcount","$dd");
|
||||
|
||||
# Set up response handling and route
|
||||
t_on_failure("orig");
|
||||
t_on_reply("stripcid");
|
||||
route(topohiding);
|
||||
route(1);
|
||||
}
|
||||
|
||||
failure_route[orig] {
|
||||
# Load Balance failover
|
||||
|
||||
# 487's should just be relayed on through as part of the dialog
|
||||
if (t_check_status("487")) {
|
||||
t_relay();
|
||||
exit;
|
||||
}
|
||||
|
||||
# If the transaction was cancelled, quit processing this route
|
||||
if(!t_was_cancelled()) {
|
||||
exit;
|
||||
}
|
||||
|
||||
# Treat a 486 from the carrier as legit
|
||||
if (t_check_status("486")) {
|
||||
t_reply("486", "Busy");
|
||||
exit;
|
||||
}
|
||||
|
||||
# Filter out redirects or basically do nothing
|
||||
if (t_check_status("3[0-9][0-9]")) {
|
||||
exit;
|
||||
}
|
||||
|
||||
# log the failed call
|
||||
route(failedcall);
|
||||
|
||||
# At this point we will use another GW
|
||||
if (load_balance("1","trunk","1")) {
|
||||
# Since we have more gateways, keep coming back, and forward
|
||||
$rd=$dd;
|
||||
t_on_failure("orig");
|
||||
# Put our routing info in
|
||||
xlog("LOADBALANCE : Sending to $rd");
|
||||
route(1);
|
||||
exit;
|
||||
|
||||
} else {
|
||||
t_reply("503", "LOADBALANCE : FR4 no more destinations");
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
route[normterm] {
|
||||
# Some basic normalization, validation and NANPA checks, for termination
|
||||
|
||||
# Seven digits just isn't enough, be more helpful
|
||||
if (uri=~"^sip:[2-9]{1}[0-9]{6}@") {
|
||||
sl_send_reply("484", "Address Incomplete NANPA 10D only");
|
||||
exit;
|
||||
}
|
||||
|
||||
# We can guess with 10 digits, auto add 1, since we are in the US to normalize for further use
|
||||
if (uri=~"^sip:[0-9]{10}@") {
|
||||
prefix("1");
|
||||
}
|
||||
|
||||
# Allow E.164 style dialing in but strip the + to normalize
|
||||
if (uri=~"^sip:\+1[0-9]{10}@") {
|
||||
strip(1);
|
||||
}
|
||||
|
||||
# If someone tries to dial information then kill call
|
||||
if (uri=~"^sip:1[0-9]{3}5551212@") {
|
||||
sl_send_reply("603", "Dont Dial Information");
|
||||
exit;
|
||||
}
|
||||
|
||||
# Valid NANPA format check 1
|
||||
if (uri=~"^sip:1[0-1]{1}[0-9]{9}@") {
|
||||
sl_send_reply("484", "Invalid Area Code");
|
||||
exit;
|
||||
}
|
||||
|
||||
# Valid NANPA format check 2
|
||||
if (uri=~"^sip:1[0-9]{3}[0-1]{1}[0-9]{6}@") {
|
||||
sl_send_reply("484", "Invalid Switch Code");
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
route[normorig] {
|
||||
# Some basic normalization, validation and NANPA checks, for origination
|
||||
|
||||
# Seven digits just isn't enough, be more helpful
|
||||
if (uri=~"^sip:[2-9]{1}[0-9]{6}@") {
|
||||
sl_send_reply("484", "Address Incomplete NANPA 10D only");
|
||||
exit;
|
||||
}
|
||||
|
||||
# Valid NANPA format check 1
|
||||
if (uri=~"^sip:1[0-1]{1}[0-9]{9}@") {
|
||||
sl_send_reply("484", "Invalid Area Code");
|
||||
exit;
|
||||
}
|
||||
|
||||
# Valid NANPA format check 2
|
||||
if (uri=~"^sip:1[0-9]{3}[0-1]{1}[0-9]{6}@") {
|
||||
sl_send_reply("484", "Invalid Switch Code");
|
||||
exit;
|
||||
}
|
||||
|
||||
# If we get 1+ NANPA format, strip the 1 to normalize
|
||||
if (uri=~"^sip:1[2-9]{1}[0-9]{2}[2-9]{1}[0-9]{6}@") {
|
||||
strip(1);
|
||||
}
|
||||
|
||||
# Allow E.164 style dialing in but strip the +1 to normalize
|
||||
if (uri=~"^sip:\+1[2-9]{1}[0-9]{2}[2-9]{1}[0-9]{6}@") {
|
||||
strip(2);
|
||||
}
|
||||
}
|
||||
|
||||
onreply_route[stripcid] {
|
||||
# A new trend for carriers is reverse Caller ID, or updating the Caller ID after connecting the call
|
||||
# Unfortunately Asterisk doesn't ignore this properly and it breaks the call tracking in vicidial
|
||||
# So instead we strip this header out on replies since they aren't needed or useful in vicidial
|
||||
if (is_present_hf("Remote-Party-ID")) { remove_hf("Remote-Party-ID"); }
|
||||
if (is_present_hf("P-Asserted-Identity")) { remove_hf("P-Asserted-Identity"); }
|
||||
if (is_present_hf("P-Preferred-Identity")) { remove_hf("P-Preferred-Identity"); }
|
||||
if (is_present_hf("Privacy")) { remove_hf("Privacy"); }
|
||||
}
|
||||
|
||||
route[topohiding] {
|
||||
record_route();
|
||||
# for initial invites we create dialog with topo hiding
|
||||
if ( is_method("INVITE") && !has_totag() ) {
|
||||
create_dialog("B"); # Should be previously set from route 3 and 4, but calling it again should be fine
|
||||
topology_hiding();
|
||||
}
|
||||
}
|
||||
|
||||
route[failedcall] {
|
||||
# Logs failed calls to the acc table for later
|
||||
$var(method)=$(rm{s.escape.common});
|
||||
$var(fromtag)=$(ft{s.escape.common});
|
||||
$var(totag)=$(tt{s.escape.common});
|
||||
$var(callid)=$(ci{s.escape.common});
|
||||
$var(sipcode)=$(T_reply_code{s.escape.common});
|
||||
$var(sipreason)=$(err.rreason{s.escape.common});
|
||||
$var(currtime)=$time(%Y-%m-%d %H-%M-%S);
|
||||
$var(sipfrom)=$(fu{s.escape.common});
|
||||
$var(sipto)=$(tu{s.escape.common});
|
||||
$var(destinationip)=$(rd{s.escape.common});
|
||||
$var(sourceip)=$(si{s.escape.common});
|
||||
xlog("$rm $si $ru $ci - Call failed, inserting");
|
||||
avp_db_query("insert into opensips_local.acc (method, from_tag, to_tag, callid, sip_code, sip_reason, time, duration, setuptime, created, sip_from, sip_to, destination_ip, source_ip, direction, failure) values ('$var(method)', '$var(fromtag)', '$var(totag)', '$var(callid)', '$var(sipcode)', '$var(sipreason)', '$var(currtime)', '0', '0', '$var(currtime)', '$var(sipfrom)', '$var(sipto)', '$var(destinationip)', '$var(sourceip)', '$avp(direction)', 'Y');");
|
||||
}
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
#!/bin/bash
|
||||
yast2 live-installer
|
||||
@@ -0,0 +1,91 @@
|
||||
#!/bin/bash
|
||||
|
||||
# vicinoc-install - ViciNOC installationg script for Kiwi built ViciNOC Distro
|
||||
#
|
||||
# Copyright (C) 2018 James Pearson <jamesp@vicidial.com> LICENSE: AGPLv2
|
||||
#
|
||||
|
||||
# Get our local IP address and set timezone
|
||||
MYIP=`ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'`
|
||||
yast timezone set timezone=UTC
|
||||
|
||||
|
||||
# MySQL setup
|
||||
mkdir -p /var/lib/mysql
|
||||
chown mysql:mysql /var/lib/mysql
|
||||
mkdir -p /srv/mysql/data
|
||||
chown mysql:mysql /srv/mysql/data
|
||||
mysql_install_db --datadir=/srv/mysql/data --user=mysql --group=mysql
|
||||
service mysql start
|
||||
|
||||
|
||||
# Icinga Database
|
||||
mysql -u root < /usr/src/vicinoc/icinga2-create.sql
|
||||
mysql -u root icinga < /usr/share/icinga2-ido-mysql/schema/mysql.sql
|
||||
mysql -u root < /usr/src/vicinoc/icingaweb2.sql
|
||||
|
||||
|
||||
# OpenSIPS Database
|
||||
mysql -u root < /usr/src/vicinoc/opensips-create.sql
|
||||
cd /usr/share/opensips/mysql
|
||||
OPENSIPS="standard acc permissions avpops dialog dispatcher drouting load_balancer rtpproxy auth_db"
|
||||
IFS=$' '
|
||||
for TABLE in $OPENSIPS
|
||||
do
|
||||
mysql -u root opensips < $TABLE-create.sql
|
||||
done
|
||||
OPENSIPSLOCAL="standard acc avpops dialog"
|
||||
IFS=$' '
|
||||
for TABLE in $OPENSIPSLOCAL
|
||||
do
|
||||
mysql -u root opensips_local < $TABLE-create.sql
|
||||
done
|
||||
mysql -u root < /usr/src/vicinoc/opensips-accextra.sql
|
||||
|
||||
|
||||
# Homer Database
|
||||
cd /usr/src/homer/homer-api/sql/mysql
|
||||
mysql -u root < homer_databases.sql
|
||||
mysql -u root < homer_user.sql
|
||||
mysql -u root homer_data < schema_data.sql
|
||||
mysql -u root homer_configuration < schema_configuration.sql
|
||||
mysql -u root homer_statistic < schema_statistic.sql
|
||||
mysql -u root homer_configuration --execute "update user set password='*33D42AC1DCD8BEFDDD6EEBA2C9AB79EA3A022B4F' where username='admin';"
|
||||
|
||||
|
||||
# Secure MySQL and then cleanup
|
||||
mysql -u root --execute "UPDATE mysql.user SET Password=PASSWORD('vicidial') WHERE User='root';"
|
||||
mysql -u root --execute "DELETE FROM mysql.user WHERE User='';"
|
||||
mysql -u root --execute "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
|
||||
mysql -u root --execute "DROP DATABASE test;"
|
||||
mysql -u root --execute "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';"
|
||||
mysql -u root --execute "FLUSH PRIVILEGES;"
|
||||
echo "[client]
|
||||
user=root
|
||||
password=vicidial
|
||||
socket=/var/run/mysql/mysql.sock" > /root/.my.cnfd
|
||||
|
||||
|
||||
# Setup Homer
|
||||
cd /opt/sipcapture
|
||||
./homer_rotate
|
||||
crontab -l > /tmp/rootcron
|
||||
echo "# Rotate homer logs daily
|
||||
0 0 * * * /opt/sipcapture/homer_rotate > /dev/null 2>&
|
||||
" >> /tmp/rootcron
|
||||
crontab /tmp/rootcron
|
||||
rm /tmp/rootcron
|
||||
|
||||
|
||||
# Activate services
|
||||
chkconfig mysql on
|
||||
chkconfig icinga2 on
|
||||
chkconfig apache2 on
|
||||
chkconfig homersips on
|
||||
chkconfig opensips on
|
||||
chkconfig smokeping on
|
||||
service icinga2 start
|
||||
service apache2 start
|
||||
service homersips start
|
||||
service openeipss start
|
||||
service smokeping start
|
||||
@@ -0,0 +1,153 @@
|
||||
*** General ***
|
||||
|
||||
owner = ViciNOC
|
||||
contact = admin@localhost
|
||||
mailhost = localhost
|
||||
sendmail = /usr/sbin/sendmail
|
||||
# NOTE: do not put the Image Cache below cgi-bin
|
||||
# since all files under cgi-bin will be executed ... this is not
|
||||
# good for images.
|
||||
imgcache = /var/lib/smokeping/cache
|
||||
imgurl = /smokeping/cache
|
||||
datadir = /var/lib/smokeping/data
|
||||
piddir = /var/run/smokeping/
|
||||
cgiurl = http://X.X.X.X/cgi-bin/smokeping
|
||||
smokemail = /etc/smokeping/smokemail
|
||||
tmail = /etc/smokeping/tmail
|
||||
# specify this to get syslog logging
|
||||
syslogfacility = local0
|
||||
# each probe is now run in its own process
|
||||
# disable this to revert to the old behaviour
|
||||
# concurrentprobes = no
|
||||
|
||||
*** Alerts ***
|
||||
to = noc@somedomain
|
||||
from = vicinoc@localhost
|
||||
|
||||
# This rule checks for 3 periods (3 * 5min default) where
|
||||
# the rtt is >100ms
|
||||
+rttdetect
|
||||
type = rtt
|
||||
# in milli seconds
|
||||
pattern = >100,>100,>100
|
||||
edgetrigger = yes
|
||||
comment = RTT > 100ms
|
||||
|
||||
# This rule checks for one period (1 * 5mins) of >60% loss
|
||||
+hostdown
|
||||
type = loss
|
||||
# in percent
|
||||
pattern = >60%
|
||||
edgetrigger = yes
|
||||
comment = Massive loss for 5 mins
|
||||
|
||||
# This rule checks for one period (1 * 5mins) of >10% loss
|
||||
+someloss
|
||||
type = loss
|
||||
# in percent
|
||||
pattern = >10%
|
||||
edgetrigger = yes
|
||||
comment = Some loss for 5 mins
|
||||
|
||||
*** Database ***
|
||||
|
||||
step = 300
|
||||
pings = 20
|
||||
|
||||
# consfn mrhb steps total
|
||||
|
||||
AVERAGE 0.5 1 1008
|
||||
AVERAGE 0.5 12 4320
|
||||
MIN 0.5 12 4320
|
||||
MAX 0.5 12 4320
|
||||
AVERAGE 0.5 144 720
|
||||
MAX 0.5 144 720
|
||||
MIN 0.5 144 720
|
||||
|
||||
*** Presentation ***
|
||||
|
||||
template = /etc/smokeping/basepage.html
|
||||
|
||||
+ charts
|
||||
|
||||
menu = Charts
|
||||
title = The most interesting destinations
|
||||
|
||||
++ stddev
|
||||
sorter = StdDev(entries=>4)
|
||||
title = Top Standard Deviation
|
||||
menu = Std Deviation
|
||||
format = Standard Deviation %f
|
||||
|
||||
++ max
|
||||
sorter = Max(entries=>5)
|
||||
title = Top Max Roundtrip Time
|
||||
menu = by Max
|
||||
format = Max Roundtrip Time %f seconds
|
||||
|
||||
++ loss
|
||||
sorter = Loss(entries=>5)
|
||||
title = Top Packet Loss
|
||||
menu = Loss
|
||||
format = Packets Lost %f
|
||||
|
||||
++ median
|
||||
sorter = Median(entries=>5)
|
||||
title = Top Median Roundtrip Time
|
||||
menu = by Median
|
||||
format = Median RTT %f seconds
|
||||
|
||||
+ overview
|
||||
|
||||
width = 600
|
||||
height = 50
|
||||
range = 10h
|
||||
|
||||
+ detail
|
||||
|
||||
width = 600
|
||||
height = 200
|
||||
unison_tolerance = 2
|
||||
|
||||
"Last 3 Hours" 3h
|
||||
"Last 30 Hours" 30h
|
||||
"Last 10 Days" 10d
|
||||
"Last 400 Days" 400d
|
||||
|
||||
#+ hierarchies
|
||||
#++ owner
|
||||
#title = Host Owner
|
||||
#++ location
|
||||
#title = Location
|
||||
|
||||
*** Probes ***
|
||||
|
||||
+ FPing
|
||||
binary = /usr/sbin/fping
|
||||
|
||||
*** Slaves ***
|
||||
secrets=/etc/smokeping/smokeping_secrets
|
||||
+boomer
|
||||
display_name=boomer
|
||||
color=0000ff
|
||||
|
||||
+slave2
|
||||
display_name=another
|
||||
color=00ff00
|
||||
|
||||
*** Targets ***
|
||||
|
||||
probe = FPing
|
||||
|
||||
menu = Top
|
||||
title = Network Latency Grapher
|
||||
remark = ViciNOC Network Health Monitor
|
||||
|
||||
+ ViciNOC
|
||||
title = ViciNOC Local Server
|
||||
host = 127.0.0.1
|
||||
|
||||
@include /etc/smokeping/smokeping-viciserver.conf
|
||||
@include /etc/smokeping/smokeping-viciagents.conf
|
||||
@include /etc/smokeping/smokeping-carriers.conf
|
||||
@include /etc/smokeping/smokeping-other.conf
|
||||
Reference in New Issue
Block a user