|
|
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 :
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 :
|
aptitude install php5 php5-curl php5-json
|
2.2 FreeBSD
Sous FreeBSD, voici les dépendances :
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 :
- 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
- 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 :
umount.php
|
<?php
# Quick and dirty way to umount
# Made by deimos <deimos@deimos.fr>
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 :
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>');
}
}
?>
|
umount.php
|
<?php
require('FreeboxClient.classe.php');
require('config.php');
require('functions.php');
$status=umount_disk($diskname_umount);
header('Location: index.php?status="' . $status . '"');
?>
|
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';
?>
|
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