domingo, 27 de abril de 2014

Meter Speed ​​Internet downloads (ONO)

Después de pasarme de Movistar a ONO, un día sufrí una pérdida de conexión por la cual ONO no me daba explicación pero que me hizo perder un día de trabajo en casa.

Entonces me surgió la duda de como saber si perdía mi conexión a internet y como poder demostrarle a ONO que llevaba varias horas sin poder trabajar desde casa.

Utilizando mi raspberry pi pude hacer esto. Instalé un Linux, mysql, php, ... y cientos de utilidades más.

Ahora tengo ONO 20 mb de fibra (mixta), pero a veces pienso que la velocidad es menor, si a esto sumamos que no se cuando se me cae la conexión estamos jodidos.

Lo primero que he hecho es intentar determinar a través de la consola en Linux si puedo hacer PING.

ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo 1 || echo 0)
La segunda cosa que tengo que haces es determinar mi IP:
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1
Una vez que sabemos que podemos hacer PING y que hemos obtenida mi IP pública, creo una tabla en mi MySQL para almacenar esos datos:
CREATE TABLE IF NOT EXISTS `T_CHECK_INTERNET` (
  `NCOD_INTERNO` int(11) NOT NULL AUTO_INCREMENT,
  `NCOD_ESTADO` int(11) NOT NULL,
  `IPV4` varchar(15) COLLATE utf8_spanish_ci NOT NULL,
  `DFEC_INICIO` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `DFEC_FIN` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `COUNT` int(11) NOT NULL,
  PRIMARY KEY (`NCOD_INTERNO`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=4 ;

Con esto almacenamos en una tabla, de forma incremental el estado de la conexión, mi ip, la fecha de inicio de la primera vez que se conectó, y la última comprobación. Además contaré las veces que hago la comprobación.

Esta tabla se comprobará cada minuto, pero si hacemos esto, tendremos una tabla llena de filas absurdas cada minuto. Para evitar esto crearé un procedimiento almacenado (así se llama en Oracle) pero en este caso en MySQL.

Este procedimiento se encargará de no repetir filas y actualizar cada minutos solo la columna DFEC_FIN. Así tendré una sola línea por cada conexión buena o mala. Lo entenderéis mas tarde.

DROP PROCEDURE `PRC_INSERT_CHECK_INTERNET`//
CREATE DEFINER=`root`@`localhost` PROCEDURE `PRC_INSERT_CHECK_INTERNET`( IN pestado INT, IN pipv4 VARCHAR(15), IN pinicio DATETIME, IN pfin DATETIME)
BEGIN

DECLARE i_ncod_interno INT; 
DECLARE i_ipv4 VARCHAR(15);
DECLARE i_ncod_estado INT;
DECLARE i_inicio DATETIME;
DECLARE i_fin DATETIME;
DECLARE i_count INT;

SELECT NCOD_INTERNO, NCOD_ESTADO, IPV4, DFEC_INICIO, DFEC_FIN, COUNT 
INTO   i_ncod_interno, i_ncod_estado, i_ipv4, i_inicio, i_fin, i_count
FROM   T_CHECK_INTERNET 
WHERE  NCOD_INTERNO = (SELECT MAX(NCOD_INTERNO) FROM T_CHECK_INTERNET);

UPDATE T_CHECK_INTERNET
SET    DFEC_FIN = pfin,
         COUNT = COUNT + 1 
WHERE  NCOD_INTERNO = i_ncod_interno;

  IF (i_ncod_estado <> pestado) THEN
    INSERT INTO T_CHECK_INTERNET ( NCOD_ESTADO, IPV4, DFEC_INICIO, DFEC_FIN, COUNT ) VALUES ( pestado, pipv4, pinicio, pfin, 1 );
  ELSE
    IF (STRCMP(i_ipv4,pipv4) <> 0) THEN
      INSERT INTO T_CHECK_INTERNET ( NCOD_ESTADO, IPV4, DFEC_INICIO, DFEC_FIN, COUNT ) VALUES ( 2, pipv4, pinicio, pfin, 1 );
    END IF;
  END IF;

commit;

END


El procedimiento es un poco absurdo pero es la forma más fácil.

Una vez hecho esto sólo tengo una línea en la tabla que me indicará el tiempo de conexión desde la primera vez, y si hay una desconexión me aparece otra línea con el tiempo de esa desconexión. Si más tarde vuelve la conexión se vuelve a registrar.
Existen 3 estados:
0 -> Se ha perdido la conexión
1 -> Conexión realizada
2 -> Conexión realizada y se ha cambiado la IP.

Al final obtendré algo como esto:

Ahora creo un script y lo meto en el cron para que ejecute la llamada al script de MySQL con los parámetros como IP, estado, hora, ...

CALL PRC_INSERT_CHECK_INTERNET ( $PING, '$IP_PUBLICA', '$DATE', '$DATE' );
Aquí tenéis el script completo (utilizando un DNS dinámico que claro tuve que instalar):

Descargar

Una vez que tenemos esto, mi estado de conexión y me IP lo que voy a hacer es comprobar mi velocidad de descarga. Para hacer esto la verdad es que he visitado un montón de páginas web para poder hacerlo y creo que lo he conseguido. Os muestro los pasos que he realizado para conseguirlo.

El primer objetivo para poder medir la velocidad de mi conexión es comprobar que efectivamente ONO me da 20mb. Como sabéis no son reales, sino es más o menos un 10%. Por lo tanto rondará lo 18-20 megas de máxima velocidad de descarga.



Una vez que vemos que ONO si me puede ofrecer mi velocidad necesito determinar como funcionan los plugins que se utilizan para comprobar la descarga. En el fondo lo que ocurre es que se descargan a tu PC ficheros desde algún sitio. Nosotros vamos a emular esto descargando ficheros desde sitios que se ofrecen para ello:


# Lista de URLs aleatorias
URLs[1]=http://speedtest1.sea1.speakeasy.net/speedtest/random500x500.jpg
URLs[2]=http://speedtest1.sea1.speakeasy.net/speedtest/random1000x1000.jpg
URLs[3]=http://speedtest1.sea1.speakeasy.net/speedtest/random2000x2000.jpg
URLs[4]=http://speedtest1.sea1.speakeasy.net/speedtest/random3000x3000.jpg
URLs[5]=http://speedtest1.sea1.speakeasy.net/speedtest/random4000x4000.jpg
URLs[6]=http://speedtest1.sfo1.speakeasy.net/speedtest/random500x500.jpg
URLs[7]=http://speedtest1.sfo1.speakeasy.net/speedtest/random1000x1000.jpg
URLs[8]=http://speedtest1.sfo1.speakeasy.net/speedtest/random2000x2000.jpg
URLs[9]=http://speedtest1.sfo1.speakeasy.net/speedtest/random3000x3000.jpg
URLs[10]=http://speedtest1.sfo1.speakeasy.net/speedtest/random4000x4000.jpg
URLs[11]=http://speedtest1.lax1.speakeasy.net/speedtest/random500x500.jpg
URLs[12]=http://speedtest1.lax1.speakeasy.net/speedtest/random1000x1000.jpg
URLs[13]=http://speedtest1.lax1.speakeasy.net/speedtest/random2000x2000.jpg
URLs[14]=http://speedtest1.lax1.speakeasy.net/speedtest/random3000x3000.jpg
URLs[15]=http://speedtest1.lax1.speakeasy.net/speedtest/random4000x4000.jpg
URLs[16]=http://speedtest1.dfw1.speakeasy.net/speedtest/random500x500.jpg
URLs[17]=http://speedtest1.dfw1.speakeasy.net/speedtest/random1000x1000.jpg
URLs[18]=http://speedtest1.dfw1.speakeasy.net/speedtest/random2000x2000.jpg
URLs[19]=http://speedtest1.dfw1.speakeasy.net/speedtest/random3000x3000.jpg
URLs[20]=http://speedtest1.dfw1.speakeasy.net/speedtest/random4000x4000.jpg
URLs[21]=http://speedtest1.chi1.speakeasy.net/speedtest/random500x500.jpg
URLs[22]=http://speedtest1.chi1.speakeasy.net/speedtest/random1000x1000.jpg
URLs[23]=http://speedtest1.chi1.speakeasy.net/speedtest/random2000x2000.jpg
URLs[24]=http://speedtest1.chi1.speakeasy.net/speedtest/random3000x3000.jpg
URLs[25]=http://speedtest1.chi1.speakeasy.net/speedtest/random4000x4000.jpg
URLs[26]=http://speedtest1.atl1.speakeasy.net/speedtest/random500x500.jpg
URLs[27]=http://speedtest1.atl1.speakeasy.net/speedtest/random1000x1000.jpg
URLs[28]=http://speedtest1.atl1.speakeasy.net/speedtest/random2000x2000.jpg
URLs[29]=http://speedtest1.atl1.speakeasy.net/speedtest/random3000x3000.jpg
URLs[30]=http://speedtest1.atl1.speakeasy.net/speedtest/random4000x4000.jpg
URLs[31]=http://speedtest1.nyc1.speakeasy.net/speedtest/random500x500.jpg
URLs[32]=http://speedtest1.nyc1.speakeasy.net/speedtest/random1000x1000.jpg
URLs[33]=http://speedtest1.nyc1.speakeasy.net/speedtest/random2000x2000.jpg
URLs[34]=http://speedtest1.nyc1.speakeasy.net/speedtest/random3000x3000.jpg
URLs[35]=http://speedtest1.nyc1.speakeasy.net/speedtest/random4000x4000.jpg
URLs[36]=http://speedtest1.wdc1.speakeasy.net/speedtest/random500x500.jpg
URLs[37]=http://speedtest1.wdc1.speakeasy.net/speedtest/random1000x1000.jpg
URLs[38]=http://speedtest1.wdc1.speakeasy.net/speedtest/random2000x2000.jpg
URLs[39]=http://speedtest1.wdc1.speakeasy.net/speedtest/random3000x3000.jpg
URLs[40]=http://speedtest1.wdc1.speakeasy.net/speedtest/random4000x4000.jpg
URLs[41]=http://www.testdevelocidad.es/speedtest/random500x500.jpg
URLs[42]=http://www.testdevelocidad.es/speedtest/random1000x1000.jpg
URLs[43]=http://www.testdevelocidad.es/speedtest/random2000x2000.jpg
URLs[44]=http://www.testdevelocidad.es/speedtest/random3000x3000.jpg
URLs[45]=http://www.testdevelocidad.es/speedtest/random4000x4000.jpg
URLs[46]=http://testvsvll2.ono.es/speedtest/random500x500.jpg
URLs[47]=http://testvsvll2.ono.es/speedtest/random1000x1000.jpg
URLs[48]=http://testvsvll2.ono.es/speedtest/random2000x2000.jpg
URLs[49]=http://testvsvll2.ono.es/speedtest/random3000x3000.jpg
URLs[50]=http://testvsvll2.ono.es/speedtest/random4000x4000.jpg
URLs[51]=http://host1.cablexnet.net/host2/speedtest/random500x500.jpg
URLs[52]=http://host1.cablexnet.net/host2/speedtest/random1000x1000.jpg
URLs[53]=http://host1.cablexnet.net/host2/speedtest/random2000x2000.jpg
URLs[54]=http://host1.cablexnet.net/host2/speedtest/random3000x3000.jpg
URLs[55]=http://host1.cablexnet.net/host2/speedtest/random4000x4000.jpg
URLs[56]=http://speedtest.cyberneticos.net/speedtest/random500x500.jpg
URLs[57]=http://speedtest.cyberneticos.net/speedtest/random1000x1000.jpg
URLs[58]=http://speedtest.cyberneticos.net/speedtest/random2000x2000.jpg
URLs[59]=http://speedtest.cyberneticos.net/speedtest/random3000x3000.jpg
URLs[60]=http://speedtest.cyberneticos.net/speedtest/random4000x4000.jpg
URLs[61]=http://speedtest.wdc01.softlayer.com/downloads/test10.zip
URLs[62]=http://speedtest.wdc01.softlayer.com/downloads/test100.zip
URLs[63]=http://speedtest.wdc01.softlayer.com/downloads/test500.zip
URLs[64]=http://london1.linode.com/100MB-london.bin
URLs[65]=http://tokyo1.linode.com/100MB-tokyo.bin
URLs[66]=http://fremont1.linode.com/100MB-fremont.bin
URLs[67]=http://newark1.linode.com/100MB-newark.bin




Actualmente he conseguido encontrar 67 ficheros donde hacer pruebas de descargas, como se pueden ver son ficheros especialmente para ello. La verdad es mi comprobador de descarga dependerá no solo de la velocidad de ONO sino de la velocidad de los servidores.

Como hay 67 URLs no todas serán buenas, así que por cada prueba de download hago una descarga de 5 ficheros e intento que en cada prueba sean diferentes. Utilizo para ello una especie de RANDOM en BASH para seleccionar 5 URLs diferentes cada vez. TO BE CONTINUED
























No hay comentarios:

Publicar un comentario