#!/usr/bin/env perl
# -*- perl -*-

=head1 NAME

freemobile - Plugin to monitor a freemobile subscription
copy this script to /etc/munin/plugins/freemobile

=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 ligne:
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.

WARNING: Some monitored options are *not* tested by author

=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' => 'Consommation : (\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(<CACHE>) {
			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 (<DATA>) {
		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");
}
