diff --git a/plugins/other/acpi-battery b/plugins/other/acpi-battery new file mode 100755 index 00000000..147ee3fd --- /dev/null +++ b/plugins/other/acpi-battery @@ -0,0 +1,70 @@ +#!/bin/sh +# +# Plugin to graph battery capacity. +# +# Parameters: +# +# acpi - Override path to acpi program +# +# +# $Log$ +# Revision 1.1 2007/03/14 19:52:10 anarcat +# ACPI-Battery plugin, framework copied from acpi plugin +# +# +# Expected content of /proc/acpi/battery/BAT0/info: +# present: yes +# design capacity: 47520 mWh +# last full capacity: 37650 mWh +# battery technology: rechargeable +# design voltage: 10800 mV +# design capacity warning: 2376 mWh +# design capacity low: 475 mWh +# capacity granularity 1: 1 mWh +# capacity granularity 2: 1 mWh +# model number: IBM-08K8039 +# serial number: 155 +# battery type: LION +# OEM info: Panasonic +#%# family=auto +#%# capabilities=autoconf + +if [ "$1" = "autoconf" ]; then + if grep -q 'present.*yes' /proc/acpi/battery/*/info > /dev/null 2>&1; then + echo yes + exit 0 + else + echo "no (battery not detected)" + exit 1 + fi +fi + +cd /proc/acpi/battery +if [ "$1" = "config" ]; then + echo 'graph_title Battery power' + echo 'graph_args --base 1000 -l 0' + echo 'graph_vlabel power in' `awk '/remaining capacity:/ { print $NF }' /proc/acpi/battery/*/state` + echo 'graph_category sensors' + echo 'graph_info This graph shows battery power based on output from ACPI.' + i=0 + for battery in * + do + echo $battery.label $battery + echo $battery.info Battery $i + i=$(($i+1)) +# design capacity warning: 2376 mWh +# design capacity low: 475 mWh + echo $battery.warning `awk '/design capacity warning:/ { print $4 }' $battery/info` + echo $battery.critical `awk '/design capacity low:/ { print $4 }' $battery/info` + + echo ${battery}_full.label $battery capacity + echo ${battery}_full.info last full capacity \(design capacity: `awk '/design capacity:/ { print $3 " " $4 }' $battery/info`\) + done + exit 0 +fi + +for battery in * +do + echo $battery.value `awk '/remaining capacity:/ { print $3 }' $battery/state` + echo ${battery}_full.value `awk '/last full capacity:/ { print $4 }' $battery/info` +done diff --git a/plugins/other/cleware b/plugins/other/cleware index 10969c9e..ac183cc1 100755 --- a/plugins/other/cleware +++ b/plugins/other/cleware @@ -1,11 +1,11 @@ #!/bin/bash # Written by Lars Falk-Petersen, cleware@falk-petersen.no -# Version 0.2. To be used with http://www.vanheusden.com/clewarecontrol/ +# Version 0.3. To be used with http://www.vanheusden.com/clewarecontrol/ # Clewarecontrol device serial must be set in config file: # #Put the following lines in /etc/munin/plugin-conf.d/cleware -# [cleware] +# [cleware*] # #device serial. find it by running: clewarecontrol -l # env.serial 7778 # #path of clewarecontrol @@ -32,11 +32,11 @@ if [ ! $serial ]; then exit 1 fi -$bin -ag > /dev/null 2>&1 +$bin -c 1 -ag > /dev/null 2>&1 echo -n "temp.value " -$bin -d $serial -b -rt +$bin -d $serial -b -c 1 -rt echo -n "hum.value " -$bin -d $serial -b -rh +$bin -d $serial -b -c 1 -rh diff --git a/plugins/other/fail2ban_all_jails b/plugins/other/fail2ban_all_jails new file mode 100755 index 00000000..8d03fca8 --- /dev/null +++ b/plugins/other/fail2ban_all_jails @@ -0,0 +1,57 @@ +#!/bin/bash +# +# munin plugin to monitor bans on Fail2ban jails +# +# Origional Author: Thomas Leveil +# Contributors: none +# Version: 1.1 +# +############################################### +# You have to specify a different user in the munin-node config file as follow: +# +# [fail2ban_all_jails] +# user root +############################################### +# +# HISTORY +# v1.1 : better autoconf +# +#%# family=contrib +#%# capabilities=autoconf + + +case $1 in + autoconf) + if [ -z $(which fail2ban-client) ]; then + echo no + exit 1 + fi + if [ $(whoami) != "root" ]; then + echo "no (fail2ban-client found but must run as root)" + exit 1 + fi + if [ -x $(which fail2ban-client) ]; then + echo yes + exit 0 + else + echo "no (fail2ban-client found but not executable)" + exit 1 + fi + ;; + config) + echo "graph_title Fail2ban" + echo 'graph_vlabel active bans' + echo 'graph_category Network' + echo 'graph_info number of jailled ip' + echo 'graph_info This graph shows the amount of bans caught by Fail2ban' + $(which fail2ban-client) status | awk '/Jail list:/ { for (i=4; i<=NF; i++) { sub(/,$/,"",$i); jail=$i; sub(/-/,"_",$i); print "fail2ban_"$i".label "jail } }' + exit 0 + ;; +esac + + $(which fail2ban-client) status | awk '/Jail list:/ { for (i=4; i<=NF; i++) { sub(/,$/,"",$i); print $i } }' | \ + while read JAIL; do + echo -n "fail2ban_${JAIL//-/_}.value " + $(which fail2ban-client) status $JAIL | awk '/Currently banned:/ { print $NF }' + done + diff --git a/plugins/other/ip_forward_ b/plugins/other/ip_forward_ new file mode 100755 index 00000000..3e4e6efc --- /dev/null +++ b/plugins/other/ip_forward_ @@ -0,0 +1,74 @@ +#!/bin/sh +# +# Wildcard-plugin to monitor forward traffic for network inretfaces through iptables. To monitor an +# interface, link if_forward_ to this file. E.g. +# +# ln -s /usr/share/node/node/plugins-auto/if_forward_ /etc/munin/node.d/if_forward_eth0 +# +# ...will monitor forwarded traffic trough eth0. +# +# Aditionally, you need these iptables rules as the first rules (they don't do anything, just make packet counts) +# +# iptables -A FORWARD -i eth0 +# iptables -A FORWARD -o eth0 +# +# Furthermore, this plugin needs to be run as root for iptables to work +# +# This plugin is based on the if_ and ip_ plugin. +# +# Magic markers (optional - used by munin-config and some installation +# scripts): +# +#%# family=auto +#%# capabilities=autoconf suggest + + +IF=`basename $0 | sed 's/^if_forward_//g'` + +if [ "$1" = "autoconf" ]; then + if [ -r /proc/net/dev ]; then + iptables-save -c >/dev/null 2>/dev/null + if [ $? -gt 0 ]; then + echo "no (could not run iptables-save as user `whoami`)" + exit 1 + else + echo yes + exit 0 + fi + else + echo "no (/proc/net/dev not found)" + exit 1 + fi +fi + +if [ "$1" = "suggest" ]; then + if [ -r /proc/net/dev ]; then + egrep '^ *(eth|wlan|ath|ra)[0-9]+:' /proc/net/dev | cut -f1 -d: | sed 's/ //g' + exit 0 + else + exit 1 + fi +fi + +if [ "$1" = "config" ]; then + + echo "graph_order out in" + echo "graph_title $IF forwarded traffic" + echo 'graph_args --base 1000' + echo 'graph_vlabel bits per ${graph_period}' + echo 'graph_category network' + echo "graph_info This graph shows only FORWARD traffic that pass trough the interface." + echo 'out.label sent' + echo 'out.type DERIVE' + echo 'out.min 0' + echo 'out.cdef out,8,*' + echo 'in.label received' + echo 'in.type DERIVE' + echo 'in.min 0' + echo 'in.cdef in,8,*' + exit 0 +fi; + +iptables-save -c | grep $IF | grep i | cut -f2 -d':' | cut -f1 -d']' | awk "{ print \"in.value \" \$0 }" +iptables-save -c | grep $IF | grep o | cut -f2 -d':' | cut -f1 -d']' | awk "{ print \"out.value \" \$0 }" + diff --git a/plugins/other/load_extended b/plugins/other/load_extended new file mode 100755 index 00000000..10d33f11 --- /dev/null +++ b/plugins/other/load_extended @@ -0,0 +1,137 @@ +#!/bin/sh +# +# Plugin to monitor the load average on a system. +# +# Usage: Link or copy into /etc/munin/node.d/ +# +# $Log$ +# Revision 1.5 2004/05/20 19:02:37 jimmyo +# Set categories on a bunch of plugins +# +# Revision 1.4 2004/05/20 13:57:12 jimmyo +# Set categories to some of the plugins. +# +# Revision 1.3 2004/05/16 12:41:04 jimmyo +# Changed load plot from lastminute to last 5 minutes. +# +# Revision 1.2 2004/05/16 12:34:26 jimmyo +# Added "info"-fields to linux/cpu and linux/load plugins, to demonstrate how it works. +# +# Revision 1.1 2004/01/02 18:50:01 jimmyo +# Renamed occurrances of lrrd -> munin +# +# Revision 1.1.1.1 2004/01/02 15:18:07 jimmyo +# Import of LRRD CVS tree after renaming to Munin +# +# Revision 1.4 2003/11/15 11:10:28 jimmyo +# Various fixes +# +# Revision 1.3 2003/11/07 17:43:16 jimmyo +# Cleanups and log entries +# +# +# +# Magic markers (optional - only used by munin-config and some +# installation scripts): +# +#%# family=auto +#%# capabilities=autoconf + + + +# If run with the "autoconf"-parameter, give our opinion on wether we +# should be run on this system or not. This is optinal, and only used by +# munin-config. In the case of this plugin, we should most probably +# always be included. + +if [ "$1" = "autoconf" ]; then + echo yes + exit 0 +fi + +# If run with the "config"-parameter, give out information on how the +# graphs should look. + +if [ "$1" = "config" ]; then + # The host name this plugin is for. (Can be overridden to have + # one machine answer for several) + + # The title of the graph + echo 'graph_title Load average' + # Arguments to "rrdtool graph". In this case, tell it that the + # lower limit of the graph is '0', and that 1k=1000 (not 1024) + echo 'graph_args --base 1000 -l 0' + # The Y-axis label + echo 'graph_vlabel load' + # We want Cur/Min/Avg/Max unscaled (i.e. 0.42 load instead of + # 420 milliload) + echo 'graph_scale no' + # Graph category. Defaults to 'other' + echo 'graph_category system' + # The fields. "label" is used in the legend. "label" is the only + # required subfield. + echo 'load1.label load 1 min avg' + echo 'load1.draw AREA' + echo 'load5.label load 5 min avg' + echo 'load5.draw AREA' + echo 'load15.label load 15 min avg' + echo 'load15.draw AREA' + # These 6 are optional. They are only used if you have + # configured your munin to tell a Nagios-server about any + # problems + echo 'load1.warning 10' + echo 'load1.critical 120' + echo 'load5.warning 10' + echo 'load5.critical 120' + echo 'load15.warning 10' + echo 'load15.critical 120' + # This one is purely to add an explanation to the web page. The first + # one is for the graph itself, while the second one is for the field + # "load". + echo 'graph_info The load average of the machine describes how many processes are in the run-queue (scheduled to run "immediately").' + echo 'load1.info Average load for 1 minute avg.' + echo 'load5.info Average load for 5 minutes avg.' + echo 'load15.info Average load for 15 minutes avg.' + + # Last, if run with the "config"-parameter, quit here (don't + # display any data) + exit 0 +fi + +# If not run with any parameters at all (or only unknown ones), do the +# real work - i.e. display the data. Almost always this will be +# "value" subfield for every data field. + +echo -n "load1.value " +cut -f1 -d' ' < /proc/loadavg + +echo -n "load5.value " +cut -f2 -d' ' < /proc/loadavg + +echo -n "load15.value " +cut -f3 -d' ' < /proc/loadavg + +# How could this plugin have been written in its simplest form? +# Something like this: +# +# --------------------- +# #!/bin/sh + +# +# if [ "$1" = "config" ]; then + +# echo "graph_title Load average" +# echo 'graph_args --base 1000 -l 0' +# echo 'graph_vlabel load' +# echo "load.label load" +# exit 0 +# fi +# echo -n "load.value " +# cut -f1 -d' ' < /proc/loadavg +# --------------------- +# +# Except for the Nagios-warnings (which most people don't have any need +# for) and things used by installation scripts and munin-config (which +# you don't need if you don't plan on submitting your plugin to the +# pacakge), and the scaling (no milliload numbers) the two versions will +# work identically. diff --git a/plugins/other/oracle__connections b/plugins/other/oracle__connections new file mode 100755 index 00000000..48e071a9 --- /dev/null +++ b/plugins/other/oracle__connections @@ -0,0 +1,153 @@ +#!/usr/bin/perl -w +# Plugin for monitor oracle connections. +# +# Licenced under GPL v2. +# +# Usage: +# +# Symlink into /etc/munin/plugins/ and add the monitored +# database to the filename. e.g.: +# +# ln -s /usr/share/munin/plugins/oracle__connections \ +# /etc/munin/plugins/oracle__connections +# This should, however, be given through autoconf and suggest. +# +# If required, give username, password and/or oracle server +# host through environment variables. +# +# +# Parameters: +# autoconf +# config (required) +# +# Config variables: +# +# dbhost - Which database server to use. Defaults to +# 'localhost'. +# dbname - Which database to use. Defaults to orcl +# dbuser - A oracle user account with read permission to +# the v$session view. Defaults to +# 'oracle'. Anyway, Munin must be told which user +# this plugin should be run as. +# dbpass - The corresponding password, if +# applicable. Default to undef. +# +# showusers - If set to 1 show usernames and num. of connections. +# Default is not show users (0). +# Magic markers +#%# family=auto +#%# capabilities=autoconf + +use strict; +use DBI; + +my $dbhost = $ENV{'dbhost'} || '127.0.0.1'; +my $dbname = $ENV{'dbname'} || 'orcl'; +my $dbuser = $ENV{'dbuser'} || 'oracle'; +my $dbport = $ENV{'dbport'} || '1521'; +my $dbpass = $ENV{'dbpass'} || ''; +my $showusers = $ENV{'showusers'} || '0'; + +# Check for DBD::Oracle +if (! eval "require DBD::Oracle;") { + exit 1; +} + +my $dsn = "DBI:Oracle:dbname=$dbname;host=$dbhost;port=$dbport;sid=$dbname"; +#print "$dsn\n"; +my $dbh = DBI->connect ($dsn, $dbuser, + $dbpass, + {RaiseError =>1}) || die ""; + + + +if (exists $ARGV[0]) { + if ($ARGV[0] eq 'autoconf') { + # Check for DBD::Oracle + if (! eval "require DBD::Oracle;") { + print "no (DBD::Oracle not found)"; + exit 1; + } + if ($dbh) { + print "yes\n"; + exit 0; + } else { + print "no Unable to access Database $dbname on host $dbhost as user $dbuser.\nError returned was: ". $DBI::errstr; + exit 1; + } + } + + if ($ARGV[0] eq "config") { + my $sql_max = "select value from v\$parameter where name = 'sessions'"; + my $sth_max = $dbh->prepare($sql_max); + $sth_max->execute(); + my ($max_connections) = $sth_max->fetchrow(); + my $warning = int ($max_connections * 0.7); + my $critical = int ($max_connections * 0.8); + print "graph_title Oracle active connections from $dbname\n"; + print "graph_args -l 0 --base 1000\n"; + print "graph_vlabel Connections\n"; + print "graph_category oracle\n"; + print "graph_info Shows active oracle connections from $dbname\n"; + print "graph_scale no\n"; + if ( $showusers ) { + my $sql = "select username, count(username) from v\$session where username is not null group by username"; + my $sth = $dbh->prepare($sql); + $sth->execute(); + my $setarea = "yes"; + while ( my ($datname,$curr_conn) = $sth->fetchrow_array ) { + print "$datname.label $datname active connections\n"; + print "$datname.info $datname active connections\n"; + print "$datname.type GAUGE\n"; + if ($setarea eq "yes") { + print "$datname.draw AREA\n"; + $setarea=""; + } else { + print "$datname.draw STACK\n"; + } + } + } else { + print "connections.label active connections\n"; + print "connections.info active connections\n"; + print "connections.type GAUGE\n"; + print "connections.warning $warning\n"; + print "connections.critical $critical\n"; + } + print "total.label active connections\n"; + print "total.info active connections\n"; + print "total.type GAUGE\n"; + print "total.warning $warning\n"; + print "total.critical $critical\n"; + print "max_connections.label Max. connections\n"; + print "max_connections.info Max. connections\n"; + print "max_connections.type GAUGE\n"; + exit 0; + } +} + + +my $sql_max = "select value from v\$parameter where name = 'sessions'"; +my $sth_max = $dbh->prepare($sql_max); +$sth_max->execute(); +my ($max_connections) = $sth_max->fetchrow(); + +if ( $showusers ) { + my $sql = "select username, count(username) from v\$session where username is not null group by username"; + my $sth = $dbh->prepare($sql); + $sth->execute(); + my $total = 0; + while ( my ($datname,$curr_conn) = $sth->fetchrow_array ) { + print "$datname.value $curr_conn\n"; + $total = $total+$curr_conn; + } + print "total.value $total\n"; +} else { + my $sql = "select count(username) from v\$session where username is not null"; + my $sth = $dbh->prepare($sql); + $sth->execute(); + my ($curr_conn) = $sth->fetchrow_array; + print "connections.value $curr_conn\n"; +} + +print "max_connections.value $max_connections\n"; + diff --git a/plugins/other/php_apc_ b/plugins/other/php_apc_ new file mode 100755 index 00000000..78af98fd Binary files /dev/null and b/plugins/other/php_apc_ differ diff --git a/plugins/other/tinydns b/plugins/other/tinydns new file mode 100755 index 00000000..5d620602 --- /dev/null +++ b/plugins/other/tinydns @@ -0,0 +1,106 @@ +#!/bin/sh +# +# Shows DNS query statistics as gathered by tinystats by Luca Morettoni. +# +# Parameters: +# +# config (required) +# autoconf (optional - used by munin-config) +# +#%# family=auto +#%# capabilities=autoconf + + +if [ "$1" = "autoconf" ]; then + if [ -f "/var/service/tinydns/log/main/tinystats.out" ]; then + echo yes; + else + echo no; + fi + exit 0; +fi + +if [ "$1" = "config" ]; then + + cat - < \s* }{}xms; $_ } grep /->/, @l7vsadm_output; my $header = shift @lines; my @header_columns = split /\s+/, $header; diff --git a/plugins/other/wordpress b/plugins/other/wordpress index 4be05ed6..76cbafe8 100755 --- a/plugins/other/wordpress +++ b/plugins/other/wordpress @@ -2,7 +2,8 @@ # wordpress-munin plugin # # Author Andre Darafarin -# Version 0.1 05 Oct 2010 +# Improvements by Chris Bair +# Version 0.2 15 Feb 2011 # # : <<=cut @@ -45,56 +46,48 @@ Add file plugin-conf.d/wordpress and fill like this =head1 VERSION -0.1, Oct 05 2010 +0.2 15 Feb 2011 =head1 AUTHOR Andre Darafarin, happypork.com =cut -case $1 in - config) - cat <<'EOM' -graph_title Wordpress average -graph_order posts comments pingbacks users -graph_vlabel Wordpress -graph_info Some Statistics of Wordpress -posts.label Posts -posts.draw LINE3 -comments.label Comments -pingbacks.label Pingbacks -users.label Users -EOM - exit 0;; -esac + +if [ "$1" = "config" ]; then + echo 'graph_title Wordpress average' + echo 'graph_order posts comments pingbacks users' + echo 'graph_vlabel Wordpress' + echo 'graph_info Some Statistics of Wordpress' + echo 'posts.label Posts' + echo 'posts.draw LINE3' + echo 'comments.label Comments' + echo 'pingbacks.label Pingbacks' + echo 'users.label Users' + exit 0 +fi + +POSTS=0 +COMMENTS=0 +PINGBACKS=0 +USERS=0 # DBNAME=${logfile:-/var/log/syslog} -POSTS=`mysql -h$DB_HOST -p$DB_PASSWORD -u$DB_USER -D $DB_NAME --execute="SELECT COUNT(*) FROM wp_posts WHERE post_status = 'publish' AND post_password = '' AND post_type = 'post';"` -SHORTPOSTS="${POSTS:9}" +POSTS=`mysql -h$DB_HOST -p$DB_PASSWORD -u$DB_USER -D $DB_NAME --column-names=0 -s --execute="SELECT COUNT(*) FROM wp_posts WHERE post_status = 'publish' AND post_password = '' AND post_type = 'post';"` -COMMENTS=`mysql -h$DB_HOST -p$DB_PASSWORD -u$DB_USER -D $DB_NAME --execute="SELECT COUNT(*) FROM wp_comments WHERE comment_approved = '1' AND comment_type = '';"` -SHORTCOMMENTS="${COMMENTS:9}" +COMMENTS=`mysql -h$DB_HOST -p$DB_PASSWORD -u$DB_USER -D $DB_NAME --column-names=0 -s --execute="SELECT COUNT(*) FROM wp_comments WHERE comment_approved = '1' AND comment_type = '';"` -PINGBACKS=`mysql -h$DB_HOST -p$DB_PASSWORD -u$DB_USER -D $DB_NAME --execute="SELECT COUNT(*) FROM wp_comments WHERE comment_approved = '1' AND comment_type = 'pingback';"` -SHORTPINGBACKS="${PINGBACKS:9}" +PINGBACKS=`mysql -h$DB_HOST -p$DB_PASSWORD -u$DB_USER -D $DB_NAME --column-names=0 -s --execute="SELECT COUNT(*) FROM wp_comments WHERE comment_approved = '1' AND comment_type = 'pingback';"` -USERS=`mysql -h$DB_HOST -p$DB_PASSWORD -u$DB_USER -D $DB_NAME --execute="SELECT COUNT(*) FROM wp_users ;"` -SHORTUSERS="${USERS:9}" +USERS=`mysql -h$DB_HOST -p$DB_PASSWORD -u$DB_USER -D $DB_NAME --column-names=0 -s --execute="SELECT COUNT(*) FROM wp_users ;"` #AUSGABE BEREICH -echo -n "posts.value $SHORTPOSTS -" - -echo -n "comments.value $SHORTCOMMENTS -" - -echo -n "pingbacks.value $SHORTPINGBACKS -" - -echo -n "users.value $SHORTUSERS -" +echo "posts.value $POSTS" +echo "comments.value $COMMENTS" +echo "pingbacks.value $PINGBACKS" +echo "users.value $USERS"