Path: csiph.com!aioe.org!.POSTED!not-for-mail From: Claudio_F Newsgroups: it.comp.lang.python Subject: Re: ip Pubblico Date: Sat, 19 Mar 2016 21:12:09 +0100 Organization: Aioe.org NNTP Server Lines: 103 Message-ID: References: NNTP-Posting-Host: /gHgHMU4FDWiGDaTTm1JBQ.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15; format=flowed Content-Transfer-Encoding: 8bit X-Complaints-To: abuse@aioe.org User-Agent: Mozilla/5.0 (X11; Linux i686; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 X-Notice: Filtered by postfilter v. 0.8.2 Xref: csiph.com it.comp.lang.python:7621 Il 18/03/2016 09:46, Smith ha scritto: > Ciao a tutti, > ho questo script e vorrei suddividerlo in funzioni per renderlo pił > sintetico possibile. Suddividerlo in funzioni si puo`, ma il codice (a parte gli errori che contiene) non e` minimamente in grado di far fronte alle seguenti situazioni: - server eco IP non raggiungibile - dati ricevuti non validi - server smtp non raggiungibile Poi, oltre a non crashare, in caso di anomalia non deve inviare mail a raffica. Un esempio puo` essere il seguente: #!/usr/bin/python3 #--------------------------------------------------------------------- import urllib.request, smtplib, time #--------------------------------------------------------------------- SMTP = 'smtp.gmail.com', 465 DESTINATARIO = '...email_destinatario...' MITTENTE = '...email_mittente...' USERNAME = '...username...' PASSWORD = '...password...' ECHOADDR = '...addr_ip_server...' ATTESA = 600 #--------------------------------------------------------------------- class ErrIP(Exception): pass class ErrMail(Exception): pass #--------------------------------------------------------------------- def valid_ip(x): x = x.split('.') return (len(x) == 4) and all(z.isdecimal() for z in x) #--------------------------------------------------------------------- def retrive_ip(addr): try: d = urllib.request.urlopen(addr).read() d = d.decode('utf-8').strip() if not valid_ip(d): raise ErrIP() return d except: raise ErrIP('Errore recupero IP!') #--------------------------------------------------------------------- def send_mail(smtp, username, password, mittente, destinatario, oggetto, testo): try: server = smtplib.SMTP_SSL(*smtp) server.ehlo() server.login(username, password) header = 'From: %s\n' % mittente header += 'To: %s\n' % destinatario header += 'Subject: %s\n\n' % oggetto msg = header + testo server.sendmail(mittente, destinatario, msg) server.quit() except: raise ErrMail('Fallito invio email!') #--------------------------------------------------------------------- def main(): ip = '' err_ip = False count = 0 while True: #--------------------------------------------------------- try: count += 1 print('**********************************') print('Controllo n. ', count) read_ip = retrive_ip(ECHOADDR) if err_ip: ip = '' err_ip = False if read_ip == ip: print('Indirizzo IP assegnato :', ip) else: print('Rilevato nuovo IP :', read_ip) oggetto = testo = 'Notifica IP : %s' % read_ip send_mail(SMTP, USERNAME, PASSWORD, MITTENTE, DESTINATARIO, oggetto, testo) ip = read_ip #--------------------------------------------------------- except ErrIP as msg: try: print(msg) if not err_ip: msg = 'Notifica errore : ' + str(msg) send_mail(SMTP, USERNAME, PASSWORD, MITTENTE, DESTINATARIO, msg, msg) err_ip = True except ErrMail as msg: print(msg) #--------------------------------------------------------- except ErrMail as msg: print(msg) #--------------------------------------------------------- finally: time.sleep(ATTESA) #--------------------------------------------------------------------- main()