Freebox 6 : piloter à distance via API sa Freebox

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search
Free

Software version Freebox 6 v1.1.6+
Operating System Debian 7
Website Free Website
Last Update 18/03/2013
Others

1 Introduction

Il est possible de piloter sa freebox 6 à distance :-). Il y a une API pour cela qui n'est pas forcément à jour, mais pratique tout de même. Et certaines personnes n'ont pas hésiter à faire des classes php, python... pour que l'on puisse en avoir une utilisation simplifiée.

Pour ma part, j'ai choisis la version PHP, puisque je souhaites faire derrière une interface minimale pour déconnecter mon disque du USB branché sur la Freebox.

2 Installation

Téléchargeons la classe PHP et un exemple :

Command git
> git clone git://gist.github.com/2579869.git .
Cloning into '.'...
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 12 (delta 3), reused 0 (delta 0)
Receiving objects: 100% (12/12), done.
Resolving deltas: 100% (3/3), done.

2.1 Debian

Sous Debian, nous allons avoir besoin de ceci :

Command
aptitude install php5 php5-curl php5-json

2.2 FreeBSD

Sous FreeBSD, voici les dépendances :

Command pkg_add
pkg_add -vr php5 php5-curl php5-json

3 Utilisation

Pour mes besoins personnels, j'ai souhaité développer une interface web permettant de déconnecter le disque USB branché dessus. J'ai donc utilisé l'API. Je vais vous montrer ici 2 exemples :

  1. Le plus simple, qui ne fait qu'un fichier de configuration, qui ne gère pas beaucoup de cas, mais qui a le mérite de fonctionner et de vous montrer comment on se sert de l'API
  2. Un peu plus complexe, reprends le premier exemple, qui est un peu plus propre (mais toujours sale) et fonctionnel.

3.1 Exemple 1

Voici comment je fais pour utiliser l'API et faire déconnecter un disque :

Configuration File umount.php
<?php
# Quick and dirty way to umount
# Made by deimos <[email protected]>

require('credentials.php');
 
// Inclusion de la classe FreeboxClient
require('FreeboxClient.classe.php');
 
// Connectez-vous en utilisant vos identifiants (le login est freebox par défaut).
$freebox = new FreeboxClient('http://mafreebox.free.fr', 'freebox', 'password');
 
// Get disks id
$storage_infos = $freebox->interroger_api( 'storage.list' );
$disks_num = count($storage_infos) - 1;
$disk_umount_id=-1;
for ($i = 0; $i <= $disks_num; $i++)
{    
    $disk_name=print_r($storage_infos[$i]['partitions'][0]['label'], true);
    if ($disk_name == $diskname_umount)
    {
        $disk_umount_id=$i;
        $disk_state=print_r( $storage_infos[$disk_umount_id]['partitions'][0]['state'], true);
    }
}
 
// Get partition id
$partition_id = print_r( $storage_infos[$disk_umount_id]['partitions'][0]['partition_id'], true);
 
// Umount disk
if (($disk_umount_id != -1) && ($disk_state == 'mounted'))
{
    $umount_return = $freebox->interroger_api( 'storage.umount', $partition_id );
    // Sleep and check
    sleep(2);
    $storage_infos = $freebox->interroger_api( 'storage.list' );
    $disk_state=print_r( $storage_infos[$disk_umount_id]['partitions'][0]['state'], true);
    if ($disk_state == 'mounted')
    {
        print 'Storage ' . $diskname_umount . " failed to be umounted\n";
    }
    else
    {
        print 'Storage ' . $diskname_umount . " has been umounted\n";
    }
}
else
{
    print "Disk is not connected\n";
}
?>

3.2 Exemple 2

Voici une méthode un peu plus propre :

Configuration File functions.php
<?php
 
function get_partition_infos($diskname)
{
    // Connectez-vous en utilisant vos identifiants (le login est freebox par défaut).
    $freebox = new FreeboxClient('http://mafreebox.free.fr', 'freebox', 'password');
 
    // Get disks id
    $storage_infos = $freebox->interroger_api( 'storage.list' );
    $disks_num = count($storage_infos) - 1;
    $disk_id=3;
    for ($i = 0; $i <= $disks_num; $i++)
    {    
        $disk_name=print_r($storage_infos[$i]['partitions'][0]['label'], true);
        if ($disk_name == $diskname)
        {   
            $disk_id=$i;
            $disk_state=print_r( $storage_infos[$disk_id]['partitions'][0]['state'], true);
        }
    }
    $partition_infos = print_r( $storage_infos[$disk_id]['partitions'][0]['partition_id'], true);
    return array($partition_infos,$disk_id,$disk_state);
}
 
function get_disk_status($diskname)
{
    $partition_infos=get_partition_infos($diskname);
 
    if (($partition_infos[1] != 3) && ($partition_infos[2] == 'mounted'))
    {
        // connected
        return array(1,$partition_infos[0],$partition_infos[1]);
    }
    else
    {
        // not connected
        return array(0,$partition_infos[0],$partition_infos[1]);
    }
}
 
function umount_disk($diskname_umount)
{
    $disk_status=get_disk_status($diskname_umount);
 
    if ($disk_status[0] == 1)
    {
        // Connectez-vous en utilisant vos identifiants (le login est freebox par défaut).
        $freebox = new FreeboxClient('http://mafreebox.free.fr', 'freebox', 'password');
 
        // Demontage du disque
        $umount_return = $freebox->interroger_api( 'storage.umount', $disk_status[1] );
        // Sleep and check
        sleep(2);
        $storage_infos = $freebox->interroger_api( 'storage.list' );
        $disk_state=print_r( $storage_infos[$disk_status[2]]['partitions'][0]['state'], true);
        if ($disk_state == 'mounted')
        {
            return('<b><font color="red">Le disque ' . $diskname_umount . ' n\'a pas pu etre demonte</font></b>');
        }
        else
        {
            return('<b><font color="green">Le disque ' . $diskname_umount . " a ete demonte correctement</font></b>");
        }
    }
    else
    {
        return('<b><font color="green">Le disque n\'est pas connecte</font></b>');
    }
}
 
?>

Configuration File umount.php
<?php
require('FreeboxClient.classe.php');
require('config.php');
require('functions.php');
$status=umount_disk($diskname_umount);
header('Location: index.php?status="' . $status . '"');
?>

Configuration File config.php
<?php
/*
Umount external drive on Freebox Revolution
This script uses another easy use API script : https://gist.github.com/2579869
Made by Deimos
*/
 
// Freebox DNS/IP
$freebox_ip='http://mafreebox.free.fr';
 
// freebox_web_login
$freebox_web_login='freebox';
 
// freebox_web_password
$freebox_web_password='password';
 
// Disk to umount
$diskname_umount='Freebox_hdd_exte';
?>

Configuration File index.php
<?php
mb_internal_encoding("UTF-8");
require('FreeboxClient.classe.php');
require('config.php');
require('functions.php');
 
// Check if disk is curently mounted or not
$disk_status=get_disk_status($diskname_umount);
 
if ($disk_status[0] == 1)
{
    print "<b><font color='red'>Le disque est connecte !</font></b>\n";
    print <<<__HTML__
    <form method="POST" action="umount.php"> 
    <select name="category"> 
    <option value="umount">Demonter le disque externe</option> 
    </select> 
    <input type="submit" name="submit"></form>
__HTML__;
}
else
{
    print "<b><font color='green'>Le disque est deconnecte et pret a etre arrete !</font></b><br />\n";
}
 
preg_match('/status="(.*)"/', rawurldecode($_SERVER['QUERY_STRING']), $matches);
if (count($matches) != 0)
{
    print $matches[1];
}
?>

4 References

https://gist.github.com/2579869
http://www.freebox-v6.fr/wiki/index.php?title=API