#!/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/ =note1 You have to manually create the folder: $HOME/.config/weboob/munin/ =head1 CONFIGURATION You need to configure the user and the home PATH like that: [freemobile] env.HOME /home/florent user florent group florent You can configure the list of monitored data with the line: env.freemonitored voice sms mms data Others monitored options: voicetoint voiceint smsint mmsint dataint specialvoice The cache timeout is 3 hours by default. You can change this value with env.cache_expire. =cut use warnings; # Munin doesn't like utf-8 :-( use encoding "iso-8859-1"; use Encode; my @monitored = split(/ /, $ENV{'freemonitored'} || 'voice sms'); my $cachefile = $ENV{'HOME'} . '/.config/weboob/munin/freemobile-munin'; my $refreshtime = $ENV{'cache_expire'} || 10800; my $weboob = "/usr/bin/env weboob-cli ICapBill get_details coin -f table |"; my %label = ( 'voice' => "Voix en France (min)\n", 'voicetoint' => "Voix vers l'international (min)\n", 'specialvoice' => "Numéro spéciaux (min) \n", 'sms' => "SMS en France\n", 'mms' => "MMS en France\n", 'data' => "Data en France\n", 'voiceint' => "Voix à l\'international (min)\n", 'smsint' => "SMS à l\'international\n", 'mmsint' => "MMS à l\'international\n", 'dataint' => "Data à l\'international\n" ); my %linenum = ( 'voice' => 3, 'voicetoint' => 3, 'specialvoice' => 4, 'sms' => 5, 'mms' => 6, 'data' => 7, 'voiceint' => 8, 'smsint' => 9, 'mmsint' => 10, 'dataint' => 11 ); my %regexp = ( 'voice' => 'National : (\d+)h(\d+)min(\d+)s', 'voicetoint' => 'International : (\d+)h(\d+)min(\d+)s', 'specialvoice' => '\| (\d+)h(\d+) min (\d+)s', 'sms' => 'Conso SMS \| (\d+) \/ (.*)', 'mms' => 'Vous avez consommé (\d+) MMS', 'data' => 'Vous avez consommé ([\d\-\.]+) Mo', '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' ); my %post = ( 'voice' => 'postvoice', 'voicetoint' => 'postvoice', 'specialvoice' => 'postvoice', 'sms' => 'simplepost', 'mms' => 'simplepost', 'data' => 'simplepost', 'voiceint' => 'postvoice', 'smsint' => 'simplepost', 'mmsint' => 'simplepost', 'dataint' => 'simplepost' ); my @lines; my $cache; my $expr; if ($ARGV[0] and $ARGV[0] eq "config") { binmode STDOUT, ":encoding(iso-8859-1)"; print "graph_title Conso Free\n"; print "graph_vlabel Suivi conso du forfait Free Mobile\n"; print "graph_category weboob\n"; print "graph_args -l 0\n"; foreach (@monitored) { print "$_" . ".label "; print $label{$_}; } } else { my $refresh; my $first = 1; my $time = time(); # Check if cache exist and not older than 3 hours if (open(CACHE, "< " . $cachefile)) { $cache = 1; LOOP: while() { if ($first) { if ($time - $_ > $refreshtime) { $refresh = 0; last; } else { $refresh = 1; } $first = 0; } else { print $_; } } } close(CACHE); exit if $cache and $refresh; # Open cache for writing and execute weboob open(CACHE, "> " . $cachefile) or die "Failed to open file $cachefile"; open(DATA, $weboob) or die "Couldn't execute program: $!"; LOOP: while () { push(@lines,$_); } close(DATA); print CACHE time(). "\n"; foreach $monit (@monitored) { doubleprint("$monit" . ".value "); if ($lines[$linenum{$monit}] =~ /$regexp{$monit}/ ) { my $string; foreach $expr (1..$#-) { $string = $string . "${$expr} "; } my $postfunction = $post{$monit}; &$postfunction($string); } else { doubleprint("0 \n"); } } close(CACHE); } sub doubleprint { print CACHE $_[0]; print $_[0]; } sub postvoice { my @args = split(/ /, $_[0]); my $minutes = $args[0] * 60 + $args[1] + $args[2] / 60; doubleprint("$minutes \n"); } sub simplepost { my @args = split(/ /,$_[0]); doubleprint("$args[0] \n"); }