root / plugins / network / bind95_ @ 942bda31
Historique | Voir | Annoter | Télécharger (3,74 ko)
| 1 | 0cbd0a71 | Jean-Samuel Reynaud | #!/usr/bin/perl |
|---|---|---|---|
| 2 | # |
||
| 3 | # Copyright Jean-Samuel Reynaud <js.reynaud@free.fr> |
||
| 4 | # Licenced under GPL v2 |
||
| 5 | # |
||
| 6 | # We use this script to produce graph with munin for dns requests |
||
| 7 | # This script must have his name start with bind95_ |
||
| 8 | # bind95_ : Global bind statistic |
||
| 9 | # bind95_test.com : Bind statistic for test.com zone (no view) |
||
| 10 | # bind95_test.com@internal : Bind statistic for test.com zone (view internal) |
||
| 11 | # This version work with bind 9.5 |
||
| 12 | # |
||
| 13 | # Thanks for Benjamin Pineau for perl cleaning and corrections |
||
| 14 | # |
||
| 15 | # You should have to add the following lines to you plugin configuration |
||
| 16 | # (/etc/munin/plugin-conf.d/munin-node): |
||
| 17 | #[bind95_*] |
||
| 18 | #user root |
||
| 19 | #stat_file /var/cache/bind/named.stats |
||
| 20 | #rndc /usr/sbin/rndc |
||
| 21 | # |
||
| 22 | # |
||
| 23 | # Magic markers |
||
| 24 | #%# family=auto |
||
| 25 | #%# capabilities=autoconf |
||
| 26 | |||
| 27 | use strict; |
||
| 28 | use warnings; |
||
| 29 | use Digest::MD5 qw(md5_hex); |
||
| 30 | |||
| 31 | # change those to reflect your bind configuration (use plugin configuration) |
||
| 32 | # stat file |
||
| 33 | my $stat_file = $ENV{'stat_file'} || "/var/cache/bind/named.stats";
|
||
| 34 | # rndc path |
||
| 35 | my $rndc = $ENV{'rndc'} || "/usr/sbin/rndc";
|
||
| 36 | |||
| 37 | |||
| 38 | my $domain = $0; |
||
| 39 | if ($domain =~ m/^.*bind95_[\w\d\._\-]+@[\w\d\._\-]+?$/) {
|
||
| 40 | $domain =~ s/^.*bind95_([\w\d\._\-]*)@([\w\d\._\-]+)?$/$1 (view: $2)/; |
||
| 41 | } elsif ($domain =~ m/^.*bind95_[\w\d\._\-]+$/) {
|
||
| 42 | $domain =~ s/^.*bind95_([\w\d\._\-]+)$/$1/; |
||
| 43 | } else {
|
||
| 44 | $domain = "View: _bind"; |
||
| 45 | } |
||
| 46 | |||
| 47 | my @counters = ( |
||
| 48 | 'IPv4 requests received', |
||
| 49 | 'requests with EDNS(0) received', |
||
| 50 | 'TCP requests received', |
||
| 51 | 'auth queries rejected', |
||
| 52 | 'recursive queries rejected', |
||
| 53 | 'transfer requests rejected', |
||
| 54 | 'update requests rejected', |
||
| 55 | 'responses sent', |
||
| 56 | 'truncated responses sent', |
||
| 57 | 'responses with EDNS(0) sent', |
||
| 58 | 'queries resulted in successful answer', |
||
| 59 | 'queries resulted in authoritative answer', |
||
| 60 | 'queries resulted in non authoritative answer', |
||
| 61 | 'queries resulted in referral answer', |
||
| 62 | 'queries resulted in nxrrset', |
||
| 63 | 'queries resulted in SERVFAIL', |
||
| 64 | 'queries resulted in NXDOMAIN', |
||
| 65 | 'queries caused recursion', |
||
| 66 | 'duplicate queries received', |
||
| 67 | 'queries dropped', |
||
| 68 | 'other query failures', |
||
| 69 | 'requested transfers completed', |
||
| 70 | 'transfer requests succeeded', |
||
| 71 | 'IPv4 notifies sent', |
||
| 72 | 'IPv4 notifies received', |
||
| 73 | 'notifies rejected', |
||
| 74 | 'IPv4 SOA queries sent', |
||
| 75 | 'IPv4 IXFR requested' |
||
| 76 | ); |
||
| 77 | |||
| 78 | |||
| 79 | # Parse the statistic file |
||
| 80 | sub parseFile {
|
||
| 81 | my $dom = shift @_; |
||
| 82 | open(IN,"<$stat_file") or die "Can't open $stat_file : $!"; |
||
| 83 | my $current_zone = ""; |
||
| 84 | while (<IN>) {
|
||
| 85 | chomp; |
||
| 86 | my $l = $_; |
||
| 87 | |||
| 88 | if ($l =~ /\[/ ) {
|
||
| 89 | $l =~ s/\[//g; |
||
| 90 | $l =~ s/\]//g; |
||
| 91 | $current_zone = $l; |
||
| 92 | } else {
|
||
| 93 | $l =~ s/^ *//g; |
||
| 94 | if ($l =~ /^[0-9]/ && $current_zone eq $domain) {
|
||
| 95 | my ($val,$desc) = split(' ',$l,2);
|
||
| 96 | if (grep { $desc eq $_ } @counters) {
|
||
| 97 | printf "%s.value %u\n",md5_hex($desc),$val; |
||
| 98 | } |
||
| 99 | } |
||
| 100 | } |
||
| 101 | } |
||
| 102 | close(IN); |
||
| 103 | } |
||
| 104 | |||
| 105 | |||
| 106 | |||
| 107 | # Config mode |
||
| 108 | if ( defined($ARGV[0]) && $ARGV[0] eq "config" ) {
|
||
| 109 | printf "graph_title Dns requests %s\n",($domain eq "View: _bind" ? " all domains":$domain); |
||
| 110 | printf "graph_vlabel requests/s\n"; |
||
| 111 | printf "graph_category network\n"; |
||
| 112 | printf "graph_info This graph display dns requests for %s\n",($domain eq "View: _bind" ? "all domains":$domain); |
||
| 113 | |||
| 114 | foreach(@counters) {
|
||
| 115 | my $s = $_; |
||
| 116 | printf "%s.label %s\n",md5_hex($s),$s; |
||
| 117 | printf "%s.type DERIVE\n",md5_hex($s); |
||
| 118 | printf "%s.min 0\n",md5_hex($s); |
||
| 119 | } |
||
| 120 | exit 0; |
||
| 121 | } |
||
| 122 | |||
| 123 | if ( defined($ARGV[0]) && $ARGV[0] eq "autoconf" ) {
|
||
| 124 | if (! -f $stat_file) {
|
||
| 125 | printf "Unable to file bind stat file on %s",$stat_file; |
||
| 126 | exit 1; |
||
| 127 | } |
||
| 128 | if (! -f $rndc) {
|
||
| 129 | printf "Unable to file rndc tool (configured : %s)",$rndc; |
||
| 130 | exit 1; |
||
| 131 | } |
||
| 132 | exit 0; |
||
| 133 | } |
||
| 134 | |||
| 135 | # Remove old stat file |
||
| 136 | unlink ($stat_file); |
||
| 137 | # Ask to bind to build new one |
||
| 138 | `$rndc stats`; |
||
| 139 | # Parse the stat file and return result |
||
| 140 | parseFile($domain); |
