mirror of
https://github.com/munin-monitoring/contrib.git
synced 2018-11-08 00:59:34 +01:00
46e2de55de
Some plugins contained code for handling "autoconf" (always returning "no") but did not announce the respective capability via the magic marker.
158 lines
4.9 KiB
Perl
Executable File
158 lines
4.9 KiB
Perl
Executable File
#!/usr/bin/perl -w
|
|
#
|
|
# xmlrpc based munin plugin for monitoring rtorrent's peer count
|
|
# prerequisites:
|
|
# - rtorrent 0.7.5 or newer compiled with --with-xmlrpc-c
|
|
# check http://libtorrent.rakshasa.no/wiki/RTorrentXMLRPCGuide for further information
|
|
#
|
|
# written by Gabor Hudiczius
|
|
# web: http://projects.cyla.homeip.net/rtwi/wiki/rTorrentOMeter
|
|
# email: ghudiczius@gmail.com
|
|
#
|
|
# 0.2.0 - 080619
|
|
# support for scgi_port and scgi_local
|
|
# configurable via munin env variables
|
|
# initial release
|
|
#
|
|
#
|
|
# Parameters:
|
|
#
|
|
# config required
|
|
#
|
|
#
|
|
# Configurable variables
|
|
#
|
|
# src "socket" when using scgi_socket, or anything else when using scgi_port
|
|
# socket rTorrent's rpc socket (scgi_local) - using scgi_local - needed, when "src" is set to "socket"
|
|
# category Change graph category
|
|
# api use "pre09" (pre 0.9.0) or "current" (0.9.0+, the default) API calls
|
|
#
|
|
# Configuration example
|
|
#
|
|
# [rtom_allsessions_*]
|
|
# user username
|
|
# env.src socket
|
|
# env.socket /home/user/torrent/.socket/rpc.socket,/home/user/torrent/.socket/rpc.socket
|
|
# env.category Category
|
|
# env.api current
|
|
#
|
|
# [rtom_allsessions_*]
|
|
# user username
|
|
# env.port 5000,5001,5002,5003
|
|
# env.category Category
|
|
#
|
|
#%# family=auto
|
|
|
|
|
|
if ( $ARGV[0] and $ARGV[0] eq "config" ) {
|
|
my $category = $ENV{"category"} || "";
|
|
print "graph_title rTorrent peer statistics\n";
|
|
print "graph_args --base 1000 --lower-limit 0\n";
|
|
print "graph_vlabel peers\n";
|
|
print "graph_category filetransfer".${category}."\n";
|
|
print "outgoing.label outgoing\n";
|
|
print "outgoing.draw AREA\n";
|
|
print "outgoing.info number of outgoing connections\n";
|
|
print "incoming.label incoming\n";
|
|
print "incoming.draw STACK\n";
|
|
print "incoming.info number of incoming connections\n";
|
|
print "plain.label plain text\n";
|
|
print "plain.draw LINE2\n";
|
|
print "plain.info number of plain text connections\n";
|
|
print "encrypted.label encrypted\n";
|
|
print "encrypted.draw LINE2\n";
|
|
print "encrypted.info number of encrypted connections\n";
|
|
print "total.label total\n";
|
|
print "total.draw LINE2\n";
|
|
print "total.info total number of connections\n";
|
|
exit 0;
|
|
}
|
|
|
|
use IO::Socket;
|
|
|
|
my $src = $ENV{"src"} || "";
|
|
my @sockets = split /,/, $ENV{"socket"} || "";
|
|
my $ip = $ENV{"ip"} || "127.0.0.1";
|
|
my @ports = split /,/, $ENV{"port"} || "";
|
|
my $api = $ENV{"api"} || "current";
|
|
|
|
my $pattern = qr/<value><(int|i4|i8|ex\.i8)>(\d+)<\/(int|i4|i8|ex\.i8)><\/value>/;
|
|
my $tpattern = qr/[0-9A-F]{20}/;
|
|
|
|
my $line = "";
|
|
if ($api =~ /pre09/) {
|
|
$line = "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>d.multicall</methodName><params><param><value><string>main</string></value></param><param><value><string>d.get_hash=</string></value></param><param><value><string>p.multicall=,p.is_encrypted=,p.is_incoming=</string></value></param></params></methodCall>";
|
|
} else {
|
|
$line = "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>d.multicall2</methodName><params><param><value><string></string></value></param><param><value><string>main</string></value></param><param><value><string>d.hash=</string></value></param><param><value><string>p.multicall=,p.is_encrypted=,p.is_incoming=</string></value></param></params></methodCall>";
|
|
}
|
|
my $llen = length $line;
|
|
my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000";
|
|
my $hlen = length $header;
|
|
|
|
my $tor = 0;
|
|
my $tot = 0;
|
|
my $enc = 0;
|
|
my $inc = 0;
|
|
my $pline = "";
|
|
my $ppline = "";
|
|
my $out = 0;
|
|
my $pla = 0;
|
|
|
|
|
|
if ( ( defined $src ) && ( $src eq "socket" ) ) {
|
|
for $socket (@sockets)
|
|
{
|
|
socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die;
|
|
connect( SOCK, sockaddr_un( $socket ) ) or die $!;
|
|
my $line = "${hlen}:${header},${line}";
|
|
print SOCK $line;
|
|
flush SOCK;
|
|
while ( $line = <SOCK> ) {
|
|
if ( $line =~ /$tpattern/ ) {
|
|
$tor += 1;
|
|
} elsif ( $line =~ /$pattern/ ) {
|
|
$tot += 1;
|
|
$enc += $2;
|
|
$line = <SOCK>;
|
|
$line =~ /$pattern/;
|
|
$inc += $2;
|
|
}
|
|
$ppline = $pline;
|
|
$pline = $line;
|
|
}
|
|
close (SOCK);
|
|
$out = $out + $tot - $inc;
|
|
$pla = $pla + $tot - $enc;
|
|
}
|
|
} else {
|
|
for $port (@ports)
|
|
{
|
|
socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) );
|
|
connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) );
|
|
my $line = "${hlen}:${header},${line}";
|
|
print SOCK $line;
|
|
flush SOCK;
|
|
while ( $line = <SOCK> ) {
|
|
if ( $line =~ /$tpattern/ ) {
|
|
$tor += 1;
|
|
} elsif ( $line =~ /$pattern/ ) {
|
|
$tot += 1;
|
|
$enc += $2;
|
|
$line = <SOCK>;
|
|
$line =~ /$pattern/;
|
|
$inc += $2;
|
|
}
|
|
$ppline = $pline;
|
|
$pline = $line;
|
|
}
|
|
close (SOCK);
|
|
$out = $out + $tot - $inc;
|
|
$pla = $pla + $tot - $enc;
|
|
}
|
|
}
|
|
|
|
|
|
print "torrents.value ${tor}\ntotal.value ${tot}\nencrypted.value ${enc}\nplain.value ${pla}\nincoming.value ${inc}\noutgoing.value ${out}\n";
|
|
|
|
exit;
|