From e3e3ca2787279291ebbde0404f705a9f28a411c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Paulmier?= Date: Fri, 7 Feb 2014 15:01:41 +0100 Subject: [PATCH] added a new plugin to monitor bind9 usage by RR queried --- plugins/bind9/bind9_rr | 133 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100755 plugins/bind9/bind9_rr diff --git a/plugins/bind9/bind9_rr b/plugins/bind9/bind9_rr new file mode 100755 index 00000000..f6193177 --- /dev/null +++ b/plugins/bind9/bind9_rr @@ -0,0 +1,133 @@ +#!/usr/bin/perl -w +# -*- perl -*- + +=head1 NAME + +bind9_rr - Plugin to monitor usage of bind 9 servers + +=head1 CONFIGURATION + +This plugin is configurable environment variables. The following +shows the default settings: + + [bind9_rr] + env.logfile /var/log/bind9/query.log + +You must also configure query logging in your named.conf. Use a stanza +such as this: + + logging { + channel query { + file "query.log" versions 2 size 1m; + print-time yes; + severity info; + }; + + category queries { query; }; + }; + +=head1 SEE ALSO + +=over + +=item * L + +=item * BIND Administrator Reference Manual + +=back + +=head1 AUTHOR + +Nicolai Langfeldt +Remi Paulmier + +=head1 LICENSE + +GPLv2 + +=head1 MAGIC MARKERS + + #%# family=manual + +=cut + +use strict; + +my $QUERYLOG = $ENV{logfile} || '/var/log/bind9/query.log'; +my $STATEFILE= "$ENV{MUNIN_PLUGSTATE}/bind9_rr.state"; + +my $OTHER=0; +my %IN; + +sub get_state { + if (! -f $STATEFILE) { + open(Q, ">", $STATEFILE); + close(Q); + } + open(Q,"< $STATEFILE") or die ("Cannot open state file"); + while () { + chomp; + my ($q,$n) = split(/\s+/,$_,2); + $IN{$q}=$n unless defined($IN{$q}); + } + close(Q); +} + + +sub do_stats { + my $k; + + open(Q,"< $QUERYLOG") or die "$!"; + while () { + chomp; + if (/: (view \S+\: |)query\: (\S+) (\w+) (\w+)/) { + if ($3 eq 'IN' and $4 !~ /^TYPE/) { + my $crr = lc $2; + $IN{$crr}++; + } + } + } + close(Q); + + get_state; + + my @INkeys = sort { $IN{$b} <=> $IN{$a} } keys %IN; + + open(Q,"> $STATEFILE") or die; + foreach $k (@INkeys[0 .. 19]) { + print "rr_$k.value ",$IN{$k},"\n"; + print Q "$k ",$IN{$k},"\n"; + } + close(Q); +} + + +sub do_config { + my $k; + + print "graph_title DNS Queries by RR +graph_category BIND +graph_vlabel Queries / \${graph_period} +"; + get_state; + + my @INkeys = sort { $IN{$b} <=> $IN{$a} } keys %IN; + + foreach $k (@INkeys[0 .. 19]) { + print "rr_$k.label $k +rr_$k.type DERIVE +rr_$k.min 0 +rr_$k.draw STACK +"; + } +}; + +if (defined($ARGV[0]) and ($ARGV[0] eq 'config')) { + do_config; + exit(0); +} + +do_stats; + + +# vim:syntax=perl