diff --git a/plugins/other/pf b/plugins/other/pf new file mode 100755 index 00000000..0e4aeb1d --- /dev/null +++ b/plugins/other/pf @@ -0,0 +1,143 @@ +#!/bin/sh +# +# OpenBSD's pf(4) monitoring for FreeBSD +# 2007, Gergely Czuczy +# +# Needs to run as root. +# Add "user root" for the [pf] into plugins.conf. +# +# Options: +# - env.do_searches yes: to enable state table search monitoring` +# +# 0.1 - initial release: +# - state table usage +# - search rate +# - match rate +# - state mismatch rate +# - blocked packets +# - monitoring of labelled rules +# +# 0.2 - feature improvements: +# - Labelled rules for packet count +# - OpenBSD compatibility +# - Warning and critical on state table +# +# 0.3 - feature improvements: +# - Aggregate rules with the same label +# +# 0.4 - feature changes: +# - State searches are optional. it can shrink others. +# - Labelled targets are marked with a leading L +# +# +#%# family=auto +#%# capabilities=autoconf + +pfctl='/sbin/pfctl' + +case $1 in + config) + cat < /dev/null | awk ' +/states/ {print "states.warning "$4*0.9; print "states.critical "$4*0.95} +' +if [ "x${do_searches}" = "xyes" ]; then + cat </dev/null | awk '/^Status:/{print $2}'` != "Enabled" ]; then + echo "no (pf(4) is not enabled, consult pfctl(8)" + exit 1 + fi + # OpenBSD + elif [ ${ostype} = "OpenBSD" ]; then + # pf(4) module loaded? + if [ `kldstat -v | grep pf | wc -l` -eq 0 ]; then + echo "no (pf(4) is not loaded)" + exit 1 + fi + # enabled? + if [ `pfctl -si 2>/dev/null | awk '/^Status:/{print $2}'` != "Enabled" ]; then + echo "no (pf(4) is not enabled, consult pfctl(8)" + exit 1 + fi + # Other OSes + else + echo "no (this plugin is not supported on your OS)" + exit 1 + fi + echo "yes" + exit 0 + ;; + suggest) + exit 0; + ;; +esac + +# +${pfctl} -si 2>/dev/null | awk ' +/current entries/{print "states.value",$3} +/searches/{if ( "'${do_searches}'" == "yes" ) print "searches.value",$2} +$1~/^match$/{print "matches.value",$2} +/state-mismatch/{print "mismatches.value",$2}' +${pfctl} -vsr 2> /dev/null| grep -A 1 ^block | awk 'BEGIN {sum=0}/^[ \t]*\[/{sum=sum+$5} END {print "blocks.value",sum}' + +# the labeled ones +pfctl -sl | awk ' +BEGIN { + total=0 +} +{ + l=""; + for (i=1; i