A mesura que l'associació ha anat actualizant la infraestructura de serveis proveïment d'accés a Internet, s'ha incrementat la complexitat dels elements de suport dels processos d'AAA. Els processos adminstratius de gestió de subscripcions a serveis i d'afiliats a la associació s'han sobrecarregat de tal manera, que ja no és possible una gestió manual directe sobre tots els components que hi intervenen.
## Descripció del sistema de proveïment
L'element central del sistema de proveïment és un _Border Network Gateway_ (BNG). Aquest element està format per un servidor L2TP i PPPoE que proporciona connexions PPP als CPE dels subscriptors. Aquests dispositius poden accedir al BNG a través d'una xarxa L3 (Guifi.net) o bé de circuits L2 (bitstreams).
Per tal de centralitzar els processos d'AAA, comptem amb un servidor RADIUS amb registres basats en una base de dades relacional. De moment, només implementem processos d'_Autentication_ i d'_Access_. L'_Accounting_ no està previst que sigui implementar a curt termini.
Les implementacions amb que comptem són a la taula següent:
Vegeu més detalls en aquest [document](https://farga.exo.cat/exo/projectes/src/branch/master/2024-1-bitstreams/access-services-bitstreams.md#definici%C3%B3-de-serveis-finals-i-portadors).
FreeRADIUS consulta en primer lloc la taula _radcheck_ per verificar que el password transferit pel CPE (MS-CHAP/CHAP) és correcte. En el mateix moment, envia al NAS (BNG) els atributs necessaris:
```
attribute = Framed-IP-Address
attribute = Delegated-IPv6-Prefix
attribute = NAS-Port-Id
```
Aquests valors són a les taules _radreply_ segons consultes creuades a d'altres taules (_radgroupreply_, _radusergroup_). Hem de tenir en compte que aquestes taules registren els circuits de provisió no de les persones subscrites.
# Requeriments de SIMPLEX
Es plantega la implementació d'un programri que permeti integrar les actuals funcions de gestió de circuits de provisionament (connexions PPP) amb funciones extra orientades a gestionar els perfils de persones afiliades a l'associació. Es planteja doncs:
* Afegir un registre de dades personals de persones afiliades
* Afegir un registre de serveis (p.ex: Basic Radio, Sarenet Competitive, EXtra IPv4, etc.)
* Les funcions fonamentals que caldrà implementar són:
- Afegir/eliminar/modificar nova persona afiliada, afegir/eliminar nou servei
- Afegir/eliminar/modificar circuit de provisionament: credencials, IPv4/IPv6
- Obtenir llistes d'afiliacions i d'alres dades relacionades amb el servei subscrit
- Obtenir dades sobre l'estat de les connexios (BNG)
- Enviar missatges de control de la connexió (DAE server)
- Autenticar, autoritzar i gestionar els comptes dels administradors dels serveis
La solució ha de permetre una alta integració dels diferents agents, és a dir, les aplicacions que puguin dur a terme totes o un group de les funcions esmentades i els elements existents (BNG, RADIUS, SQL). També ha de permtre una gran modularitat i distribució en xarxa.
# Proposta de disseny
Atés que tots els elements existents basen el seu funcionament amb crides de socket (xarxa) i es requereix una alta integració, proposem el desenvolupament de:rest api authentication ssh key
* Una REST API que implementi les crides accessibles pels agents (aplicacions)
* Un agent basat en text orientat a administradors avançats i que permeti iteracions de desenvolupament assumibles (relativament curtes)
* Un agent basat en web orientat a adminitradors básics i/o avançats
El següent esquema descriu l'arquitectura general de la solució SIMPLEX:
L'intercanvi de missatges HTTP s'especifica amb un _media type_ tipus JSON. Aquest format és genèric i cal
definir el format del contingut d'aquest tipus de missatges. L'API inclou una sèrie de controladors que gestionen les estructures de dades en format JSON.
### Carrier
La declaració de variables de l'endpoint _Carrier_ és:
```
PATH = /carrier/<CarrierId::Integer>
MEDIA_TYPE = application/json
DATA_STRUCT = {
"id": <CarrierId::Integer>,
"name": <CarrierName:String>,
"data": <OptionalCarrierData::Json>,
"structure": <SpxDataScheme::TRBEx>
```
En aquest cas, el camp `structure` defineix les dades personalitzades del servei portador que presta el carrier.
### Transport
La declaració de variables de l'endpoint _Transport_ és:
```
PATH = /transport/<TransportId::Integer>
MEDIA_TYPE = application/json
DATA_STRUCT = {
"id": <TransportId::Integer>,
"data": <SpxDataScheme::TRBEx>,
"carrierId": <CarrierId::Integer>
}
```
### Estructures de dades de serveis portadors
Les següents definicions es poden aplicar a les estructures de dades vinculades als serveis portadors: