Controller, GlobalDatastore e file

Questa pagina descrive ciò che esce dallo schema « moduli → proprietà → elementi » delle pagine precedenti: i dati del controller, il modulo centrale GlobalDatastore e il file system del server. Un client che si limita a mostrare i moduli non ne ha bisogno; un client che vuole offrire ciò che propone una pagina di parametri globali (configurazioni, driver INDI, carico del server, attrezzatura, immagini) deve gestirli.

I dati del controller (controllerdata)

Il controller è il componente del server che carica i moduli e pilota il server INDI integrato. Espone i propri dati nel dump, sotto la chiave controllerdata (vedi d), poi li mantiene aggiornati con messaggi uc.

ChiaveContenuto
availableconfsConfigurazioni di moduli salvate: oggetto nome della configurazione → elenco di {modulelabel, moduletype, profilename}
currentconfNome della configurazione corrente
bannerBanner del server (testo libero, opzione --banner)
gitVersione del server: Gitdate, Githash, Gitmessage, Gittag
librariesLibrerie di moduli disponibili, un oggetto di metadati per libreria
profilesProfili disponibili: oggetto nome della classe del modulo → elenco di nomi di profilo
indiserver"Y" se il server INDI integrato è attivato, "N" altrimenti
indidriversCatalogo dei driver INDI installati: elenco di {binary, family, label, mdpd}
indiactivedriversDriver INDI attualmente avviati
systemwatcherCarico del server, vedi più avanti
files, foldersCopia di d.files.files e d.files.folders, vedi File system
uc: una chiave per messaggio, valore sostituito in blocco

Un messaggio uc porta una sola chiave di controllerdata, e il suo valore sostituisce interamente quello precedente (nessuna fusione). Un client che legge solo la prima chiave del payload (come fa Rooster) è quindi corretto finché il server invia una sola chiave per messaggio, il che oggi è vero.

systemwatcher: carico del server

Il server misura il proprio carico a intervalli regolari e lo diffonde a tutti i client. L’intervallo si regola con l’opzione --systemwatchinterval (secondi, 10 per impostazione predefinita, 0 disattiva). Il messaggio è un normale uc, e l’ultimo valore è presente anche in controllerdata.systemwatcher del dump.

{
  "uc-update controller data": {
    "systemwatcher": {
      "cpu": { "load_1m": 10.42, "load_5m": 9.79, "load_15m": 4.51 },
      "ram": { "used_mb": 12194, "total_mb": 31941 },
      "disks": [
        { "device": "/dev/nvme0n1p2", "mountpoint": "/", "used_gb": 789.4, "total_gb": 915.3 }
      ],
      "network": [
        { "iface": "enp4s0", "rx_kbps": 16.27, "tx_kbps": 448.8 }
      ],
      "temperatures": [
        { "type": "Tctl", "temp_c": 75.375 }
      ]
    }
  }
}
CampoSignificato
cpu.load_1m / load_5m / load_15mCarico medio del sistema (come /proc/loadavg), non una percentuale di utilizzo: 1.0 = un core saturo in media
ram.used_mb / total_mbMemoria utilizzata (totale − disponibile) e totale, in MB
disks[]Un elemento per dispositivo di archiviazione montato (/dev/*, esclusi i loop): device, mountpoint, used_gb, total_gb
network[]Un elemento per interfaccia (escluso lo): velocità rx_kbps / tx_kbps misurate tra due messaggi; la prima misura di un’interfaccia vale 0
temperatures[]Sensori hardware del processore: type, temp_c. L’elenco può essere vuoto a seconda della macchina (vengono letti solo i sensori Intel coretemp e AMD k10temp)
Non presumere che gli array siano popolati

disks, network e soprattutto temperatures possono essere vuoti. Un client deve nascondere la sezione corrispondente invece di mostrare una tabella vuota. Il protocollo non fornisce il numero di core del server: un indicatore di CPU non può quindi essere una vera percentuale, il valore va mostrato come carico.

Configurazioni e ciclo di vita dei moduli

Una configurazione è un insieme denominato di moduli (libreria, etichetta, profilo) che il server può ricaricare in un colpo solo. L’elenco si trova in controllerdata.availableconfs, la configurazione attiva in controllerdata.currentconf.

AzioneComandoDettaglio
Caricare una configurazioneCLCarica tutti i moduli della configurazione
Salvare la configurazione correnteCSCon il nome indicato
Caricare un moduloMLLibreria, etichetta, profilo facoltativo
Scaricare un moduloMKPer nome del modulo

I moduli effettivamente caricati sono quelli del dump (d.m); compaiono e scompaiono tramite aa e dm. La configurazione non contiene mai GlobalDatastore (vedi sotto), che è sempre presente.

Server INDI e driver

Se controllerdata.indiserver vale "Y", il server pilota un’istanza INDI integrata. I comandi YA/YZ/YL/YR/YS la avviano, la arrestano e gestiscono i driver; controllerdata.indidrivers fornisce il catalogo disponibile e controllerdata.indiactivedrivers ciò che è in esecuzione. binary è il valore da passare come driver in YL, YR e YS.

Il modulo GlobalDatastore

GlobalDatastore è un modulo come gli altri nel dump (d.m.GlobalDatastore, con proprietà, elementi, griglie, profili), ma il suo ruolo è centrale:

  • è creato dal server prima di tutti gli altri moduli ed è sempre presente: MK su di esso viene rifiutato, e non è mai incluso in una configurazione;
  • contiene il riferimento condiviso dell’attrezzatura, che tutti gli altri moduli consultano: ottiche, località, attrezzature (set di dispositivi) e server INDI.

Le sue griglie servono da sorgente per elenchi di scelta (LOV) con lo stesso nome, presenti in d.lovs (optics, locations, equipments, servers) e ricostruiti a ogni modifica della griglia. Gli altri moduli le usano così: scegliere un’ottica compila la focale e il diametro, scegliere una località compila latitudine, longitudine e altitudine, scegliere un set di attrezzature risolve i dispositivi (camera, montatura, focheggiatore, ruota portafiltri, camera di guida, GPS, cupola, meteo) e il server INDI da contattare.

Proprietà esposte:

ProprietàRuolo
devicesSet di attrezzature e GPS selezionati (equipments, gps)
devicesactionsPulsanti: connettere/disconnettere i dispositivi, caricare le configurazioni (condevs, discondevs, loadconfs)
serverHost e porta del server INDI (host, port)
serveractionsPulsanti: connettere/disconnettere il server INDI (conserv, disconserv)
startupCaselle di avvio automatico (indiatstart, devatstart, confsatstart)
equipmentsGriglia dei set di attrezzature
locationsGriglia delle località (icone refresh = leggere il GPS, add = aggiungere la riga corrente)
opticsGriglia delle ottiche
serversGriglia dei server INDI

Tutte le sue proprietà si manipolano con i messaggi standard (SV, SA, GC…, I3/I4 su locations); un client generico le mostra come qualsiasi altro modulo. Rooster le presenta in una scheda dedicata della sua pagina di parametri, mantenendo le proprietà che hanno un profilo (hasprofile) e raggruppandole per level1/level2.

File system

Il server pubblica l’elenco dei file prodotti (immagini, sequenze, archivi) nella cartella --webroot, senza che il client debba interrogarlo. Questo meccanismo è indipendente dai moduli.

Nel dump: d.files

"files": {
  "folders": ["", "/Allsky", "/Sequencer/gam Cyg/LIGHT/Luminance"],
  "files": ["/image1.jpeg", "/rapport.txt"],
  "selectedfolder": "/home/gilles/ostmedia"
}
CampoContenuto
foldersTutte le sottocartelle del webroot, ricorsivamente, percorsi relativi al webroot che iniziano con /. La radice è la stringa vuota "". Non ordinato.
filesI file della sola cartella selezionata (non ricorsivo), percorsi relativi al webroot che iniziano con /. Tutti i file, senza filtro di estensione.
selectedfolderLa cartella selezionata, come percorso assoluto del file system del server (e non relativo).

Non ci sono né paginazione né limite di dimensione: su un webroot molto pieno l’elenco può essere lungo.

Scegliere la cartella: FS

FS indica la cartella di cui si vuole l’elenco dei file. Il server sorveglia una sola cartella alla volta.

La cartella selezionata è globale per il server

Non esiste una cartella per client: un FS cambia l’elenco di file visto da tutti i client connessi (gli eventi seguenti sono diffusi a tutti). Un client non deve usarlo per una semplice navigazione «locale» se altri client possono essere connessi.

Il server non valida il percorso: una cartella inesistente restituisce semplicemente un elenco vuoto, senza errore.

Aggiornamenti: evt

Quando il contenuto della cartella selezionata cambia (file creato, eliminato o rinominato), o dopo un FS, il server invia eventi di primo livello evt:

{ "evt": "fileadd", "fileevent": ["/Sequencer/gam Cyg/LIGHT/Luminance/img_001.FITS"] }
{ "evt": "filedel", "fileevent": ["/rapport.txt"] }
Valore di evtSignificato
fileaddFile apparso/i nella cartella selezionata
filedelFile scomparso/i dalla cartella selezionata
folderadd / folderdelSottocartella creata / eliminata nel webroot (stessa forma, fileevent contiene i percorsi delle cartelle)

fileevent è sempre un array; oggi contiene un solo percorso per messaggio (N file = N messaggi). Dopo un FS, il client riceve un filedel per ogni file della vecchia cartella, poi un fileadd per ogni file della nuova: non c’è alcun messaggio che annuncia il nuovo selectedfolder, che esiste solo nel dump.

A ogni passaggio il server invia inoltre messaggi uc files e folders contenenti gli elenchi completi: un client può quindi applicare gli eventi evt uno per uno, oppure semplicemente sostituire i propri elenchi con questi uc.

Trappola: evt inizia con ev

La regola abituale è confrontare i primi 1 o 2 caratteri della chiave. Ora, evt inizia con ev, il tipo degli aggiornamenti di elemento con metadati, il cui payload è un oggetto e non una stringa. Un client che smista sul prefisso deve verificare l’uguaglianza esatta con evt prima di verificare ev, altrimenti scambierà un evento di file per un aggiornamento di elemento.

Costruire l’URL di un file

I percorsi di files sono relativi al webroot e iniziano con /. L’URL di un file è l’URL di base dei media del server (http(s)://hostname/ostmedia/, vedi la nota « URL media » del Modello dati) seguita dal percorso. Attenzione alla / iniziale: concatenarla a una base che termina già con / dà una doppia //.

Ciò che l’evento non fa

Il server rileva l’aggiunta, l’eliminazione e la ridenominazione di file, non la modifica del contenuto di un file esistente: un’immagine riscritta con lo stesso nome non produce alcun evento. È il caso delle immagini di anteprima dei moduli, il cui URL resta identico a ogni ripresa: un client deve aggiungere un parametro di cache-busting (?t= + marca temporale) quando ricarica un’immagine dopo un aggiornamento della sua proprietà.