Rebooter sa Freebox Server 6 en ligne de commande

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

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 :

Command 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) :

Command 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 :

Command
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 :

Configuration File /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 :

Command chmod
chmod 555 /bin/freebox

3 Utilisation

Nous allons sauvegarder le mot de passe de l'interface de la Freebox comme ceci :

Command freebox
> freebox savepass
Password:

Voici ensuite la méthode pour redémarrer la Freebox :

Command freebox
freebox reboot

4 Ressources

http://www.admin-linux.fr/?p=5049