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.
163 lines
6.3 KiB
Perl
Executable File
163 lines
6.3 KiB
Perl
Executable File
#!/usr/bin/perl -w
|
|
#
|
|
# xmlrpc based munin plugin for monitoring rtorrent's upload/download speed
|
|
# 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.0.0 - 071218
|
|
# initial release
|
|
#
|
|
# 0.0.1 - 071220
|
|
# minor textbugs fixed
|
|
#
|
|
# 0.1.0d - 080519
|
|
# full rewrite in perl
|
|
# support for scgi_port and scgi_local
|
|
# configurable via munin env variables
|
|
# different ul/dl scale can be set for asymmetric connections
|
|
# using get_(up|down)_total, and derive
|
|
#
|
|
# 0.2.0 - 080619
|
|
# upload and download limit displayed on the graph
|
|
#
|
|
#
|
|
# 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"
|
|
# diff "yes" for using bps for upload and Bps for download, or anything else for using Bps for both
|
|
# 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 pre09
|
|
#
|
|
# [rtom_allsessions_*]
|
|
# user username
|
|
# env.port 5000,5001,5002,5003
|
|
# env.category Category
|
|
#
|
|
#%# family=auto
|
|
|
|
|
|
if ( $ARGV[0] and $ARGV[0] eq "config" ) {
|
|
my $diff = $ENV{"diff"} || "";
|
|
my $category = $ENV{"category"} || "";
|
|
print "graph_order down up\n";
|
|
print "graph_title rTorrent speeds\n";
|
|
print "graph_args --base 1024\n";
|
|
print "graph_vlabel Bytes per \${graph_period}\n";
|
|
print "graph_category filetransfer".${category}."\n";
|
|
print "down.label Download B/s\n";
|
|
print "down.info Download speed in Bytes per seconds\n";
|
|
print "down.type DERIVE\n";
|
|
print "down.min 0\n";
|
|
print "down.draw AREA\n";
|
|
if ( ( defined $diff ) && ( $diff eq "yes" ) ) {
|
|
print "up.label Upload b/s\n";
|
|
print "up.info Upload speed in bits per seconds\n";
|
|
print "up.cdef up,8,*\n";
|
|
} else {
|
|
print "up.label Upload B/s\n";
|
|
print "up.info Upload speed in Bytes per seconds\n";
|
|
}
|
|
print "up.type DERIVE\n";
|
|
print "up.min 0\n";
|
|
print "up.draw LINE2\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)>([-]{0,1}\d+)<\/(int|i4|i8|ex\.i8)><\/value>/;
|
|
my $line = "";
|
|
if ($api =~ /pre09/) {
|
|
$line = "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>system.multicall</methodName><params><param><value><array><data><value><struct><member><name>methodName</name><value><string>get_up_total</string></value></member><member><name>params</name><value><array><data/></array></value></member></struct></value><value><struct><member><name>methodName</name><value><string>get_down_total</string></value></member><member><name>params</name><value><array><data/></array></value></member></struct></value><value><struct><member><name>methodName</name><value><string>get_upload_rate</string></value></member><member><name>params</name><value><array><data/></array></value></member></struct></value><value><struct><member><name>methodName</name><value><string>get_download_rate</string></value></member><member><name>params</name><value><array><data/></array></value></member></struct></value></data></array></value></param></params></methodCall>";
|
|
} else {
|
|
$line = "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>system.multicall</methodName><params><param><value><array><data><value><struct><member><name>methodName</name><value><string>throttle.global_up.total</string></value></member><member><name>params</name><value><array><data/></array></value></member></struct></value><value><struct><member><name>methodName</name><value><string>throttle.global_down.total</string></value></member><member><name>params</name><value><array><data/></array></value></member></struct></value><value><struct><member><name>methodName</name><value><string>throttle.global_up.max_rate</string></value></member><member><name>params</name><value><array><data/></array></value></member></struct></value><value><struct><member><name>methodName</name><value><string>throttle.global_down.max_rate</string></value></member><member><name>params</name><value><array><data/></array></value></member></struct></value></data></array></value></param></params></methodCall>";
|
|
}
|
|
|
|
my $llen = length $line;
|
|
my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000";
|
|
my $hlen = length $header;
|
|
|
|
my $up = -1;
|
|
my $down = -1;
|
|
|
|
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;
|
|
my $up_tmp = -1;
|
|
my $down_tmp = -1;
|
|
while (( $up_tmp == -1 ) && ( $line = <SOCK> ) ) {
|
|
if ( $line =~ /$pattern/ ) {
|
|
$up_tmp = $2;
|
|
}
|
|
}
|
|
while (( $down_tmp == -1 ) && ( $line = <SOCK> ) ) {
|
|
if ( $line =~ /$pattern/ ) {
|
|
$down_tmp = $2;
|
|
}
|
|
}
|
|
close (SOCK);
|
|
$up = $up + $up_tmp;
|
|
$down = $down + $down_tmp;
|
|
}
|
|
} 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;
|
|
my $up_tmp = -1;
|
|
my $down_tmp = -1;
|
|
while (( $up_tmp == -1 ) && ( $line = <SOCK> ) ) {
|
|
if ( $line =~ /$pattern/ ) {
|
|
$up_tmp = $2;
|
|
}
|
|
}
|
|
while (( $down_tmp == -1 ) && ( $line = <SOCK> ) ) {
|
|
if ( $line =~ /$pattern/ ) {
|
|
$down_tmp = $2;
|
|
}
|
|
}
|
|
close (SOCK);
|
|
$up = $up + $up_tmp;
|
|
$down = $down + $down_tmp;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
print "up.value ${up}\ndown.value ${down}\n";
|
|
|
|
exit;
|