2
0
mirror of https://github.com/munin-monitoring/contrib.git synced 2018-11-08 00:59:34 +01:00
contrib-munin/plugins/rtorrent/rtom_allsessions_mem
Lars Kruse 46e2de55de Remove unused "autoconf" handling from plugins without this capability
Some plugins contained code for handling "autoconf" (always returning
"no") but did not announce the respective capability via the magic
marker.
2018-09-16 15:13:38 +02:00

116 lines
3.5 KiB
Perl
Executable File

#!/usr/bin/perl -w
#
# xmlrpc based munin plugin for monitoring rtorrent's memory usage
# 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"
# ip rTorrent's ip address - using scgi_port - needed, when "src" is NOT set to "socket"
# port rTorrent's scgi port (scgi_port) - using scgi_port - needed, when "src" is NOT 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 memory usage\n";
print "graph_args --base 1024 --lower-limit 0\n";
print "graph_vlabel Bytes\n";
print "graph_category filetransfer".${category}."\n";
print "mem.label Memory usage\n";
print "mem.info Memory usage of rTorrent\n";
print "mem.type GAUGE\n";
print "mem.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 $mem = 0;
my $pattern = qr/<value><(int|i4|i8|ex\.i8)>(\d+)<\/(int|i4|i8|ex\.i8)><\/value>/;
my $line = "";
if ($api =~ /pre09/) {
$line = "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>get_memory_usage</methodName></methodCall>";
} else {
$line = "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>pieces.memory.current</methodName></methodCall>";
}
my $llen = length $line;
my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000";
my $hlen = length $header;
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 =~ /$pattern/ ) {
$mem = $mem + $2;
}
}
close (SOCK);
}
} 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 =~ /$pattern/ ) {
$mem = $mem + $2;
}
}
close (SOCK);
}
}
print "mem.value ${mem}\n";
exit;