Browse Source

Initial commit for the Munin Plugin for Freebox Revolution

master
Nicolas Massé 12 years ago
parent
commit
028034977c
  1. 1
      Munin-Plugin-For-Freebox-Revolution/.gitignore
  2. 49
      Munin-Plugin-For-Freebox-Revolution/auth.pl
  3. 56
      Munin-Plugin-For-Freebox-Revolution/request.pl

1
Munin-Plugin-For-Freebox-Revolution/.gitignore

@ -0,0 +1 @@
apptoken

49
Munin-Plugin-For-Freebox-Revolution/auth.pl

@ -0,0 +1,49 @@
#!/usr/bin/perl -w
use LWP::UserAgent;
use JSON::PP;
use strict;
my $ua = LWP::UserAgent->new;
my %auth_request = (
app_id => "fr.itix.munin",
app_name => "Munin",
app_version => "0.0.1",
device_name => "tournedix.itix.fr"
);
my $auth_response = $ua->post("http://mafreebox.freebox.fr/api/v1/login/authorize", Content => encode_json(\%auth_request));
die "post: authorize: ".$auth_response->status_line
unless $auth_response->is_success;
my $json_auth_response = decode_json($auth_response->decoded_content);
my $trackid = $json_auth_response->{result}->{track_id};
die "post: authorize: no trackid in response"
unless defined $trackid;
my $apptoken = $json_auth_response->{result}->{app_token};
print "APPTOKEN is '",$apptoken,"'\n";
do {
$auth_response = $ua->get("http://mafreebox.freebox.fr/api/v1/login/authorize/$trackid");
die "post: authorize: ".$auth_response->status_line
unless $auth_response->is_success;
$json_auth_response = decode_json($auth_response->decoded_content);
print "RES: ",$json_auth_response->{success}," STATUS: ",$json_auth_response->{result}->{status}, "\n";
sleep 2;
} while ($json_auth_response->{result}->{status} eq 'pending');
my $status = $json_auth_response->{result}->{status};
print "Final status is '", $status, "'\n";
if ($status eq 'granted') {
my $filename = "apptoken";
open TOKENFILE, '>', $filename
or die "open: $filename: $!";
print TOKENFILE "$apptoken\n";
close TOKENFILE;
}

56
Munin-Plugin-For-Freebox-Revolution/request.pl

@ -0,0 +1,56 @@
#!/usr/bin/perl -w
use LWP::UserAgent;
use JSON::PP;
use MIME::Base64;
use Digest::SHA qw/hmac_sha1_hex/;
use strict;
my $ua = LWP::UserAgent->new;
sub get_json {
my $resp = shift;
my $method = shift;
#warn "raw response: ".$resp->decoded_content;
warn "$method: www: ".$resp->status_line
unless $resp->is_success;
my $json = decode_json($resp->decoded_content);
die "$method: fb: method call failed: ".$json->{msg}
unless $json->{success};
return $json;
}
my $auth_response = $ua->get("http://mafreebox.freebox.fr/api/v1/login/");
my $json_auth_response = get_json($auth_response, "login");
my $challenge = $json_auth_response->{result}->{challenge};
print "Current challenge is $challenge\n";
my $filename = "apptoken";
open TOKENFILE, "<", $filename
or die "open: $filename: $!";
my $apptoken = <TOKENFILE>;
close TOKENFILE;
my $pw = hmac_sha1_hex($challenge, $apptoken);
print "Computed password is $pw\n";
my %auth_request = (
app_id => "fr.itix.munin",
password => $pw
);
$auth_response = $ua->post("http://mafreebox.freebox.fr/api/v1/login/session", Content => encode_json(\%auth_request));
$json_auth_response = get_json($auth_response, "login");
my $session_token = $json_auth_response->{result}->{session_token};
die "post: session: no session_token in response"
unless defined $session_token;
$ua->default_header('X-Fbx-App-Auth', $session_token);
my %rrd_request = (
db => "net",
date_start => time - 5*60,
date_end => time,
);
my $rrd_response = $ua->post("http://mafreebox.freebox.fr/api/v1/rrd", Content => encode_json(\%rrd_request));
my $json_rrd_response = get_json($rrd_response, "rrd");
Loading…
Cancel
Save