Forum Programmation.shell Activer/désactiver le Wifi d'une Freebox V6 depuis le réseau local

Posté par  .
Étiquettes :
8
28
nov.
2011
Bonjour,

[edit du 29/11/11 : mise à jour du script suite au conseil de BFG]

Le besoin :

Avoir la possibilité de désactiver et désactiver le Wifi de ma Freebox v6 (dite 'revolution') à des horaires définis, et ceci sans intervention humaine.

Le but :

Le but est de définir des plages horaires où le Wifi sera actif, le reste du temps il sera coupé.
Je ne m'étendrais pas sur la motivation d'une telle démarche : pour moi, c'est une simple règle de bon sens, tout comme on éteint la lumière en partant...

Comment :

Le script reçoit 1 seul paramètre qui peut être : [on, off, status]
Le but est d'appeler ce script depuis la crontab pour activer/désactiver le wifi selon le besoin.
Un élément de mon réseau local (un NAS en l'occurence) enverra les ordres d'activation/désactivation du Wifi à la Freebox. J'ai donc placé ce script et configuré la crontab du NAS à ma convenance.
Le script utilise curl pour envoyer les ordres au serveur web interne de la Freebox comme si un utilisateur s'y connectait et changeait l'état de la connexion Wifi sur la page dédiée.
La seule adaptation nécessaire est le mot de passe (cf. fbxPasswd) qui doit être modifié pour y mettre celui correspondant à votre Freebox. J'utilise le canal 9 (channel=9) et 20MHz (ht_mode=20) de largeur de bande : à adapter éventuellement.
Le script retourne 1 si le Wifi est activé, 0 sinon.

Divers :

Bien évidemment, une intervention manuelle sur le menu tactile du Freebox Server ou via l'interface web http://mafreebox.freebox.fr est toujours possible pour forcer l'état. De même qu'il est évident que l'élément envoyant les ordres à la Freebox doit être relié filairement à cette dernière...

Remarque :

Sur la commande 'status', je suis pollué par le code html retourné par le serveur, j'aurais juste aimé n'avoir que ma trace "Freebox Wifi is XX". 'option curl --silent n'y fait rien. Des idées ?

Exemple de crontab :

e.g. Wifi activé tous les jours de 7h30 à 8h30 et de 17h30 à 22h00 uniquement.

30 7 * * * /chemin/script/fbxWifi.sh on
30 8 * * * /chemin/script/fbxWifi.sh off
30 17 * * * /chemin/script/fbxWifi.sh on
00 22 * * * /chemin/script/fbxWifi.sh off

Le script :

#!/bin/bash

fbxLogin='freebox'
fbxPasswd='monMotDePasse'

fbxCookieFile="/tmp/fbxCookie.txt"

fbxLogin() {
    curl --cookie-jar $fbxCookieFile -s -o /dev/null -L "http://mafreebox.freebox.fr/login.php?login=$fbxLogin&passwd=$fbxPasswd"
    if [ $? -ne 0 ]; then
       echo "Login to Freebox failed!"
       exit 0
    fi
}

fbxLogout() {
    curl -b $fbxCookieFile -s -o /dev/null -L 'http://mafreebox.freebox.fr/login.php?logout=1'
    rm -f $fbxCookieFile
    if [ $? -ne 0 ]; then
       echo "Logout of Freebox failed!"
    fi
}

wifiOn() {
    fbxLogin
    curl -b $fbxCookieFile -s -o /dev/null -d 'enabled=on&channel=9&ht_mode=20&method=wifi.ap_params_set&config=Valider'  -H "X-Requested-With: XMLHttpRequest" -L 'http://mafreebox.freebox.fr/wifi.cgi'
# | w3m -dump -T text/html
    if [ $? -ne 0 ]; then
        echo "Setting Freebox wifi ON failed!"
    fi
    fbxLogout
}

wifiOff() {
    fbxLogin
    curl -b $fbxCookieFile -s -o /dev/null -d 'channel=9&ht_mode=20&method=wifi.ap_params_set&config=Valider'  -H "X-Requested-With: XMLHttpRequest" -L 'http://mafreebox.freebox.fr/wifi.cgi'
# | w3m -dump -T text/html
    if [ $? -ne 0 ]; then
        echo "Setting Freebox wifi OFF failed!"
    fi
    fbxLogout
}

wifiStatus() {
    fbxLogin
    checked=$(curl -b $fbxCookieFile -s -L 'http://mafreebox.freebox.fr/settings.php?page=wifi_conf' | grep '<input type="checkbox" name="enabled" checked />')

    rc=0
    if [ "$checked" != "" ]; then
        echo "Freebox Wifi is ON"
        rc=1
    else
        echo "Freebox Wifi is OFF"
    fi

    fbxLogout
    exit $rc
}


case "$1" in
    on)
        wifiOn
        exit 1
        ;;
    off)
        wifiOff
        exit 0
        ;;
    status)
        wifiStatus
        exit $?
        ;;
    *)
        echo "Usage: $0 {on|off|status}"
        exit 0
esac

exit 0

  • # Au dodo

    Posté par  (site web personnel) . Évalué à 4.

    Ca c'est pour les ados qui ne veulent pas se coucher...

    • [^] # Re: Au dodo

      Posté par  . Évalué à 3.

      pas grave l'ado il se branche sur le freewifi du voisin ...

      • [^] # Re: Au dodo

        Posté par  . Évalué à 1.

        Cette crontab n'est qu'un exemple et n'est pas la mienne. Cependant, effectivement, je ferme le tuyau à 22h : mes enfants n'étant pas encore ados, je m'auto-censure en coupant à 22h ;-)

  • # curl -o

    Posté par  . Évalué à 3.

    Sur la commande 'status', je suis pollué par le code html retourné par le serveur, j'aurais juste aimé n'avoir que ma trace "Freebox Wifi is XX". 'option curl --silent n'y fait rien. Des idées ?

    Il faut utiliser curl -o /dev/null --silent (-o /dev/null enregistre la réponse du serveur dans /dev/null, et --silent désactive les informations comme la barre de progression).

    • [^] # Re: curl -o

      Posté par  . Évalué à 1.

      Merci pour le tuyau, j'essaierai dès ce soir...

    • [^] # Re: curl -o

      Posté par  . Évalué à 1.

      Après mise à jour du script, cela fonctionne parfaitement maintenant : plus aucune pollution sur le stdout.
      Le script présenté en première page été mis à jour avec les dernières modifications.
      BFG, merci pour le tuyau :-)

  • # Merci

    Posté par  (site web personnel) . Évalué à 1.

    Dormant pas loin de ma freebox, je trouve cette idée pas mal

  • # V5

    Posté par  . Évalué à 3.

    Il n'y a pas moyen de faire la même chose sur une Freebox V5 ?

    Le fait de devoir passer par la page web d'administation + redémarrage de la Freebox m'amène à ne jamais couper le Wifi, juste pour ne pas avoir à galérer lorsque je met à jour mes programmes sur mon téléphone Android (1 fois par mois...).

  • # égoïste!!!!!

    Posté par  . Évalué à 2.

    Et comment je fais moi pour accéder au freewifi pour mouler sur DLFP ?

    accessoirement j'ai une vrai question : ça consomme et ça émet vraiment un wifi non utilisé ? J'ai pas remarqué de différence notable sur la conso de mon portable selon que le wifi est activé ou pas (je suis en filaire, mais par défaut il est activé au démarrage)

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

    • [^] # Re: égoïste!!!!!

      Posté par  . Évalué à 2.

      Le Wifi, de part sa conception radio n'est pas des plus économe : il n'a pas été conçu initialement pour de l'embarqué.
      Un palliatif a été de corriger cela au niveau logiciel, avec gestion de la mise en ville du wifi si non utilisé (si aucun trafic envoyé).
      Bref, le wifi est plus dédié à un 'dongle', sous entendu qu'il y a un équipent derrière avec une batterie d'une certaine capacité déjà (ex. un ordinateur portable) et non pas une batterie de très petite capacité, type téléphone mobile.
      C'est en cela surtout que les techno radio de téléphonie mobile sont bien meilleures : elles ont directement été pensées pour une utilisation nomade, avec une petite batterie.
      Par exemple, la radio 4G LTE est encore optimisée par rapport à la 3G, notamment en 'uplink'.

      Sur un ordinateur portable, si il y a beaucoup de trafic (eg nombreux téléchargements), alors la consommation du wifi sera non négligeable. A contrario, si le wifi est peu utilisé et que la gestion d'énergie du wifi est activée, cela ne devrait pas être sensible.

      • [^] # Re: égoïste!!!!!

        Posté par  . Évalué à 2.

        Ok donc aucun problème si je veux laisser mon freewifi ouvert, si y a personne dessus ça consomme peu ;)

        Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • # Bravo et merci !!

    Posté par  . Évalué à 2.

    Génial ! Ça fait un moment que je voulais un truc du genre.
    Je suis d'ailleurs en train d'écrire une application Android utilisant cette interface mafreebox pour faire la même chose, et tu m'as donné l'option qui me manquait : "X-Requested-With: XMLHttpRequest".
    Si ça intéresse des gens, je devrais rendre ça disponible sous peu (reste à rendre l'interface moins moche)

    Encore merci !

    • [^] # Re: Bravo et merci !!

      Posté par  . Évalué à 2.

      J'ai loupé un truc.
      Tu veux allumer le wifi de la freebox avec un téléphone android... pas connecté sur le wifi de la freebox car éteint ?
      Même 'pas moche', j'ai un doute.

      • [^] # Re: Bravo et merci !!

        Posté par  . Évalué à 0.

        C'est pas "je veux", c'est "ça marche déjà".

        Dans son post initial, Skimpax utilise http://mafreebox.freebox.fr/ qui permet d'accéder à sa Freebox en local. En activant l'accès distant (Connexion Internet => Configuration => Accès distant), on accède au serveur en rempaçant mafreebox.freebox.fr par son IP (ou son nom de domaine si on en a un).

        Donc changer l'état du WiFi revient simplement à un post http effectué à l'adresse de sa Freebox.

        • [^] # Re: Bravo et merci !!

          Posté par  . Évalué à 1.

          Dans son post initial, Skimpax utilise...

          oui mais en FILAIRE.
          mafreebox.freebox.fr n'est accessible que depuis le réseau local.
          donc activer le wifi éteint par le wifi est un non sens.

          • [^] # Re: Bravo et merci !!

            Posté par  . Évalué à -1.

            Je ne comprends pas ce que tu ne comprends pas.

            Il n'y a ni filaire, ni wifi ni réseau local. Tout ça c'est pour l'accès à mafreebox.freebox.fr.
            Or, on peut rendre accessible cette page à l'extérieur. La nouvelle adresse d'accès est l'adresse IP de la Freebox. Ce n'est rien de plus que du routage.

            En local :
            mafreebox.freebox.fr correspond à 192.168.0.254 (adresse de la Freebox par défaut)

            Puis, quand on active le réseau distant :
            l'adresse IP de la connexion est routée par défaut sur le port 80 (part défaut) sur 192.168.0.254.

            Bref, ce n'est rien de plus qu'un accès à une page Web.

            PS : je viens d'activer mon réseau WiFi avec mon téléphone en passant par la 3G.

            • [^] # Re: Bravo et merci !!

              Posté par  . Évalué à 3.

              mafreebox.freebox.fr est un hôte local, il change en fonction de la ligne depuis laquelle tu y accèdes. Il ne résout pas en dehors de chez toi.

              Tu as activé le wifi en 3G certainement par la console client "subscribe.free.fr" ce qui ne correspond pas vraiment au post en cours.

              • [^] # Re: Bravo et merci !!

                Posté par  . Évalué à 1.

                Tu as activé le wifi en 3G certainement par la console client "subscribe.free.fr"
                C'est quand même moi qui l'ai développé mon appli Android, je sais par quoi je passe.

                Voici en gros à peu près la ligne d'accès au script (posté tel quel on se fera bien sûr jeter si on ne se connecte pas en gardant le cookie).
                HttpPost httppostWifiConf = new HttpPost("http://" + IP + "/wifi.cgi?");

                Oui mafreebox.freebox.fr est un hôte local.
                En revanche, mon adresse IP est 82.xxx.xx.xxx, et si je tape :
                http://82.xxx.xx.xxx magie du réseau, cela tente d'accéder à mon routeur (ici ma Freebox).
                Et là, magie de la Freebox, celle-ci a un bien un service qui tourne : le même que mafreebox.freebox.fr qui n'est qu'un nom de domaine local vers ce service.

                Bref, ça fait 3 fois que j'écris la même chose, je t'invite à lire :
                http://www.freenews.fr/spip.php?article10656

  • # Widget KDE (Plasmoid) pour piloter la freebow

    Posté par  . Évalué à 0.

    Grâce à ce script légèrement retouché (il n'accepte pas les mots de passe avec des caractères spéciaux, et exit 0/1 inversé par rapport au besoin), j'ai utilisé Service Monitor pour afficher des icônes sur le bureau, qui ouvre ou non le wifi ainsi que le contrôle parental.
    C'est super pratique.
    Donc un grand merci pour le partage.
    Vicnet

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.