git-svn-id: svn://192.168.202.10@2888 3d104415-ff17-0410-8863-d5cf3c621b8a

This commit is contained in:
jamesp
2018-01-10 18:15:35 +00:00
parent ee3c5097e9
commit b5e1dc0374
55 changed files with 4266 additions and 0 deletions
+7
View File
@@ -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>
+26
View File
@@ -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.
+149
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
object IcingaApplication "app" { }
+38
View File
@@ -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$"
}
+20
View File
@@ -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 != ""
}
+101
View File
@@ -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)
}
+52
View File
@@ -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
}
+33
View File
@@ -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
}
+103
View File
@@ -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"
}
+91
View File
@@ -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 = {
}
}
+17
View File
@@ -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"
}
+2
View File
@@ -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`;
+4
View File
@@ -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';
+524
View File
@@ -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');");
}
+2
View File
@@ -0,0 +1,2 @@
#!/bin/bash
yast2 live-installer
+91
View File
@@ -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
+153
View File
@@ -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