Esta pequeña aplicación de ejemplo consulta el servicio web, ejem, de la DGT que permite obtener el tipo de distintivo ambiental asociado a una matrícula.
Es posible ejecutarlo en local en dos modos:
- Como línea de comandos.
- Levantando un servidor web, exponiendo ciertos API endpoints.
La CLI ofrece el comando scrap
, incluyendo la posibilidad de personalizar la respuesta con algunos flags:
Scraps all car plates retrieving their ECO sticker, starting in 0000BBB
Usage:
dgt scrap [flags]
Flags:
-F, --from string Plate where to scrap from
-h, --help help for scrap
-p, --persist If the result will be persisted in a data store
-P, --plate string Plate to scrap. It will ignore the 'persist' flag
-U, --until string Plate where to scrap until (included)
Flag | Short version | Type | Default | Requerido | Descripción |
---|---|---|---|---|---|
--from | -F | string | no | Una matrícula válida desde la que empezar el procesado | |
--until | -U | string | no | Una matrícula válida en la que terminar el procesado | |
--persist | -p | boolean | no | no | Si es necesario persistir el resultado en un almacenamiento |
--plate | -P | string | no | Si tiene valor, únicamente se procesará esa matrícula |
Es posible ejecutar la herramienta como una imagen Docker, previa construcción de la misma:
$ docker build -t mdelapenya/dgt:latest .
$ docker run --rm mdelapenya/dgt:latest scrap --plate 9334LSL
$ docker run --rm mdelapenya/dgt:latest scrap
Ésto es útil para saber por qué matrícula vamos:
$ docker run --rm mdelapenya/dgt:latest scrap --from 9334LSL
Ésto es útil para saber por qué matrícula vamos:
$ docker run --rm mdelapenya/dgt:latest scrap --from 0000LSL --until 1000LSL
Es posible ejecutar la herramienta como un stack de Docker Compose, incluyendo el servidor web con el API de matrículas así como una base de datos MySQL para la persistencia de los datos. Además, se levantarán tantos contenedores como letras llevamos en las matrículas (de la B a la M), que ejecutarán en su arranque la CLI para escanear todas las matrículas que comiencen por dicha letra, terminando en la última matrícula de la serie.
```shell
$ docker compose up --build
Accediendo a la base de datos es posible consultar las matrículas procesadas y sus distintivos:
$ docker exec -it dgt-db-1 mysql -u root -ppassw0rd --database=dgt
# retornar todas las matrículas
mysql> select p.plate, s.description, s.emoji from plates p, stickers s where s.sticker_id=p.sticker_id;
# agregar matrículas por distintivo
mysql> select s.description, s.emoji, count(1) as count from plates p, stickers s where s.sticker_id=p.sticker_id group by s.sticker_id;
O utilizando el siguiente script:
./scripts/count.sh
Si necesitas extraer la base de datos, ejecuta el siguiente script:
./scripts/backup.sh
Un fichero SQL se creará en el directorio database/sql
con el nombre 001_dgt.sql
, de modo que si recreas la ejecución desde cero, la base de datos aparecerá pre-cargada.
Importante decir que tendrás que actualizar las matrículas a utilizar en el fichero docker-compose.yml
, para que no se solapen con las que ya están en la base de datos. Lee el siguiente apartado.
Si por alguna razón se queda sin memoria el equipo en el que se ejecuta, puedes ejecutar el siguiente script:
./scripts/oom.sh
Generará un fichero plates.txt
en el directorio actual, con la última matrícula procesada, que puedes usar para reanudar el proceso.
Básicamente, el script hace lo siguiente:
- para todos los servicios menos la base de datos:
$ docker stop dgt-go-j-1 dgt-go-l-1 dgt-go-f-1 dgt-go-h-1 dgt-go-c-1 dgt-go-k-1 dgt-go-m-1 dgt-go-b-1 dgt-go-g-1 dgt-go-d-1
- detecta en qué punto se quedaron cada uno de los servicios:
# ejecuta una consulta en servicio de la base de datos, obteniendo el valor de la última matrícula procesada, en este caso para la letra M
$ docker exec -it dgt-db-1 mysql -u root -ppassw0rd --database=dgt -e "select plate from plates where plate_id=(select plate_id from plates where plate like '____M__' order by plate_id desc limit 1);" >> ./plates.txt
- Coge esas matrículas y cambia el valor del flag
--from
para el servicio de cada letra en el ficherodocker-compose.yml
para que sea la siguiente a la última procesada. - Arranca los servicios de nuevo con
docker compose up
, para que coja los nuevos valores de matrícula desde los que empezar a procesar.
./scripts/restart.sh
GET /plates/:plate
curl "http://localhost:8080/plates/0000bbb"
{"result":"Etiqueta Ambiental C"}
Escribe la matrícula sin guiones ni espacios (0000XXX)