Vous connaissez sans doute les multiples sites permettant de mesurer la vitesse de votre connexion Internet (Speedtest par exemple), et de frimer devant les copains si vous avez la fibre 🙂
Dernièrement j’ai eu besoin de monitorer la vitesse de ma connexion, c’est à dire prendre une mesure à intervalles régulier, et récupérer les données
Je m’attendais au pire et m’imaginais déjà parser les pages web pour y récupérer les résultats, mais pas du tout, il y a beaucoup plus simple

Comment mesurer la bande passante en ligne de commande?
Le site bien connu Speedtest.net propose un outil bien pratique pour lancer vos tests en ligne de commande
Cet outil dispose de nombreuses options vous permettant de choisir le test qui vous intéresse, et le format de sortie le plus facile à utiliser pour vous

Je vais donc vous expliquer comment installer cet outil, les options disponibles, et quelques exemples d’utilisation et d’analyse

Installation de speedtest-cli

L’outil dont je vais vous parler est donc speedtest-cli
Vous trouverez plus d’informations sur la page du projet si besoin

Installation via les dépôts

Sur une Debian ou Ubuntu, je vous conseille d’installer cela directement avec les commandes suivantes:

sudo apt-get update
sudo apt-get install python-pip
sudo pip install speedtest-cli

Installation manuelle

Si vous préférez, vous pouvez aussi télécharger le script python directement:

wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.pychmod +x speedtest-cli

Quelque soit la méthode choisie, l’installation est désormais terminée, passons à l’utilisation

Mesure de la vitesse de votre connexion

Pour mesurer la bande passante, la commande basique est celle ci:

speedtest-cli

Cela vous affichera les 3 informations suivantes :

  • Le ping
  • La vitesse de téléchargement (download)
  • La vitesse d’envoi (upload)

Voici un exemple de l’affichage:

# speedtest-cli
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from OVH SAS (92.222.88.59)...
Selecting best server based on latency...
Hosted by Naitways (Paris) [1.82 km]: 13.248 ms
Testing download speed........................................
Download: 97.70 Mbits/s
Testing upload speed..................................................
Upload: 95.50 Mbits/s

Cela est très rapide, et déjà c’est intéressant
Si vous êtes sous Linux, ou avez un Linux sous la main à votre domicile/travail, je trouve déjà que c’est plus rapide de lancer ça que d’aller sur le site 🙂

Les options disponibles

Mais ce n’est pas tout, de nombreuses options sont disponibles

Usage

Voici le détail de la commande aide:

# speedtest-cli -h
usage: speedtest-cli [-h] [--no-download] [--no-upload] [--bytes] [--share]
                     [--simple] [--csv] [--csv-delimiter CSV_DELIMITER]
                     [--csv-header] [--json] [--list] [--server SERVER]
                     [--exclude EXCLUDE] [--mini MINI] [--source SOURCE]
                     [--timeout TIMEOUT] [--secure] [--no-pre-allocate]
                     [--version]

Command line interface for testing internet bandwidth using speedtest.net.
--------------------------------------------------------------------------
https://github.com/sivel/speedtest-cli

optional arguments:
  -h, --help            show this help message and exit
  --no-download         Do not perform download test
  --no-upload           Do not perform upload test
  --bytes               Display values in bytes instead of bits. Does not
                        affect the image generated by --share, nor output from
                        --json or --csv
  --share               Generate and provide a URL to the speedtest.net share
                        results image, not displayed with --csv
  --simple              Suppress verbose output, only show basic information
  --csv                 Suppress verbose output, only show basic information
                        in CSV format. Speeds listed in bit/s and not affected
                        by --bytes
  --csv-delimiter CSV_DELIMITER
                        Single character delimiter to use in CSV output.
                        Default ","
  --csv-header          Print CSV headers
  --json                Suppress verbose output, only show basic information
                        in JSON format. Speeds listed in bit/s and not
                        affected by --bytes
  --list                Display a list of speedtest.net servers sorted by
                        distance
  --server SERVER       Specify a server ID to test against. Can be supplied
                        multiple times
  --exclude EXCLUDE     Exclude a server from selection. Can be supplied
                        multiple times
  --mini MINI           URL of the Speedtest Mini server
  --source SOURCE       Source IP address to bind to
  --timeout TIMEOUT     HTTP timeout in seconds. Default 10
  --secure              Use HTTPS instead of HTTP when communicating with
                        speedtest.net operated servers
  --no-pre-allocate     Do not pre allocate upload data. Pre allocation is
                        enabled by default to improve upload performance. To
                        support systems with insufficient memory, use this
                        option to avoid a MemoryError
  --version             Show the version number and exit

On peut donc :

  • Afficher le résultat en « bytes » plutôt qu’en « bits »
  • Choisir les tests à faire (juste le Download par exemple)
  • Choisir le format de l’affichage (Json et CSV seront très intéressants pour la suite notamment)
  • Générer une image à partager directement en ligne de commande, par exemple:
    speedtest ovh internet
  • Afficher uniquement les chiffres importants sans le debug (vous aurez donc Ping, Download et Upload uniquement)
  • Afficher la liste des serveurs disponible, et choisir celui qu’on veut utiliser pour le test
  • etc …

Petite précision si vous êtes dans le même cas: je n’avais pas accès à toutes ces options avec une installation depuis les dépôts sur Debian 8.
J’imagine qu’il faut être sur la dernière version pour avoir tout ça, ou alors utilisez l’installation manuelle pour avoir la version complète avec toutes les options

Exemples

Option simple:

# speedtest-cli --simple
Ping: 11.691 ms
Download: 97.12 Mbit/s
Upload: 99.31 Mbit/s

Option JSON sans upload:

# speedtest-cli --json --no-upload
{"client": {"rating": "0", "loggedin": "0", "isprating": "3.7", "ispdlavg": "0", "ip": "92.222.88.59", "isp": "OVH SAS", "lon": "2.3292", "ispulavg": "0", "country": "FR", "lat": "48.8628"}, "bytes_sent": 0, "download": 97391791.12253797, "timestamp": "2018-12-14T05:53:18.558544Z", "share": null, "bytes_received": 122260468, "ping": 11.812, "upload": 0, "server": {"latency": 11.812, "name": "Paris", "url": "http://speedtest.naitways.net/upload.php", "country": "France", "lon": "2.3470", "cc": "FR", "host": "speedtest.naitways.net:8080", "sponsor": "Naitways", "lat": "48.8742", "id": "16476", "d": 1.8171187953225858}}

Vous avez compris le principe, je vous laisse jouer avec les autres options 🙂

Lire les résultats en PHP

Les différents format disponibles permettent un import facile dans votre logiciel préféré, par exemple on peut utiliser du PHP pour récupérer les valeurs
Dans mon cas j’ai aussi utiliser Cacti pour avoir le graph de l’historique, et Nagios pour avoir une alerte quand ça passe sous un certain seuil
Cela dépendra vraiment de vos besoins

Format JSON

Commençons par la commande précédente avec l’affichage au format JSON
JSON est vraiment un format facile à lire en PHP
En version rapide, voici un code fonctionnel:

<?php
exec("/root/speedtest-cli --json --no-upload",$output);

$tab = json_decode($output[0],TRUE);

echo "Vitesse de téléchargement: " . round($tab["download"]/1024). " ko/s";

?>

Pensez à adapter le chemin du script dans le exec (suivant le type d’installation que vous avez suivi)
Ensuite à vous d’adapter le reste du code pour gérer l’affichage comme bon vous semble

Vous pouvez ensuite lancer le script, cela produira l’affichage suivant:

# php test-json.php
Vitesse de téléchargement: 95142 ko/s


Dans le cas du JSON, le nom du champ dans le tableau est le même que celui affiché en lançant la commande à la main, donc c’est très simple

Format CSV

Lorsque le format JSON est disponible, le CSV à moins d’intérêt je trouve
Car il est moins pratique à exploiter
Par contre cela me semble intéressant si l’on souhaite logguer l’historique dans un fichier, pour l’analyser par la suite

Vous pouvez par exemple l’ouvrir dans Excel et l’analyser comme bon vous semble
Et pour l’exemple je vais vous montrer comment créer une tâche planifiée de relevé de la bande passante, puis de le lire en PHP

Création de la tache planifiée

Sur Linux, on va programmer notre tâche planifiée dans crontab en suivant la procédure suivante:

  • Lancer crontab en mode édition
    crontab -e
  • Coller cette ligne par exemple
    */5 * * * * /root/speedtest-cli --csv >> /root/speedtest.csv

    Cela va lancer le script speedtest toutes les 5 minutes (à vous d’adapter suivant vos besoins), et enregistrer les résultats dans le fichier /root/speedtest.csv
    Pensez aussi à modifier les chemins du script et du fichier si besoin

Au bout de quelques minutes, nous aurons donc un fichier contenant plusieurs lignes, chaque ligne représentant un résultat de speedtest
Nous allons maintenant voir comme le lire en PHP

Lecture du fichier CSV

Encore une fois j’ai créé rapidement un petit script PHP pour lire le CSV:

<?php
if (($handle = fopen("/root/speedtest.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        echo $data[3]." => ".$data[6]."\n";
    }
    fclose($handle);
}

?>

Pensez à adapter le chemin du fichier dans le fopen
Ensuite dans un CSV les champs n’ont pas de nom mais des numéros, la première colonne est le numéro 0, la suivante le 1, etc …
Il faut donc passer le numéro de votre choix au tableau $data pour afficher ce qui vous intéresse
Evidemment vous pouvez personnaliser l’affichage, ou insérer les valeurs en base de donnée pour un traitement ultérieur

Au lancement du script vous devriez avoir un résultat de ce genre:

# php test-csv.php
2018-12-15T06:15:02.275776Z => 97088005.20650594
2018-12-15T06:20:01.626602Z => 96987530.59635574

 

Conclusion

Et voila pour les bases de l’utilisation de ce script très intéressant pour Speedtest
Evidemment les possibilités sont infinies et je vous ai juste montré les bases de ce que l’on peut en faire
Je vous laisse jouer avec, et n’hésitez pas à laisser un commentaire si vous avez trouvé une utilisation intéressante de ce script, ou si vous bloquez quelque part 🙂

A lire également