60
UNIVERSITÀ DEGLI STUDI DI TRIESTE FACOLTÀ DI INGEGNERIA CORSO DI LAUREA IN INGEGNERIA INFORMATICA TESI DI LAUREA IN INGEGNERIA INFORMATICA SISTEMI DI AUTOMAZIONE DEI MESSAGGI DI ALLARME PER IL MONITORAGGIO DELLA RETE REGIONALE DELLA SANITÀ Relatore: Laureando: Prof. Fulvio Sbroiavacca Michele Sinigoi

Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

  • Upload
    maiko

  • View
    209

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

UNIVERSITÀ DEGLI STUDI DI TRIESTE

FACOLTÀ DI INGEGNERIACORSO DI LAUREA IN INGEGNERIA INFORMATICA

TESI DI LAUREA

IN

INGEGNERIA INFORMATICA

SISTEMI DI AUTOMAZIONE DEI MESSAGGI DI ALLARME PER IL MONITORAGGIO DELLA RETE REGIONALE DELLA SANITÀ

Relatore: Laureando:Prof. Fulvio Sbroiavacca Michele Sinigoi

Correlatore:Ing. Fabio Del Torre

ANNO ACCADEMICO 2011/2012

Page 2: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità
Page 3: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

Indice1. Premessa 5

2. Analisi dell’ ambiente 6

2.1. La rete regionale 6

2.2. Introduzione ad HP OpenView 7

2.3. Progettazione dello script 11

3. Descrizione dello script 14

4. Manutenzione 21

4.1. File di log della gerarchia 21

4.2. File con indirizzi email e dati SMSMachine/XML 22

4.3. Spostamento festività e orari di reperibilità 23

4.4. Cambiamento indirizzo SMTP del server di posta 23

5. Aggiunta di un nuovo nodo da monitorare 24

5.1. Creazione dei nuovi file 24

5.2. Modifica dei nuovi file 24

5.3. Creazione dei nuovi eventi da Event Configuration di HP OpenView 25

6. Configurazione SMSMachine/XML 28

7. Conclusioni 30

7.1. Analisi dei risultati e stato attuale 30

7.2. Quantificazione del lavoro svolto 30

7.3. Breve conclusione soggettiva 31

8. Appendice 32

8.1. Mappa della gerarchia 32

8.2. Script di livello gerarchico alto 32

8.3. Script di livello gerarchico medio 36

8.4. Script di livello gerarchico basso 41

8.5. Script per il ritorno up del nodo 46

8.6. Script di chiamata da HP OpenView 46

9. Ringraziamenti 47

Page 4: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità
Page 5: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

1. Premessa

La seguente tesi si occuperà di descrivere il concepimento, la progettazione, la realizzazione e il funzionamento di uno script in linguaggio Perl creato per il programma di monitoraggio HP OpenView.Il programma viene utilizzato per il monitoraggio dei nodi di una rete, in questo caso Insiel S.p.A. si prende cura della rete regionale dei servizi, che include la rete della sanità, degli enti locali e della regione.Da una mappa interattiva creata dal gestore del programma all’ interno dell’ azienda, sono visualizzati i nodi della rete, i quali raggruppano al livello inferiore altri nodi appartenenti ad una stessa area geografica suddivisi a loro volta in uno specifico ambito (sanità, enti locali e regione) e un colore ne descrive lo stato attuale (verde: tutti i nodi e sottonodi di quella rete sono attivi, azzurro: almeno un nodo è inattivo, giallo: più di un nodo è inattivo, arancio: tutti i nodi tranne uno sono inattivi e rosso: tutti i nodi sono inattivi).I nodi sono un qualsiasi elemento in grado di inviare trap snmp (ad esempio router e switch) che tramite SPC (servizio di pubblica connettività) portano la rete dei servizi fino all’ utente finale.HP OpenView permette la configurazione degli eventi che genera la rete, modificando questi è stato possibile associare ad ogni nodo da monitorare scelto secondo determinate caratterisitche uno script utile alla tempestiva risoluzione dell’ eventuale problema.Lo script in Perl serve ad allertare nel modo più rapido possibile un addetto del mancato funzionamento di un nodo tramite l’ invio di un messaggio di allarme, ovviamente questo tipo di controllo verrà eseguito solo sui nodi fondamentali della rete come sono quelli degli ospedali regionali e sui POP, che forniscono il collegamento alla rete a tutti gli altri nodi. Il tipo di messaggio che viene inviato può essere una email e/o un sms, l’invio dell’ sms è stato possibile grazie al collegamento di una SMSMachine/XML provvista di sim card direttamente al server su cui è installato HP OpenView.L’ elaborato si propone pertanto di descrivere brevemente il funzionamento e la strutturazione della rete regionale, le caratteristiche di HP OpenView al fine di poter essere in grado di realizzare nel migliore dei modi uno script utile sia all’ azienda che all’ utenza finale (le strutture i cui nodi sono monitorati). Nell’ ultima parte verrà descritto lo script in Perl vero e proprio per l’ invio dei messaggi di allarme.

5

Page 6: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

2. Analisi dell’ ambiente

2.1. La rete regionale

La Rupar è la rete regionale del Friuli Venezia-Giulia, si occupa di connettere tra loro le sedi pubbliche di regione (SIAR), sanità (SISR) ed enti pubblici (SIAL).A differenza della vecchia Rupar, basata su linee in rame a 34 Mbps, che connetteva i nodi principali e poi si diramava verso i nodi secondari, con relativa perdita di prestazioni; per la nuova Rupar è stata indetta una gara per l’ assegnazione dell’ appalto, la quale ha portato alla costruzione di una rete in fibra ottica da 100 Mbps, la nuova rete ha una struttura gerarchica con cinque POP, di cui solo due attivi per ora, situati a Trieste e ad Amaro, ai quali si collegano dei MiniPOP che fungono da nodi di distribuzione per collegare e fornire accesso alla rete ad ospedali, scuole e comuni.La differenza principale in termini di costi, riguarda il collegamento, ora vi è un unico collegamento verso il POP da parte del MiniPOP, mentre prima se ne aveva uno per ogni ente (SIAR, SISR e SIAL), il passaggio verso la nuova Rupar che si sta compiendo si basa sul progetto Hermes, il quale prevedeva la realizzazione degli scavi per la fibra ottica e la realizzazione dei POP e dei MiniPOP.La vecchia e la nuova Rupar coesistono nel processo di trasferimento, infatti alcuni collegamenti non ancora migrati arrivano direttamente ai POP di Trieste ed Amaro per poter usufruire dell’ accesso a internet; in precedenza si avevano collegamenti punto a punto e tutto il traffico in uscita verso internet veniva gestito dai POP, che si occupavano di fungere da filtro e da firewall; ora non esiste più questo tipo di collegamenti bensì si sfrutta l’ SPC (servizio di pubblica connettività), sarà il provider infatti a veicolare il percorso dei pacchetti all’ interno della sedi di Insiel secondo le specifiche passate dall’ azienda, potendo monitorarne il traffico e gli eventuali problemi; è buona norma installare dei router in uscita dai centri per poter tenere traccia del traffico generato e intervenire in caso di problemi, si utilizzerà un programma per il monitoraggio che si occuperà del controllo del traffico della rete regionale.Oltre al collegamento delle sedi di regione, sanità e enti locali, la rete regionale si occupa di fornire punti di accesso per i residenti in regione, in quanto ci sono luoghi dove è difficile portare fisicamente la linea (come paesi di montagna difficilmente raggiungibili) o dove non è conveniente cambiare la linea già presente (paesi con pochi abitanti). Il progetto che si occupa di fornire la connettività a queste persone è denominato PASI, all’ interno di uno spazio comunale, come può essere una biblioteca o un luogo di pubblico accesso viene fornita una postazione con dei personal computer e una stampante, il cui numero varia a seconda delle necessità del luogo e della

6

Page 7: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

capacità del collegamento fisico della rete.Un altro progetto basato sulla rete regionale dei servizi è il PACS, che si occupa della condivisione in rete di materiale medico, come possono essere radiografie o risonanze, ovvero immagini che producono un volume di traffico in rete elevato essendo file di svariati megabyte di peso. La consultazione di questi file deve essere possibile da ogni ospedale anche in simultanea da più operatori se necessario, viene quindi ad essere richiesta la piena efficenza della rete.Per poter garantire la funzionalità della rete e la risoluzione dei problemi che si possono venire a creare in qualsiasi momento Insiel si affida al programma di monitoraggio HP OpenView, che si occupa del controllo, tramite informazioni visive e creazione di report giornalieri e mensili riguardanti ogni nodo monitorato.

2.2. Introduzione ad HP OpenView

Il software HP OpenView è una delle applicazioni di monitoraggio più usate; si occupa del controllo di reti, permettendo tramite l’ utilizzo di mappe, sulle quali disporre i propri nodi, che sono gli elementi in grado di inviare trap snmp e un sistema di allarmistica in grado di individuare immediatamente e visivamente la sorgente del problema.Oltre al monitoraggio della rete, è possibile creare dei report sull’ utilizzo della rete per controllare i nodi che occupano più banda e quelli sulle cui tratte si riscontrano il maggior numero di errori; i report vengono inviati a cadenza giornaliera e mensile via email asseime a grafici di semplice interpretazione.

Lo splash screen all’ apertura del programma.

Nel nostro caso il programma monitora l’ intera rete regionale dei servizi, la quale comprende le reti della sanità, ovvero tutti gli ospedali, le centrali operative del 118 e i centri specializzati presenti in regione; la rete regionale, che comprende le strutture della regione Friuli Venezia-Giulia; e la rete degli enti locali: scuole, biblioteche, il progetto PASI e altri enti comunali.

7

Page 8: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

Il server su cui è installata il software si trova ad Amaro che è uno dei due POP da cui passa la maggior parte del traffico della rete (l’ altro POP si trova nella sede di Insiel a Trieste) pertanto si presta perfettamente allo scopo di monitorare lo stato dei nodi collegati alla rete.

La schermata principale del programma con i nodi principali.

I nodi sono raggruppamenti di router e switch configurati dall’ utente, che forniscono il collegamento alla rete in una determinata zona o struttura, infatti si può navigare all’ interno di questa mappa e cliccando su ogni nodo si aprirà lo schema dei collegamenti in cascata al nodo principale.

8

Page 9: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

I nodi raggruppati sotto al nodo principale SISR TS.

I nodi che vengono visualizzati sono apparati contenenti interfacce collegati a loro volta ad altri apparati; e reti con un proprio indirizzo ip a cui saranno collegati dei terminali a seconda delle esigenze.

9

Page 10: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

Le reti e gli switch collegati al nodo della sanità triestina.

Il programma ci permette inoltre di tenere sotto controllo ogni porta degli apparati collegati alla rete, è possibile selezionarli tutti, ma è decisamente più conveniente monitorare solo quelli a cui sappiamo essere collegati dei dispositivi di interesse.

10

Page 11: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

L’ interfaccia dello swtitch con le porte monitorat in verde se attive.

Abbiamo visto che ogni aspetto dei dispositivi della rete è monitorabile da HP OpenView, il programma comprende una funzione che suddivide le varie tipologie di allarme sia esso un errore, un superamento della soglia, un errore di configurazione o di stato. Attraverso un browser dedicato si può costantemente rimanere aggiornati su qualsiasi cosa avvenga all’ interno della rete regionale. Visivamente il programma modifica i colori dei nostri nodi se si verifica qualche problema, infatti se il colore verde ci indica l’ assenza di problemi su quel nodo, e su tutti i sottonodi collegati al primo; l’ azzurro il indica che almeno un dispositivo facente riferimento a quel nodo non funziona, può essere che non sia raggiungibile dalla rete o che abbia dei problemi specifici lui stesso; il giallo mostra che più di un dispositivo non è raggiungibile; il colore arancione indica che un unico dispositivo è funzionante e raggiungibile; mentre il colore rosso indica l’ assenza di collegamento verso il nodo.

2.3. Progettazione dello script

Il nostro obbiettivo è quello di poter avvertire tempestivamente il personale incaricato del monitoraggio della rete degli eventuali problemi su dei nodi cardine, come possono essere quelli degli ospedali o dei nodi principali (i POP) sfruttando gli allarmi generati dal programma. Ci viene fornita infatti la

11

Page 12: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

possiblità dallo stesso di poter associare ad ogni evento l’ esecuzione di uno script in linguaggio Perl, che viene ad essere lanciato una volta che sul browser degli allarmi compare quello del nodo da monitorare.Il messaggio che si vuole inviare deve brevemente informare su che nodo o nodi sono irraggiungibili in quel momento per facilitare la ricerca di dove si trovi effettivamente il problema, viene aggiunta inoltre l’ ora in cui si verifica per poter eventualmente tenere una statistica.Avendo già scelto il linguaggio di programmazione da utilizzare, aiutati in questo da HP OpenView stesso, bisogna decidere le modalità per allertare il reperibile; nel nostro caso oltre alle email è stato possibile utilizzare a supporto anche gli sms, grazie al collegamento di una SMSMachine/XML alla macchina su cui è installato HP OpenView. L’ utilizzo degli sms è stato pensato proprio per la necessità di poter intervenire immediatamente sui nodi monitorati essendo particolarmente importanti come quelli ospedalieri o che forniscono la connessione alla rete a tutti gli altri nodi della regione; gli sms verranno mandati solamente in un orario definito di reperibilità, mentre le email verranno sempre inviate in caso di irragiungibilità di un nodo, in quanto sempre tenute sotto controllo dal responsabile. Per poter inviare le email è stato necessario installare sulla macchina dei moduli aggiuntivi in grado di gestire mittente, indirizzo smtp, soggetto e contenuto del messaggio; mentre per la comunicazione dello script con la SMSMachine/XML vengono inviate richieste HTTP con metodo POST verso l’ indirizzo ip a cui è collegata, specificando il nodo interessato dal problema così da facilitarne la ricerca immediata.Come abbiamo potuto vedere la rete regionale ha una sua precisa gerarchia, dove in alto si trovano i POP, che forniscono il collegamento a tutti i nodi di livello inferiore (SISR per quanta riguarda la parte sanitaria dei collegamenti), i quali a loro volta si occuperanno di collegare le strutture ospedaliere della regione. Non è possibile mantenere la gerarchia con la versione di HP OpenView installata sul server, si voleva però in ogni caso evitare di ricevere i messaggi di allarme per ogni nodo nel caso in cui non fosse raggiungibile il nodo più alto nella gerarchia (il POP di Amaro) in quanto tutti i nodi sottostanti sarebbero stati visti dal server come irraggiungibili essendo il server stesso privo di connessione. Per evitare ciò ci si è serviti di file di testo (.txt) su cui far scrivere lo script di livello più alto e da far leggere a quelli inferiori, i quali vedendo il nodo di gerarchia alta anch’ esso down avrebbero lasciato mandare solo a lui il messaggio di allarme. Bisogna inoltre integrare la scrittura dell’ orario in cui viene scritto il file (lo stesso in cui avviene il problema e viene avviato lo script).Dobbiamo tenere conto di eventuali problemi momentanei della rete, che possono durare pochi secondi/minuti i quali si risolvono immediatamente e non necessitano certamente di un intervento da parte del reperibile (soprattutto se avvengono in piena notte), si sfrutterà nuovamente la possibilità di associare uno script ad un evento fornita dal programma di

12

Page 13: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

monitoraggio, useremo in questo caso l’ evento di ritorno up di un nodo, e anche ora sfrutteremo la scrittura di un file di testo da parte di entrambi gli script, nodo down e nodo up; che congiunta all’ utilizzo di un timer il quale prima della lettura del file di supporto, ve ne sarà uno per ogni nodo, farà attendere lo script per un determinato lasso di tempo e nel caso in cui il problema si risolva sarà lo script di ritorno up a scrivere sul file e quindi bloccare l’ invio dei messaggi di allarame.Abbiamo visto quali sono le problematiche da affrontare nella realizzazione dello script, nel prossimo capitolo se ne analizzerà la struttura, si vedrà come integrarlo nel programma di monitoraggio e cosa fare per la sua manutenzione; vedremo inoltre come configurare la SMSMachine/XML per l’ invio degli sms.

13

Page 14: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

3. Descrizione dello script

Lo script è stato pensato per poter inviare automaticamente email e sms ad una o più persone reperibili, quando uno dei nodi monitorati non viene più rilevato dal programma di monitoraggio HP OpenView; si viene ad avere la necessità di poter evitare che il cliente (in questo caso ospedali, sedi del 118 e nodi di rete principali) percepisca dei disservizi intervenendo immediatamente per correggere il problema, nasce così l’ idea dell’ invio di email e sms per poter avvertire tempestivamente il personale operativo atto al controllo dei nodi. Per fare questo si utilizza la possibilità data dal programma stesso di associare ad un evento il lancio di uno script in linguaggio Perl; si deve pertanto prima creare l’ evento e successivamente associargli lo script adeguato.La rete che viene ad essere monitorata presenta dei nodi che differiscono per importanza gerarchica (si veda la mappa nell’ appendice), abbiamo i POP a livello più elevato, da cui dipendono poi tutti gli altri nodi in cascata; è stato quindi necessario creare tre script differenti a seconda del livello del nodo da monitorare, inoltre è stato creato uno script per il ritorno in funzione di un nodo, anche in questo caso và associato ad un particolare evento su HP OpenView, appoggiandoci ad un file che viene ad essere modificato e consultato dagli script. I diversi livelli gerarchici sono stati introdotti per poter evitare l’ invio di allarmi per dei nodi dipendenti da nodi a livello più alto che in quel momento non sono raggiungibili rendendoli a loro volta irraggiungibili. A fronte di un problema di livello gerarchico elevato non si invieranno messaggi di allarme anche per i nodi sottostanti poiché tale problema è causato dal nodo più alto in gerarchia.Per evitare al NNM (Network Node Manager, ovvero HP OpenView) un carico di lavoro eccessivo e il rischio di conflitto tra i diversi script scatenati nello stesso istante si è dovuti ricorrere ad uno script di chiamata atto a far partire lo script vero e proprio, così da rendere immediatamente disponibili le risorse del programma. La gerarchia si viene ad ottenere grazie alla creazione da parte degli script di file di testo (gerarchia_nomenodo.txt), su cui viene automaticamente aggiornato lo stato del nodo, assieme alla data e ora in cui avviene il down. Lo script di livello più alto non si preoccuperà di andare a controllare se dei nodi sotto di lui sono down, ma si limiterà ad aggiornare il suo file e spedire gli allarmi (se non torna in funzione entro un tempo stabilito nel qual caso esce dallo script poiché il problema è stato immediatamente risolto); i nodi di livello gerarchico intermedio dopo aver aggiornato il proprio file controlleranno che il nodo superiore da cui dipendono non sia anch’ esso down (da meno di un tempo prefissato) nel qual caso lasceranno al suo script l’ incombenza di mandare i messaggi d’ allarme; infine i nodi di livello gerarchico più basso non avendo altri nodi dipendenti da loro si limiteranno a controllare il file del nodo superiore e solo nel caso in cui questo non risulti down procederanno con l’

14

Page 15: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

invio degli allarmi.Gli allarmi sono costituiti da email e sms, per l’ invio delle email si utilizzano delle librerie del linguaggio Perl, in particolare la MIME::Lite, a cui vanno forniti soggetto della email, messaggio, indirizzo smtp, mittente e ricevente. È possibile inviare il messaggio di allarme a più riceventi e per questo viene messo a disposizione un file (indirizzi.txt) dal quale lo script estrarrà gli indirizzi di chi si vuole informare. Per l’ invio degli sms si utilizza una SMSMachine/XML che configurata opportunamente con il suo file di configurazione xmlconfig (vanno inseriti indirizzo ip, gateway, net mask e numero di telefono della sim interna) può ricevere tramite HTTP con metodo POST i dati da spedire via sms. L’ invio degli sms è circoscritto a determinati orari e giorni modificabili direttamente dagli script (ore notturne, week end, festività).Tramite la configurazione degli eventi in HP OpenView è possibile associare uno script sia quando il nodo monitorato va down sia quando ritorna up. Nel caso in cui un nodo riscontri un down temporaneo (inferiore ai 5 minuti) il personale non viene allertato, verranno inviati invece gli opportuni messaggi di allarme in caso di irraggiungibilità prolungata del nodo. Si utilizza quindi un altro file (log_nomenodo.txt) su cui viene segnata data e ora in cui si verifica l’ irraggiungibilità, si fà quindi attendere lo script un tempo prefissato, al termine del quale se il file non viene aggiornato dall’ evento di nodo up si fanno partire gli allarmi necessari. L’ evento nodo up scriverà lo stesso file di log includendo data e ora di ritorno up del nodo.Illustriamo ora lo script vero e proprio nel caso in cui un nodo sia irraggiungibile dal programma di monitoraggio, prendiamo come esempio uno script di gerarchia intermedia, poiché possiede i metodi propri sia del nodo superiore che di quello inferiore.

#! /usr/bin/perl -wuse Fcntl qw(SEEK_END);use warnings;use MIME::Lite;use Net::SMTP;use HTTP::Request::Common;use LWP::UserAgent;use Date::Parse;

Questi sono i metodi necessari al funzionamento dello script, alcuni sono già presenti in Perl altri come MIME::Lite e LWP::UserAgent vanno installati come librerie. Per installare una nuova libreria su macchina windows, da riga di comando digitiamo “perl –MCPAN –e shell” si accede così alla shell di installazione per nuovi moduli; a questo punto basta digitare “install nomemodulo” (ad es. install MIME::Lite) per poter usufruire della libreria desiderata.

my $STOP = '0';exit if ($STOP);

Le due righe superiori servono a non far partire lo script se è necessaria una

15

Page 16: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

manutenzione, ponendo la variabile $STOP uguale a 1 lo si blocca.

my $gerlog_sisr = 'C:\Program Files\HP OpenView\log\allarmi_script\gerarchia_POPTS.txt';my $time = localtime;open( GER, '>>', $gerlog_sisr ) or die "Non riesco ad aprire $gerlog_sisr"; print GER "\n";print GER "$time POPTS DOWN"; close GER;

Si scrive sul file di gerarchia indicato data e ora in cui il nodo viene indicato non raggiungibile, servirà ai file di gerarchia più bassa per controllare che il problema del loro non funzionamento non sia a livello superiore.

sleep 120;

Facciamo attendere lo script 120 secondi per dar tempo al programma di monitoraggio di trovare altri eventuali nodi down.

my $gerlog_pop = 'C:\Program Files\HP OpenView\log\allarmi_script\gerarchia_POPAmaro.txt'; open( GER, '<', $gerlog_pop ) or open( GER, '>>', $gerlog_pop );my $tiempo = localtime(0);print GER $tiempo;close GER;

Lo script và a vedere il file di gerarchia di livello superiore, se non è presente perché non ha mai avuto problemi di raggiungibilità dovremo crearlo impostando come data e ora della prima riga Thu Jan 1 01:00:00 1970 (successivamente si fà un controllo su data e ora per stabilire se mandare gli allarmi o lasciare al nodo superiore l’ incombenza). Nello script di livello più elevato non avremo questa parte poiché deve occuparsi solo di avvertire i nodi di livello inferiore.

open( GER, '<', $gerlog_pop );my $gr = -s $gerlog_pop;my $last;my $off = 256;while( ! defined( $last ) ){ $off = $gr if $off > $gr; seek( GER, -$off, SEEK_END ) or warn "Ricerca fallita!"; my @rows = <GER>; if( @rows > 1 ){ $last = $rows[ -1 ]; } elsif( $off >= $gr ) { $last = $rows[ 0 ]; } else { $off += 256; }}

In questa sezione andiamo a ricercare nel file di gerarchia di livello superiore l’ ultima riga (assicurandoci che sia l’ ultima anche in caso di file con una sola riga).

16

Page 17: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

$now = time();$date = substr ($last,0,24);$mod = str2time($date);if ($mod+600 >= $now){print "il nodo a livello superiore è down, invierà lui i

messaggi di allarme";}

Si estrae dall’ ultima riga la prima parte relativa a data e ora, a cui sommiamo 10 minuti ($mod+600 ) e si confronta con la data e ora attuale per controllare che non sia già il nodo superiore a occuparsene.

else {my $file = 'C:\Program Files\HP OpenView\log\allarmi_script\log_POPTS.txt';my $time = localtime;open( LOG, '>>', $file ) or die "Non riesco ad aprire '$file'"; print LOG "\n";print LOG "$time\n";print LOG "NODO DOWN\n";close LOG;

Se sul file di gerarchia superiore non si riscontra un messaggio che indica l’ irraggiungibilità, si aggiorna il file di log del nodo e si procede con l’ invio dei messaggi di allarme.

sleep (300);

Facciamo aspettare lo script 5 minuti per evitare che in caso di ritorno up del nodo in un tempo inferiore a quello indicato si mandino i messaggi di allarme inutilmente.

open( LOG, '<', $file ) or die "Non riesco ad aprire '$file'";my $size = -s $file;my $found;my $offset = 256;while( ! defined( $found ) ){ $offset = $size if $offset > $size; seek( LOG, -$offset, SEEK_END ) or warn "Ricerca fallita!"; my @lines = <LOG>; if( @lines > 1 ){$found = $lines[ -1 ];

} elsif( $offset >= $size ) {$found = $lines[ 0 ];

} else {$offset += 256;

}}if( $found eq "NODO UP"){print "NODO UP: tutto normale\n";

Come nel caso precedente ma sostituendo le variabili all’ interno del metodo andiamo a controllare che l’ ultima riga del file non presenti la frase “NODO UP” nel qual caso lo script termina la sua esecuzione.

} else {($sec,$min,$ore,$giom,$mese,$anno,$gios,$gioa,$oraleg) =

17

Page 18: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

localtime(time);if ((($ore > 8) && ($ore < 18)) &&(($gios < 6) && ($gios > 0)) &&($gioa != 0) && #1 gennaio($gioa != 5) && #6 gennaio($gioa != 114) && #pasquetta($gioa != 114) && #25 aprile($gioa != 120) && #1 maggio($gioa != 152) && #2 giugno($gioa != 226) && #15 agosto($gioa != 304) && #1 novembre($gioa != 341) && #8 dicembre($gioa != 358) && #25 dicembre($gioa != 359) #26 dicembre

Con questo if controlliamo di non trovarci all’ interno di ore o giornate (week end e festività) nelle quali e necessario l’ invio oltre che dell’ email anche dell’ sms.

) {open( INDIRIZZI , 'C:\Perl\bin\indirizzi.txt') or die

("Non riesco ad aprire il file in lettura\n");@email_to = split(/ /, <INDIRIZZI>);

Apriamo il file contenente gli indirizzi email a cui dovremo mandare gli allarmi.

my ($node, $alert, $time, @indirizzi_email) = @ARGV;$time = localtime;if (!($node && $alert && $time)){die ("Fornire valori per nodo, tipo di allerta e ora!\n

Nodo=$node\n Tipo di allerta=$alert\n Ora=$time\nAssicurarsi che gli indirizzi email siano inseriti

correttamente");}

Vanno forniti al programma indirizzi email validi, nome del nodo (passato tramite script di chiamata) e ora in cui avviene il problema.

my $mess = ("$time | $node | $alert");@indirizzi_email = (@indirizzi_email, @email_to);foreach my $indirizzi (@indirizzi_email) {my $from = '[email protected]'; my $smtp = '193.42.84.142';my $sub = 'Controllare '. $node .' !'; $msg = MIME::Lite->new(From => $from,To => $indirizzi,Subject => $sub,Type => 'multipart/mixed'

)or die "Errore nella creazione del contenitore: $!\n";$msg->attach (Type => 'TEXT',Data => $mess

)or die "Errore nell aggiungere il testo: $!\n";MIME::Lite->send('smtp',$smtp, Timeout=>60, Debug => 1);$msg->send;

}close INDIRIZZI;}

18

Page 19: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

Per ognuno degli indirizzi email presenti nel file segnalato si invia lo stesso messaggio di allarme indicante data e ora, nome del nodo e tipo di allerta.

else {

Se ci troviamo in un giorno o orario non lavorativo, dovremo inviare oltre alla email anche un sms, per farlo utilizziamo una richiesta HTTP con metodo POST da inviare all’ indirizzo ip della SMSMachine/XML, siccome l’ indirizzo ip può essere modificato (ad esempio se viene modificata fisicamente la posizione della SMSMachine), lo facciamo leggere allo script da un file di testo esterno assieme al numero del reperibile a cui mandare il messaggio. Nella richiesta HTTP va inoltre aggiunta la password del programma di configurazione dell’ SMSMachine/XML.

open( SMSMACHINEDATA , 'C:\Perl\bin\SMSMachinedata.txt') or die ("Non riesco ad aprire il file in lettura\n");

my @data = split(/ /, <SMSMACHINEDATA>);my $numero = $data[0];my $ipSMSMachine = $data[1];my $post = 'http://'. $ipSMSMachine .'/smssend.cgi';my $ua = LWP::UserAgent->new;$ua->request (POST $post, [ num => $numero

text => 'Controllare POPTS !', mode => 'mode = 0', Pwd => 'SMS1234',

]);close SMSMACHINEDATA;open( INDIRIZZI , 'C:\Perl\bin\indirizzi.txt') or die ("Non riesco ad aprire il file in lettura\n");@email_to = split(/ /, <INDIRIZZI>);my ($node, $alert, $time, @indirizzi_email) = @ARGV;$time = localtime;if (!($node && $alert && $time)){die ("Fornire valori per nodo, tipo di allerta e ora!\n

Nodo=$node\n Tipo di allerta=$alert\n Ora=$time\nAssicurarsi che gli indirizzi email siano inseriti

correttamente");}my $mess = ("$time | $node | $alert");@indirizzi_email = (@indirizzi_email, @email_to);foreach my $indirizzi (@indirizzi_email) {my $from = '[email protected]';my $smtp = '193.42.84.142';my $sub = 'Controllare '. $node .' !'; $msg = MIME::Lite->new(From => $from,To => $indirizzi,Subject => $sub,Type => 'multipart/mixed'

)or die "Errore nella creazione del contenitore: $!\n";$msg->attach (Type => 'TEXT',Data => $mess

)or die "Errore nell aggiungere il testo: $!\n";MIME::Lite->send('smtp',$smtp, Timeout => 60, Debug => 1);$msg->send;}

19

Page 20: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

close INDIRIZZI;}}close LOG;

}

Dopo aver spedito l’ sms si spedisce l’ email utilizzando lo stesso metodo visto in precedenza, questo per avere comunque traccia dell’ allarme nel caso in cui l’ sms non dovesse arrivare.Vediamo ora lo script che viene eseguito quando un nodo ritorna raggiungibile.

#! /usr/bin/perl -wuse strict;use warnings;my $file = 'C:\Program Files\HP OpenView\log\allarmi_script\log_POPTS.txt';my ($sec,$min,$ore,$giom,$mese,$anno,$gios,$gioa,$oraleg) = localtime(time);open( LOG, '>>', $file ) or die "Non riesco ad aprire '$file'"; print LOG "\n";print LOG scalar localtime;print LOG "\n";print LOG "NODO UP"; close LOG;

Definiamo il file su cui si và a scrivere quando viene fatto partire lo script, si apre quindi il file in “append” cioé quello che si va a scrivere lo si scrive come ultima riga non sovrascrivendo le altre; verranno scritti data e ora e “NODO UP”.Infine vediamo lo script che associato all’ evento di HP OpenView: nodo down richiama lo script principale.

#! /usr/bin/perl -wuse warnings;exec("perl C:\\Perl\\bin\\POPTS.pl.txt POPTS DOWN!");

La funzione exec() richiama lo script principale e non attende che sia concluso, così da liberare subito le risorse per il programma di monitoraggio, si passano inoltre il nome del nodo e il tipo di allarme da inserire nelle email.

20

Page 21: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

4. Manutenzione

Il seguente capitolo riguarderà le operazioni da svolgere per il mantenimento di un corretto funzionamento dello script e di quelle neccessarie se si desidera aggiungere un nuovo nodo da monitorare, con un’ eventuale modifica alla gerarchia dei nodi, la quale non viene implementata tramite HP OpenView, ma attraverso la scrittura di file da parte dello script stesso.Passiamo ora all’ analisi vera e propria delle operazioni da compiere, i percorsi in cui si trovano i file fanno riferimento al server sul quale è installato HP OpenView sito ad Amaro di proprieà Insiel S.p.A.È consigliabile mentre si eseguono interventi di manutenzione mettere a 1 la variabile $STOP che si trova nelle prime righe di programma, così da evitare che una chiamata allo script in quel momento non crei problemi, finite le operazioni di manutenzione la si riporti a 0.

La variabile $STOP da modificare.

4.1. File di log della gerarchia

Se si vuole modificare la posizione dei file di log della gerarchia, che si trovano attualmente in C:\Program Files\HP OpenView\log\allarmi_script\ bisognerà in ogni singolo script modificarne il percorso, sia per il nodo stesso (se di gerarchia media o alta) sia per il nodo di livello superiore verso cui si va a fare il controllo (se si è in uno script di nodo medio o basso). Anche il file di log di ogni singolo nodo è presente nella stessa cartella, in questo caso basta modificare il percorso una volta sola all’ interno dello script, si dovrà però modificare lo stesso percorso anche nel corrispettivo file associato all’ evento nodo up (il nome dei file di questo tipo iniziano con up).

21

Page 22: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

Cartella contenente i file di gerarchia e di log.

4.2. File con indirizzi email e dati SMSMachine/XML

I file con all’ interno gli indirizzi email e i dati della SMSMachine/XML si trovano in C:\Perl\bin\ anche in questo caso se si vogliono spostare basta sostituire il vecchio indirizzo all’ interno dello script, stando attenti a farlo due volte per il file contente gli indirizzi e una volta per il file con i dati dell’ SMSMachine/XML. Se si vogliono modificare i dati all’ interno del file per quanto riguarda le email (indirizzi.txt) gli indirizzi vanno inseriti su singola riga, separati da uno spazio; il programma non fa il controllo sulla regolarità dell’ indirizzo inserito pertanto controllare attentamente che gli indirizzi esistano.Per quanto riguarda il file contente i dati della SMSMachine/XML ( SMSMachinedata.txt) all’ interno è presente prima il numero telefonico della sim card presente all’ interno della SMSMachine/XML e poi separato da uno spazio l’ indirizzo ip a cui è collegata la macchina.

Impaginazione dei dati all’ interno dei file indirizzi.txt e SMSMachinedata.txt.

22

Page 23: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

4.3. Spostamento festività e orari di reperibilità

Lo script principale è stato pensato per mandare gli sms se si è in un giorno di festa (Natale, Pasqua, 1° Maggio,...) o in orario notturno (dalle 18 alle 8) così da poter garantire il funzionamento dei servizi collegati ai nodi. Viene eseguito un controllo con un if sull’ ora in cui appare il messaggio di nodo down e sui giorni di festività che sono variabili definite come “giorno dell’ anno” (da 0, il primo gennaio, a 364 o 365 se l’ anno è bisestile); per modificare le ore e le date bisognerà aprire i file di ogni nodo con un editor di testo e modificare le variabili.

Il punto in cui vanno modificate le variabili.

4.4. Cambiamento indirizzo SMTP del server di posta

Nel caso in cui si dovesse modificare l’ indirizzo ip del server di posta, lo script di ogni nodo va modificato in due punti, ovvero quelli in cui lo script deve mandare una email. Va modificata la variabile $smtp.

Per modificare l’ indirizzo ip del server SMTP andiamo a modificare la variabile $smtp, l’ operazione va fatta in due punti distinti del

programma.

23

Page 24: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

5. Aggiunta di un nuovo nodo da monitorare

5.1. Creazione dei nuovi file

Se si vuole aggiungere un nuovo nodo da monitorare bisogna anzitutto vedere a che livello di gerarchia si deve porre. Se il nodo non dipende da nessun altro (come per il caso del POP di Amaro) allora si dovrà aprire con un editor di testo lo script di un nodo con livello di gerarchia alto, copiarne il contenuto in un nuovo file rinomindandolo nuovonodo.pl.txt; le stesse operazioni verranno eseguite se la gerarchia del nuovo nodo è di livello intermedio o basso. Una volta copiato il file dello script principale bisognerà eseguire le stesse operazioni di copia e creazione per i file dell’ evento di nodo up e per il file di chiamata dello script principale in HP OpenView, si dovranno avere alla fine di queste operazioni altri due file di testo: upnuovonodo.pl.txt e cnuovonodo.pl.txt. Per questi due file la gerarchia del nodo non è da considerare in quanto svolgono in ogni caso le stesse operazioni a qualsiasi livello gerarchico.

5.2. Modifica dei nuovi file

I nuovi file vanno ovviamente modificati all’interno dello script per quanto riguarda i percorsi dei file di gerarchia (se necessari) e di log del nuovo nodo, devono essere fatti creare al nuovo nodo dei file diversi rispetto a quelli del nodo da cui lo script è stato copiato. Vanno modificati gli indirizzi del nodo superiore (se presente) verso il quale lo script effettuerà i controlli e l’ indirizzo del file di gerarchia che il nuovo nodo và ad aggiornare.

I percorsi da modificare in nuovonodo.pl.txt.

Deve inoltre essere modificato il file di log, questa operazione va svolta sia sul file nuovonodo.pl.txt sia su upnuovonodo.pl.txt.

24

Page 25: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

Il percorso da modificare su nuovonodo.pl.txt.

Il percorso da modificare su upnuovonodo.pl.txt.

Sul file cnuovonodo.pl.txt che verrà associato all’ evento node down di HP OpenView, va indicato il percorso dello script principale.

Indichiamo il percorso del file nuovonodo.pl.txt.

5.3. Creazione dei nuovi eventi da Event Configuration di HP OpenView

Una volta creati e modificati gli script per il nuovo nodo da monitorare, bisogna creare gli eventi che scateneranno lo script in caso di problemi. Per fare ciò in HP OpenView andiamo su Options e quindi Event Configuration.

25

Page 26: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

Aperta la nuova finestra andiamo a selezionare OpenView nello spazio in alto degli enterprise e cerchiamo in basso l’ evento OV_Node_Down.

A questo punto selezioniamo Edit, quindi Events e Copy...

Si aprirà una nuova finestra in cui inserire il nome del nuovo evento (in Description), l’indirizzo ip o il nome del nuovo nodo (in Sources) e lo script da associare all’ accadimento dell’ evento (in Actions).

26

Page 27: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

A questo punto l’ evento viene creato, si devono creare due eventi uno per il nodo down e uno per il nodo up; le modalità di creazione sono le stesse cambiano solamente i nomi dell’ evento e lo script a cui gli eventi sono associati, ovvero cnuovonodo.pl.txt per il node down (lo script di chiamata allo script vero e proprio) e upnuovonodo.pl.txt per il node up.Nella finestra degli Status Alarms saranno visibili i messaggi di avvertimento nel caso un nodo vada down, a quel punto verrà fatto partire lo script.

27

Page 28: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

6. Configurazione SMSMachine/XML

Per consentire l’ invio degli sms è necessario appoggiarsi alla SMSMachine/XML la quale è collegata alla rete con un suo indirizzo ip. Per poter configurare l’ apparecchio è necessario aprire il file di configurazione xmlconfig, presente sul server di Amaro, con un browser internet (no Internet Explorer per problemi di compatibilità); è necessario loggarsi con l’ indirizzo ip della SMSMachine/XML e la password della stessa. Si accede quindi al menù interno, nel quale si potranno modificare entrando in TCP/IP config indirizzo ip, gateway, net mask, DNS e password della macchina. In GSM config si potranno invece modificare il numero della SIM inserita e il contact center dell’ operatore mobile della stessa.

La schermata di login.

28

Page 29: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

Il menù interno e le schermate TCP/IP config e GSM config.

29

Page 30: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

7. Conclusioni

7.1. Analisi dei risultati e stato attuale

L’ obbiettivo che veniva posto all’ inizio di questa tesi era quello di progettare e mettere in funzione uno script in linguaggio Perl, da utilizzare per allertare tempestivamente, via email e/o sms, un responsabile in caso di malfunzionamenti di nodi sensibili della rete sanitaria regionale.Dopo aver scelto i nodi da monitorare, che sono quelli degli ospedali regionali, le sedi del 118 e i due POP siti a Trieste ed Amaro, si è dovuta creare una gerarchia affinché il malfunzionamento di un nodo di livello elevato non facesse scattare gli allarmi anche per i nodi inferiori e localizzare così immediatamente il problema, gli allarmi inoltre non scattano nel caso il problema rientri in tempi brevi decisi dal responsabile.La creazione di tre script differenti, seppur queste differenze siano verametne minime a livello di struttura ed operazioni compiute, è stata necessaria per rispettare la tabella gerarchica studiata per la rete.Possiamo dire di aver pienamente raggiunto l’ obbiettivo fissato, gli allarmi vengono generati sia in formato di email che di sms (a seconda dell’ orario a cui avviene il problema), gli script di livello diverso rispettano la gerarchia imposta e non sovrappongono gli allarmi, nel caso di down di pochi minuti (inferiori a 5) lo script di ritorno up del nodo funziona correttamente interrompendo l’ esecuzione dello script preposto all’ invio degli allarmi.Attualmente lo script è ancora in funzione presso Insiel, non è stato necessario l’ apporto di modifiche a nessuno degli script; l’ invio degli allarmi è in funzione sia via email che via sms, anche la SMSMachine/XML ha mantenuto la stessa SIM card e lo stesso indirizzo ip.

7.2. Quantificazione del lavoro svolto

I nodi monitorati con questo sistema di allarmi sono 28 e comprendono ospedali, sedi del 118, sedi dell’ azienda sanitaria e i due POP della rete.Sono stati scritti tre differenti script nel caso in cui un nodo vada down per rispettare la gerarchia che si è voluto imporre ai nodi, volendo quantificare le righe di codice scritte avremo per lo script di livello alto: 214, per quello di livello medio: 256 e per il livello più basso: 245; considerando i 28 nodi totali sono circa 6860 righe. Per quanto riguarda lo script di ritorno up del nodo sono 22 righe, che per 28 nodi porta il totale a 616 righe. Al totale vanno aggiunte le 3 righe di script di chiamata per liberare immediatamente le risorse in HP OpenView.Va considerato che gli script “originali” sono soltanto 3 e anche questi sono fondamentalmente uguali tranne per le parti relative alla lettura e scrittura dei

30

Page 31: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

file che riguardano la gerarchia, sommando a questi le righe degli altri due script (ritorno up e chiamata) abbiamo un totale di 740 righe, se poi vogliamo considerare tutte le righe di codice attive sugli script sono circa 7600.

7.3. Breve conclusione soggettiva

Il lavoro svolto in Insiel è stato molto soddisfacente dal punto di vista personale; ho potuto sviluppare il mio lavoro dalle fondamenta, ovvero dalle richieste di un committente (in questo caso facente ovviamente parte dell’ azienda) potendo interagire per trovare il miglior modo di sviluppare il prodotto finale.La creazione dello script ha richiesto un certo impegno non avendo avuto in partenza una buona base di programmazione in Perl, ma anche per questo è stato stimolante il suo sviluppo perché le capacità progredivano assieme alla complessità delle operazioni da svolgere.Inoltre sapere che lo script continua ad essere utile e funzionante, senza la necessità di ulteriori interventi di manutenzione rappresenta dal mio punto di vista una grossa soddisfazione, come lo è poterlo scrivere su questa tesi.

31

Page 32: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

8. Appendice

8.1. Mappa della gerarchia

POPAmaroPOPTS

sanita-backbone-ts-lop0rtburlo-lop0ts118-farneto-lop0ass2-118-GO-lop0sisr-gorizia-backbone-lop0

ass2-osp-sgdd-lop0osp-gorizia-lop0

osp-spolo-lop0jalmicco-lop0

osp-latisana-lop0sisr-ud-backbone-lop0

backbone-aoud-lop0aoud-cividale-lop0118-via-faedis-lop0

sisr-tolm-regione-lop0osp-tolmezzo-lop0osp-gemona-lop0

sisr-pn-regione-lop0aopn-osp-smangeli-lop0cro-avianoosp-sacile-lop0osp-svito-lop0osp-maniago-lop0osp-spilimbergo

aots-maggiore-MAN-lop0osp-cattinara-pri-lop0

La gerarchia al momento è strutturata con un solo nodo di livello alto che è POPAmaro, gli altri sono nodi di livello medio se hanno altri nodi dipendenti da loro (in cascata) e nodi di livello basso se da loro non dipende nessun altro nodo (come ad es. aots-maggiore-MAN-lop0, osp-latisana-lop0 o rtburlo-lop0).

8.2. Script di livello gerarchico alto

#! /usr/bin/perl -w

#Sinigoi Michele Aprile 2011#Questo script viene attivato quando il nodo che si sta monitorando per qualche motivo non è#più raggiungibile, lo script controlla innanzitutto che il nodo di livello superiore#non sia anch'esso irraggiungibile, in quel caso toccherà a lui mandare il messaggio di#allarme adeguato. Una volta stabilito che è il nodo più alto in gerarchia irraggiungibile#aggiorna un file di log, che servirà nel caso in cui ritorni raggiungibile in pochi minuti#(uscendo pertanto dallo script); se persiste l' irraggiungibilità si passa quindi a stabilire#tramite il controllo di data e ora se è necessario inviare solo un'

32

Page 33: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

email o bisogna#aggiungere anche un sms (destinato al reperibile durante le ore notturne o festività), a cui#seguirà l' invio vero e proprio.

use Fcntl qw(SEEK_END);use warnings;use MIME::Lite;use Net::SMTP;use HTTP::Request::Common;use LWP::UserAgent;use Date::Parse;

#ferma lo script se uguale a 1 (per manutenzione), 0 per ripartiremy $STOP = '0';exit if ($STOP);

#scriviamo sul file che gerarchizza i nodi, cosicché i nodi a livello più basso possano#vedere se il nodo di più alto livello è down e quindi far partire o no lo scriptmy $gerlog_pop = 'C:\Program Files\HP OpenView\log\allarmi_script\gerarchia_POPAmaro.txt';my $time = localtime;open( GER, '>>', $gerlog_pop ) or die "Non riesco ad aprire $gerlog_pop"; #viene scritto il messaggio in append, ovvero in coda

print GER "\n";print GER "$time POPAmaro DOWN"; close GER;

#apro il file log e inserisco messaggio di errore derivante da HPOVmy $file = 'C:\Program Files\HP OpenView\log\allarmi_script\log_POPAmaro.txt';my $time = localtime;open( LOG, '>>', $file ) or die "Non riesco ad aprire '$file'"; #viene scritto il messaggio in append, ovvero in coda#inserire le variabili per far scriver sul log il messaggio con data, ora e erroreprint LOG "\n";print LOG "$time\n"; #verrà inserito l'errore (tipo e nodo che lo genera)print LOG "NODO DOWN\n";close LOG;

sleep (300); #attendi 5 minuti per eventuale ritorno up del nodo

#apro il file alla ricerca dell'ultima riga, se uguale a messaggio che avvisa#il ritorno up del nodo si esce dallo script, altrimenti si invia email di allarmeopen( LOG, '<', $file ) or die "Non riesco ad aprire '$file'";

my $size = -s $file;my $found;my $offset = 256;

while( ! defined( $found ) ){ $offset = $size if $offset > $size; seek( LOG, -$offset, SEEK_END ) or warn "Ricerca fallita!";

#leggi le righe, ll'offset è stato scelto cosìcchè @lines contenesse

33

Page 34: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

#solo penultima e ultima riga my @lines = <LOG>;

if( @lines > 1 ){ #più di una riga siamo sicuri di avere l' ultima $found = $lines[ -1 ]; } elsif( $offset >= $size ) { #se leggiamo tutto il file e abbiamo solo una riga

#siamo sicuri che sia l' ultima $found = $lines[ 0 ]; } else { #riprova con offset più grande $offset += 256; }}

#controllo che l'ultimo messaggio sia di nodo down, così da inviare la emailif( $found eq "NODO UP"){

print "NODO UP: tutto normale\n"; #se il nodo è tornato up esco dallo script} else {

($sec,$min,$ore,$giom,$mese,$anno,$gios,$gioa,$oraleg) = localtime(time);

#con un if controlliamo che non ci si trovi nelle ore o giorni in cui non è necessaria la reperibilità

if ((($ore > 8) && ($ore < 18)) &&(($gios < 6) && ($gios > 0)) &&($gioa != 0) && #1 gennaio($gioa != 5) && #6 gennaio($gioa != 114) && #pasquetta($gioa != 114) && #25 aprile($gioa != 120) && #1 maggio($gioa != 152) && #2 giugno($gioa != 226) && #15 agosto($gioa != 304) && #1 novembre($gioa != 341) && #8 dicembre($gioa != 358) && #25 dicembre($gioa != 359) #26 dicembre

) { #sostituire alla var $min la var $ore a seconda della reperibilità

#chiama nohp.pl#apro il file con gli indirizzi e gli estraggo#crea diversi file indirizzi a seconda di chi controlla

il nodo

open( INDIRIZZI , 'C:\Perl\bin\indirizzi.txt') or die ("Non riesco ad aprire il file in lettura\n");

@email_to = split(/ /, <INDIRIZZI>);

#passiamo nodo, tipo di allerta, ora e gli indirizzi email all' array @ARGV

my ($node, $alert, $time, @indirizzi_email) = @ARGV;$time = localtime;

#controllo che vi siano le informazioni sufficenti da inviare

if (!($node && $alert && $time)){die ("Fornire valori per nodo, tipo di allerta e

ora!\n Nodo=$node\n Tipo di allerta=$alert\n Ora=$time\nAssicurarsi che gli indirizzi email siano inseriti

correttamente");}

34

Page 35: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

#creazione con inserimento parametri del messaggio da inviare

my $mess = ("$time | $node | $alert");@indirizzi_email = (@indirizzi_email, @email_to);foreach my $indirizzi (@indirizzi_email) {

#sender, receiver, SMTP, soggetto, messaggiomy $from = '[email protected]'; #cambia con email insiel per

monitoraggiomy $smtp = '193.42.84.142';my $sub = 'Controllare '. $node .' !'; #inserisce il nome

del nodo da controllare nel messaggio

#creazione contenitore email$msg = MIME::Lite->new(

From => $from,To => $indirizzi,Subject => $sub,Type => 'multipart/mixed'

)or die "Errore nella creazione del contenitore: $!\n";

#aggiungiamo il testo dell' email$msg->attach (

Type => 'TEXT',Data => $mess

)or die "Errore nell aggiungere il testo: $!\n";

#invio messaggioMIME::Lite->send('smtp',$smtp, Timeout=>60, Debug => 1);$msg->send;}close INDIRIZZI;

}else {

#chiama nohp.pl + sms.pl#sms.plopen( SMSMACHINEDATA , 'C:\Perl\bin\SMSMachinedata.txt')

or die ("Non riesco ad aprire il file in lettura\n");

my @data = split(/ /, <SMSMACHINEDATA>);my $numero = $data[0];my $ipSMSMachine = $data[1];my $post = 'http://'. $ipSMSMachine

.'/smssend.cgi';my $ua = LWP::UserAgent->new;$ua->request (POST $post, [ num => $numero, #numero cellulare del

reperibile text => 'Controllare POPAmaro !', #testo

sms con indicazione nodo mode => 'mode = 0', Pwd => 'SMS1234', #password del

programma di gestione, di default ]);

close SMSMACHINEDATA;

#nohp.pl#apro il file con gli indirizzi e gli estraggo#crea diversi file indirizzi a seconda di chi controlla

il nodoopen( INDIRIZZI , 'C:\Perl\bin\indirizzi.txt') or die

("Non riesco ad aprire il file in lettura\n");@email_to = split(/ /, <INDIRIZZI>);

35

Page 36: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

#passiamo nodo, tipo di allerta, ora e gli indirizzi email all' array @ARGV

my ($node, $alert, $time, @indirizzi_email) = @ARGV;$time = localtime;

#controllo che vi siano le informazioni sufficenti da inviare

if (!($node && $alert && $time)){die ("Fornire valori per nodo, tipo di allerta e

ora!\n Nodo=$node\n Tipo di allerta=$alert\n Ora=$time\nAssicurarsi che gli indirizzi email siano inseriti

correttamente");}

#creazione con inserimento parametri del messaggio da inviare

my $mess = ("$time | $node | $alert");@indirizzi_email = (@indirizzi_email, @email_to);foreach my $indirizzi (@indirizzi_email) {

#sender, receiver, SMTP, soggetto, messaggiomy $from = '[email protected]'; #cambia con email insiel per

monitoraggiomy $smtp = '193.42.84.142';my $sub = 'Controllare '. $node .' !'; #inserisce il nome

del nodo da controllare nel messaggio

#creazione contenitore email$msg = MIME::Lite->new(

From => $from,To => $indirizzi,Subject => $sub,Type => 'multipart/mixed'

)or die "Errore nella creazione del contenitore: $!\n";

#aggiungiamo il testo dell' email$msg->attach (

Type => 'TEXT',Data => $mess

)or die "Errore nell aggiungere il testo: $!\n";

#invio messaggioMIME::Lite->send('smtp',$smtp, Timeout => 60, Debug =>

1);$msg->send;}close INDIRIZZI;

}}close LOG;

8.3. Script di livello gerarchico medio

#! /usr/bin/perl -w

#Sinigoi Michele Aprile 2011#Questo script viene attivato quando il nodo che si sta monitorando per qualche motivo non è#più raggiungibile, lo script controlla innanzitutto che il nodo di livello superiore#non sia anch'esso irraggiungibile, in quel caso toccherà a lui mandare il messaggio di

36

Page 37: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

#allarme adeguato. Una volta stabilito che è il nodo più alto in gerarchia irraggiungibile#aggiorna un file di log, che servirà nel caso in cui ritorni raggiungibile in pochi minuti#(uscendo pertanto dallo script); se persiste l' irraggiungibilità si passa quindi a stabilire#tramite il controllo di data e ora se è necessario inviare solo un' email o bisogna#aggiungere anche un sms (destinato al reperibile durante le ore notturne o festività), a cui#seguirà l' invio vero e proprio.

use Fcntl qw(SEEK_END);use warnings;use MIME::Lite;use Net::SMTP;use HTTP::Request::Common;use LWP::UserAgent;use Date::Parse;

#ferma lo script se uguale a 1 (per manutenzione), 0 per ripartiremy $STOP = '0';exit if ($STOP);

#scriviamo sul file che gerarchizza i nodi, cosicché i nodi a livello più basso possano#vedere se il nodo di più alto livello è down e quindi far partire o no lo scriptmy $gerlog_sisr = 'C:\Program Files\HP OpenView\log\allarmi_script\gerarchia_POPTS.txt';my $time = localtime;open( GER, '>>', $gerlog_sisr ) or die "Non riesco ad aprire $gerlog_sisr"; #viene scritto il messaggio in append, ovvero in coda

print GER "\n";print GER "$time POPTS DOWN"; close GER;

sleep 120; #prima di andare a cercare aspettiamo aggiornamento dei vari nodimy $gerlog_pop = 'C:\Program Files\HP OpenView\log\allarmi_script\gerarchia_POPAmaro.txt'; #cerco sul file del nodo di livello superioreopen( GER, '<', $gerlog_pop ) or open( GER, '>>', $gerlog_pop );my $tiempo = localtime(0);print GER $tiempo;close GER;open( GER, '<', $gerlog_pop );

my $gr = -s $gerlog_pop;my $last;my $off = 256;

while( ! defined( $last ) ){ $off = $gr if $off > $gr; seek( GER, -$off, SEEK_END ) or warn "Ricerca fallita!";

#leggi le righe, ll'offset è stato scelto cosìcchè @rows contenesse #solo penultima e ultima riga my @rows = <GER>;

37

Page 38: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

if( @rows > 1 ){ #più di una riga siamo sicuri di avere l' ultima $last = $rows[ -1 ]; } elsif( $off >= $gr ) { #se leggiamo tutto il file e abbiamo solo una riga

#siamo sicuri che sia l' ultima $last = $rows[ 0 ]; } else { #riprova con offset più grande $off += 256; }}$now = time();$date = substr ($last,0,24);$mod = str2time($date);if ($mod+600 >= $now){

print "il nodo a livello superiore è down, invierà lui i messaggi di allarme";}else {

#apro il file log e inserisco messaggio di errore derivante da HPOV

my $file = 'C:\Program Files\HP OpenView\log\allarmi_script\log_POPTS.txt';

my $time = localtime;open( LOG, '>>', $file ) or die "Non riesco ad aprire '$file'"; #viene scritto il messaggio in append, ovvero in coda#inserire le variabili per far scriver sul log il messaggio con

data, ora e erroreprint LOG "\n";print LOG "$time\n"; #verrà inserito l'errore (tipo e nodo che

lo genera)print LOG "NODO DOWN\n";close LOG;

sleep (300); #attendi 5 minuti per eventuale ritorno up del nodo

#apro il file alla ricerca dell'ultima riga, se uguale a messaggio che avvisa

#il ritorno up del nodo si esce dallo script, altrimenti si invia email di allarme

open( LOG, '<', $file ) or die "Non riesco ad aprire '$file'";

my $size = -s $file;my $found;my $offset = 256;

while( ! defined( $found ) ){ $offset = $size if $offset > $size; seek( LOG, -$offset, SEEK_END ) or warn "Ricerca fallita!";

#leggi le righe, ll'offset è stato scelto cosìcchè @lines contenesse

#solo penultima e ultima riga my @lines = <LOG>;

if( @lines > 1 ){

#più di una riga siamo sicuri di avere l' ultima$found = $lines[ -1 ];

} elsif( $offset >= $size ) {#se leggiamo tutto il file e abbiamo solo una riga#siamo sicuri che sia l' ultima$found = $lines[ 0 ];

38

Page 39: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

} else {#riprova con offset più grande$offset += 256;

}}

#controllo che l'ultimo messaggio sia di nodo down, così da inviare la email

if( $found eq "NODO UP"){print "NODO UP: tutto normale\n"; #se il nodo è tornato

up esco dallo script} else {

($sec,$min,$ore,$giom,$mese,$anno,$gios,$gioa,$oraleg) = localtime(time);

#con un if controlliamo che non ci si trovi nelle ore o giorni in cui non è necessaria la reperibilità

if ((($ore > 8) && ($ore < 18)) &&(($gios < 6) && ($gios > 0)) &&($gioa != 0) && #1 gennaio($gioa != 5) && #6 gennaio($gioa != 114) && #pasquetta($gioa != 114) && #25 aprile($gioa != 120) && #1 maggio($gioa != 152) && #2 giugno($gioa != 226) && #15 agosto($gioa != 304) && #1 novembre($gioa != 341) && #8 dicembre($gioa != 358) && #25 dicembre($gioa != 359) #26 dicembre

) { #sostituire alla var $min la var $ore a seconda della reperibilità

#chiama nohp.pl#apro il file con gli indirizzi e gli estraggo#crea diversi file indirizzi a seconda di chi

controlla il nodo

open( INDIRIZZI , 'C:\Perl\bin\indirizzi.txt') or die ("Non riesco ad aprire il file in lettura\n");

@email_to = split(/ /, <INDIRIZZI>);

#passiamo nodo, tipo di allerta, ora e gli indirizzi email all' array @ARGV

my ($node, $alert, $time, @indirizzi_email) = @ARGV;

$time = localtime;

#controllo che vi siano le informazioni sufficenti da inviare

if (!($node && $alert && $time)){die ("Fornire valori per nodo, tipo di

allerta e ora!\n Nodo=$node\n Tipo di allerta=$alert\n Ora=$time\nAssicurarsi che gli indirizzi email siano

inseriti correttamente");}

#creazione con inserimento parametri del messaggio da inviare

my $mess = ("$time | $node | $alert");@indirizzi_email = (@indirizzi_email, @email_to);foreach my $indirizzi (@indirizzi_email) {

#sender, receiver, SMTP, soggetto, messaggiomy $from = '[email protected]'; #cambia con email

insiel per monitoraggiomy $smtp = '193.42.84.142';

39

Page 40: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

my $sub = 'Controllare '. $node .' !'; #inserisce il nome del nodo da controllare nel messaggio

#creazione contenitore email$msg = MIME::Lite->new(

From => $from,To => $indirizzi,Subject => $sub,Type => 'multipart/mixed'

)or die "Errore nella creazione del contenitore: $!\n";

#aggiungiamo il testo dell' email$msg->attach (

Type => 'TEXT',Data => $mess

)or die "Errore nell aggiungere il testo: $!\n";

#invio messaggioMIME::Lite->send('smtp',$smtp, Timeout=>60, Debug

=> 1);$msg->send;}close INDIRIZZI;

}else {

#chiama nohp.pl + sms.pl#sms.plopen( SMSMACHINEDATA , 'C:\Perl\bin\

SMSMachinedata.txt') or die ("Non riesco ad aprire il file in lettura\n");

my @data = split(/ /, <SMSMACHINEDATA>);my $numero = $data[0];my $ipSMSMachine = $data[1];my $post = 'http://'. $ipSMSMachine

.'/smssend.cgi';my $ua = LWP::UserAgent->new;$ua->request (POST $post, [ num => $numero, #numero cellulare

del reperibile text => 'Controllare POPTS !',

#testo sms con indicazione nodo mode => 'mode = 0', Pwd => 'SMS1234', #password del

programma di gestione, di default ]);

close SMSMACHINEDATA;

#nohp.pl#apro il file con gli indirizzi e gli estraggo#crea diversi file indirizzi a seconda di chi

controlla il nodoopen( INDIRIZZI , 'C:\Perl\bin\indirizzi.txt') or

die ("Non riesco ad aprire il file in lettura\n");@email_to = split(/ /, <INDIRIZZI>);

#passiamo nodo, tipo di allerta, ora e gli indirizzi email all' array @ARGV

my ($node, $alert, $time, @indirizzi_email) = @ARGV;

$time = localtime;

#controllo che vi siano le informazioni sufficenti

40

Page 41: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

da inviareif (!($node && $alert && $time)){

die ("Fornire valori per nodo, tipo di allerta e ora!\n Nodo=$node\n Tipo di allerta=$alert\n Ora=$time\n

Assicurarsi che gli indirizzi email siano inseriti correttamente");

}

#creazione con inserimento parametri del messaggio da inviare

my $mess = ("$time | $node | $alert");@indirizzi_email = (@indirizzi_email, @email_to);foreach my $indirizzi (@indirizzi_email) {

#sender, receiver, SMTP, soggetto, messaggiomy $from = '[email protected]'; #cambia con email

insiel per monitoraggiomy $smtp = '193.42.84.142';my $sub = 'Controllare '. $node .' !'; #inserisce

il nome del nodo da controllare nel messaggio

#creazione contenitore email$msg = MIME::Lite->new(

From => $from,To => $indirizzi,Subject => $sub,Type => 'multipart/mixed'

)or die "Errore nella creazione del contenitore: $!\n";

#aggiungiamo il testo dell' email$msg->attach (

Type => 'TEXT',Data => $mess

)or die "Errore nell aggiungere il testo: $!\n";

#invio messaggioMIME::Lite->send('smtp',$smtp, Timeout => 60, Debug

=> 1);$msg->send;}close INDIRIZZI;

}}close LOG;

}

8.4. Script di livello gerarchico basso

#! /usr/bin/perl -w

#Sinigoi Michele Aprile 2011#Questo script viene attivato quando il nodo che si sta monitorando per qualche motivo non è#più raggiungibile, lo script controlla innanzitutto che il nodo di livello superiore#non sia anch'esso irraggiungibile, in quel caso toccherà a lui mandare il messaggio di#allarme adeguato. Una volta stabilito che è il nodo più alto in gerarchia irraggiungibile#aggiorna un file di log, che servirà nel caso in cui ritorni raggiungibile in pochi minuti#(uscendo pertanto dallo script); se persiste l' irraggiungibilità

41

Page 42: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

si passa quindi a stabilire#tramite il controllo di data e ora se è necessario inviare solo un' email o bisogna#aggiungere anche un sms (destinato al reperibile durante le ore notturne o festività), a cui#seguirà l' invio vero e proprio.

use Fcntl qw(SEEK_END);use warnings;use MIME::Lite;use Net::SMTP;use HTTP::Request::Common;use LWP::UserAgent;use Date::Parse;

#ferma lo script se uguale a 1 (per manutenzione), 0 per ripartiremy $STOP = '0';exit if ($STOP);

sleep 120; #prima di andare a cercare aspettiamo aggiornamento dei vari nodimy $gerlog_sisr = 'C:\Program Files\HP OpenView\log\allarmi_script\gerarchia_sanita-backbone-ts-lop0.txt'; #cerco sul file del nodo di livello superioreopen( GER, '<', $gerlog_sisr ) or open( GER, '>>', $gerlog_sisr );my $tiempo = localtime(0);print GER $tiempo;close GER;open( GER, '<', $gerlog_sisr );

my $gr = -s $gerlog_sisr;my $last;my $off = 256;

while( ! defined( $last ) ){ $off = $gr if $off > $gr; seek( GER, -$off, SEEK_END ) or warn "Ricerca fallita!";

#leggi le righe, ll'offset è stato scelto cosìcchè @rows contenesse #solo penultima e ultima riga my @rows = <GER>;

if( @rows > 1 ){ #più di una riga siamo sicuri di avere l' ultima $last = $rows[ -1 ]; } elsif( $off >= $gr ) { #se leggiamo tutto il file e abbiamo solo una riga

#siamo sicuri che sia l' ultima $last = $rows[ 0 ]; } else { #riprova con offset più grande $off += 256; }}$now = time();$date = substr ($last,0,24);$mod = str2time($date);if ($mod+600 >= $now){

print "il nodo a livello superiore è down, invierà lui i messaggi di allarme";}else {

42

Page 43: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

#apro il file log e inserisco messaggio di errore derivante da HPOV

my $file = 'C:\Program Files\HP OpenView\log\allarmi_script\log_rtburlo-lop0.txt';

my $time = localtime;open( LOG, '>>', $file ) or die "Non riesco ad aprire '$file'"; #viene scritto il messaggio in append, ovvero in coda#inserire le variabili per far scriver sul log il messaggio con

data, ora e erroreprint LOG "\n";print LOG "$time\n"; #verrà inserito l'errore (tipo e nodo che

lo genera)print LOG "NODO DOWN\n";close LOG;

sleep (300); #attendi 5 minuti per eventuale ritorno up del nodo

#apro il file alla ricerca dell'ultima riga, se uguale a messaggio che avvisa

#il ritorno up del nodo si esce dallo script, altrimenti si invia email di allarme

open( LOG, '<', $file ) or die "Non riesco ad aprire '$file'";

my $size = -s $file;my $found;my $offset = 256;

while( ! defined( $found ) ){ $offset = $size if $offset > $size; seek( LOG, -$offset, SEEK_END ) or warn "Ricerca fallita!";

#leggi le righe, ll'offset è stato scelto cosìcchè @lines contenesse

#solo penultima e ultima riga my @lines = <LOG>;

if( @lines > 1 ){

#più di una riga siamo sicuri di avere l' ultima$found = $lines[ -1 ];

} elsif( $offset >= $size ) {#se leggiamo tutto il file e abbiamo solo una riga#siamo sicuri che sia l' ultima$found = $lines[ 0 ];

} else {#riprova con offset più grande$offset += 256;

}}

#controllo che l'ultimo messaggio sia di nodo down, così da inviare la email

if( $found eq "NODO UP"){print "NODO UP: tutto normale\n"; #se il nodo è tornato

up esco dallo script} else {

($sec,$min,$ore,$giom,$mese,$anno,$gios,$gioa,$oraleg) = localtime(time);

#con un if controlliamo che non ci si trovi nelle ore o giorni in cui non è necessaria la reperibilità

if ((($ore > 8) && ($ore < 18)) &&(($gios < 6) && ($gios > 0)) &&($gioa != 0) && #1 gennaio($gioa != 5) && #6 gennaio

43

Page 44: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

($gioa != 114) && #pasquetta($gioa != 114) && #25 aprile($gioa != 120) && #1 maggio($gioa != 152) && #2 giugno($gioa != 226) && #15 agosto($gioa != 304) && #1 novembre($gioa != 341) && #8 dicembre($gioa != 358) && #25 dicembre($gioa != 359) #26 dicembre

) { #sostituire alla var $min la var $ore a seconda della reperibilità

#chiama nohp.pl#apro il file con gli indirizzi e gli estraggo#crea diversi file indirizzi a seconda di chi

controlla il nodo

open( INDIRIZZI , 'C:\Perl\bin\indirizzi.txt') or die ("Non riesco ad aprire il file in lettura\n");

@email_to = split(/ /, <INDIRIZZI>);

#passiamo nodo, tipo di allerta, ora e gli indirizzi email all' array @ARGV

my ($node, $alert, $time, @indirizzi_email) = @ARGV;

$time = localtime;

#controllo che vi siano le informazioni sufficenti da inviare

if (!($node && $alert && $time)){die ("Fornire valori per nodo, tipo di

allerta e ora!\n Nodo=$node\n Tipo di allerta=$alert\n Ora=$time\nAssicurarsi che gli indirizzi email siano

inseriti correttamente");}

#creazione con inserimento parametri del messaggio da inviare

my $mess = ("$time | $node | $alert");@indirizzi_email = (@indirizzi_email, @email_to);foreach my $indirizzi (@indirizzi_email) {

#sender, receiver, SMTP, soggetto, messaggiomy $from = '[email protected]'; #cambia con email

insiel per monitoraggiomy $smtp = '193.42.84.142';my $sub = 'Controllare '. $node .' !';

#creazione contenitore email$msg = MIME::Lite->new(

From => $from,To => $indirizzi,Subject => $sub,Type => 'multipart/mixed'

)or die "Errore nella creazione del contenitore: $!\n";

#aggiungiamo il testo dell' email$msg->attach (

Type => 'TEXT',Data => $mess

)or die "Errore nell aggiungere il testo: $!\n";

#invio messaggioMIME::Lite->send('smtp',$smtp, Timeout=>60, Debug

=> 1);

44

Page 45: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

$msg->send;}close INDIRIZZI;

}else {

#chiama nohp.pl + sms.pl#sms.plopen( SMSMACHINEDATA , 'C:\Perl\bin\

SMSMachinedata.txt') or die ("Non riesco ad aprire il file in lettura\n");

my @data = split(/ /, <SMSMACHINEDATA>);my $numero = $data[0];my $ipSMSMachine = $data[1];my $post = 'http://'. $ipSMSMachine

.'/smssend.cgi';my $ua = LWP::UserAgent->new;$ua->request (POST $post, [ num => $numero, #numero cellulare

del reperibile text => 'Controllare rtburlo-

lop0 !', #testo sms con indicazione nodo mode => 'mode = 0', Pwd => 'SMS1234', #password del

programma di gestione, di default ]);

close SMSMACHINEDATA;

#nohp.pl#apro il file con gli indirizzi e gli estraggo#crea diversi file indirizzi a seconda di chi

controlla il nodoopen( INDIRIZZI , 'C:\Perl\bin\indirizzi.txt') or

die ("Non riesco ad aprire il file in lettura\n");@email_to = split(/ /, <INDIRIZZI>);

#passiamo nodo, tipo di allerta, ora e gli indirizzi email all' array @ARGV

my ($node, $alert, $time, @indirizzi_email) = @ARGV;

$time = localtime;

#controllo che vi siano le informazioni sufficenti da inviare

if (!($node && $alert && $time)){die ("Fornire valori per nodo, tipo di

allerta e ora!\n Nodo=$node\n Tipo di allerta=$alert\n Ora=$time\nAssicurarsi che gli indirizzi email siano

inseriti correttamente");}

#creazione con inserimento parametri del messaggio da inviare

my $mess = ("$time | $node | $alert");@indirizzi_email = (@indirizzi_email, @email_to);foreach my $indirizzi (@indirizzi_email) {

#sender, receiver, SMTP, soggetto, messaggiomy $from = '[email protected]'; #cambia con email

insiel per monitoraggiomy $smtp = '193.42.84.142';my $sub = 'Controllare '. $node .' !';

#creazione contenitore email

45

Page 46: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

$msg = MIME::Lite->new(From => $from,To => $indirizzi,Subject => $sub,Type => 'multipart/mixed'

)or die "Errore nella creazione del contenitore: $!\n";

#aggiungiamo il testo dell' email$msg->attach (

Type => 'TEXT',Data => $mess

)or die "Errore nell aggiungere il testo: $!\n";

#invio messaggioMIME::Lite->send('smtp',$smtp, Timeout => 60, Debug

=> 1);$msg->send;}close INDIRIZZI;

}}close LOG;

}

8.5. Script per il ritorno up del nodo

#! /usr/bin/perl -w

#Sinigoi Michele Aprile 2011#questo script scrive sul file di log data e ora in cui il nodo è tornato up#dando la possibilità allo script che avverte se il nodo è down di interrompersi#evitando di mandare messaggi non necessari (cavi scollegati, brevi disconessioni di pochi minuti)

use strict;use warnings;

#apro il file log e inserisco messaggio di ritorno up del nodo indicando data e oramy $file = 'C:\Program Files\HP OpenView\log\allarmi_script\log_POPTS.txt';my ($sec,$min,$ore,$giom,$mese,$anno,$gios,$gioa,$oraleg) = localtime(time);

open( LOG, '>>', $file ) or die "Non riesco ad aprire '$file'"; #viene scritto il messaggio in append, ovvero in codaprint LOG "\n";print LOG scalar localtime;print LOG "\n";print LOG "NODO UP";

close LOG;

8.6. Script di chiamata da HP OpenView

#! /usr/bin/perl -w

use warnings;

46

Page 47: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

exec("perl C:\\Perl\\bin\\POPTS.pl.txt POPTS DOWN!");

47

Page 48: Sistemi di automazione dei messaggi di allarme per il monitoraggio della rete regionale della sanità

9. Ringraziamenti

Ringrazio Fulvio Sbroiavacca, Fabio Del Torre e Aldo Martinuzzi per la loro disponibilità, per i suggerimenti ricevuti nello scrivere la tesi e durante il tirocinio.Un grazie a tutti quelli che non ci hanno creduto, alla mia famiglia e ai miei amici ognuno in maniera diversa sa quanto ha contribuito in questi anni, quello che non sa è che da grande voglio diventare un tostapane.

48