1 Introduction
Depuis la version 6 de la Freebox, il y a une interface web (http://mafreebox.freebox.fr) qui permet de controler plusieurs options de celle ci et notamment de la redémarrer. Nous allons donc utiliser cette possibilité pour la redémarrer via la ligne de commande. Pour faire ceci, j'utilise un script qui a été récupérer sur admin-linux.fr.
J'ai essayer sur une Debian, ça fonctionne nativement et sous pfSense 2.0.1 et je me suis heurté à quelques petits problèmes. C'est pourquoi je vais détailler comment j'ai pu les résoudre ici.
2 Installation
2.1 Prérequis
Il va vous falloir bash et wget pour faire fonctionner le script qui va suivre. Sur la plus part des distributions...pas de soucis c'est installé. Mais sur des versions pour de l'embarqué ou packagées au minimum, ça pose des soucis. Je vais détailler comment faire sous pfSense.
2.1.1 pkg_add
Installez wget et bash :
pkg_add
|
pkg_add -vr wget
pkg_add -vr bash
|
2.1.2 Manuellement
Si vous rencontrez des problèmes car le repository n'existe plus, prenez celui qui se rapproche le plus de votre version et uploadez les sur votre machine (pfSense par exemple) :
wget
|
wget ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8.2-release/ftp/wget-1.12_2.tbz
wget ftp://ftp.beastie.tdk.net/pub/FreeBSD/ports/i386/packages-8.2-release/shells/bash-4.1.9.tbz
|
Ensuite nous allons décompresser tout ce petit monde :
|
cd /
tar -xzf wget-1.12_2.tbz
tar -xzf bash-4.1.9.tbz
|
2.2 Script
Nous allons mettre ce script dans /bin/freebox par exemple :
/bin/freebox
|
#!/bin/bash
# Description : Script de redémarrage de la FreeBox
# depuis la ligne de commande.
# Auteur : FHH <fhh@admin-linux.fr>
# $Id: freebox,v 1.6 2011/08/28 22:59:56 fhh Exp $
# Variables globales du script :
USERNAME="freebox" ;
URL="http://mafreebox.freebox.fr" ;
WORKING_DIRECTORY="${HOME}/.freebox" ;
CONFIG_FILE="${WORKING_DIRECTORY}/config" ;
TMP_DIRECTORY="${WORKING_DIRECTORY}/tmp" ;
COOKIES="cookies" ;
FREE_LOGIN_SCRIPT="/login.php" ;
FREE_REBOOT_CGI="/system.cgi" ;
WGET_OPTS="-T1 -t1 -qO /dev/null" ;
# usage : Affichage de l'aide
usage () {
echo -e "$0 <options> [commande]\n" ;
echo "Options" ;
echo " -h : Affiche ce message d'aide." ;
echo " -p <pass> : Spécifie le mot de passe FreeBox." ;
echo ;
echo "Commandes" ;
echo " restart : Redémarrage de la freebox." ;
echo " savepass : Sauvegarde le mot de passe." ;
echo ;
echo "En cas de dysfonctionnement, vérifiez votre mot de " ;
echo "passe FreeBox et/ou le fichier \"~/.freebox/config\"." ;
}
# Fonction de sortie de script :
die() {
echo $@ >&2 ;
exit 1 ;
}
# Fonction d'authentification sur la FreeBox
auth() {
# Authentification et enregistrement du cookie :
wget ${WGET_OPTS} --save-cookies "${TMP_DIRECTORY}/${COOKIES}" --post-data "login=${USERNAME}&passwd=${password}" "${URL}/${FREE_LOGIN_SCRIPT}" ;
# Si le cookie n'est pas redéscendu, l'authentification à échoué :
[ -e "${TMP_DIRECTORY}/${COOKIES}" ] || die "> Echec d'authentification. Vérifiez le mot de passe." ;
[ ! -z "$(sed -e 's/[[:blank:]]//g' -e '/^#\|^$/d' "${TMP_DIRECTORY}/${COOKIES}")" ] || die "> Authentification échouée. Vérifiez le mot de passe." ;
}
# Fonction de saisie du mot de passe
askpwd() {
cpt=0 ;
while [ -z "${password}" ] ; do
(( ${cpt} >= 3 )) && die "> Vous devez fournir votre mot de passe. Arrêt !" ;
(( cpt = cpt + 1 )) ;
read -sp "Password: " password ;
echo ;
done
}
init () {
[ ! -d "${WORKING_DIRECTORY}" ] && { mkdir "${WORKING_DIRECTORY}" || die "> Impossible de créer \"${WORKING_DIRECTORY}\"" ; }
[ ! -d "${TMP_DIRECTORY}" ] && { mkdir "${TMP_DIRECTORY}" || die "> Impossible de créer \"${TMP_DIRECTORY}\"" ; }
[ -e "${TMP_DIRECTORY}/${COOKIES}" ] && rm "${TMP_DIRECTORY}/${COOKIES}" ;
}
connection () {
wget ${WGET_OPTS} ${URL} ;
case $? in
4)
die "> Problème d'accès à la Freebox. Essayez de vous connecter manuellement" ;;
5)
die "> Problème SSL. Essayez de vous connecter manuellement" ;;
esac
}
cleancook () {
# Nettoyage du cookie :
[ -e "${TMP_DIRECTORY}/${COOKIES}" ] && rm "${TMP_DIRECTORY}/${COOKIES}" ;
}
# Fonction de redémarrage de la FreeBox
restart () {
init ;
[ -z "${password}" -a -r "${CONFIG_FILE}" ] && . ${CONFIG_FILE} ;
connection ;
askpwd ;
auth ;
# Redémarrage de la freebox :
wget ${WGET_OPTS} --load-cookies "${TMP_DIRECTORY}/${COOKIES}" --post-data 'method=system.reboot&redirect_after=/reboot.php&timeout=1' -p "${URL}/${FREE_REBOOT_CGI}" ;
cleancook ;
}
savepass () {
init ;
askpwd ;
auth ;
echo "password=${password}" > "${CONFIG_FILE}" ;
chmod 0600 "${CONFIG_FILE}"
cleancook ;
}
# Corps du programme :
(( $# > 0 )) || { usage ; exit 0; }
while getopts ":p:h" opt ; do
case ${opt} in
p)
password=${OPTARG} ;;
h)
usage ;
exit 0 ;;
:)
echo -e "> Option -$OPTARG requiert un argument.\n" ;
usage ;
exit 1 ;;
*)
echo -e "> Invalide option \"-$OPTARG\".\n" ;
usage ;
exit 1 ;;
esac
done
shift $((OPTIND-1))
(( $# > 1 )) && { echo -e "> Une seule commande à la fois.\n" ; usage ; exit 1 ; } ;
(( $# < 1 )) && { echo -e "> Aucune commande précisée.\n" ; usage ; exit 1 ; } ;
case $1 in
restart)
restart ;;
savepass)
savepass ;;
*)
echo -e "> $1 : Commande inconnue !\n" ;
usage ;
exit 1 ;;
esac
|
Puis lui donner les bons droits :
chmod
|
|
3 Utilisation
Nous allons sauvegarder le mot de passe de l'interface de la Freebox comme ceci :
freebox
|
> freebox savepass
Password:
|
Voici ensuite la méthode pour redémarrer la Freebox :
freebox
|
|
4 Ressources
http://www.admin-linux.fr/?p=5049