Come monitorare un server Node.js via telnet

Iniziamo col tranquillizzare il lettore: la parola "telnet" nel titolo non deve assolutamente spaventarci. Anche se usiamo Node.js da poche settimane e conosciamo solamente le nozioni rudimentali di JavaScript, siamo sicuramente in grado di trarre vantaggio da una connessione telnet. Questo articolo spiega come procedere passo passo e dovrebbe essere comprensibile anche dai meno esperti. Prima di entrare nei dettagli spieghiamo perche puo risultare conveniente usare una connessione telnet per monitorare un server remoto.

Prova di collegamento

Prova di collegamento

Per collaudare il server realizzato a pagina precedente procediamo nel seguente modo. Innanzitutto eseguiamo il server, lanciando il comando node server.js. Dopodiché, per simulare la connessione del client apriamo un’altra shell (ad esempio un altro prompt dei comandi) che svolgerà il ruolo di client. Per connettere il client al server basterà digitare il comando telnet localhost 5010. Se lavoriamo con Windows dovremmo trovarci in una situazione come quella di figura 1.

telnet_01

Figura 1 – Finestra del server e finestra del client

Dopo esserci connessi possiamo provare a digitare il comando status() su una qualsiasi delle due finestre. In ogni caso il risultato dovrebbe essere il seguente

Se infatti guardiamo al codice di pagina precedente vedremo che abbiamo aggiunto la funzione status alla shell, usando l’istruzione

a questo punto dovremo notare che in realtà abbiamo eseguito un’istruzione di questo tipo due volte, perché abbiamo anche scritto

Questo perché lo snippet di pagina precedente crea due console, ovvero inizializza due shell: una locale e una remota. Quella remota è disponibile solo quando ci colleghiamo da un’altra finestra, usando il protocollo telnet. Quella locale invece è disponibile direttamente sul server, quando eseguiamo lo snippet Node.js. Quest’ultima shell non è strettamente necessaria se vogliamo usare lo snippet per monitorare il server da remoto: l’abbiamo inserita a scopo didattico, per mostrare come cambia il comportamento del modulo REPL quando precisiamo un flusso d’ingresso diverso. Nel nostro caso le due shell si distinguono proprio dal flusso d’ingresso: la shell remota accetta in ingresso la connessione telnet, mentre quella locale accetta in ingresso i dati provenienti dalla tastiera.

Con questo abbiamo finito. Come accennato, la funzione status andrebbe arricchita aggiungendo il codice che vogliamo monitorare. In questo modo possiamo eseguire la funzione status da una qualsiasi macchina remota, esattamente come se fossimo sul server. Come già detto, ai fini della sicurezza, questo è possibile solamente se il server remoto accetta in ingresso connessioni di tipo telnet. Questo aspetto solitamente dipende dalla configurazione del provider: se non abbiamo accesso a tale configurazione la connessione telnet potrebbe essere disabilitata. In altre parole: se non possiamo configurare accessi di tipo telnet, lo snippet di pagina precedente dovrebbe essere del tutto innocuo. Conclusioni

Lo snippet di pagina precedente usa due volte l’oggetto shell ritornato dal modulo “repl”. Ciò significa che l’istruzione di import del modulo, oltre a rendere accessibile il modulo “repl”, si occupa anche di creare l’oggetto che rappresenta la shell, tramite l’istruzione

se guardiamo al codice, vedremo che eseguiamo il metodo start su quest’oggetto due volte: la prima volta per la variabile local, la seconda volta per la variabile remote. Queste due variabili sono quindi “imparentate” perché create eseguendo lo stesso metodo start sullo stesso oggetto shell. Ciò suggerisce che le due shell (locale e remota) non siano indipendenti: possiamo verificarlo creando una variabile da una parte (scrivendo ad esempio “a=12”) e poi visualizzando la stessa variabile dall’altra parte (scrivendo ad esempio “a+2”).

La conclusione è che le due shell sono connesse e quindi permettono di condividere dati e funzioni. È proprio in virtù di questo meccanismo che possiamo monitorare, da una macchina remota, qualsiasi variabile esistente nell’ambiente Node.js. Le potenzialità sono moltissime e vale la pena fare qualche prova: anche se non useremo mai telnet come protocollo per monitorare la macchina remota, è sempre utile essere in grado di verificarne il funzionamento.