Projet

Général

Profil

Paste
Télécharger au format
Statistiques
| Branche: | Révision:

root / plugins / network / pf @ dd4afac8

Historique | Voir | Annoter | Télécharger (3,44 ko)

1
#!/bin/sh
2
#
3
# OpenBSD's pf(4) monitoring for FreeBSD
4
# 2007, Gergely Czuczy <phoemix@harmless.hu>
5
#
6
# Needs to run as root.
7
# Add "user root" for the [pf] into plugins.conf.
8
#
9
# Options:
10
#  - env.do_searches yes: to enable state table search monitoring`
11
#
12
# 0.1 - initial release:
13
# - state table usage
14
# - search rate
15
# - match rate
16
# - state mismatch rate
17
# - blocked packets
18
# - monitoring of labelled rules
19
#
20
# 0.2 - feature improvements:
21
#  - Labelled rules for packet count
22
#  - OpenBSD compatibility
23
#  - Warning and critical on state table
24
#
25
# 0.3 - feature improvements:
26
#  - Aggregate rules with the same label
27
#
28
# 0.4 - feature changes:
29
#  - State searches are optional. it can shrink others.
30
#  - Labelled targets are marked with a leading L
31
#
32
#
33
#%# family=auto
34
#%# capabilities=autoconf
35
PATH=/bin:/sbin:/usr/bin:/usr/sbin
36
export PATH
37

    
38
pfctl="/sbin/pfctl"
39

    
40
case $1 in
41
    config)
42
	echo "graph_title OpenBSD pf statistics"
43
	echo "graph_vlabel Entries per second"
44
	echo "graph_scale no"
45
	echo "graph_category network"
46
	echo "graph_args -l 0"
47
	echo "graph_info OpenBSD's pf usage statistics"
48
	echo "states.label States"
49
	echo "states.type GAUGE"
50
	${pfctl} -sm 2> /dev/null | awk '/states/ {print "states.warning "$4*0.9; print "states.critical "$4*0.95}'
51
	if [ "x${do_searches}" = "xyes" ]; then
52
		echo "searches.label Searches"
53
		echo "searches.min 0"
54
		echo "searches.type DERIVE"
55
	fi
56
	echo "matches.label Matches"
57
	echo "matches.min 0"
58
	echo "matches.type DERIVE"
59
	echo "mismatches.label State mismatches"
60
	echo "mismatches.min 0"
61
	echo "mismatches.type DERIVE"
62
	echo "blocks.label Blocked packets"
63
	echo "blocks.type DERIVE"
64
	echo "blocks.min 0"
65
	${pfctl} -sl 2>/dev/null | awk '{
66
		 l="";
67
		 for (i=1; i<NF-2; i=i+1) l=l" "$i;
68
		 sub(/^ /, "", l);
69
		 f=l;
70
		 gsub(/[^a-z0-9A-Z]/, "_", f);
71
		 print f".label L: "l;
72
		 print f".type DERIVE"
73
		 print f".min 0"}'
74
	exit 0
75
	;;
76

    
77
    autoconf)
78
	ostype=`uname -s`
79
        # NetBSD
80
	if [ ${ostype} = "NetBSD" ]; then
81
	# enabled?
82
		if [ `${pfctl} -si 2>/dev/null | awk '/^Status:/{print $2}'` != "Enabled" ]; then
83
			echo "no (pf(4) is not enabled, consult pfctl(8))"
84
			exit 1
85
		fi
86
	# FreeBSD
87
	elif [ ${ostype} = "FreeBSD" ]; then
88
		# enabled?
89
		if [ `${pfctl} -si 2>/dev/null | awk '/^Status:/{print $2}'` != "Enabled" ]; then
90
			echo "no (pf(4) is not enabled, consult pfctl(8))"
91
			exit 1
92
		fi
93
	# OpenBSD
94
	elif [ ${ostype} = "OpenBSD" ]; then
95
		# pf(4) module loaded?
96
		if [ `kldstat -v | grep pf | wc -l` -eq 0 ]; then
97
			echo "no (pf(4) is not loaded)"
98
			exit 1
99
		fi
100
		# enabled?
101
		if [ `${pfctl} -si 2>/dev/null | awk '/^Status:/{print $2}'` != "Enabled" ]; then
102
			echo "no (pf(4) is not enabled, consult pfctl(8))"
103
			exit 1
104
		fi
105
	# Other OSes
106
	else
107
		echo "no (this plugin is not supported on your OS)"
108
		exit 1
109
	fi
110
	echo "yes"
111
	exit 0
112
	;;
113

    
114
    suggest)
115
	exit 0;
116
	;;
117

    
118
esac
119

    
120
#
121
${pfctl} -si 2>/dev/null | awk '
122
	/current entries/{print "states.value",$3}
123
	/searches/{if ( "'${do_searches}'" == "yes" ) print "searches.value",$2}
124
	$1~/^match$/{print "matches.value",$2}
125
	/state-mismatch/{print "mismatches.value",$2}'
126
${pfctl} -vsr 2> /dev/null| grep -A 1 ^block | awk 'BEGIN {sum=0}/^[ \t]*\[/{sum=sum+$5} END {print "blocks.value",sum}'
127

    
128
# the labeled ones
129
${pfctl} -sl 2>/dev/null | awk '
130
	BEGIN {
131
		total=0
132
	}
133
	{
134
		l="";
135
		for (i=1; i<NF-2; i=i+1) l=l" "$i;
136
		sub(/^ /, "", l);
137
		f=l;
138
		gsub(/[^a-z0-9A-Z]/, "_", f);
139
		total=total+1;
140
		fields[f]=fields[f]+$(NF-i+2);
141
	}
142
	END {
143
		if ( total == 0 ) exit 0;
144
		for ( k in fields ) print k".value "fields[k]
145
	}'