Checkmk
to checkmk.com
Important

This is a machine translation based on the English version of the article. It might or might not have already been subject to text preparation. If you find errors, please file a GitHub issue that states the paragraph that has to be improved.

1. Introduzione

Livestatus è l'interfaccia più importante di Checkmk. È il modo più veloce per ottenere tutti i dati degli host e dei servizi monitorati, compresi i dati in tempo reale. Ad esempio, i dati della panoramica vengono recuperati direttamente tramite questa interfaccia. Poiché vengono letti direttamente dalla RAM, si evita l'accesso lento al disco rigido, garantendo così un accesso rapido al monitoraggio senza sovraccaricare il sistema.

Per strutturare i dati, questi sono organizzati in tabelle e colonne. La tabella "hosts" include, ad esempio, le colonne "name", " state" e molte altre. Ogni riga nella tabella "hosts" rappresenta un host, la tabella "services" un servizio, e così via. In questo modo i dati possono essere facilmente cercati e recuperati.

Questo articolo dovrebbe aiutarti a utilizzare questa interfaccia per le tue query, estensioni e personalizzazioni. Come utente dell'istanza puoi – utilizzando copia e incolla – testare direttamente tutte le query e i comandi presenti in questo articolo.

2. Il Livestatus Query Language (LQL)

2.1. Usare l'LQL nella shell

L'accesso a Livestatus avviene tramite un socket Unix utilizzando il Livestatus Query Language (LQL). La sua sintassi si basa su HTTP.

Tramite la riga di comando ci sono diversi modi per accedere all'interfaccia. Una possibilità è usare i comandi printf e unixcat per inviare un'istruzione al socket. Lo strumento unixcat è già incluso in Checkmk per l'utente instance. Importante: tutti gli input al socket distinguono tra maiuscole e minuscole, quindi bisogna sempre tenerlo presente:

OMD[mysite]:~$ printf "GET hosts\nColumns: name\n" | unixcat ~/tmp/run/live
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

L'interfaccia richiede che tutti i comandi e le intestazioni siano su una riga separata. Puoi contrassegnare tale interruzione di riga con \n. In alternativa al comando sopra, puoi anche usare il comando di script lq, che ti risparmia un po' di lavoro completando automaticamente alcuni campi durante l'inserimento:

OMD[mysite]:~$ lq "GET hosts\nColumns: name"
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Oppure puoi avviare il flusso di immissione interattivo e inserire il comando seguito dall'intestazione. Con una riga vuota esegui il comando con la sua intestazione, e con un'ulteriore riga l'accesso al socket viene terminato. Nota che nell'esempio, tutto ciò che precede la riga vuota appartiene al comando, e tutto ciò che si trova tra la prima e la seconda riga vuota è la risposta:

OMD[mysite]:~$ lq
GET hosts
Columns: name

myserver123
myserver124
myserver125

OMD[mysite]:~$
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Gli esempi seguenti vengono sempre eseguiti con il comando lq – nel modulo diretto quando la query è breve, e come flusso di immissione per query più lunghe.

Comandi LQL

Nei primi esempi hai già visto il primo dei due comandi: con GET puoi richiamare tutte le tabelle disponibili. Nella guida ai comandi trovi un elenco completo, con una descrizione, di tutte le tabelle disponibili, e questo articolo contiene anche una spiegazione generale sull'uso di Livestatus.

Con COMMAND puoi inviare comandi direttamente al core, ad esempio per impostare un tempo di manutenzione programmata o per disattivare completamente le notifiche. Un elenco di tutti i comandi disponibili si trova comunque nella guida ai comandi alla voce Comandi.

Intestazioni LQL

Per ogni comando GET puoi inserire varie intestazioni per limitare i risultati di una query, per visualizzare solo colonne specifiche di una tabella e molto altro ancora. Di seguito sono riportate le due intestazioni più importanti:

Intestazione Descrizione

Colonne

La query restituirà solo le colonne specificate.

Filtro

Verranno visualizzate solo le voci che soddisfano una condizione specifica.

Qui trovi un elenco di tutte le intestazioni, ciascuna con una breve descrizione.

Mostra colonne e tabelle disponibili

Non sarà possibile ricordare tutte le tabelle e le loro colonne, e l'accesso a questo manuale (con i riferimenti nella versione online) potrebbe non essere sempre possibile. È tuttavia possibile creare rapidamente una query che fornisca le informazioni desiderate. Per ricevere un elenco di tutte le tabelle disponibili, invia la seguente query ed elimina le righe duplicate nell'output con sort. Nell'output puoi effettuare la visualizzazione delle prime quattro righe come esempio:

OMD[mysite]:~$ lq "GET columns\nColumns: table" | sort -u
columns
commands
comments
contactgroups
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Per una query su tutte le colonne di una tabella devi ovviamente specificarle. Sostituisci hosts con la tabella desiderata. Anche qui le prime quattro righe dell'output possono essere oggetto di visualizzazione come esempio:

OMD[mysite]:~$ lq "GET columns\nFilter: table = hosts\nColumns: name"
accept_passive_checks
acknowledged
acknowledgement_type
action_url
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

2.2. Utilizzo di LQL in Python

Dato che Checkmk si basa in gran parte su Python, gli script in questo linguaggio sono molto pratici. Lo script seguente può essere usato come base per accedere al socket Livestatus:

live_example.py
#!/usr/bin/env python
# Sample program for accessing Livestatus from Python

import json, os, socket

# for local site only: file path to socket
address = f"{os.getenv('OMD_ROOT')}/tmp/run/live"
# for local/remote sites: TCP address/port for Livestatus socket
# address = ("localhost", 6557)

# connect to Livestatus
family = socket.AF_INET if isinstance(address, tuple) else socket.AF_UNIX
with socket.socket(family, socket.SOCK_STREAM) as sock:
    sock.connect(address)

    # send our request and let Livestatus know we're done
    sock.sendall(b"GET status\nOutputFormat: json\n")
    sock.shutdown(socket.SHUT_WR)

    # receive the reply as a JSON string
    chunks = []
    while not chunks or chunks[-1] != b"":
        chunks.append(sock.recv(4096))

reply = b"".join(chunks).decode()

# print the parsed reply
print(json.loads(reply))
Copia il contenuto del file negli appunti
Contenuto del file copiato con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

2.3. Utilizzo dell'API Livestatus

Checkmk fornisce anche un'API per il linguaggio di programmazione Python, che semplifica l'accesso a Livestatus. Per questa API è disponibile un codice di esempio che ne spiega l'utilizzo. Puoi trovare questa API su GitHub.

3. Query semplici

3.1. Query su colonne (Columns)

Negli esempi che abbiamo visto finora, sono state interrogate TUTTE le informazioni per TUTTI gli host. In pratica, però, probabilmente ti serviranno solo colonne specifiche. Con l'intestazione Columns già menzionata, l'output può essere limitato a questa colonna. I nomi delle singole colonne saranno separati da un semplice carattere spazio.

OMD[mysite]:~$ lq "GET hosts\nColumns: name address"
myserver123;192.168.0.42
myserver234;192.168.0.73
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Come puoi vedere, in una riga i singoli valori sono separati da un punto e virgola.

Tip

Se si utilizzano queste intestazioni, l'intestazione verrà omessa nell'output. È possibile reinserirla nell'output con l'intestazione ColumnHeaders.

3.2. Impostazione di un filtro semplice

Per limitare la query a righe specifiche, è possibile filtrare le colonne in base a contenuti specifici. Se si desidera cercare solo servizi con uno stato specifico, è possibile farlo con un filtro:

OMD[mysite]:~$ lq "GET services\nColumns: host_name description state\nFilter: state = 2"
myserver123;Filesystem /;2
myserver234;ORA MYINST Processes;2
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Nell'esempio verranno cercati tutti i servizi con stato "CRIT" e verranno visualizzati il nome host, la descrizione del servizio e il suo stato. Questi filtri possono ovviamente essere combinati e limitati ai servizi con stato "CRIT" che non sono ancora stati sottoposti a conferma:

OMD[mysite]:~$ lq "GET services\nColumns: host_name description state\nFilter: state = 2\nFilter: acknowledged = 0"
myserver234;Filesystem /;2
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Come puoi vedere, puoi anche filtrare per colonne che non sono presenti nell'elenco di Columns.

Operatori ed espressioni regolari

Finora sono stati filtrati solo i numeri corrispondenti. Il risultato intermedio di una query può anche essere cercato per "minore di" con numeri o per stringhe di caratteri. Gli operatori disponibili si trovano nel capitolo Operatori nella guida ai comandi. Così puoi, ad esempio, filtrare per espressioni regolari nelle colonne:

OMD[mysite]:~$ lq "GET services\nColumns: host_name description state\nFilter: description ~~ exchange database|availability"
myserver123;Exchange Database myinst1;1
myserver123;Exchange Availability Service;0
myserver234;Exchange Database myinst3;0
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Con l'operatore giusto puoi cercare nelle colonne in vari modi. Livestatus interpreterà sempre un'espressione del genere come "può apparire ovunque nella colonna", a meno che non sia stato definito diversamente. Indica l'inizio di una riga, ad esempio, con il carattere ^, e la fine di una riga con il carattere $. Un elenco completo di tutti i caratteri speciali nelle espressioni regolari di Checkmk si trova nell' articolo dedicato alle espressioni regolari.

3.3. Ordinamento dell’output (OrderBy)

Puoi usare l'intestazione OrderBy per ordinare l'output in base al contenuto di qualsiasi colonna o anche ai valori di qualsiasi chiave del dizionario. Questo ti permette di creare un elenco alfabetico di tutti gli host, ad esempio:

OMD[mysite]:~$ lq "GET hosts\nColumns: name\nOrderBy: name"
ahost
anotherhost
yetanotherhost
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Implicitamente, l'output viene ordinato in ordine crescente (asc) come previsto. Tuttavia, puoi anche specificare esplicitamente l'ordinamento desiderato e invertirlo specificando desc`:

OMD[mysite]:~$ lq "GET hosts\nColumns: name\nOrderBy: name desc"
yetanotherhost
anotherhost
ahost
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Con query leggermente più lunghe e ordinando, ad esempio, i dati sulla performance, è possibile creare interessanti elenchi. Nell'esempio seguente, gli host vengono visualizzati in ordine decrescente in base al loro tempo di attività:

OMD[mysite]:~$  lq "GET services\nColumns: host_name performance_data\nFilter: description = Uptime\nOrderBy: performance_data.uptime desc"
anotherhost;uptime|249531.1
yetanotherhost;uptime|149142.3
ahost;uptime|48959
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

4. Query complesse

4.1. Filtri per gli elenchi

Alcune colonne di una tabella restituiscono non solo un singolo valore, ma un intero elenco di valori. Affinché tale elenco possa essere cercato in modo efficace, in questi casi gli operatori hanno un'altra funzione. Un elenco completo degli operatori è disponibile alla voce Operatori per elenchi. Ad esempio, l'operatore >= ha la funzione "contiene". Con questo potresti, ad esempio, cercare contatti specifici:

OMD[mysite]:~$ lq "GET hosts\nColumns: name address contacts\nFilter: contacts >= hhirsch"
myserver123;192.168.0.42;hhirsch,hhirsch,mfrisch
myserver234;192.168.0.73;hhirsch,wherrndorf
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Come si può vedere nell'esempio sopra, i contatti saranno elencati, separati da virgole, nella colonna contacts. Questo permette di distinguerli chiaramente in modo che non sembrino l'inizio di un'altra colonna. Una caratteristica speciale dell'operatore di uguaglianza è che checka se un elenco è vuoto:

OMD[mysite]:~$ lq "GET hosts\nColumns: name contacts\nFilter: contacts ="
myserver345;
myserver456;
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

4.2. Combinazione dei filtri

Diversi filtri sono già stati combinati in precedenza. Sembrerebbe intuitivo che i dati debbano passare attraverso tutti i filtri per essere visualizzati. I filtri saranno quindi collegati dall'operazione logica "e". Per collegare determinati filtri con un "o" logico, alla fine della stringa del filtro digita "o:" seguito da un numero intero. Il contatore specifica quante delle ultime righe possono essere combinate con un "o". In questo modo è possibile formare gruppi e combinarli come richiesto. Ecco un semplice esempio. Qui vengono combinati due filtri in modo che vengano visualizzati tutti i servizi che hanno lo stato " WARN" o "SCONOSCIUTO":

OMD[mysite]:~$ lq
GET services
Columns: host_name description state
Filter: state = 1
Filter: state = 3
Or: 2

myserver123;Log /var/log/messages;1
myserver123;Interface 3;1
myserver234;Bonding Interface SAN;3

OMD[mysite]:~$
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Il risultato di una combinazione può anche essere negato, oppure i gruppi possono a loro volta essere combinati in altri gruppi. Nell'esempio vengono visualizzati tutti i servizi il cui stato non è OK e la cui descrizione inizia con Filesystem oppure che hanno uno stato diverso da SCONOSCIUTO:

OMD[mysite]:~$ lq
GET services
Columns: host_name description state
Filter: state = 3
Filter: description ~ Filesystem
And: 2
Filter: state = 0
Or: 2
Negate:

myserver123;Log /var/log/messages;1
myserver123;Interface 3;1
myserver234;Filesystem /media;2
myserver234;Filesystem /home;2
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

4.3. Specificare un formato di output

Il formato di output può essere specificato in due modi. Un metodo consiste nel ridefinire i separatori utilizzati nell'output standard. L'altro metodo consiste nell'effettuare l'output in conformità con i formati Python o JSON.

Personalizzazione dicsv

Come già descritto, puoi personalizzare con precisione il formato di output standard csv (minuscolo!) e definire come i singoli elementi devono essere separati l'uno dall'altro. Checkmk riconosce quattro diversi separatori per strutturare i dati. Dopo i due punti, inserisci un valore ASCII standard appropriato in modo che il filtro sia strutturato come segue:

Separators: 10 59 44 124

Questi separatori hanno le seguenti funzioni:

  1. Separatore per i set di dati: 10 (interruzione di riga)

  2. Separatore per le colonne in un set di dati: 59 (punto e virgola)

  3. Separatore per gli elementi in un elenco: 44 (virgola)

  4. Separatore per gli elementi in un elenco di servizi: 124 (barra verticale)

Ciascuno di questi valori può essere selezionato per strutturare l'output come desideri. Nell'esempio seguente le singole colonne di un set di dati sono state separate con un tabulatore (9) anziché con un punto e virgola (59):

OMD[mysite]:~$ lq
GET services
Columns: host_name description state
Filter: description ~ Filesystem
Separators: 10 9 44 124

myserver123     Filesystem /opt     0
myserver123     Filesystem /var/some/path       1
myserver123     Filesystem /home        0
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!
Tip

L'ordine dei separatori è fisso e non può essere modificato.

Modifica dei formati di output

Oltre a generare output in formato csv, Livestatus può anche generare output in altri formati. Questi hanno il vantaggio di essere più facili e puliti da analizzare nei linguaggi di programmazione di livello superiore. Di conseguenza, gli output possono essere codificati nei seguenti formati:

Formato Descrizione

Python

Genera un output sotto forma di elenco compatibile con la versione 2.x. Il testo è formattato in Unicode.

python3

Genera anch'esso un output sotto forma di elenco, tenendo conto delle modifiche nel tipo di dati – ad esempio, la conversione automatica del testo in Unicode.

json

Anche in questo caso l'output verrà generato come elenco, ma verrà utilizzato solo un formato compatibile con json.

CSV

Formatta l'output in conformità con RFC-4180.

csv

Vedi personalizzazione di csv. Questo è il formato standard se non ne viene specificato un altro, ed è basato sul formato CSV ufficiale.

Non confondere l'CSV Format con l'output csv di Livestatus, che viene utilizzato se non è stato specificato alcun formato di output. È quindi assolutamente essenziale rispettare la maiuscola/minuscola. Per la personalizzazione, alla fine specifica OutputFormat invece di Separator:

OMD[mysite]:~$ lq
GET services
Columns: host_name description state
Filter: description ~ Filesystem
OutputFormat: json

[["myserver123","Filesystem /opt",0]
["myserver123","Filesystem /var/some/path",1]
["myserver123","Filesystem /home",0]]
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

5. Come recuperare le statistiche (Stats)

5.1. Introduzione

Ci saranno situazioni in cui non ti interessa lo stato di un singolo servizio o di un gruppo di servizi. Molto più importante è il numero di servizi con uno stato "WARN" (in esecuzione), o il numero di database sottoposti a monitoraggio. Livestatus è in grado di generare e visualizzare statistiche con Stats.

5.2. Numeri

L'Overviewe riceve i dati recuperando le statistiche relative a host, servizi ed eventi tramite Livestatus e visualizzandole nell'interfaccia di Checkmk. Con l'accesso diretto a Livestatus puoi creare il tuo riepilogo personalizzato:

OMD[mysite]:~$ lq
GET services
Stats: state = 0
Stats: state = 1
Stats: state = 2
Stats: state = 3

34506;124;54;20
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

A proposito, queste statistiche possono essere combinate con tutti i filtri.

5.3. Raggruppamento

Le statistiche possono anche essere combinate con l'and/or. Le intestazioni vengono quindi chiamate StatsAnd o StatsOr. Usa StatsNegate se l' output deve essere invertito. Nell'esempio verrà visualizzato il numero totale di host (l'Stats iniziale) e, in aggiunta, l'output includerà il conteggio degli host contrassegnati come stale e che non sono nell'elenco del tempo di manutenzione programmata (le statistiche 2 e 3 sono collegate con un 'AND' logico):

OMD[mysite]:~$ lq
GET hosts
Stats: state >= 0
Stats: staleness >= 3
Stats: scheduled_downtime_depth = 0
StatsAnd: 2

734;23
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Non farti confondere dalle varie opzioni per combinare i risultati dei filtri e delle statistiche. Mentre tutti gli host che soddisfano le condizioni verranno visualizzati con l'intestazione " Filter", con le statistiche l'output sarà la somma di quante volte si applica il filtro "Stats".

5.4. Minimo, massimo, media, ecc.

È anche possibile eseguire calcoli sui valori e, ad esempio, visualizzare un valore medio o un valore massimo. Un elenco completo di tutti i possibili operatori è disponibile qui.

Nell'esempio seguente l'output fornirà un elenco dei tempi medi, minimi e massimi richiesti dai plug-in di controllo di un host per calcolare uno stato:

OMD[mysite]:~$ lq
GET services
Filter: host_name = myserver123
Stats: avg execution_time
Stats: max execution_time
Stats: min execution_time

0.0107628;0.452087;0.008593
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

I calcoli con le metriche vengono handle in modo un po' speciale. Anche qui sono disponibili tutte le funzioni con l'intestazione Stats. Queste vengono però applicate singolarmente a tutte le metriche di un servizio. Ad esempio, nell'esempio seguente verranno sommate le metriche relative all'utilizzo della CPU di un gruppo di host:

OMD[mysite]:~$ lq
GET services
Filter: description ~ CPU utilization
Filter: host_groups >= cluster_a
Stats: sum perf_data

guest=0.000000 steal=0.000000 system=34.515000 user=98.209000 wait=23.008000
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

6. Limitare l'output (Limit)

Il numero di righe in un output può essere limitato intenzionalmente. Questo può essere utile se, ad esempio, vuoi solo vedere se riesci a ottenere una risposta a una query Livestatus, ma vuoi evitare di ottenere un output di più pagine:

OMD[mysite]:~$  lq "GET hosts\nColumns: name\nLimit: 3"
myserver123
myserver234
myserver345
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Tieni presente che questo limite funziona anche quando è combinato con altre intestazioni. Se, ad esempio, con Stat conti quanti host hanno uno stato UP, e limiti l'output a 10, verranno presi in considerazione solo i primi 10 host.

7. Limiti di tempo (Timelimit)

Non solo è possibile limitare il numero di righe da visualizzare, ma anche il tempo massimo che una query può impiegare per l'esecuzione. Questa opzione può impedire che una query Livestatus blocchi una connessione all'infinito se per qualche motivo si blocca. La restrizione temporale specifica il tempo massimo in secondi che una query può impiegare per il processo:

OMD[mysite]:~$ lq "GET hosts\nTimelimit: 1"
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

8. Attivazione delle intestazioni delle colonne (ColumnHeaders)

Con l'opzione "ColumnHeaders" è possibile aggiungere i nomi delle colonne all'output. Normalmente questi vengono omessi per semplificare il processo successivo:

OMD[mysite]:~$  lq "GET hosts\nColumns name address groups\nColumnHeaders: on"
name;address;groups
myserver123;192.168.0.42;cluster_a,headnode
myserver234;192.168.0.43;cluster_a
myserver345;192.168.0.44;cluster_a
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

9. Autorizzazioni (AuthUser)

Se vuoi rendere disponibili degli script in base allo stato di attività (Livestatus), l'utente dovrebbe probabilmente vedere solo i dati per i quali è autorizzato. Checkmk fornisce l'intestazione AuthUser per questa funzione, con la restrizione che non può essere utilizzata nelle seguenti tabelle:

  • columns

  • commands

  • contacts

  • contactgroups

  • eventconsolerules

  • eventconsolestatus

  • status

  • timeperiods

Al contrario, questa intestazione può essere utilizzata in tutte le tabelle che accedono alle tabelle hosts o services. A quali di queste un utente è autorizzato dipende dai gruppi di contatto dell'utente.

In questo modo una query produrrà solo i dati che il contatto è autorizzato a vedere. Nota qui la differenza tra le impostazioni di permesso di strict eloose :

OMD[mysite]:~$ lq "GET services\nColumns: host_name description contacts\nAuthUser: hhirsch"
myserver123;Uptime;hhirsch
myserver123;TCP Connections;hhirsch
myserver123;CPU utilization;hhrisch,kkleber
myserver123;File /etc/resolv.conf;hhirsch
myserver123;Kernel Context Switches;hhrisch,kkleber
myserver123;File /etc/passwd;hhirsch
myserver123;Filesystem /home;hhirsch
myserver123;Kernel Major Page Faults;hhrisch
myserver123;Kernel Process Creations;hhirsch
myserver123;CPU load;hhrisch,kkleber
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

10. Ritardi temporali (Wait)

Con l'intestazione Wait puoi creare query per specifici set di dati senza dover sapere se i prerequisiti per i dati sono stati soddisfatti. Questo può essere utile quando, ad esempio, hai bisogno di dati di confronto per una specifica situazione di errore, ma non vuoi sovraccaricare il sistema in modo continuo e inutile. Le informazioni verranno quindi recuperate solo quando sono davvero necessarie.

Un elenco completo delle intestazioni Wait è disponibile qui.

Nell'esempio seguente verrà visualizzato il servizio "Disk IO SUMMARY" per un server ESXi non appena lo stato del servizio "CPU load" cambia in una specifica CRIT della VM. Con l'intestazione "WaitTimeout", la query verrà quindi eseguita se la condizione non è stata soddisfatta dopo 10000 millisecondi. Questo impedisce che la connessione Livestatus rimanga bloccata per molto tempo:

OMD[mysite]:~$ lq
GET services
WaitObject: myvmserver CPU load
WaitCondition: state = 2
WaitTrigger: state
WaitTimeout: 10000
Filter: host_name = myesxserver
Filter: description = Disk IO SUMMARY
Columns: host_name description plugin_output

myesxserver;Disk IO SUMMARY;OK - Read: 48.00 kB/s, Write: 454.54 MB/s, Latency: 1.00 ms
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Un'ulteriore applicazione consiste nel combinare questo con un comando. Puoi inviare un comando e recuperare i risultati non appena sono disponibili. Nell'esempio seguente vogliamo interrogare e visualizzare i dati attuali di un servizio. Per farlo, prima verrà inviato il comando, poi verrà emessa una query. Questo checka se i dati del servizio Check_MK sono più recenti di quelli presenti in un determinato momento. Non appena la condizione preliminare sarà soddisfatta, verrà visualizzato lo stato del servizio Memory.

OMD[mysite]:~$ lq "COMMAND [$(date +%s)] SCHEDULE_FORCED_SVC_CHECK;myserver;Check_MK;$(date +%s)"
OMD[mysite]:~$ lq
GET services
WaitObject: myserver Check_MK
WaitCondition: last_check >= 1517914646
WaitTrigger: check
Filter: host_name = myserver
Filter: description = Memory
Columns: host_name description state

myserver;Memory;0
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!
Tip

Tieni presente che il timestamp utilizzato in last_check nell'esempio DEVE essere sostituito con uno appropriato – altrimenti la condizione sarà sempre soddisfatta e l'output verrà generato immediatamente.

11. Fusi orari (ora locale)

Molti ambienti di monitoraggio interrogano host e servizi a livello globale. In questi casi si può rapidamente verificare una situazione in cui le istanze di monitoraggio distribuite operano in fusi orari diversi. Poiché Checkmk utilizza il tempo Unix – che è indipendente dai fusi orari – questo non dovrebbe essere un problema.

Se tuttavia un server dovesse essere assegnato a un fuso orario errato, questa differenza può essere compensata con l'intestazione Localtime. Fornisci anche l'ora corrente alla query. Checkmk arrotonderà autonomamente alla mezz'ora successiva e correggerà la differenza. Puoi fornire l'ora automaticamente se esegui la query direttamente:

OMD[mysite]:~$ lq "GET hosts\nColumns: name last_check\nFilter: name = myserver123\nLocaltime: $(date +%s)"
myserver123;1511173526
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Altrimenti fornisci il risultato di date +%s se vuoi utilizzare lo stream di input:

OMD[mysite]:~$ lq
GET hosts
Columns: name last_check
Filter: name = myserver123
Localtime: 1511173390

myserver123;Memory;1511173526
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

12. Codici di stato (ResponseHeader)

Se scrivi un'API, probabilmente vorrai ricevere un codice di stato come risposta, in modo da poter processare meglio l'output. L'intestazione ResponseHeader supporta i valori off (Standard) e fixed16 e, con questi, fornisce un messaggio di stato lungo esattamente 16 byte nella prima riga della risposta. In caso di errore, le righe successive conterranno una descrizione completa del codice di errore. Queste sono quindi molto utili anche per cercare l'errore nei risultati della query.

Il rapporto di stato nella prima riga combina quanto segue:

  • Byte 1-3: Il codice di stato. La tabella completa dei codici possibili è disponibile qui.

  • Byte 4: un semplice carattere spazio (carattere ASCII: 32)

  • Byte 5-15: La lunghezza della risposta effettiva come numero intero. I byte non necessari sono riempiti con caratteri di spaziatura.

  • Byte 16: un avanzamento riga (carattere ASCII: 10)

Nell'esempio seguente eseguiremo una query errata in cui un filtro è in realtà codificato erroneamente con un nome di colonna.

OMD[mysite]:~$ lq "GET hosts\nName: myserver123\nResponseHeader: fixed16"
400          33
Columns: undefined request header
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

In caso di errore, il formato di output è sempre un messaggio di errore in forma di testo. Questo vale indipendentemente da eventuali modifiche che potresti aver apportato.

13. Mantenere attiva una connessione (KeepAlive)

Soprattutto con gli script che stabiliscono una connessione Livestatus attraverso la rete, potresti voler mantenere aperto il canale per risparmiare l'overhead generato dal ripetuto stabilimento della connessione. Puoi farlo con l'intestazione KeepAlive, e in questo modo riuscirai a riservare un canale. A proposito: dopo un comando, una connessione Livestatus rimane sempre aperta. Non è necessario inserire alcuna intestazione aggiuntiva per questo.

Tip

Poiché il canale è bloccato per altri processi per tutta la durata della connessione, può diventare un problema se non ci sono altre connessioni disponibili. Gli altri processi devono quindi attendere fino a quando una connessione non si libera. Nella configurazione standard Checkmk tiene pronte 20 connessioni: aumenta il numero massimo di queste connessioni secondo necessità con Setup > General > Global Settings > Monitoring Core > Maximum concurrent Livestatus connections.

Combina sempre KeepAlive con Response header , per poter distinguere correttamente le singole risposte l'una dall'altra:

OMD[mysite]:~$ lq
GET hosts
ResponseHeader: fixed16
Columns: name
KeepAlive: on

200          33
myserver123
myserver234
myserver345
GET services
ResponseHeader: fixed16
Columns: host_name description last_check
Filter: description = Memory

200          58
myserver123;Memory;1511261122
myserver234;Memory;1511261183
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Assicurati che non ci sia una riga vuota tra la prima risposta e la seconda richiesta. Non appena un'intestazione viene omessa da una query, dopo l'output successivo la connessione verrà chiusa come al solito dalla riga vuota.

14. Recupero dei log

14.1. Panoramica

Con la tabella log in Livestatus hai accesso diretto alla cronologia di monitoraggio del nucleo di monitoraggio, così puoi filtrare comodamente eventi specifici usando l'LQL. Le tabelle di disponibilità, ad esempio, vengono generate con l'aiuto di queste tabelle. Per migliorare la panoramica e restringere una query per argomento, hai accesso alle seguenti classi di log:

Classe Descrizione

0

Tutti i messaggi non coperti da altre classi

1

Avvisi relativi a host e servizi

2

Eventi importanti del programma

3

Notifiche

4

Controlli passivi

5

Comandi esterni

6

Voci di stato iniziali o attuali (ad es. dopo una rotazione dei log)

7

Modifiche allo stato del programma

Semplicemente utilizzando queste classi di log puoi già limitare molto bene il tipo di voce di log da visualizzare. Il periodo di tempo preso in considerazione nella query verrà ulteriormente limitato. Questo è importante perché altrimenti verrebbe cercata l'intera cronologia dell'istanza – il che potrebbe logicamente rallentare notevolmente il sistema a causa del flusso di informazioni.

Un'ulteriore restrizione sensata dell'output sono i (Columns) che devono essere visualizzati per una voce. Nell'esempio qui sotto cercheremo tutte le notifiche che sono state registrate nell'ultima ora:

OMD[mysite]:~$ lq "GET log\nFilter: class = 3\nFilter: time >= $(($(date +%s) - 3600))\nColumns: host_name service_description time state"
myserver123;Memory;1511343365;0
myserver234;CPU load;1511343360;3
myserver123;Memory;1511343338;2
myserver234;CPU load;1511342512;0
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!
Tip

Assicurati che nella modalità interattiva del flusso di voci non sia possibile utilizzare nessuna delle variabili usate nell'esempio, e limita sempre le query a un periodo di tempo.

14.2. Configurazione della cronologia di monitoraggio

È possibile influenzare la rotazione dei file e le loro dimensioni massime. Puoi inoltre specificare quante righe di un file devono essere lette prima che Checkmk interrompa l'operazione. Tutto ciò può influire sulla performance delle tue query, a seconda della struttura dell'istanza. Sono disponibili i seguenti tre parametri, che puoi trovare e personalizzare in Setup > General > Global Settings > Monitoring Core:

Nome Descrizione

History log rotation: Regular interval of rotations

Qui è possibile definire in quale periodo di tempo la cronologia deve essere continuata in un nuovo file.

History log rotation: Rotate by size (Limit of the size)

Indipendentemente dal periodo di tempo, qui si definisce la dimensione massima di un file. La dimensione rappresenta un compromesso tra la velocità di lettura possibile e gli I/O possibili.

Maximum number of parsed lines per log file

Quando viene letto il numero specificato di righe, la lettura del file si interrompe. Questo evita i timeout se, per qualsiasi motivo, un file diventa molto grande.

15. Check della disponibilità

Con la tabella statehist puoi interrogare i dati grezzi sulla disponibilità di host e servizi, e quindi avere accesso a tutte le informazioni utilizzate dalla visualizzazione della disponibilità dell'interfaccia. Inserisci sempre un periodo di tempo, altrimenti verranno cercati tutti i log disponibili, il che può mettere a dura prova il sistema. Si applicano anche le seguenti specifiche aggiuntive:

  • Il periodo di tempo in cui un host/servizio aveva uno stato particolare può essere visualizzato come valore assoluto o come tempo Unix, ma anche come valore relativo e come percentuale del periodo di tempo interrogato.

  • Durante i periodi in cui un host/servizio non è stato sottoposto a monitoraggio, lo stato sarà "-1".

Verificare se, quando e per quanto tempo un host/servizio è stato monitorato è possibile in Checkmk grazie alla registrazione dello stato iniziale. In questo modo non solo puoi vedere quale stato era presente in un momento specifico, ma puoi anche risalire a verificare se in quel momento era effettivamente monitorato. Importante: questa registrazione è attiva anche con un Nagios-Core. Qui però può essere disattivata:

~/etc/nagios/nagios.d/logging.cfg
log_initial_states=0

Nell'esempio qui sotto puoi vedere come appaiono la query di una ripartizione percentuale e i tempi assoluti per un determinato stato. Come periodo di tempo sono state specificate le ultime 24 ore e la query è stata limitata alla disponibilità di un servizio su un determinato host:

OMD[mysite]:~$ lq
GET statehist
Columns: host_name service_description
Filter: time >= 1511421739
Filter: time < 1511436139
Filter: host_name = myserver123
Filter: service_description = Memory
Stats: sum duration_ok
Stats: sum duration_warning
Stats: sum duration_critical
Stats: sum duration_part_ok
Stats: sum duration_part_warning
Stats: sum duration_part_critical

myserver123;Memory;893;0;9299;0.0620139;0;0.645764
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Come recuperare un elenco completo delle colonne disponibili è spiegato più dettagliatamente nella Guida ai comandi.

16. Variabili in Livestatus

In vari punti dell'interfaccia di Checkmk puoi usare le variabili per effettuare assegnazioni basate sul contesto. Alcuni di questi dati sono recuperabili anche tramite Livestatus. Poiché anche queste variabili devono essere risolte, i valori di queste colonne vengono duplicati in una tabella: una volta come voce letterale e una volta con la variabile sostituita dal valore appropriato. Un esempio è la colonna "notes_url", che restituisce un URL con la variabile:

OMD[mysite]:~$ lq "GET hosts\nColumns: name notes_url"
myserver123;https://mymonitoring/heute/wiki/doku.php?id=hosts:$HOSTNAME$
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Se invece, invece di questo, interroghi la colonna note_url_expanded, riceverai il valore effettivo della macro:

OMD[mysite]:~$ lq "GET hosts\nColumns: name notes_url_expanded"
myserver123;https://mymonitoring/heute/wiki/doku.php?id=hosts:myserver123
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

17. Utilizzo di Livestatus tramite rete

17.1. Connessioni tramite TCP/IP

Per accedere a Livestatus tramite la rete, puoi collegare il socket Unix del processo live status a una porta TCP. In questo modo puoi eseguire script su macchine remote e raccogliere i dati direttamente dal luogo in cui devono essere elaborati.

Quando un'istanza è disattivata, l'accesso tramite TCP può essere abilitato con il comando omd:

OMD[mysite]:~$ omd config set LIVESTATUS_TCP on
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Una volta avviata l'istanza, Livestatus via TCP è solitamente attivo sulla porta predefinita 6557. Per i server Checkmk con più istanze che utilizzano Livestatus via TCP, viene scelta la porta inutilizzata immediatamente superiore.

Tutte le impostazioni, come la porta e gli indirizzi IP autorizzati, possono essere configurate tramite omd config. In alternativa, queste impostazioni possono essere effettuate nel Setup. In Checkmk la crittografia SSL della comunicazione Livestatus è abilitata di default:

Livestatus configuration in Setup.
Configurazione di Livestatus in Setup

Test della connessione SSL locale

Livestatus utilizza un certificato generato automaticamente al momento della creazione dell'istanza. Questo certificato si trova nel file var/ssl/ca-certificates.crt insieme a tutti gli altri certificati CA considerati attendibili dall'istanza. Affinché lo strumento da riga di comando openssl s_client possa convalidare il certificato utilizzato dal server Livestatus, questo file deve essere designato come File dell'Autorità di Certificazione.

Abbiamo notevolmente abbreviato l'output della chiamata al comando qui; […​] mostra le omissioni:

OMD[mysite]:~$ openssl s_client -CAfile var/ssl/ca-certificates.crt -connect localhost:6557
CONNECTED(00000003)
Can't use SSL_get_servername
depth=1 CN = Site 'mysite' local CA
verify return:1
depth=0 CN = mysite
verify return:1
---
Certificate chain
 0 s:CN = mysite
   i:CN = Site 'mysite' local CA
 1 s:CN = Site 'mysite' local CA
   i:CN = Site 'mysite' local CA
---
Server certificate
[...]
    Start Time: 1664965470
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Non appena non ci sono più output, puoi eseguire i comandi LQL in modo interattivo e terminare l'interazione con una riga vuota (premi due volte Enter). Se funziona, puoi anche reindirizzare le query Livestatus e utilizzare il parametro aggiuntivo -quiet per sopprimere l'output di debug:

OMD[mysite]:~$ echo -e "GET hosts\nColumns: name\n\n" | \
    openssl s_client -quiet  -CAfile var/ssl/ca-certificates.crt -connect localhost:6557
Can't use SSL_get_servername
depth=1 CN = Site 'mysite' local CA
verify return:1
depth=0 CN = mysite
verify return:1
myserver23
myserver42
myserver123
myserver124
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

L'output che precede i quattro nomi host viene scritto su STDERR dal comando openssl. Può essere soppresso aggiungendo 2>/dev/null.

Accesso remoto a Livestatus

Se accedi a Livestatus da macchine remote, non dovresti usare l'intero elenco di certificati considerati attendibili dall'istanza Checkmk su quelle macchine. Leggi invece il certificato della CA dell'istanza solo dal Setup.

Per farlo, vai su Global Settings > Site management > Trusted certificate authorities for SSL. Qui puoi copiare e incollare il certificato utilizzato dall’istanza CA. Copia il testo completo del primo certificato sotto Content of CRT/PEM file in un file — nel nostro esempio usiamo /tmp/mysite_ca.pem.

Display of the site CA's certificate in the Setup.
Visualizzazione del certificato della CA dell'istanza nella Setup

Se l'host remoto è stato ora abilitato per l'accesso a Livestatus, le query Livestatus tramite script saranno possibili con questo file di certificato:

user@host:~$ echo -e "GET hosts\nColumns: name\n\n" | \
    openssl s_client -quiet  -CAfile /tmp/mysite_ca.pem -connect cmkserver:6557
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Nota: il file del certificato non fornisce l'autenticazione, ma garantisce solo la crittografia del trasporto! La protezione dell'accesso è regolata esclusivamente tramite gli indirizzi IP autorizzati ad accedere alla porta Livestatus.

Livestatus con stunnel

Se vuoi rendere disponibile la porta Livestatus remota crittografata come porta locale non crittografata, puoi usare il programma stunnel.

/etc/stunnel/cmk_myremotesite.conf
[pinning client]
client = yes
accept = 0.0.0.0:6557
connect = <myremotesiteip>:6557
verifyPeer = yes
CAfile = /etc/stunnel/myremotesite.pem

Dopo il riavvio di stunnel, è possibile l'accesso non crittografato alla porta locale.

user@host:~$ echo -e "GET hosts\nColumns: name\n\n" | nc localhost 6557
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

SSL negli script

Se vuoi usare degli script per accedere a Livestatus tramite SSL, evita di usare openssl s_client. Lo scopo principale di questo strumento è testare la creazione della connessione e il debug delle catene di certificati. Per verificare se l'output previsto è completo in caso di errori di connessione, ti consigliamo di valutare l'intestazione della risposta. Un'API ben mantenuta che supporta SSL e la valutazione delle intestazioni è quella per Python, che puoi trovare su GitHub.

17.2. Connessioni tramite SSH

Se è necessario accedere a Livestatus dall'esterno della tua rete locale, la protezione dell'accesso basata esclusivamente sugli indirizzi IP potrebbe non essere pratica. Il modo più semplice per ottenere un accesso autenticato in questo caso è utilizzare Secure Shell.

Con SSH, hai la possibilità di passare un comando che verrà eseguito sul server remoto:

user@host:~$ ssh mysite@myserver 'lq "GET hosts\nColumns: name"'
myserver123
myserver234
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

In alternativa, puoi inoltrare la porta di Livestatus all'host su cui stai lavorando tramite un tunnel SSH:

user@host:~$ ssh -L 6557:localhost:6557 mysite@myserver
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Se la connessione è stata stabilita, in una seconda sessione della console puoi verificare se è possibile accedere con openssl s_client:

user@host:~$ openssl s_client -CAfile /tmp/mysite_ca.pem -connect localhost:6557
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Se questo test ha esito positivo, qualsiasi script che hai scritto per l'accesso diretto alla rete Livestatus può essere utilizzato su localhost.

18. Comandi di impostazione

18.1. Panoramica

Livestatus non serve solo per le query sui dati, ma anche per inviare comandi direttamente al core (CMC o Nagios). Un comando corretto include sempre un timestamp: in realtà può essere qualsiasi cosa tu voglia. Dato che verrà utilizzato anche nei log per tracciare l' ora dell'elaborazione, però, è meglio inserire l'ora nel modo più preciso possibile. I comandi senza timestamp verranno ignorati, senza generare un messaggio di errore , ma solo con una semplice voce nell'cmc.log

Affinché il timestamp sia il più preciso possibile, si consiglia di non impostare il comando nel flusso di input, ma piuttosto di emetterlo direttamente. In tale situazione è possibile anche accedere alle variabili e fornire l'ora attuale:

OMD[mysite]:~$ lq "COMMAND [$(date +%s)] DISABLE_NOTIFICATIONS"
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

Questo formato funziona sia con il Nagios-Core nell'CRE Comunità Checkmk sia con il CMC nelle edizioni commerciali. Nei due core, tuttavia, i comandi si sovrappongono solo in parte. Un elenco completo dei comandi per il Nagios-Core è disponibile direttamente sul sito web di Nagios. I comandi disponibili per il CMC sono riportati nel Riferimento ai comandi.

18.2. Funzionalità speciali in Nagios

CRE Nell'elenco dei comandi la sintassi ha la seguente forma:

#!/bin/sh
# This is a sample shell script showing how you can submit the CHANGE_CUSTOM_HOST_VAR command
# to Nagios.  Adjust variables to fit your environment as necessary.

now=`date +%s`
commandfile='/usr/local/nagios/var/rw/nagios.cmd'

/bin/printf "[%lu] CHANGE_CUSTOM_HOST_VAR;host1;_SOMEVAR;SOMEVALUE\n" $now > $commandfile

Come hai imparato, Checkmk utilizza un formato molto più semplice per l'emissione dei comandi. Per rendere il formato Nagios compatibile con Checkmk, ti servono semplicemente il comando, il timestamp e, se applicabile, le variabili:

OMD[mysite]:~$ lq "COMMAND [$(date +%s)] CHANGE_CUSTOM_HOST_VAR;host1;_SOMEVAR;SOMEVALUE"
Copia i comandi negli appunti
Comandi copiati con successo negli appunti!
L'accesso in scrittura agli appunti è stato negato!

19. File e directory

Percorso Funzione

~/tmp/run/live

La socket Unix attraverso la quale vengono inviati query e comandi.

~/bin/lq

Comando di script per semplificare l'invio di query e comandi al socket Unix in Livestatus.

~/var/log/cmc.log

Il file di log del CMC, in cui, insieme ad altri dati, vengono documentate le query/i comandi.

~/var/check_mk/core/history

Il file di log del CMC, in cui vengono registrate tutte le modifiche che si verificano durante il funzionamento del core – ad esempio, cambiamenti nello stato di un host/servizio.

~/var/check_mk/core/archive/

I file di log dell'historye vengono archiviati qui. Questi verranno letti solo se necessario.

~/var/log/nagios.log

Il file di log di Nagios-Core, in cui, insieme ad altri dati, sono documentate le query/i comandi.

~/var/nagios/archive/

I file di log di history sono archiviati qui. Verranno letti solo se necessario.

~/share/doc/check_mk/livestatus/LQL-examples/

In questa directory puoi trovare una serie di esempi di query Livestatus che puoi provare. Gli esempi si basano sul comando dello script lq – ad es.: lq < 1.lql


Last modified: Tue, 27 Jan 2026 10:58:11 GMT via commit 3d944493f
In questa pagina