Newer
Older
#!/usr/bin/env perl
# -*- perl -*-
=head1 NAME
freemobile - A plugin to monitor a freemobile subscription
Create a link to this script in /etc/munin/plugins/ :
$ ln -s /path/to/freemobile-munin /etc/munin/plugins/freemobile
=head1 CONFIGURATION
env.phonenumber 06ABCDEFGH
env.freemonitored voice sms mms data specialvoice
env.cache_expire 3600
timeout 30
C<user> I<required>: user with freemobile backend configured
C<env.HOME> I<required>: path to user home
C<env.phonenumber> (optional): add your phone number if you have more than one
subscription for this account.
C<env.freemonitored> (optional): default only 'voice sms'
The full list of monitored options is :
* voice sms mms data specialvoice voicetoint voiceint smsint mmsint dataint
C<env.cache_expire 3600> (optional): cache interval in second, or time
between two connection to the website. The cache interval is 3 hours by default.
C<timeout 30> (optional): Munin internal option. The plugin can be slow,
30s is recommended.
#use encoding 'iso-8859-15'; # Munin doesn't like utf-8 :-(
my $cachedir = $ENV{'HOME'} . '/.config/weboob/munin/';
my $cachefile = "$cachedir/freemobile-munin";
my $phone = $ENV{'phonenumber'};
my $account = '';
if (length($phone) > 0) {
$account = $phone . '@freemobile';
}
my $weboob = 'boobill -f table -b freemobile details ' . $account;
'voice' => 'Voix en France (min)',
'voicetoint' => 'Voix vers l\'international (min)',
'sms' => 'SMS en France',
'mms' => 'MMS en France',
'data' => 'Data en France',
'voiceint' => 'Voix à l\'international (min)',
'smsint' => 'SMS à l\'international',
'mmsint' => 'MMS à l\'international',
'dataint' => 'Data à l\'international',
);
'specialvoice' => 4,
'sms' => 5,
'mms' => 6,
'data' => 7,
'voiceint' => 8,
'smsint' => 9,
'mmsint' => 10,
'dataint' => 11,
);
'voice' => 'National : (\d+)h(\d+)min(\d+)s',
'voicetoint' => 'International : (\d+)h(\d+)min(\d+)s',
'specialvoice' => '\| (\d+)h(\d+) min (\d+)s',
'voiceint' => 'Appels émis (\d+)h(\d+)min(\d+)s',
'smsint' => 'Conso SMS (international) \| (\d+)',
'mmsint' => 'Vous avez consommé (\d+) MMS',
'dataint' => 'Vous avez consommé ([\d\-\.]+) (Mo|Go)',
'specialvoice' => 'postvoice',
'voiceint' => 'postvoice',
'smsint' => 'simplepost',
'mmsint' => 'simplepost',
);
sub doubleprint {
my $var = shift;
print {$cache_fh} $var;
print $var;
return 0;
}
sub postvoice {
my @args = @_;
my $minutes = $args[0] * 60 + $args[1] + $args[2] / 60;
doubleprint "$minutes \n";
return 0;
}
sub simplepost {
my @args = @_;
doubleprint "$args[0] \n";
return 0;
}
sub datapost {
my @args = @_;
my $multi = 1;
my $unit = $args[1];
$multi = $args[0] * $multi;
doubleprint "$multi \n";
return 0;
sub config {
binmode STDOUT, ':encoding(iso-8859-1)';
print <<'EOF';
graph_title Conso Free
graph_vlabel Suivi conso du forfait Free Mobile
graph_category weboob
graph_args -l 0
EOF
foreach (@monitored) {
# Check if cache exist and not older than the refresh threshold.
if ( open $cache_fh, '<', $cachefile ) {
close $cache_fh or croak "unable to close: $ERRNO";
# File not empty?
if ( @cache_data > 0 ) {
# Data is still fresh. Display cached values and exit.
if ( time - $cache_data[0] < $refreshtime ) {
print join q{}, @cache_data[ 1 .. $#cache_data ];
exit 0;
}
}
}
open my $data, q(-|), $weboob or croak "Couldn't execute program: $ERRNO";
my @lines = <$data>;
close $data or carp "unable to close: $ERRNO";
# If error output, print the cache (if exist) and exit
if ( @cache_data > 0 ) {
print join q{}, @cache_data[ 1 .. $#cache_data ];
exit 0;
}
exit 1;
}
# Open cache for writing
open $cache_fh, '>', $cachefile
or croak "Failed to open file $cachefile";
print {$cache_fh} time . "\n";
foreach my $monit (@monitored) {
doubleprint "$monit.value ";
if ( my @results = $lines[ $linenum{$monit} ] =~ /$regexp{$monit}/ ) {
my $postfunction = $post{$monit};
}
else {
# Create the munin cache dir if missing
if ( !-d $cachedir ) {
mkdir $cachedir;
}