Ecco un altro esempio di come Python riesce a di integrare all’interno dello stesso script funzionalità appartenenti a moduli differenti.
In questo caso l’obiettivo è stato quello di realizzare una funzione che, pianificata a intervalli regolari con gli strumenti di Windows, riuscisse ad interrogare i servizi di mappa di ArcGIS Server e, in caso di esito negativo, ad avvisare con una mail inviata ad uno o più indirizzi.

In questo caso sono state utilizzate le librerie urllib2 (richiede Pythonwin installato) e smtplib, rispettivamente per l’interrogazione di una URL e per l’invio della mail sfruttando un server SMTP.

Da notare che in questo caso non sono stati utilizzati moduli arcpy di Esri.

import urllib2, smtplib

 

La prima parte consente di specificare i riferimenti al proprio arcgis server, ai servizi da monitorare e alla lista degli utenti da avvisare in caso di mancata risposta di uno o più servizi.

 

# Parametri dei servizi da monitorare
RestURL = "http://mioserver:6080/arcgis/rest" #Togliere la porta 6080 se necessario
services = ["FOLDER1/Servizio1","FOLDER2/Servizio2"]
# Parametri del server SMTP
SERVER = "mailserver.yourcompany.com"
PORT = "25"
FROM = "xxxx@yourcompany.com"
PASS ="xxxxx"
MAILDOMAIN = '@yourcompany.com'

# Utenti
userList=["nome.cognome","nome2.cognome2"]

# Altri parametri
rispostaNeg =""
rispostaPos =""

Il secondo blocco di codice esegue un ciclo per ogni servizio Arcgis Server che si vuole monitorare restituendo le risposte negative e positive in due variabili di testo distinte.

# Interrogazione dei Servizi
count = 0
for s in services:
params = "" #urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
url ="%s/services/%s/MapServer" %(RestURL,s)

e = ""
print(s)
try:
f = urllib2.urlopen(url, '5') # urllib2.urlopen(url[, data][, timeout in seconds])
print f.code
rispostaPos = rispostaPos + "\n"+ url + ": RISPONDE (cod." + str(f.getcode()) + ")"
except urllib2.HTTPError, e:
print e.code
rispostaNeg = rispostaNeg + "\n"+ url + ": NON RISPONDE (cod." + str(e.code) + ")"
except urllib2.URLError, e:
print e.args
print e.reason.errno
rispostaNeg = rispostaNeg + "\n"+ url + ": NON RISPONDE (cod." + str(e.reason.errno) + ")"
count = count+1

 

Il blocco di righe successive, solo in caso di risposta negativa, si occupa di generare gli indirizzi e-mail e il testo del messaggio automatico che contiene i servizi interrogati e il loro “stato”. La risposta è stata strutturata in modo da evidenziare prima di tutto i servizi che non rispondono rispetto invece a quelli che rispondono correttamente .

if rispostaNeg != "" :
# get a list of usernames from the list of named tuples returned from ListUsers
userNames = [u for u in userList]
# take the userNames list and make email addresses by appending the appropriate suffix.
emailList = [name + MAILDOMAIN for name in userNames]

TO = emailList
SUBJECT = "Verifica stato dei Servizi ArcGIS Server %s" %(RestURL)
MSG = "Auto generated Message.\n\rControllo dello stato dei servizi. \n SERVIZI CON PROBLEMI:" + rispostaNeg + "\n\nSERVIZI CONTROLLATI E OK:" + rispostaPos
print MSG
print emailList

# Prepare actual message
MESSAGE = "\ From: %s To: %s Subject: %s %s" % (FROM, ", ".join(TO), SUBJECT, MSG)

 

L’ultimo blocco, contenuto nel blocco IF precedente, esegue effettivamente l’invio utilizzando le credenziali di accesso al server SMTP: sono stati utilizzati i comandi “Try…Exept” per catturare gli errori in ogni singola fase dell’invio.

try:
try:
print("Collegamento al server...")
server = smtplib.SMTP(SERVER,PORT)
try:
print("Login...")
server.login(FROM, PASS)
try:
print("Invio mail...")
server.sendmail(FROM, TO, MESSAGE)
except Exception as e:
print("Errore invio Mail\n" + e.message)
except Exception as e:
print("Errore Autenticazione Server: controllare le credenziali \n" + e.message)
except Exception as e:
print("Errore Collegamento al Server: controllare l'URL del Server e le comunicazioni sulla porta (25 e' la predefinita) \n" + e.message)

print("Quit.")
server.quit()

except Exception as e:
print e.message

 

In questo modo si possono censire i servizi cartografici più importanti e fare in modo che ad ogni esecuzione, e solo in caso di necessità, venga spedito un report con i servizi che non rispondono correttamente. Attenzione a non esagerare nel ridurre l’intervallo di esecuzione del controllo, potreste ritrovarvi la mail riempita nel giro di un weekend!

Di seguito il codice completo da personalizzare con i propri parametri.

 

import urllib2, smtplib

# Parametri dei servizi da monitorare
RestURL = "http://mioserver:6080/arcgis/rest" #Togliere la porta 6080 se necessario
services = ["FOLDER1/Servizio1","FOLDER2/Servizio2"]

# Parametri del server SMTP
SERVER = "mailserver.yourcompany.com"
PORT = "25"
FROM = "xxxx@yourcompany.com"
PASS ="xxxxx"
MAILDOMAIN = '@yourcompany.com'

# Utenti
userList=["nome.cognome","nome2.cognome2"]

# Altri parametri
rispostaNeg =""
rispostaPos =""

# Interrogazione dei Servizi
count = 0
for s in services:
params = "" #urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
url ="%s/services/%s/MapServer" %(RestURL,s)

e = ""
print(s)
try:
f = urllib2.urlopen(url, '5') # urllib2.urlopen(url[, data][, timeout in seconds])
print f.code
rispostaPos = rispostaPos + "\n"+ url + ": RISPONDE (cod." + str(f.getcode()) + ")"
except urllib2.HTTPError, e:
print e.code
rispostaNeg = rispostaNeg + "\n"+ url + ": NON RISPONDE (cod." + str(e.code) + ")"
except urllib2.URLError, e:
print e.args
print e.reason.errno
rispostaNeg = rispostaNeg + "\n"+ url + ": NON RISPONDE (cod." + str(e.reason.errno) + ")"
count = count+1

if rispostaNeg != "" :
# get a list of usernames from the list of named tuples returned from ListUsers
userNames = [u for u in userList]
# take the userNames list and make email addresses by appending the appropriate suffix.
emailList = [name + MAILDOMAIN for name in userNames]

TO = emailList
SUBJECT = "Verifica stato dei Servizi ArcGIS Server %s" %(RestURL)
MSG = "Auto generated Message.\n\rControllo dello stato dei servizi. \n SERVIZI CON PROBLEMI:" + rispostaNeg + "\n\nSERVIZI CONTROLLATI E OK:" + rispostaPos
print MSG
print emailList

# Prepare actual message
MESSAGE = "\ From: %s To: %s Subject: %s %s" % (FROM, ", ".join(TO), SUBJECT, MSG)

try:
try:
print("Collegamento al server...")
server = smtplib.SMTP(SERVER,PORT)
try:
print("Login...")
server.login(FROM, PASS)
try:
print("Invio mail...")
server.sendmail(FROM, TO, MESSAGE)
except Exception as e:
print("Errore invio Mail\n" + e.message)
except Exception as e:
print("Errore Autenticazione Server: controllare le credenziali \n" + e.message)
except Exception as e:
print("Errore Collegamento al Server: controllare l'URL del Server e le comunicazioni sulla porta (25 e' la predefinita) \n" + e.message)

print("Quit.")
server.quit()

except Exception as e:
print e.message

print("Fine script")

 

Per gli utenti Geomaster abbiamo ulteriormente personalizzato e perfezionato lo script esclusivamente per lavorare sulle mappe costruite con Geomaster (www.oneteamlab.it/geomaster).

Domande e commenti al nostro indirizzo: gis@oneteam.it

Leave a Comment