Los sistemas embebidos suelen ser accedidos de manera remota. Existen distintas técnicas para hacerlo, una forma muy utilizada suelen ser las RESTful APIs. Estas, brindan una interfaz definida y robusta para la comunicación y manipulación del sistema embebido de manera remota. Definidas para un esquema Cliente-Servidor se utilizan en todas las verticales de la industria tecnológica, desde aplicaciones de IoT hasta juegos multijugador.
El objetivo del presente trabajo práctico es que el estudiante tenga un visión end to end de una implementación básica de una RESTful API sobre un sistema embedido trabajando con aplicaciones que se asemejan a la vida profesional, a través de diferentes stacks de lenguajes. El estudiante deberá implementarlo interactuando con todas las capas del procesos. Desde el testing funcional (alto nivel) hasta el código en C y Go del servicio (bajo nivel).
Para realizar el presente trabajo practico, es necesario una computadora con kernel GNU/Linux, ya que usaremos SystemD para implementar el manejo de nuestro servicios.
Se dispone de N sensores de IoT conectados a un servidor escrito en Go el cual recibe de estos una serie de parámetros que se listan a continuación. El servidor cuenta con un servicio de usuarios y el servicio de procesamiento. Cada servicio deberá exponer una REST API con Media Type application/json
[about mediatype] para todas sus funcionalidades y del lado de usuarios, solo permitir la operación a usuarios autentificados.
El servicio debe tener configurado un nginx por delante para poder direccionar el request al servicio correspondiente.
El web server deberá solo responder a dashboard.com
para el servicio de usuarios y sensors.com
para el servicio de procesamiento. Debe retornar 404 Not Found para cualquier otro path no existente con algún mensaje a elección con formato JSON.
A modo de simplificación, usaremos sólo HTTP, pero aclarando que esto posee graves problemas de seguridad.
A continuación, detallaremos los dos servicios a crear y las funcionalidades de cada uno.
Este servicio se encargará de crear usuarios y listarlos. Estos usuarios deberán poder logearse vía SSH luego de su creación. Solo podrán acceder aquellos usuarios autentificados. Y las tareas de cada endpoint usando JWT
Endpoints para la creación de usuario en el sistema operativo:
GET http://{{server}}/api/users/login
POST http://{{server}}/api/users/createuser
Request
curl --request POST \
--url http:// {server}}/api/users \
-u USER:SECRET \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--data '{"username": "myuser", "password": "mypassword"}' \
--authentification jwt
Respuesta
{
"id": 142,
"username": "myuser",
"created_at": "2019-06-22 02:19:59"
}
Endpoint para obtener todos los usuarios del sistema operativo y sus identificadores.
GET http://{{server}}/api/users/listall
Request
curl --request GET \
--url http://{{server}}/api/users \
-u USER:SECRET \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--authentification jwt
Respuesta
{
"data": [
{
"user_id": 2,
"username": "user1",
},
{
"user_id": 1,
"username": "user2"
},
...
]
}
Debe listar un Media Type , application/json
. Con la información de: procesamiento, memoria libre, swap, etc.
POST http://{{server}}/processing/submit
Request
curl --request POST \
--url http://{{server}}/contador/increment \
-u USER:SECRET \
--header 'accept: application/json' \
--header 'content-type: application/json'
Este endpoint permite saber el valor de todos los sensores en promedio.
GET http://{{server}}/processing/summary
Request
curl --request GET \
--url http://{{server}}/contador/value \
-u USER:SECRET \
--header 'accept: application/json' \
--header 'content-type: application/json'
Este endpoint no tiene ningún requerimiento de para logging.
Se deberá proveer los archivos fuente, así como cualquier otro archivo asociado a la compilación, archivos de proyecto "Makefile" y el código correctamente documentado, todo en el repositorio, donde le Estudiante debe demostrar avances semana a semana mediante commits.
También se debe entregar un informe, guia tipo How to, explicando paso a paso lo realizado (puede ser un Markdown). El informe además debe contener el diseño de la solución con una explicacion detallada de la misma. Se debe asumir que las pruebas de compilación se realizarán en un equipo que cuenta con las herramientas típicas de consola para el desarrollo de programas (Ejemplo: gcc, make), y NO se cuenta con herramientas "GUI" para la compilación de los mismos (Ej: eclipse).
El install del makefile deberá copiar los archivos de configuración de systemd para poder luego ser habilitados y ejecutados por linea de comando. El script debe copiar los archivos necesarios para el servicio Nginx systemd para poder luego ser habilitados y ejecutados por linea de comando. Los servicios deberán pasar una batería de test escritas en postman provistas. TBD.
- Dividir el código en módulos de manera juiciosa.
- Estilo de código.
- Manejo de errores
- El código no debe contener errores de staticcheck.
El presente trabajo práctico es individual deberá entregarse antes del viernes 02 de Junio de 2023 a las 23:55 mediante el LEV. Será corregido y luego deberá coordinar una fecha para la defensa oral del mismo.