01 - Préambule
Depuis fin juin, nous pouvons interagir avec la Freebox Revolution au travers l'API du nouveau Freebox OS.
02 - Processus d'interrogation
Le processus est décomposé en 2 phases :
- l'autorisation de l'application après une validation physique sur la Freebox.
- la création d'une session sur la Freebox.
03 - Phase d'autorisation
Pour cela il faut lancer la commande :
curl -X POST -i -H "Content-type: application/json" -X POST http://mafreebox.freebox.fr/api/v1/login/authorize/ -d ' { "app_id": "fr.prestaopen.cacti", "app_name": "Cacti_request", "app_version": "0.1", "device_name": "Eon_Master" } ' >/tmp/post_authorize.log 2>/dev/null
Un message apparaît sur la Freebox. Vous pouvez valider ou non l'application. Sans intervention de votre part, l'application n'est pas validée.
Appuyer sur la flèche de droite puis sur le bouton de validation.
Nous sauvegardons la variable app_token dans le fichier /tmp/post_authorize.log.
Fichier freeboxv6_adsl_api_post_authorize.sh :
#!/bin/sh clear curl -X POST -i -H "Content-type: application/json" -X POST http://mafreebox.freebox.fr/api/v1/login/authorize/ -d ' { "app_id": "fr.prestaopen.cacti", "app_name": "Cacti_request", "app_version": "0.1", "device_name": "Eon_Master" } ' >/tmp/post_authorize.log 2>/dev/null
Fichier post_authorize.log :
HTTP/1.1 200 OK Server: nginx Date: Fri, 16 Aug 2013 09:18:15 GMT Content-Type: application/json; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive {"success":true,"result":{"app_token":"1CKzz6w\/Qh0\/oCJuSyVdShSCGpFMm+xeyucdDrz3pUs85c4rrcIQC5R51fLRXNoF","track_id":0}}
04 - Modification des droits de l'application
Sur la console d'administration mafreebox.freebox.fr, il faut modifier les droits de l'application.
Se connecter avec votre mot de passe et cliquer sur Connexion.
Lancer le programme gérant les paramètres de la Freebox.
Lancer l'application pour la gestion des accès.
Cliquer sur l'onglet Applications.
Votre application n'a pas droits aux modifications des réglages de la Freebox. Cliquer sur l'icone de modification.
Cocher Modification des réglages de la Freebox et cliquer sur OK.
Votre application a les bons droits. Cliquer sur OK pour sortir et fermer la fenêtre.
05 - Phase de session et d'interrogation
Nous devons dans un premier temps, récupérer l'app_token.
app_token=`grep "app_token" "/tmp/post_authorize.log" | cut -f 4 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"`
Ce code va chercher la valeur de app_token et le nettoyer des caractères "\".
curl -H "Content-type: application/json" -X GET http://mafreebox.freebox.fr/api/v1/login/>/tmp/challenge.log 2>/dev/null challenge=`grep "challenge" "/tmp/challenge.log" | cut -f 5 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"`
Ce code interroge la Freebox pour recevoir un challenge et va nettoyer le challenge.
password=`echo -n $challenge | openssl dgst -sha1 -hmac $app_token`
Nous devons créer un password pour cette session.
curl -i -H "Content-type: application/json" -X POST http://mafreebox.freebox.fr/api/v1/login/session/ -d ' { "app_id": "fr.prestaopen.cacti", "password": "'$password'" } '>/tmp/session_token.log 2>/dev/null session_token=`grep "session_token" "/tmp/session_token.log" | cut -f 3 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"`
La session est ouverte par ce code et nous avons maintenant un session_token.
06 - Interrogation DSL
Nous allons voir ici comment interroger la Freebox pour recevoir les valeurs concernant l'ADSL :
- Rate_up
- Rate_down
- snr_up
- Snr_down
07 - Rate_up
Cette donnée se trouve dans la base dsl et se nomme rate_up. Le code d'interrogation est celui-ci :
curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "dsl", "fields": [ "rate_up" ], "precision": 1 } '> /tmp/dsl_rate_up.log 2>/dev/null
Il est nettoyé ici :
rate_up=`cat /tmp/dsl_rate_up.log | grep -oE "[^{]+$"| grep -oE '":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p'`
08 - Rate_down
Cette donnée se trouve dans la base dsl et se nomme rate_down. Le code d'interrogation est celui-ci :
curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "dsl", "fields": [ "rate_down" ], "precision": 1 } '> /tmp/dsl_rate_down.log 2>/dev/null
Il est nettoyé ici :
rate_down=`cat /tmp/dsl_rate_down.log | grep -oE "[^{]+$"| grep -oE ',".*,' | sed -n 's/\([^{]*:\)\([^,]*\),.*/\2/p' | sed 's/.\{2\}$//'`
Attention : l'agencement des valeurs est différente pour cette donnée.
09 - Snr_up
Cette donnée se trouve dans la base dsl et se nomme snr_up. Le code d'interrogation est celui-ci :
curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "dsl", "fields": [ "snr_up" ], "precision": 1 } '> /tmp/dsl_snr_up.log 2>/dev/null
Il est nettoyé ici :
snr_up=`cat /tmp/dsl_snr_up.log | grep -oE "[^{]+$"| grep -oE '":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p'`
10 - Snr_down
Cette donnée se trouve dans la base dsl et se nomme snr_down. Le code d'interrogation est celui-ci :
curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "dsl", "fields": [ "snr_down" ], "precision": 1 } '> /tmp/dsl_snr_down.log 2>/dev/null
Il est nettoyé ici :
snr_down=`cat /tmp/dsl_snr_down.log | grep -oE "[^{]+$"| grep -oE '":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p'`
11 - Formatage des résultats
Nous allons mettre en forme les résultats pour Cacti avec le code ci-dessous :
printf "rate_up:%s rate_down:%s snr_up:%s snr_down:%s \n" $rate_up $rate_down $snr_up $snr_down;
12 - Conclusion
Voici le résultat de notre interrogation :
Voila nous avons un script pour interroger notre Freebox. Nous verrons dans un autre article comment définir les graphes de notre Freebox sur Cacti.
13 - Annexes
Programme pour lire les valeurs rrd de la niche dsl :
#!/bin/sh app_token=`grep "app_token" "/tmp/post_authorize.log" | cut -f 4 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` curl -H "Content-type: application/json" -X GET http://mafreebox.freebox.fr/api/v1/login/>/tmp/challenge.log 2>/dev/null challenge=`grep "challenge" "/tmp/challenge.log" | cut -f 5 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` password=`echo -n $challenge | openssl dgst -sha1 -hmac $app_token` curl -i -H "Content-type: application/json" -X POST http://mafreebox.freebox.fr/api/v1/login/session/ -d ' { "app_id": "fr.prestaopen.cacti", "password": "'$password'" } '>/tmp/session_token.log 2>/dev/null session_token=`grep "session_token" "/tmp/session_token.log" | cut -f 3 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "dsl", "fields": [ "rate_up" ], "precision": 100 } '> /tmp/dsl_rate_up.log 2>/dev/null rate_up=`cat /tmp/dsl_rate_up.log | grep -oE "[^{]+$"| grep -oE '":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p'` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "dsl", "fields": [ "rate_down" ], "precision": 100 } '> /tmp/dsl_rate_down.log 2>/dev/null rate_down=`cat /tmp/dsl_rate_down.log | grep -oE "[^{]+$"| grep -oE ',".*,' | sed -n 's/\([^{]*:\)\([^,]*\),.*/\2/p' | sed 's/.\{2\}$//'` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "dsl", "fields": [ "snr_up" ], "precision": 100 } '> /tmp/dsl_snr_up.log 2>/dev/null snr_up=`cat /tmp/dsl_snr_up.log | grep -oE "[^{]+$"| grep -oE '":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p'` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "dsl", "fields": [ "snr_down" ], "precision": 100 } '> /tmp/dsl_snr_down.log 2>/dev/null snr_down=`cat /tmp/dsl_snr_down.log | grep -oE "[^{]+$"| grep -oE '":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p'` printf "rate_down:%s rate_up:%s snr_down:%s snr_up:%s \n" $rate_down $rate_up $snr_down $snr_up;
Programme pour lire les valeurs rrd de la niche net :
#!/bin/sh app_token=`grep "app_token" "/tmp/post_authorize.log" | cut -f 4 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` curl -H "Content-type: application/json" -X GET http://mafreebox.freebox.fr/api/v1/login/>/tmp/challenge.log 2>/dev/null challenge=`grep "challenge" "/tmp/challenge.log" | cut -f 5 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` password=`echo -n $challenge | openssl dgst -sha1 -hmac $app_token` curl -i -H "Content-type: application/json" -X POST http://mafreebox.freebox.fr/api/v1/login/session/ -d ' { "app_id": "fr.prestaopen.cacti", "password": "'$password'" } '>/tmp/session_token.log 2>/dev/null session_token=`grep "session_token" "/tmp/session_token.log" | cut -f 3 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "net", "fields": [ "bw_up" ], "precision": 1 } '> /tmp/net_bw_up.log 2>/dev/null bw_up=`cat /tmp/net_bw_up.log | grep -oE "[^{]+$"| grep -oE ',".*,' | sed -n 's/\([^{]*:\)\([^,]*\),.*/\2/p' | sed 's/.\{2\}$//'` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "net", "fields": [ "bw_down" ], "precision": 1 } '> /tmp/net_bw_down.log 2>/dev/null bw_down=`cat /tmp/net_bw_down.log | grep -oE "[^{]+$"| grep -oE '":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p'` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "net", "fields": [ "rate_up" ], "precision": 1 } '> /tmp/net_rate_up.log 2>/dev/null rate_up=`cat /tmp/net_rate_up.log | grep -oE "[^{]+$"| grep -oE '":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p'` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "net", "fields": [ "rate_down" ], "precision": 1 } '> /tmp/net_rate_down.log 2>/dev/null rate_down=`cat /tmp/net_rate_down.log | grep -oE "[^{]+$"| grep -oE ',".*,' | sed -n 's/\([^{]*:\)\([^,]*\),.*/\2/p' | sed 's/.\{2\}$//'` printf "bw_up:%s bw_down:%s rate_up:%s rate_down:%s \n" $bw_up $bw_down $rate_up $rate_down;
Nous utilisons 2 programmes pour lire les valeurs rrd de la niche switch :
Pour les données en réception
#!/bin/sh app_token=`grep "app_token" "/tmp/post_authorize.log" | cut -f 4 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` curl -H "Content-type: application/json" -X GET http://mafreebox.freebox.fr/api/v1/login/>/tmp/challenge.log 2>/dev/null challenge=`grep "challenge" "/tmp/challenge.log" | cut -f 5 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` password=`echo -n $challenge | openssl dgst -sha1 -hmac $app_token` curl -i -H "Content-type: application/json" -X POST http://mafreebox.freebox.fr/api/v1/login/session/ -d ' { "app_id": "fr.prestaopen.cacti", "password": "'$password'" } '>/tmp/session_token.log 2>/dev/null session_token=`grep "session_token" "/tmp/session_token.log" | cut -f 3 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "switch", "fields": [ "rx_1" ], "precision": 1 } '> /tmp/switch_rx_1.log 2>/dev/null switch_rx_1=`cat /tmp/switch_rx_1.log | grep -oE "[^{]+$"| grep -oE ',".*,' | sed -n 's/\([^{]*:\)\([^,]*\),.*/\2/p' | sed 's/.\{2\}$//'` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "switch", "fields": [ "rx_2" ], "precision": 1 } '> /tmp/switch_rx_2.log 2>/dev/null switch_rx_2=`cat /tmp/switch_rx_2.log | grep -oE "[^{]+$"| grep -oE '":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p'` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "switch", "fields": [ "rx_3" ], "precision": 1 } '> /tmp/switch_rx_3.log 2>/dev/null switch_rx_3=`cat /tmp/switch_rx_3.log | grep -oE "[^{]+$"| grep -oE '":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p'` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "switch", "fields": [ "rx_4" ], "precision": 1 } '> /tmp/switch_rx_4.log 2>/dev/null switch_rx_4=`cat /tmp/switch_rx_4.log | grep -oE "[^{]+$"| grep -oE ',".*,' | sed -n 's/\([^{]*:\)\([^,]*\),.*/\2/p' | sed 's/.\{2\}$//'` printf "switch_rx_1:%s switch_rx_2:%s switch_rx_3:%s switch_rx_4:%s \n" $switch_rx_1 $switch_rx_2 $switch_rx_3 $switch_rx_4 ;
Pour les données en émission
#!/bin/sh app_token=`grep "app_token" "/tmp/post_authorize.log" | cut -f 4 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` curl -H "Content-type: application/json" -X GET http://mafreebox.freebox.fr/api/v1/login/>/tmp/challenge.log 2>/dev/null challenge=`grep "challenge" "/tmp/challenge.log" | cut -f 5 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` password=`echo -n $challenge | openssl dgst -sha1 -hmac $app_token` curl -i -H "Content-type: application/json" -X POST http://mafreebox.freebox.fr/api/v1/login/session/ -d ' { "app_id": "fr.prestaopen.cacti", "password": "'$password'" } '>/tmp/session_token.log 2>/dev/null session_token=`grep "session_token" "/tmp/session_token.log" | cut -f 3 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "switch", "fields": [ "tx_1" ], "precision": 1 } '> /tmp/switch_tx_1.log 2>/dev/null switch_tx_1=`cat /tmp/switch_tx_1.log | grep -oE "[^{]+$"| grep -oE ',".*,' | sed -n 's/\([^{]*:\)\([^,]*\),.*/\2/p' | sed 's/.\{2\}$//'` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "switch", "fields": [ "tx_2" ], "precision": 1 } '> /tmp/switch_tx_2.log 2>/dev/null switch_tx_2=`cat /tmp/switch_tx_2.log | grep -oE "[^{]+$"| grep -oE '":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p'` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "switch", "fields": [ "tx_3" ], "precision": 1 } '> /tmp/switch_tx_3.log 2>/dev/null switch_tx_3=`cat /tmp/switch_tx_3.log | grep -oE "[^{]+$"| grep -oE '":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p'` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "switch", "fields": [ "tx_4" ], "precision": 1 } '> /tmp/switch_tx_4.log 2>/dev/null switch_tx_4=`cat /tmp/switch_tx_4.log | grep -oE "[^{]+$"| grep -oE ',".*,' | sed -n 's/\([^{]*:\)\([^,]*\),.*/\2/p' | sed 's/.\{2\}$//'` printf "switch_tx_1:%s switch_tx_2:%s switch_tx_3:%s switch_tx_4:%s \n" $switch_tx_1 $switch_tx_2 $switch_tx_3 $switch_tx_4 ;
Programme pour lire les valeurs rrd de la niche temp :
#!/bin/sh app_token=`grep "app_token" "/tmp/post_authorize.log" | cut -f 4 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` curl -H "Content-type: application/json" -X GET http://mafreebox.freebox.fr/api/v1/login/>/tmp/challenge.log 2>/dev/null challenge=`grep "challenge" "/tmp/challenge.log" | cut -f 5 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` password=`echo -n $challenge | openssl dgst -sha1 -hmac $app_token` curl -i -H "Content-type: application/json" -X POST http://mafreebox.freebox.fr/api/v1/login/session/ -d ' { "app_id": "fr.prestaopen.cacti", "password": "'$password'" } '>/tmp/session_token.log 2>/dev/null session_token=`grep "session_token" "/tmp/session_token.log" | cut -f 3 -d ':' | cut -f 1 -d ','| sed 's/\\\//g' |sed "s/\"//g"| sed "s/\r//g" | sed "s/\n//g"` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "temp", "fields": [ "temp1" ], "precision": 100 } '> /tmp/temp1.log 2>/dev/null temp1=`cat /tmp/temp1.log | grep -oE "[^{]+$"| grep -oE '":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p'` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "temp", "fields": [ "temp2" ], "precision": 100 } '> /tmp/temp2.log 2>/dev/null temp2=`cat /tmp/temp2.log | grep -oE "[^{]+$"| grep -oE '":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p'` curl -i -X POST http://mafreebox.freebox.fr/api/v1/rrd/ -H "X-Fbx-App-Auth: $session_token" -d ' { "db": "temp", "fields": [ "temp3" ], "precision": 100 } '> /tmp/temp3.log 2>/dev/null temp3=`cat /tmp/temp3.log | grep -oE "[^{]+$"| grep -oE '":.*,' | grep -oE '3":.*,' | sed -n 's/\([^:]*:\)\([^,]*\),.*/\2/p' | sed -e "s/}]//g"` printf "temp1:%s temp2:%s temp3:%s \n" $temp1 $temp2 $temp3;
Ces programmes seront appelés par Cacti.