Como hacer un speedtest-O-meter

Varias veces en Nación TVNAUTA he mencionado que tengo una máquina haciendo Speedtest (http://www.speedtest.net) desde consola y que se suben a una hoja de cálculo de Google Drive, tutorial que saqué desde Makezine
Yo lo hago con una Raspberry PI B+ y funciona perfecto, salvo que alguna veces no escribe los datos en la hoja de Google, pero estoy buscando como poder saber el porque no sucede. (ya lo solucioné).

Para hacer esto, debemos tener los siguientes ingredientes:

  1. Computador con linux siempre encendido (Raspberry PI en mi caso)
  2. Cuenta en Google Drive a través de tu Gmail (http://www.gmail.com)
  3. Cuenta en IFTTT (http://www.ifttt.com)

En mi caso yo lo hago con el equipo conectado a la red a través de su puerto RJ45 y no de Wi-Fi para así eliminar la pérdida que pudiese existir y además contrasto las mediciones con una gráfica del consumo de banda ancha que tengo con un Cacti (http://www.cacti.net) que habla con el router vía SNMP (tema de otro tutorial).

Una vez que tenemos el sistema operativo instalado, ejecuto el siguiente comando (en Raspbian, el sistema operativo por defecto de las Raspberry Pi)

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

Con lo anterior, se instaló PIP, que e sun manejado de paquetes de Python y luego el paquete de instalación del speedtest en línea de comandos.

A partir de lo anterior, hacemos una prueba:

pi@NetMon:~ $ speedtest-cli
Retrieving speedtest.net configuration…
Retrieving speedtest.net server list…
Testing from CMET (200.112.228.37)…
Selecting best server based on latency…
Hosted by Telefonica Chile (Santiago) [2.04 km]: 22.617 ms
Testing download speed………………………………….
Download: 76.69 Mbit/s
Testing upload speed…………………………………………..
Upload: 4.06 Mbit/s

Listo.. ya tenemos instalado nuestro cliente de speedtest, ahora lo que debemos hacer es que esto funcione con cierta periodicidad; en mi caso cada una hora, y cara eso vamos a usar el comando Cron y generaremos un archivo llamado speedtest-cron.sh usando en mi caso vim

$ vim speedtest-cron.sh

y ahora agregamos adentro lo siguiente:

#!/bin/bash

date >> /home/pi/speedtest.log
/usr/local/bin/speedtest –simple >> /home/pi/speedtest.log 

Ahora que ya tenemos generado el archivo y uno de registro (log), lo llamaremos desde el crontab

$ crontab -e

una vez abierto el crontab, agregaremos lo siguiente:

10 * * * * /home/pi/speedtest-cron.sh 

Este crontab correrá a los 10 minutos de cada hora (no cada 10 minutos) y escribirá el resultado en un archivo llamado speedtest.log

$ cat speedtest.log
Mon Jul 19 17:38:12 GMT 2016
Ping: 23.145 ms
Download: 64.32 Mbit/s
Upload: 3.89 Mbit/s

Ok, esa es la salida del archivo que aún está media ilegible, así que en vez de rehacer todo de nuevo, usaremos las speedtest-cli-extras que hacen el trabajo de hacer todo más entendible para  los scripts que vendrán después.

$ git clone https://github.com/HenrikBengtsson/speedtest-cli-extras.git
$ cd speedtest-cli-extras/bin
$ ./speedtest-csv
2016-07-20 20:41:59;2016-07-20 20:42:43;VTR;201.214.0.39;Claro Chile SA (Santiago);0.45 km;22.166 ms;58.87 Mbit/s;3.79 Mbit/s;http://www.speedtest.net/result/5492007648.png

Aunque esto se ve mucho más desordenado que las líneas anteriores, es un texto que los programas pueden interpretar separando cada campo por el “;” entre ellos.
Ahora viene la parte del IFTTT (significa If Then Do That = Si Pasa Esto, Haz esto Otro). Hablaremos más en profundidad en el programa sobre todo lo que se puede hacer cone este sistema de programación de alto nivel.
Asumiendo que ya tienes la cuenta, debes buscar la receta que habla de Maker y SpeedtestIf Then Do That

Ahora, la magia… vamos a hacer que en vez de escribir la respuesta anterior a un log, haremos que se suba los valores usando la llave secreta que se nos genera al suscribirnos a la receta

https://maker.ifttt.com/trigger/speedtest/with/key/{secret_key}

Ahora, vamos a generar el archivo que llama al speedtest-cli y que toma los valores que se generan, los corta en trozos y sube la información a nuestra hoja de cálculo de Google Drive.

Pueden descargar el archivo en su home o bien escribir lo siguiente en un archivo llamado speedtest-ifttt.sh


#!/usr/bin/env bash
###########################################################
# Originally written by: Henrik Bengtsson, 2014
# https://github.com/HenrikBengtsson/speedtest-cli-extras
# Modified to use IFTTT by: Alasdair Allan, 2015
# License: GPL (>= 2.1) [http://www.gnu.org/licenses/gpl.html]
###########################################################

# Character for separating values
# (commas are not safe, because some servers return speeds with commas)
sep=”;”

# Temporary file holding speedtest-cli output
user=$USER
if test -z $user; then
user=$USERNAME
fi
log=/tmp/$user/speedtest-csv.log

# Local functions
function str_extract() {
pattern=$1
# Extract
res=`grep “$pattern” $log | sed “s/$pattern//g”`
# Drop trailing …
res=`echo $res | sed ‘s/[.][.][.]//g’`
# Trim
res=`echo $res | sed ‘s/^ *//g’ | sed ‘s/ *$//g’`
echo $res
}

# Display header?
if test “$1” = “–header”; then
start=”start”
stop=”stop”
from=”from”
from_ip=”from_ip”
server=”server”
server_dist=”server_dist”
server_ping=”server_ping”
download=”download”
upload=”upload”
share_url=”share_url”
else
mkdir -p `dirname $log`

start=`date +”%Y-%m-%d %H:%M:%S”`

if test -n “$SPEEDTEST_CSV_SKIP” && test -f “$log”; then
# Reuse existing results (useful for debugging)
1>&2 echo “** Reusing existing results: $log”
else
# Query Speedtest
/usr/local/bin/speedtest-cli –share > $log
fi

stop=`date +”%Y-%m-%d %H:%M:%S”`

# Parse
from=`str_extract “Testing from “`
from_ip=`echo $from | sed ‘s/.*(//g’ | sed ‘s/).*//g’`
from=`echo $from | sed ‘s/ (.*//g’`

server=`str_extract “Hosted by “`
server_ping=`echo $server | sed ‘s/.*: //g’`
server=`echo $server | sed ‘s/: .*//g’`
server_dist=`echo $server | sed ‘s/.*\\[//g’ | sed ‘s/\\].*//g’`
server=`echo $server | sed ‘s/ \\[.*//g’`

download=`str_extract “Download: “`
upload=`str_extract “Upload: “`
share_url=`str_extract “Share results: “`
fi

# Standardize units?
if test “$1” = “–standardize”; then
download=`echo $download | sed ‘s/Mbits/Mbit/’`
upload=`echo $upload | sed ‘s/Mbits/Mbit/’`
fi

# Send to IFTTT
secret_key=”SECRET_KEY_HERE”
value1=`echo $server_ping | cut -d” ” -f1`
value2=`echo $download | cut -d” ” -f1`
value3=`echo $upload | cut -d” ” -f1`
json=”{\”value1\”:\”${value1}\”,\”value2\”:\”${value2}\”,\”value3\”:\”${value3}\”}”
curl -X POST -H “Content-Type: application/json” -d “${json}” https://maker.ifttt.com/trigger/speedtest/with/key/${secret_key}

En donde dice secret_key=”SECRET_KEY_HERE”, dejen las comillas.
Ahora, le dan permiso de ejecución y lo ejecutan

$ chmod u+x speedtest-ifttt.sh
$ ./speedtest-ifttt.sh
Congratulations! You’ve fired the speedtest event
$

Ahora vayan a su Google Drive y verán una nueva planilla llamada speedtest

Captura de pantalla 2016-07-31 a las 21.07.34

Yo tengo varios archivos ya que al llegar a los 2.000 registros, automáticamente se genera una planilla nueva.

Captura de pantalla 2016-07-31 a las 21.09.30

 

 

Estas son las columnas que se escriben en el archivo.. yo las agrego a mano, nada complejo, pero es la fecha, latencia (en milisegundos o ms) , la velocidad de bajada en Megabits por segundos (Mbit/s) u luego de subida en la misma magnitud.

Ahora, debemos modificar nuestro speedtest-cron.sh para que al ser ejecutado por crontab cada hora, apunte al nuevo script que generamos

#!/bin/bash
date >> /home/pi/speedtest.log
/home/pi/speedtest-ifttt.sh >> /home/pi/speedtest.log
echo “” >> /home/pi/speedtest.log

Voila!!! ya tenemos nuestro script que generará lo siguiente:

Captura de pantalla 2016-07-31 a las 21.21.32

 

 

 

 

 

Aquí tienen las entradas en su Google “ducks” como diría mi amigo Franco Catrín

 

Este artículo fue escrito en General, Nación TVNAUTA, Trabajo, TVNAUTA. Enlace Permanente.

3 Respuestas a Como hacer un speedtest-O-meter

  1. Pingback: Anónimo

  2. Bien! Creo que voy a trajinar un poco, me intereso el tema, y como el RPI lo tengo con un LAMP (para desarrollo de websites), la salida apuntarla a una base MYSQL, y poder sacar informacion filtrada por varios patrones…. en fin, el bichito programador me esta picando un poco….

  3. Y bueno, ya hice una pequeña interfaz con perl para que grabe la data en una bdd mysql.

Agregar un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *