Monitoring de la Livebox 4 avec Grafana

Ça fait un moment que j’ai envie d’effectuer le suivi de mes débits Internet, mais quand même pas assez envie pour tout faire tout seul. Heureusement il y a peu j’ai trouvé des scripts BASH + curl pour monitorer la Livebox avec Cacti. Je n’avais donc plus qu’à les adapter.

Le script que j’ai trouvé fonctionne de la même manière que le mien pour Garmin. En effet, il utilise curl pour simuler l’accès à l’API JSON de la Livebox, comme si c’était le navigateur qui effectuait les demandes.

La seule modification que j’ai du effectuer c’est donc l’export des données vers InfluxDB au lieu de fichiers texte au format Cacti. Pour cela, j’utilise l’API HTTP d’InfluxDB avec curl, c’est assez simple.

Comme je ne m’intéresse qu’à la quantité de données échangée sur Internet. J’ai aussi réduit le nombre d’appels à l’API de la Livebox. J’ai aussi supprimé la déconnexion, mais ça risque peut-être de poser un problème au bout d’un moment sachant qu’au rythme d’une connexion par minute ça fait quand même 1440 sessions ouvertes par jour, on verra …

Préparation de la base de donnée

Pour préparer la base de donnée, rien de plus simple.

  • Se connecter à base de donnée avec le programme “influx”
  • Utiliser la commande suivante : CREATE DATABASE monitoring;

Utilisation du script

Le script possède deux dépendances: jq et curl. jq permet de manipuler le JSON. Je m’en sert pour lire la config et lire les informations d’authentification (en remplacement de sed dans le script original).

Pour utiliser le script, il suffit de créer un fichier de configuration nommé “config.json” dans le dossier du script. Ce fichier de configuration doit contenir les éléments suivants :

{
    "host": "192.168.1.1",
    "password": "A lire sous la box ...",
    "db": "http://localhost:8086"
}

Configuration dans Grafana

Pour configurer Grafana, l’astuce c’est d’utiliser la dérivée comme on envoi la valeur totale de blocs transmis. Je ne sais pas encore à quelle unité correspond un bloc, mais j’ai l’impression que ce n’est pas loin d’un kilo octet.

J’ai utilisé les requêtes suivantes. La première pour le download que je fais apparaître en négatif et l’autre pour l’upload que je fais apparaitre en positif. J’ai choisi d’utiliser des barres parce que je trouvais ça plus joli.

SELECT -derivative(last("rx"), 1s) FROM "livebox" WHERE ("host" = '192.168.1.1') AND $timeFilter GROUP BY time($__interval) fill(linear)

SELECT derivative(last("tx"), 1s) FROM "livebox" WHERE ("host" = '192.168.1.1') AND $timeFilter GROUP BY time($__interval) fill(linear)

Et voilà le résultat :

Et voilà le résultat avec un bon download d’une image Ubuntu avant de me coucher.

Le script

#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

LIVEBOX_HOST=`jq -r .host ${DIR}/config.json`
LIVEBOX_PASS=`jq -r .pass ${DIR}/config.json`
INFLUX_URL=`jq -r .db ${DIR}/config.json`

TMP_DIR=/tmp/

myOutput=${TMP_DIR}/myOutput.txt
myCookies=${TMP_DIR}/myCookies.txt

########################################
# Connexion et recuperation du cookies #
########################################
curl -s -o "$myOutput" -X POST -c "$myCookies" -H 'Content-Type: application/x-sah-ws-4-call+json' -H 'Authorization: X-Sah-Login' -d "{\"service\":\"sah.Device.Information\",\"method\":\"createContext\",\"parameters\":{\"applicationName\":\"so_sdkut\",\"username\":\"admin\",\"password\":\"${LIVEBOX_PASS}\"}}" http://${LIVEBOX_HOST}/ws > /dev/null

##################################################
# Lecture du cookies pour utilisation ulterieure #
##################################################
myContextID=`jq -r .data.contextID $myOutput`

#######################################################
# Envoi des commandes pour recuperer les informations #
#######################################################
getDSLStats=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"NeMo.Intf.dsl0\",\"method\":\"getDSLStats\",\"parameters\":{}}" http://${LIVEBOX_HOST}/ws`

TX=`echo $getDSLStats | jq -r .status.TransmitBlocks`
RX=`echo $getDSLStats | jq -r .status.ReceiveBlocks`

#################################
# Envoi des données à influx db #
#################################
curl -s -i -XPOST "${INFLUX_URL}/write?db=monitoring" --data-binary "livebox,host=${LIVEBOX_HOST} rx=${RX},tx=${TX}" > /dev/null

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.