diff --git a/apache2/conf.d/homer.conf b/apache2/conf.d/homer.conf new file mode 100644 index 0000000..0a9365f --- /dev/null +++ b/apache2/conf.d/homer.conf @@ -0,0 +1,7 @@ +Alias /homer "/srv/www/vhosts/homer" + + + Options Indexes FollowSymLinks MultiViews + AllowOverride all + Require all granted + diff --git a/apache2/conf.d/smokeping.conf b/apache2/conf.d/smokeping.conf new file mode 100644 index 0000000..1a871c0 --- /dev/null +++ b/apache2/conf.d/smokeping.conf @@ -0,0 +1,26 @@ + + # 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 + + + SetHandler fastcgi-script + Require all granted + + + + 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 + + + +# this code will forbid access to frontend +# no need to remove it in case when system is not configured correctly + + Redirect 403 /cgi-bin/smokeping + diff --git a/homer/GeoLiteCity.dat b/homer/GeoLiteCity.dat new file mode 100644 index 0000000..f4eaba6 Binary files /dev/null and b/homer/GeoLiteCity.dat differ diff --git a/homer/homersips.init b/homer/homersips.init new file mode 100644 index 0000000..85b948d --- /dev/null +++ b/homer/homersips.init @@ -0,0 +1,149 @@ +#! /bin/sh +# Copyright (C) 2018 James Pearson LICENSE: AGPLv2 +# All rights reserved. +# +# Author: James Pearson set local and overall rc status to +# 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 diff --git a/icinga2/conf.d/app.conf b/icinga2/conf.d/app.conf new file mode 100644 index 0000000..3e4be0d --- /dev/null +++ b/icinga2/conf.d/app.conf @@ -0,0 +1 @@ +object IcingaApplication "app" { } diff --git a/icinga2/conf.d/commands.conf b/icinga2/conf.d/commands.conf new file mode 100644 index 0000000..e97b087 --- /dev/null +++ b/icinga2/conf.d/commands.conf @@ -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$" + } +} + diff --git a/icinga2/conf.d/commands/apache-status.conf b/icinga2/conf.d/commands/apache-status.conf new file mode 100644 index 0000000..7fc0561 --- /dev/null +++ b/icinga2/conf.d/commands/apache-status.conf @@ -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" +} + diff --git a/icinga2/conf.d/commands/asterisk-status.conf b/icinga2/conf.d/commands/asterisk-status.conf new file mode 100644 index 0000000..e9a8e40 --- /dev/null +++ b/icinga2/conf.d/commands/asterisk-status.conf @@ -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" +} + diff --git a/icinga2/conf.d/commands/drive-smart.conf b/icinga2/conf.d/commands/drive-smart.conf new file mode 100644 index 0000000..a2f1025 --- /dev/null +++ b/icinga2/conf.d/commands/drive-smart.conf @@ -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" +} + diff --git a/icinga2/conf.d/commands/mysql-slavechk.conf b/icinga2/conf.d/commands/mysql-slavechk.conf new file mode 100644 index 0000000..7a64af3 --- /dev/null +++ b/icinga2/conf.d/commands/mysql-slavechk.conf @@ -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" +} + diff --git a/icinga2/conf.d/commands/mysql-stdchk.conf b/icinga2/conf.d/commands/mysql-stdchk.conf new file mode 100644 index 0000000..81307e3 --- /dev/null +++ b/icinga2/conf.d/commands/mysql-stdchk.conf @@ -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" +} + + diff --git a/icinga2/conf.d/commands/ntp-check.conf b/icinga2/conf.d/commands/ntp-check.conf new file mode 100644 index 0000000..9207592 --- /dev/null +++ b/icinga2/conf.d/commands/ntp-check.conf @@ -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" +} + diff --git a/icinga2/conf.d/commands/raid-stat.conf b/icinga2/conf.d/commands/raid-stat.conf new file mode 100644 index 0000000..7d8d87e --- /dev/null +++ b/icinga2/conf.d/commands/raid-stat.conf @@ -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" +} + diff --git a/icinga2/conf.d/commands/sip-check.conf b/icinga2/conf.d/commands/sip-check.conf new file mode 100644 index 0000000..7b6998c --- /dev/null +++ b/icinga2/conf.d/commands/sip-check.conf @@ -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" +} + diff --git a/icinga2/conf.d/commands/snmp-cpu-use.conf b/icinga2/conf.d/commands/snmp-cpu-use.conf new file mode 100644 index 0000000..c139df4 --- /dev/null +++ b/icinga2/conf.d/commands/snmp-cpu-use.conf @@ -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" +} + diff --git a/icinga2/conf.d/commands/snmp-digitemp.conf b/icinga2/conf.d/commands/snmp-digitemp.conf new file mode 100644 index 0000000..3197c15 --- /dev/null +++ b/icinga2/conf.d/commands/snmp-digitemp.conf @@ -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" +} + diff --git a/icinga2/conf.d/commands/snmp-drive-use.conf b/icinga2/conf.d/commands/snmp-drive-use.conf new file mode 100644 index 0000000..79349ec --- /dev/null +++ b/icinga2/conf.d/commands/snmp-drive-use.conf @@ -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 = "/" +} + diff --git a/icinga2/conf.d/commands/snmp-mem-chk.conf b/icinga2/conf.d/commands/snmp-mem-chk.conf new file mode 100644 index 0000000..26471b4 --- /dev/null +++ b/icinga2/conf.d/commands/snmp-mem-chk.conf @@ -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 +} + diff --git a/icinga2/conf.d/commands/snmp-raid-stat.conf b/icinga2/conf.d/commands/snmp-raid-stat.conf new file mode 100644 index 0000000..27c10d8 --- /dev/null +++ b/icinga2/conf.d/commands/snmp-raid-stat.conf @@ -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" +} + diff --git a/icinga2/conf.d/commands/snmp-smart.conf b/icinga2/conf.d/commands/snmp-smart.conf new file mode 100644 index 0000000..373827e --- /dev/null +++ b/icinga2/conf.d/commands/snmp-smart.conf @@ -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" +} + diff --git a/icinga2/conf.d/commands/web-check.conf b/icinga2/conf.d/commands/web-check.conf new file mode 100644 index 0000000..0b257b2 --- /dev/null +++ b/icinga2/conf.d/commands/web-check.conf @@ -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$" +} + diff --git a/icinga2/conf.d/downtimes.conf b/icinga2/conf.d/downtimes.conf new file mode 100644 index 0000000..0bed647 --- /dev/null +++ b/icinga2/conf.d/downtimes.conf @@ -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 != "" +} diff --git a/icinga2/conf.d/groups.conf b/icinga2/conf.d/groups.conf new file mode 100644 index 0000000..4782d6f --- /dev/null +++ b/icinga2/conf.d/groups.conf @@ -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) +} + diff --git a/icinga2/conf.d/hosts.conf b/icinga2/conf.d/hosts.conf new file mode 100644 index 0000000..7ad0306 --- /dev/null +++ b/icinga2/conf.d/hosts.conf @@ -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" ] + } +} + diff --git a/icinga2/conf.d/hosts/db/dbX.template b/icinga2/conf.d/hosts/db/dbX.template new file mode 100644 index 0000000..437c43f --- /dev/null +++ b/icinga2/conf.d/hosts/db/dbX.template @@ -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" ] } +} + diff --git a/icinga2/conf.d/hosts/dial/dialX.template b/icinga2/conf.d/hosts/dial/dialX.template new file mode 100644 index 0000000..7372f78 --- /dev/null +++ b/icinga2/conf.d/hosts/dial/dialX.template @@ -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" ] } +} + diff --git a/icinga2/conf.d/hosts/web/webX.template b/icinga2/conf.d/hosts/web/webX.template new file mode 100644 index 0000000..3469124 --- /dev/null +++ b/icinga2/conf.d/hosts/web/webX.template @@ -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" ] } +} diff --git a/icinga2/conf.d/notifications.conf b/icinga2/conf.d/notifications.conf new file mode 100644 index 0000000..73f0f5f --- /dev/null +++ b/icinga2/conf.d/notifications.conf @@ -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 +} diff --git a/icinga2/conf.d/satellite.conf b/icinga2/conf.d/satellite.conf new file mode 100644 index 0000000..4a6b97a --- /dev/null +++ b/icinga2/conf.d/satellite.conf @@ -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 +} diff --git a/icinga2/conf.d/services.conf b/icinga2/conf.d/services.conf new file mode 100644 index 0000000..b6d9ecf --- /dev/null +++ b/icinga2/conf.d/services.conf @@ -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 +} + + + diff --git a/icinga2/conf.d/services/asterisk.conf b/icinga2/conf.d/services/asterisk.conf new file mode 100644 index 0000000..36c3eff --- /dev/null +++ b/icinga2/conf.d/services/asterisk.conf @@ -0,0 +1,7 @@ +apply Service "asterisk" { + import "service-1minhigh" + check_command = "asterisk-status" + enable_flapping = 0 + assign where host.vars.servertype == "dialer" +} + diff --git a/icinga2/conf.d/services/mysql.conf b/icinga2/conf.d/services/mysql.conf new file mode 100644 index 0000000..aefb848 --- /dev/null +++ b/icinga2/conf.d/services/mysql.conf @@ -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" +} + diff --git a/icinga2/conf.d/services/ntp.conf b/icinga2/conf.d/services/ntp.conf new file mode 100644 index 0000000..955a431 --- /dev/null +++ b/icinga2/conf.d/services/ntp.conf @@ -0,0 +1,6 @@ +apply Service "ntp" { + import "service-1minhigh" + check_command = "ntp-check" + assign where host.address != "127.0.0.1" +} + diff --git a/icinga2/conf.d/services/sip.conf b/icinga2/conf.d/services/sip.conf new file mode 100644 index 0000000..89be948 --- /dev/null +++ b/icinga2/conf.d/services/sip.conf @@ -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" +} + diff --git a/icinga2/conf.d/services/snmp-cpu.conf b/icinga2/conf.d/services/snmp-cpu.conf new file mode 100644 index 0000000..d52794c --- /dev/null +++ b/icinga2/conf.d/services/snmp-cpu.conf @@ -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" +} diff --git a/icinga2/conf.d/services/snmp-drive-use.conf b/icinga2/conf.d/services/snmp-drive-use.conf new file mode 100644 index 0000000..585c9f7 --- /dev/null +++ b/icinga2/conf.d/services/snmp-drive-use.conf @@ -0,0 +1,5 @@ +apply Service "root" { + import "service-5minlow" + check_command = "snmp-drive-use" + assign where host.address != "127.0.0.1" +} diff --git a/icinga2/conf.d/services/snmp-memory.conf b/icinga2/conf.d/services/snmp-memory.conf new file mode 100644 index 0000000..a6ee2ca --- /dev/null +++ b/icinga2/conf.d/services/snmp-memory.conf @@ -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" +} + diff --git a/icinga2/conf.d/services/snmp-raid.conf b/icinga2/conf.d/services/snmp-raid.conf new file mode 100644 index 0000000..4add3e2 --- /dev/null +++ b/icinga2/conf.d/services/snmp-raid.conf @@ -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" +} + diff --git a/icinga2/conf.d/services/snmp-smart.conf b/icinga2/conf.d/services/snmp-smart.conf new file mode 100644 index 0000000..6ab708e --- /dev/null +++ b/icinga2/conf.d/services/snmp-smart.conf @@ -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" +} + diff --git a/icinga2/conf.d/services/web.conf b/icinga2/conf.d/services/web.conf new file mode 100644 index 0000000..4bc75a9 --- /dev/null +++ b/icinga2/conf.d/services/web.conf @@ -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" +} + diff --git a/icinga2/conf.d/templates.conf b/icinga2/conf.d/templates.conf new file mode 100644 index 0000000..020732a --- /dev/null +++ b/icinga2/conf.d/templates.conf @@ -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 +} + diff --git a/icinga2/conf.d/timeperiods.conf b/icinga2/conf.d/timeperiods.conf new file mode 100644 index 0000000..21fac52 --- /dev/null +++ b/icinga2/conf.d/timeperiods.conf @@ -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 = { + } +} + diff --git a/icinga2/conf.d/users.conf b/icinga2/conf.d/users.conf new file mode 100644 index 0000000..515ef21 --- /dev/null +++ b/icinga2/conf.d/users.conf @@ -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" +} diff --git a/icinga2/icinga2-create.sql b/icinga2/icinga2-create.sql new file mode 100644 index 0000000..685042c --- /dev/null +++ b/icinga2/icinga2-create.sql @@ -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'; diff --git a/icinga2/plugins/check_apachestatus.pl b/icinga2/plugins/check_apachestatus.pl new file mode 100644 index 0000000..7e3efdf --- /dev/null +++ b/icinga2/plugins/check_apachestatus.pl @@ -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 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 v1.3 +# Fixed bug in perfdata regexp when Apache output was +# "nnn B/sec" instead of "nnn kB/sec" +# +# 20081231 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 [-p ] [-t ] [-w -c ] [-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 < , + WARNING if we are able to connect to the apache server's status page and #available slots <= , + CRITICAL if we are able to connect to the apache server's status page and #available slots <= , + 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/
/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"}
+  }
+}
diff --git a/icinga2/plugins/check_ast_chans.pl b/icinga2/plugins/check_ast_chans.pl
new file mode 100644
index 0000000..46ffe39
--- /dev/null
+++ b/icinga2/plugins/check_ast_chans.pl
@@ -0,0 +1,166 @@
+#!/usr/bin/perl
+
+# check_ast_chans.pl - Icinga plugin to check total asterisk channel usage
+#
+# Copyright (C) 2018  James Pearson     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'};}
diff --git a/icinga2/plugins/check_snmp_load.pl b/icinga2/plugins/check_snmp_load.pl
new file mode 100644
index 0000000..455d21c
--- /dev/null
+++ b/icinga2/plugins/check_snmp_load.pl
@@ -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  -C  [-2] | (-l login -x passwd [-X pass -L ,])  [-p ] -w  -c  -T=[stand|netsl|netsc|as400|cisco|cata|c5500|nsc|fg|bc|nokia|hp|lp|hpux] [-f] [-t ] [-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 <,
+    : Authentication protocol (md5|sha : default md5)
+    : 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;
+
diff --git a/icinga2/plugins/check_snmp_mem.pl b/icinga2/plugins/check_snmp_mem.pl
new file mode 100644
index 0000000..000b9b2
--- /dev/null
+++ b/icinga2/plugins/check_snmp_mem.pl
@@ -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  -H  -m "^Virtual Memory$"  -w  -c 
+
+
+# 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  -C  [-2] | (-l login -x passwd [-X pass -L ,])  [-p ] -w  -c  [-I|-N|-E] [-f] [-m -b] [-t ] [-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 <,
+    : Authentication protocol (md5|sha : default md5)
+    : 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};
+
+}
diff --git a/icinga2/plugins/check_snmp_storage.pl b/icinga2/plugins/check_snmp_storage.pl
new file mode 100644
index 0000000..b783738
--- /dev/null
+++ b/icinga2/plugins/check_snmp_storage.pl
@@ -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  -C  [-2] | (-l login -x passwd [-X pass -L ,]) [-p ] -m  [-q storagetype] -w  -c  [-t ] [-T pl|pu|bl|bu ] [-r -s -i -G] [-e] [-S 0|1[,1,]] [-o ] [-R <% reserved>]\n";
+}
+
+sub round ($$) {
+    sprintf "%.$_[1]f", $_[0];
+}
+
+sub is_pattern_valid { # Test for things like "" 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 < 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=,
+    : Authentication protocol (md5|sha : default md5)
+    : 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=[,,]
+   : 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"
+   : (optional) if = 1, put the OK/WARN/CRIT at the beginning
+   : take the  first caracters or  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 :