diff --git a/plugins/other/tor-bandwidth-usage b/plugins/other/tor-bandwidth-usage new file mode 100755 index 00000000..26a5f070 --- /dev/null +++ b/plugins/other/tor-bandwidth-usage @@ -0,0 +1,153 @@ +#!/usr/bin/perl -w +# +# tor_bandwidth_acct - munin plugin to monitor Tor routers traffic +# +# To use this plugin you need the following: +# o Enable accounting on torrc configuration file (even if you dont want to limit bandwidth usage, +# just put a huge value for on AccountingMax) +# example: +# AccountingStart day 12:00 +# AccountingMax 100 GB +# o Enable CookieAuthentication (CookieAuthentication 1 in torrc) or define a HashedControlPassword +# +# tested with Tor releases: 0.2.1.28, 0.2.1.29 +# +# Author: tazoi , based on a plugin by Ævar Arnfjörð Bjarmason ; + if (substr($replyline, 0, 1) != '2') { + $replyline =~ s/\s*$//; + return "Failed to authenticate: $replyline"; + } + + return; +} + +if ($ARGV[0] and $ARGV[0] eq "autoconf") { + # Try to connect to the daemon + my $socket = IO::Socket::INET->new("$address:$port") + or my $failed = 1; + + if ($failed) { + print "no (failed to connect to $address port $port)\n"; + exit 1; + } + + my $msg = Authenticate($socket); + if (defined($msg)) { + print $socket "QUIT\r\n"; + close($socket); + print "no ($msg)\n"; + exit 1; + } + + print $socket "QUIT\r\n"; + close($socket); + print "yes\n"; + exit 0; +} + +if ($ARGV[0] and $ARGV[0] eq "config") { + print "graph_title Tor bandwidth usage (in/out)\n"; + print "graph_args --base 1000\n"; + print "graph_vlabel bytes/sec\n"; + print "graph_category Tor\n"; + print "graph_info This graph shows the flowing incoming/outgoing bytes on a Tor node\n"; + print "down.label Download\n"; + print "down.type DERIVE\n"; + print "down.min 0\n"; + print "up.label Upload\n"; + print "up.type DERIVE\n"; + print "up.min 0\n"; + + exit 0; +} + +my $socket = IO::Socket::INET->new("$address:$port") + or die("Couldn't connect to $address port $port: $!"); + +my $msg = Authenticate($socket); +if (defined($msg)) { + print $socket "QUIT\r\n"; + close($socket); + die "$msg\n"; +} + +print $socket "GETINFO accounting/bytes\r\n"; +my $down = 0; +my $up = 0; +my $replyline = <$socket>; +chomp($replyline); +if ( $replyline =~ /^250-accounting\/bytes=(\d+)\s(\d+)\r$/ ) { + $down = $1; + $up = $2; +} else { + die "Failed to get accounting info: $replyline\n"; +} + +print $socket "QUIT\r\n"; +close($socket); + +print "down.value $down\n"; +print "up.value $up\n"; + +exit 0;