{"id":1497,"date":"2014-03-24T10:13:17","date_gmt":"2014-03-24T10:13:17","guid":{"rendered":"http:\/\/oneteamgis.wordpress.com\/?p=1497"},"modified":"2018-03-08T15:44:36","modified_gmt":"2018-03-08T14:44:36","slug":"uno-script-python-che-monitora-i-servizi-di-arcgis-server","status":"publish","type":"post","link":"https:\/\/gis.oneteam.it\/index.php\/2014\/03\/24\/uno-script-python-che-monitora-i-servizi-di-arcgis-server\/","title":{"rendered":"Uno Script Python che monitora i servizi di ArcGIS Server&#8230;"},"content":{"rendered":"<p style=\"text-align: justify;\">Ecco un altro esempio di come Python riesce a di integrare all&#8217;interno dello stesso script funzionalit\u00e0 appartenenti a moduli differenti.<br \/>\nIn questo caso l&#8217;obiettivo \u00e8 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,\u00a0in caso di esito negativo,\u00a0ad avvisare con una mail inviata ad uno o pi\u00f9 indirizzi.<\/p>\n<p style=\"text-align: justify;\">In questo caso sono state utilizzate le librerie urllib2 (richiede <a href=\"http:\/\/sourceforge.net\/projects\/pywin32\/files\/pywin32\/Build%20218\/\" target=\"_blank\" rel=\"noopener\">Pythonwin<\/a> installato) e smtplib, rispettivamente per l&#8217;interrogazione di una URL e per l&#8217;invio della mail sfruttando un server SMTP.<\/p>\n<p>Da notare che in questo caso non sono stati utilizzati moduli arcpy di Esri.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nimport urllib2, smtplib\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\">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\u00f9 servizi.<\/p>\n<p>&nbsp;<\/p>\n<p><!--more--><\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n# Parametri dei servizi da monitorare\r\nRestURL = &quot;http:\/\/mioserver:6080\/arcgis\/rest&quot; #Togliere la porta 6080 se necessario\r\nservices = &#x5B;&quot;FOLDER1\/Servizio1&quot;,&quot;FOLDER2\/Servizio2&quot;]\r\n# Parametri del server SMTP\r\nSERVER = &quot;mailserver.yourcompany.com&quot;\r\nPORT = &quot;25&quot;\r\nFROM = &quot;xxxx@yourcompany.com&quot;\r\nPASS =&quot;xxxxx&quot;\r\nMAILDOMAIN = '@yourcompany.com'\r\n\r\n# Utenti\r\nuserList=&#x5B;&quot;nome.cognome&quot;,&quot;nome2.cognome2&quot;]\r\n\r\n# Altri parametri\r\nrispostaNeg =&quot;&quot;\r\nrispostaPos =&quot;&quot;\r\n<\/pre>\n<p style=\"text-align: justify;\">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.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n# Interrogazione dei Servizi\r\ncount = 0\r\nfor s in services:\r\nparams = &quot;&quot; #urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})\r\nurl =&quot;%s\/services\/%s\/MapServer&quot; %(RestURL,s)\r\n\r\ne = &quot;&quot;\r\nprint(s)\r\ntry:\r\nf = urllib2.urlopen(url, '5') # urllib2.urlopen(url&#x5B;, data]&#x5B;, timeout in seconds])\r\nprint f.code\r\nrispostaPos = rispostaPos + &quot;\\n&quot;+ url + &quot;: RISPONDE (cod.&quot; + str(f.getcode()) + &quot;)&quot;\r\nexcept urllib2.HTTPError, e:\r\nprint e.code\r\nrispostaNeg = rispostaNeg + &quot;\\n&quot;+ url + &quot;: NON RISPONDE (cod.&quot; + str(e.code) + &quot;)&quot;\r\nexcept urllib2.URLError, e:\r\nprint e.args\r\nprint e.reason.errno\r\nrispostaNeg = rispostaNeg + &quot;\\n&quot;+ url + &quot;: NON RISPONDE (cod.&quot; + str(e.reason.errno) + &quot;)&quot;\r\ncount = count+1\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\">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 &#8220;stato&#8221;. La risposta \u00e8 stata strutturata in modo da evidenziare prima di tutto i servizi che non rispondono rispetto invece a quelli che rispondono correttamente .<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\nif rispostaNeg != &quot;&quot; :\r\n# get a list of usernames from the list of named tuples returned from ListUsers\r\nuserNames = &#x5B;u for u in userList]\r\n# take the userNames list and make email addresses by appending the appropriate suffix.\r\nemailList = &#x5B;name + MAILDOMAIN for name in userNames]\r\n\r\nTO = emailList\r\nSUBJECT = &quot;Verifica stato dei Servizi ArcGIS Server %s&quot; %(RestURL)\r\nMSG = &quot;Auto generated Message.\\n\\rControllo dello stato dei servizi. \\n SERVIZI CON PROBLEMI:&quot; + rispostaNeg + &quot;\\n\\nSERVIZI CONTROLLATI E OK:&quot; + rispostaPos\r\nprint MSG\r\nprint emailList\r\n\r\n# Prepare actual message\r\nMESSAGE = &quot;\\ From: %s To: %s Subject: %s %s&quot; % (FROM, &quot;, &quot;.join(TO), SUBJECT, MSG)\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><span style=\"line-height: 1.5em;\">L&#8217;ultimo blocco, contenuto nel blocco IF precedente, esegue effettivamente l&#8217;invio utilizzando le credenziali di accesso al server SMTP: sono stati utilizzati i comandi &#8220;Try&#8230;Exept&#8221; per catturare gli errori in ogni singola fase dell&#8217;invio.<\/span><\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\ntry:\r\ntry:\r\nprint(&quot;Collegamento al server...&quot;)\r\nserver = smtplib.SMTP(SERVER,PORT)\r\ntry:\r\nprint(&quot;Login...&quot;)\r\nserver.login(FROM, PASS)\r\ntry:\r\nprint(&quot;Invio mail...&quot;)\r\nserver.sendmail(FROM, TO, MESSAGE)\r\nexcept Exception as e:\r\nprint(&quot;Errore invio Mail\\n&quot; + e.message)\r\nexcept Exception as e:\r\nprint(&quot;Errore Autenticazione Server: controllare le credenziali \\n&quot; + e.message)\r\nexcept Exception as e:\r\nprint(&quot;Errore Collegamento al Server: controllare l'URL del Server e le comunicazioni sulla porta (25 e' la predefinita) \\n&quot; + e.message)\r\n\r\nprint(&quot;Quit.&quot;)\r\nserver.quit()\r\n\r\nexcept Exception as e:\r\nprint e.message\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\">In questo modo si possono censire i servizi cartografici pi\u00f9 importanti e fare in modo che ad ogni esecuzione, e solo in caso di necessit\u00e0, venga spedito un report con i servizi che non rispondono correttamente. Attenzione a non esagerare nel ridurre l&#8217;intervallo di esecuzione del controllo, potreste ritrovarvi la mail riempita nel giro di un weekend!<\/p>\n<p style=\"text-align: justify;\">Di seguito il codice completo da personalizzare con i propri parametri.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\nimport urllib2, smtplib\r\n\r\n# Parametri dei servizi da monitorare\r\nRestURL = &quot;http:\/\/mioserver:6080\/arcgis\/rest&quot; #Togliere la porta 6080 se necessario\r\nservices = &#x5B;&quot;FOLDER1\/Servizio1&quot;,&quot;FOLDER2\/Servizio2&quot;]\r\n\r\n# Parametri del server SMTP\r\nSERVER = &quot;mailserver.yourcompany.com&quot;\r\nPORT = &quot;25&quot;\r\nFROM = &quot;xxxx@yourcompany.com&quot;\r\nPASS =&quot;xxxxx&quot;\r\nMAILDOMAIN = '@yourcompany.com'\r\n\r\n# Utenti\r\nuserList=&#x5B;&quot;nome.cognome&quot;,&quot;nome2.cognome2&quot;]\r\n\r\n# Altri parametri\r\nrispostaNeg =&quot;&quot;\r\nrispostaPos =&quot;&quot;\r\n\r\n# Interrogazione dei Servizi\r\ncount = 0\r\nfor s in services:\r\nparams = &quot;&quot; #urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})\r\nurl =&quot;%s\/services\/%s\/MapServer&quot; %(RestURL,s)\r\n\r\ne = &quot;&quot;\r\nprint(s)\r\ntry:\r\nf = urllib2.urlopen(url, '5') # urllib2.urlopen(url&#x5B;, data]&#x5B;, timeout in seconds])\r\nprint f.code\r\nrispostaPos = rispostaPos + &quot;\\n&quot;+ url + &quot;: RISPONDE (cod.&quot; + str(f.getcode()) + &quot;)&quot;\r\nexcept urllib2.HTTPError, e:\r\nprint e.code\r\nrispostaNeg = rispostaNeg + &quot;\\n&quot;+ url + &quot;: NON RISPONDE (cod.&quot; + str(e.code) + &quot;)&quot;\r\nexcept urllib2.URLError, e:\r\nprint e.args\r\nprint e.reason.errno\r\nrispostaNeg = rispostaNeg + &quot;\\n&quot;+ url + &quot;: NON RISPONDE (cod.&quot; + str(e.reason.errno) + &quot;)&quot;\r\ncount = count+1\r\n\r\nif rispostaNeg != &quot;&quot; :\r\n# get a list of usernames from the list of named tuples returned from ListUsers\r\nuserNames = &#x5B;u for u in userList]\r\n# take the userNames list and make email addresses by appending the appropriate suffix.\r\nemailList = &#x5B;name + MAILDOMAIN for name in userNames]\r\n\r\nTO = emailList\r\nSUBJECT = &quot;Verifica stato dei Servizi ArcGIS Server %s&quot; %(RestURL)\r\nMSG = &quot;Auto generated Message.\\n\\rControllo dello stato dei servizi. \\n SERVIZI CON PROBLEMI:&quot; + rispostaNeg + &quot;\\n\\nSERVIZI CONTROLLATI E OK:&quot; + rispostaPos\r\nprint MSG\r\nprint emailList\r\n\r\n# Prepare actual message\r\nMESSAGE = &quot;\\ From: %s To: %s Subject: %s %s&quot; % (FROM, &quot;, &quot;.join(TO), SUBJECT, MSG)\r\n\r\ntry:\r\ntry:\r\nprint(&quot;Collegamento al server...&quot;)\r\nserver = smtplib.SMTP(SERVER,PORT)\r\ntry:\r\nprint(&quot;Login...&quot;)\r\nserver.login(FROM, PASS)\r\ntry:\r\nprint(&quot;Invio mail...&quot;)\r\nserver.sendmail(FROM, TO, MESSAGE)\r\nexcept Exception as e:\r\nprint(&quot;Errore invio Mail\\n&quot; + e.message)\r\nexcept Exception as e:\r\nprint(&quot;Errore Autenticazione Server: controllare le credenziali \\n&quot; + e.message)\r\nexcept Exception as e:\r\nprint(&quot;Errore Collegamento al Server: controllare l'URL del Server e le comunicazioni sulla porta (25 e' la predefinita) \\n&quot; + e.message)\r\n\r\nprint(&quot;Quit.&quot;)\r\nserver.quit()\r\n\r\nexcept Exception as e:\r\nprint e.message\r\n\r\nprint(&quot;Fine script&quot;)\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\">Per gli utenti Geomaster abbiamo ulteriormente personalizzato e perfezionato lo script esclusivamente per lavorare sulle mappe costruite con Geomaster (<a href=\"http:\/\/www.oneteamlab.it\/geomaster\">www.oneteamlab.it\/geomaster<\/a>).<\/p>\n<p style=\"text-align: justify;\">Domande e commenti al nostro indirizzo: <a href=\"mailto:gis@oneteam.it\">gis@oneteam.it<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ecco un altro esempio di come Python riesce a di integrare all&#8217;interno dello stesso script funzionalit\u00e0 appartenenti a moduli differenti. In questo caso l&#8217;obiettivo \u00e8 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,\u00a0in caso di esito&hellip;<\/p>\n","protected":false},"author":1,"featured_media":6738,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,14],"tags":[51,82,112,219,228,370,394,396,470,507,508,525,526],"class_list":["post-1497","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arcgis-for-server","category-articoli-tecnici","tag-alert","tag-arcgis-server","tag-avviso","tag-e-mail","tag-email","tag-mail","tag-monitor","tag-monitoraggio-servizi","tag-python","tag-script","tag-scripting","tag-servizio-che-non-risponde","tag-servizio-spento"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/posts\/1497","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/comments?post=1497"}],"version-history":[{"count":6,"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/posts\/1497\/revisions"}],"predecessor-version":[{"id":6734,"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/posts\/1497\/revisions\/6734"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/media\/6738"}],"wp:attachment":[{"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/media?parent=1497"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/categories?post=1497"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gis.oneteam.it\/index.php\/wp-json\/wp\/v2\/tags?post=1497"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}