166 lines
3.6 KiB
Perl
Executable file
166 lines
3.6 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
|
|
# config:
|
|
# [spectrum2_*]
|
|
# env.admin_jid tradmin@host.org
|
|
# env.password jid_password
|
|
# env.transports icq.host.org xmpp.host.org
|
|
#
|
|
# symlinks:
|
|
# spectrum2_backends spectrum2_memory spectrum2_users spectrum2_messages spectrum2_messages_sec
|
|
#
|
|
#
|
|
use AnyEvent;
|
|
use AnyEvent::XMPP::Client;
|
|
use AnyEvent::XMPP::Component;
|
|
use AnyEvent::XMPP::Ext::Disco;
|
|
use AnyEvent::XMPP::Ext::Version;
|
|
use AnyEvent::XMPP::Namespaces qw/xmpp_ns/;
|
|
use AnyEvent::XMPP::Util qw/simxml/;
|
|
use XML::Simple;
|
|
use Time::HiRes qw ( setitimer ITIMER_REAL time );
|
|
use strict;
|
|
$|=1;
|
|
|
|
$SIG{ALRM} = sub { exit; };
|
|
setitimer(ITIMER_REAL, 30, 1);
|
|
|
|
|
|
my %config=(
|
|
users => {
|
|
title=>'Buddies online',
|
|
vlabel=>'users',
|
|
info=>'Number of users that currently use the spectrum transports.',
|
|
command=>'online_users_count',
|
|
base=>'--base 1000',
|
|
x=>'1',
|
|
},
|
|
backends => {
|
|
title=>'Backends running',
|
|
vlabel=>'backends',
|
|
info=>'Number of backends that currently running.',
|
|
command=>'backends_count',
|
|
base=>'--base 1000',
|
|
x=>'1',
|
|
},
|
|
memory => {
|
|
title=>'Memory usage of transports',
|
|
vlabel=>'megabytes',
|
|
info=>'Memory usage of spectrum transports.',
|
|
command=>'used_memory',
|
|
base=>'--base 1024',
|
|
x=>'1024',
|
|
},
|
|
messages => {
|
|
title=>'Messages send over transport',
|
|
vlabel=>'messages',
|
|
info=>'Messages send over spectrum transports.',
|
|
command=>'',
|
|
base=>'--base 1000',
|
|
x=>'1',
|
|
},
|
|
messages_sec => {
|
|
title=>'Messages send over transport',
|
|
vlabel=>'messages/sec',
|
|
info=>'Messages send per second over spectrum transports.',
|
|
command=>'',
|
|
base=>'--base 1000',
|
|
x=>'1',
|
|
},
|
|
);
|
|
my @queue=('_out','_in');
|
|
$0 =~ /spectrum2_(.+)*$/;
|
|
my $func = $1;
|
|
exit 2 unless defined $func;
|
|
my %tr;
|
|
my $count=0;
|
|
foreach (split(' ',$ENV{'transports'})){
|
|
if ($func=~/messages/)
|
|
{
|
|
$tr{$_."_in"}=$count;
|
|
$count++;
|
|
$tr{$_."_out"}=$count;
|
|
$count++;
|
|
}
|
|
else
|
|
{
|
|
$tr{$_}=$count;
|
|
$count++;
|
|
}
|
|
}
|
|
|
|
if (exists $ARGV[0] and $ARGV[0] eq "config")
|
|
{
|
|
print "graph_title ".$config{$func}->{'title'}."\n";
|
|
print "graph_vlabel ".$config{$func}->{'vlabel'}."\n";
|
|
print "graph_category spectrum2\n";
|
|
foreach (keys (%tr)){
|
|
print "r".$tr{$_}.".label ".$_."\n";
|
|
if ($func eq 'messages_sec')
|
|
{
|
|
print "r".$tr{$_}.".type DERIVE\n";
|
|
print "r".$tr{$_}.".min 0\n";
|
|
}
|
|
}
|
|
print "graph_args ".$config{$func}->{'base'}."\n";
|
|
print "graph_info ".$config{$func}->{'info'}."\n";
|
|
exit 0;
|
|
}
|
|
|
|
binmode( STDOUT);
|
|
my $xs=new XML::Simple;
|
|
my $cl=AnyEvent::XMPP::Client->new(debug=>0);
|
|
my $j=AnyEvent->condvar;
|
|
$cl->add_account($ENV{'admin_jid'}.'/'.time,$ENV{'password'});
|
|
$cl->reg_cb(
|
|
session_ready => \&cl_sess,
|
|
disconnect => \&cl_disc,
|
|
message => \&cl_msg,
|
|
);
|
|
$cl->start;
|
|
$j->wait;
|
|
|
|
|
|
sub cl_disc
|
|
{
|
|
my ($cl,$acc,$h,$p,$reas)=@_;
|
|
print "disc ($h:$p) $reas\n";
|
|
}
|
|
sub cl_sess
|
|
{
|
|
my($cl,$acc)=@_;
|
|
foreach (keys (%tr)){
|
|
if ($func=~/messages/)
|
|
{
|
|
if (s/_in$//)
|
|
{
|
|
$cl->send_message("messages_from_xmpp",$_,undef,'chat');
|
|
};
|
|
if (s/_out$//)
|
|
{
|
|
$cl->send_message("messages_to_xmpp",$_,undef,'chat');
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$cl->send_message($config{$func}->{'command'},$_,undef,'chat');
|
|
}
|
|
}
|
|
}
|
|
sub cl_msg
|
|
{
|
|
my ($cl,$acc,$msg)=@_;
|
|
if ($func=~/messages/)
|
|
{
|
|
print "r".$tr{$msg->from.$queue[-1]}.".value ".int($msg->any_body/$config{$func}->{'x'})."\n";
|
|
delete( $tr{$msg->from.$queue[-1]});
|
|
pop(@queue);
|
|
if ($#queue==-1){@queue=("_out","_in");}
|
|
}
|
|
else
|
|
{
|
|
print "r".$tr{$msg->from}.".value ".int($msg->any_body/$config{$func}->{'x'})."\n";
|
|
delete( $tr{$msg->from});
|
|
}
|
|
exit if (scalar(keys %tr)==0);
|
|
}
|