Server RMAP

Analisi funzionalità RMAP

Introduzione

Le funzionalità offerte dal server RMAP (https://rmap.cc) sono implementate usando i seguenti software e servizi (sono elencati solo quelli significativi):

  • Broker AMQP (RabbitMQ) per la distribuzione di dati in tempo reale attraverso un sistema di code, sia da stazione a server che da server a server.

  • Broker MQTT (Mosquitto) per l’invio di dati da stazioni al server.

  • Arkimet per l’archiviazione dei dati storici

  • DB-All.e per l’archiviazione dei dati recenti

  • Una singola applicazione web (Django web framework) che gestisce

    • Sistema di autenticazione

    • Visualizzazione dei dati

    • Registrazione utenti

    • Configurazione di metadati e firmware delle stazioni

    • Inserimento manuale dati e immagini georeferenziati

    • Visualizzazione personalizzata per RainBO

image0

Data ingestion

Il data ingestion riguarda principalmente l’accoglimento di dati da stazioni via MQTT e AMQP. I dati che arrivano via MQTT sono poi inoltrati al broker AMQP, che è il nucleo della movimentazione dei dati all’interno del sistema. I client che devono inviare dati via MQTT o AMQP devono passare da un sistema di autenticazione e autorizzazione, sostanzialmente per garantire che i dati siano inviati solo da utenti autenticati e che non vadano a sovrapporsi a dati altrui. Entrambi i broker interrogano il sistema di autenticazione, un servizio web che implementa gli endpoint richiesti da RabbitMQ e Mosquitto. Il servizio di autorizzazione su AMQP (cioè cosa può pubblicare un utente autenticato) è invece delegato al demone identvalidationd, che prende i dati dalla coda di ingresso dell’utente e passa alla coda di ingestion solo i dati per cui il campo ident è uguale al nome utente. I dati che passano quest’ultimo controllo sono poi inviati:

  • Ad altre code AMQP, ad esempio per forniture esterne o per altri processamenti. Su due di queste code sono inoltrati i dati per il SIMC (archiviati in Arkimet in formato VM2), una per le stazioni delle reti claster e rmap e l’altra per la rete profe.

  • Al database DB-All.e che contiene i dati recenti.

Ci sono inoltre alcuni moduli per l’accoglimento di dati da sorgenti che non usano AMQP o non usano il formato BUFR (e.g. Luftdaten).

image1

Configurazione delle stazioni

Questa funzionalità permette l’aggiornamento della configurazione e del firmware delle stazioni STIMA. L’aggiornamento può essere fatto via HTTP o AMQP, previa autenticazione presso il corrispondente servizio di autenticazione. image2

Registrazione utenti

Questa funzionalità permette di registrare gli utenti attraverso un classico processo di iscrizione: l’utente compila una form e riceve una email per la conferma dell’avvenuta registrazione. Ovviamente, c’è un dialogo con il servizio di autenticazione. image3

Visualizzazione dei dati

Questo servizio permette di visualizzare i dati archiviati (DB-All.e e Arkimet) sia su mappa che su grafico. Non c’è servizio di autenticazione e autorizzazione perchè si presuppone che tutti i dati siano pubblici. Questo sistema è probabilmente necessario per i dati della rete amatoriale e quindi è necessario che il servizio corrispondente di data ingestion sia collegato all’importatore dei dati su DB-All.e e Arkimet. image4

Cosudo

Cosudo permette di analizzare i dati osservati per identificare anomalie, confrontando i dati da stazione con dati radar, satellite e previsti. Inoltre, permette all’operatore di invalidare dei dati: tali invalidazioni sono poi inviate ai sistemi del SIMC per applicarle sull’archivio.

È una applicazione che non necessita di accesso dall’esterno e deve avere a disposizione i dati dall’archivio del SIMC.

Il sistema di autenticazione è necessario poiché, essendo ospitato sul server rmap.cc, deve essere reso privato.

Non è ancora operativo e mancano i flussi di alimentazione dei dati. image5

Inserimento manuale dei dati

Questa funzionalità permette l’inserimento manuale, da parte di operatori, di dati e immagini via HTTP e AMQP. I dati attualmente sono le osservazioni della neve e del tempo (quest’ultimo all’interno del progetto RainBO). Si appoggia al sistema di autenticazione. image6

RainBO

È l’interfaccia per un progetto, che permette la visualizzazione con delle viste personalizzate per i seguenti servizi:

  • Visualizzazione dei dati

  • Inserimento manuale dei dati

  • Registrazione utenti

Interfaccia web

L’accesso da browser al sistema per alcune funzionalità, quali

  • Registrazione utente

  • Configurazione manuale delle stazioni

  • Visualizzazione dati

  • Inserimento manuale di dati

Sono offerte da un sistema monolitico, in cui tutti i vari pezzi sono interconnessi. È possibile separarli, ma è richiesto un intervento non banale sul frontend che può essere eseguito solo a valle dell’organizzazione dei vari pezzi di RMAP su diversi host.

Se una funzionalità usa varie app Django e deve quindi “assemblare” varie interfacce insieme, allora è necessario fare un repository per la singola funzionalità che dipende dalle app Django richieste.

Installazione server completo basato su Rocky Linux 8

Installazione sistema operativo

Installare Rocky Linux 8.

Aggiunta repository e installazione pacchetti

dnf -y install epel-release
dnf install yum-plugin-copr
dnf copr enable simc/stable
dnf copr enable pat1/rmap
dnf config-manager --set-enabled powertools
dnf groupinstall rmap
dnf copr enable simc/cosudo
dnf install python3-django-dynamic-map-borinud
dnf install mosquitto mosquitto-auth-plug
dnf install arkimet
useradd rmap

/etc/selinux/config:

SELINUX=disabled

/etc/tmpfiles.d/rmap.conf

mkdir /rmap
chmod go+rx /rmap

/etc/sysconfig/crond

mkdir /var/log/rmap
chown -R rmap:rmap /var/log/rmap

postgresql

dnf module disable postgresql:10
dnf module enable postgresql:12
dnf install postgresql-server postgresql-contrib
dnf installpython3-psycopg2
postgresql-setup --initdb --unit postgresql

/var/lib/pgsql/data/pg_hba.conf

/var/lib/pgsql/data/postgresql.conf

mkdir /etc/systemd/system/postgresql.service.d/

/etc/systemd/system/postgresql.service.d/rmap.conf

mkdir /rmap/pgsql/
chown postgres:postgres /rmap/pgsql/
mv /var/lib/pgsql/data /rmap/pgsql/

su - postgres
initdb
exit

systemctl enable postgresql.service
systemctl start postgresql.service

su - postgres
createuser -P -e rmapadmin
createdb --owner=rmapadmin rmapadmin
exit

/etc/rmap/rmap-site.cfg

/etc/rmap/dashboard.conf

/etc/rmap/graphTemplates.conf

rmapctrl --syncdb
su - postgres
createuser -P -e rmap
createdb --owner=rmap report_fixed
createdb --owner=rmap report_mobile
createdb --owner=rmap sample_fixed
createdb --owner=rmap sample_mobile

exit

apache

Collect static files from django apps:

mkdir /root/tmp/global_static
rmapctrl --collectstatic
rmdir /root/tmp/global_static

yum install python3-mod_wsgi

useradd -r rmap
mkdir /home/rmap
chown rmap:rmap /home/rmap
mkdir /rmap/cache
chown rmap:rmap /rmap/cache

/etc/httpd/conf.modules.d/00-mpm.conf

/etc/httpd/conf.d/rmap.conf

/etc/httpd/conf.d/rmap.inc

chkconfig httpd on``
service httpd start``

Arkimet

dnf install arkimet arkimet-postprocessor-suite
useradd  -r arkimet
mkdir /home/arkimet
chown arkimet:arkimet /home/arkimet
mkdir /rmap/arkimet/
chown -R arkimet:arkimet /rmap/arkimet/
mkdir /var/log/arkimet
chown -R arkimet:arkimet /var/log/arkimet

/etc/sysconfig/arkimet

/etc/arkimet/scan/bufr_generic_mobile_rmap.py

Replicate structure in:

/rmap/arkimet

systemctl daemon-reload
chkconfig arkimet on
service arkimet start

Mosquitto

mkdir /etc/mosquitto/conf.d
mkdir /rmap/mosquitto
chown mosquitto:mosquitto /rmap/mosquitto

/etc/mosquitto/conf.d/rmap.conf

/etc/mosquitto/aclfile

remove everythings and add in /etc/mosquitto/mosquitto.conf

include_dir /etc/mosquitto/conf.d
pid_file /var/run/mosquitto.pid
touch /etc/mosquitto/pwfile
chkconfig mosquitto on
service mosquitto start

if the package use systemV create:

/etc/monit.d/mosquitto

Rabbitmq

curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash

dnf install rabbitmq-server

/etc/rabbitmq/enabled_plugins

/etc/rabbitmq/rabbitmq-env.conf

/etc/rabbitmq/rabbitmq.config

mkdir -p /rmap/rabbitmq/mnesia/
chown -R rabbitmq:rabbitmq /rmap/rabbitmq
chkconfig rabbitmq-server on
service rabbitmq-server start

login at management interface with user "guest" and password "guest" on overview page use import definition to configure exchange, queue and users with the same management interface remove "guest" user and login with a new real user

Per attivare uno showell:

rabbitmqctl set_parameter shovel report_mobile '{"src-protocol": "amqp091", "src-uri": "amqp://rmap:<password>@rmap.cc", "src-queue": "report_mobile_saved", "dest-protocol": "amqp091", "dest-uri": "amqp://rmap:<password>@", "dest-queue": "report_mobile"}'

problema non risolto: se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta. https://www.rabbitmq.com/shovel-dynamic.html bisognerebbe riuscire a settare "user_id" tramite il parametro "dest-publish-properties" nel formato json sopra ma non funziona

Monit

yum install monit

/etc/monitrc

/etc/monit.d/rmap

chkconfig monit on
service monit start

Sincronizzazione DB da un server

Server di origine

rmapctrl --dumpdata > dumpdata.json

rimuovere le prime righe che non sono json

dbadb export --dsn="mysql:///report_fixed?user=rmap&password=****" > report_fixed.bufr
dbadb export --dsn="mysql:///report_mobile?user=rmap&password=****" > report_mobile.bufr
dbadb export --dsn="mysql:///sample_fixed?user=rmap&password=****" > sample_fixed.bufr
dbadb export --dsn="mysql:///sample_mobile?user=rmap&password=****" > sample_mobile.bufr

Server di destinazione

Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)

rmapctrl --loaddata=dumpdata.json
dbadb import --wipe-first --dsn="postgresql://rmap:***@localhost/report_fixed" report_fixed.bufr
dbadb import --wipe-first --dsn="postgresql://rmap:***@localhost/report_mobile" report_mobile.bufr
dbadb import --wipe-first --dsn="postgresql://rmap:***@localhost/sample_mobile" sample_mobile.bufr
dbadb import --wipe-first --dsn="postgresql://rmap:***@localhost/sample_fixed" sample_fixed.bufr
cd /usr/share/rmap/
rsync -av utente@serverorigine:/usr/share/rmap/media .

Arkiweb

AL MOMENTO NON DISPONIBILE !

dnf install arkiweb

/etc/httpd/conf.d/arkiweb.conf

ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/
Alias /arkiweb  /var/www/html/arkiweb

<Directory "/usr/lib64/arkiweb">
       AllowOverride None
       Options +ExecCGI

       Order allow,deny
       Allow from all

       # ARKIWEB_CONFIG is mandatory!
       SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config


       Require all granted

       # Authentication (optional)
       #
       # Basic authentication example:
       # SetEnv ARKIWEB_RESTRICT REMOTE_USER
       # AuthType Basic
       # AuthUserFile /etc/arkiweb.passwords
       # require valid-user
</Directory>

Alias /arkiwebjs/ /usr/share/arkiweb/public/
<Directory "/usr/share/arkiweb/public">
          #Require all granted
          AllowOverride None

          Order allow,deny
          Allow from all

          Require all granted

</Directory>
mkdir /var/www/html/arkiweb/
cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html

/rmap/arkimet/arkiweb.config

Installazione server solo funzionalità DATA INGESTION basato su Rocky Linux 8

Installazione sistema operativo

Installare Rocky Linux 8.

Aggiunta repository e installazione pacchetti

dnf -y install epel-release
dnf install yum-plugin-copr
dnf copr enable simc/stable
dnf copr enable pat1/rmap
dnf config-manager --set-enabled powertools
dnf install python3-rmap-core
dnf install mosquitto mosquitto-auth-plug
useradd rmap

modificare il file /etc/selinux/config:

SELINUX=disabled

scaricare il file /etc/tmpfiles.d/rmap.conf

mkdir /rmap
chmod go+rx /rmap
mkdir /var/log/rmap
chown -R rmap:rmap /var/log/rmap

scaricare il file /etc/rmap/rmap-site.cfg

cambiare la password dell'utente amministratore.

Mosquitto

mkdir /etc/mosquitto/conf.d
mkdir /rmap/mosquitto
chown mosquitto:mosquitto /rmap/mosquitto

scaricare il file /etc/mosquitto/conf.d/rmap.conf

cancellare tutto il contenuto del file /etc/mosquitto/mosquitto.conf e sostituirlo con le seguenti righe:

include_dir /etc/mosquitto/conf.d
pid_file /var/run/mosquitto/mosquitto.pid
systemctl enable mosquitto
systemctl start mosquitto

Rabbitmq

curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash

dnf install rabbitmq-server

scaricare il file /etc/rabbitmq/enabled_plugins

scaricare il file /etc/rabbitmq/rabbitmq-env.conf

scaricare il file /etc/rabbitmq/rabbitmq.config

Installare il certificato ssl/tls per il dominio del server in:

/etc/arpaecert/arpae_it.pem

e impostare gli opportuni privilegi di lettura/scrittura.

mkdir -p /rmap/rabbitmq/mnesia/
chown -R rabbitmq:rabbitmq /rmap/rabbitmq
systemctl enable rabbitmq-server
systemctl start rabbitmq-server

effettuare il login all'interfaccia di management web: <http://server-fqdn:15672/> con user "guest" e password "guest", quindi utilizzare la funzione "import definition" per caricare exchange, queue e users importando il seguente file:

rabbit_server_data_ingestion.json

dalla stessa interfaccia di management web impostare le password per tutti gli utenti, rimuovere l'utente "guest" e fare login con uno dei nuovi utenti definiti.

Monit

yum install monit

scaricare il file /etc/monitrc

scaricare il file /etc/monit.d/rmap

chmod 0700 /etc/monitrc /etc/monit.d/rmap
chown root:root /etc/monitrc /etc/monit.d/rmap
systemctl enable monit
systemctl start monit

Sincronizzazione file statici per autenticazione e autorizzazione da un server RMAP completo

Server di origine

rmapctrl --exportsha > file.pwd
rmapctrl --exportmqttsha >> file.pwd
rmapctrl --exportmqttacl > aclfile
rmapctrl --exportmqttpsk > file.psk

eventualmente rimuovere le prime righe di messaggistica del logging

Server di destinazione

Trasferire i file in /etc/mosquitto/ sul nostro server per la data ingestion. Imparire il comando:

/bin/systemctl reload mosquitto.service