Questa storia inizia più o meno così con una innocente telefonata (ndr: i nomi sono stati cambiati perchè volevo una scusa per scrivere che i nomi sono stati cambiati):

> Ciao Angelo, mi serve un UPS con scheda di rete, un 1500VA va bene, cosa mi proponi?
< Uhm fammi vedere, APC come al solito immagino, per quando ti serve?
> Ieri! [...]
< Ok, ok [...], c'è questo disponibile, linea Smart-UPS, prezzo x
> Lo prendo! Fattura a 360 giorni come al solito [:-p] grazie

Ora cosa poteva andare storto con un semplice UPS?
Ecco un’immagine, anzi l’immagine, che vale più di mille parole, più o meno tutte di taglio imprecativo e colorito

apc smartconnect snmp interface

Il problema

Il problema, o almeno l’origine del problema, sono senz’altro io…
Se penso ad un UPS con scheda di rete do per scontato che abbia un’interfaccia web e supporti SNMP.

SBAGLIATO!

APC invece ha pensato bene di, diciamo così, dare un’opzione in più ai suoi clienti: una piattaforma Cloud, chiamata SmartConnect, dove il mio nuovo e fiammante UPS si può registrare e notificare eventi con un deploy praticamente automatico a prova di Zia Nuccia.

Ora tutto ciò è senz’altro un plus per Zia Nuccia, per tutti gli altri invece il simbolino nell’immagine sopra dovrebbe un po’ preoccuparvi.

In pratica zero accesso locale in http/ssh/telnet e no supporto SNMP.
Immagino che la scelta sia allora squisitamente commerciale, un modo per vincolarti all’onnipresente (sigh) modello “as a service” (già solo questo meriterebbe un approfondimento a parte) e vado alla ricerca delle integrazioni supportate su SmartConnect: solo notifiche email, Slack e Teams.
Di un semplice ed efficiente servizio di API per ora nessuna traccia.

La soluzione

La soluzione, come spesso accade, è arrangiarsi con quello che sai e quello che hai: un sito web e i DevTools del browser.
Lasciando per il momento da parte il processo di login che mi ha fatto penare non poco, scopro che una volta autenticato il sito usa degli endpoint REST per recuperare ed aggiornare lo stato del mio UPS:

  • I dati di base e stato di tutti i dispositivi registrati /api/v1/gateways

  • I dati di base e stato del singolo dispositivo /api/v1/gateways/<gateway_id>

  • Stato dettagliato del singolo dispositivo /api/v1/gateways/<gateway_id>?collection=input,output,battery,network,main_outlet,switched_outlets

  • Una sorta di dizionario dei possibili stati ed eventi /api/v1/dictionaries/en

Ognuno di essi restituisce i relativi dati in formato JSON, quindi dai, con la giusta pazienza ed approfittando della calma lavorativa che c’è ad Agosto ce la posso fare!

APC-ScrapConnect

APC-ScrapConnect è il nome che ho dato ad un piccolo script scritto per gestire il login e recuperare i dati.
Il nome mi è venuto spontaneo pensando allo scraping che effettivamente fa per riuscire a fare il login e quanto questo intero processo sia stato una vera “cr*p” da superare.
Dall’URL iniziale all’effettivo login tocca passare attraverso tipo 7 diverse chiamate https ognuna da parsare per cookie e redirect impostati via javascript o per token da usare nella chiamata successiva.
Ma ovviamente questo interessa più me che te, quindi ecco come utilizzarlo direttamente dal manifest

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* Usage:
 *  # Return a basic subset of properties for each device registered on platform
 *      APC-ScrapConnect.php <username> <password> list
 *  # Return log events since datetime(ISO8601 UTC format) for all devices, defaults to last hour
 *      APC-ScrapConnect.php <username> <password> events [datetime]
 *  # Return generic info for supplied device_id
 *      APC-ScrapConnect.php <username> <password> gwinfo <device_id>
 *  # Return detailed status for supplied device_id
 *      APC-ScrapConnect.php <username> <password> gwdetails <device_id>
 *  # Return log events since datetime(ISO8601 UTC format) for supplied device_id, defaults to last hour
 *      APC-ScrapConnect.php <username> <password> gwevents <device_id> [datetime]
 *  # Return SmartConnect platform's dictionary, useful for digging into JSON returned data
 *      APC-ScrapConnect.php <username> <password> dict
 *  # Search for device with provided serialnumber or IP and return a basic subset of properties
 *     Designed for easy integration with Zabbix discovery rules and LLD macro
 *      APC-ScrapConnect.php <username> <password> discovery <device_sn> [device_ip]
 *
 * Output:
 *  JSON string with "Data" and "Error" properties.
 *   "Data" contains actual data retrieved from APC platform
 *   "Error" is set to null in case of success
 */

Ed ecco il link GitHub allo script completo per iniziare ad utilizzarlo

APC-ScrapConnect

Non finisce qui

Forse avrai visto che è presente anche l’opzione discovery che ben si presta per essere integrata con Zabbix, se ti interessa continua a seguirci, cercherò di pubblicare anche un template apposito.