# Wichtiger Hinweis: Externe Konfiguration
# Die Login-Daten für No-IP und eMail können aus einer externen Datei, welche in
# der Variable "CONFIG_FILE" definiert werden muss gelesen werden.
# Besonderheit: Die Datei im Dateisystem muss die Endung ".py" haben.
# Bitte dort die Daten eintragen (Im gleichen Verzeichnis wie das Skript!)
CONFIG_FILE = "NOIP_Account_Renew" # Ohne .py (Im gleichen Verzeichnis wie das Skript!)
# Kann abgeschaltet werden, in dem man CONFIG_FILE = "" setzt. In dem Fall die
# Variablen hier ausfüllen!
USERNAME = "" # No-IP Benutzername
PASSWORD = "" # No-IP Passwort
FROMADRESS = "" # eMail-Sender
TOADRESS = "" # eMail-Empfänger
SMTPSERVER = "" # SMTP-Serveradresse ("" zum deaktivieren)
SMTPPORT = "" # SMTP-Port (Z. B. 25)
SMTPPASS = "" # Server verlangt Autentification ("" zum deaktivieren)
pi@LabPi:~/Scripts $ sudo python /home/pi/Scripts/no-ip_updater.py
NO-IP Account-Renew Script #190312
Traceback (most recent call last):
File "/home/pi/Scripts/no-ip_updater.py", line 98, in <module>
br.select_form(nr=0)
File "/usr/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 499, in select_form
global_form = self._factory.global_form
File "/usr/lib/python2.7/dist-packages/mechanize/_html.py", line 544, in __getattr__
self.forms()
File "/usr/lib/python2.7/dist-packages/mechanize/_html.py", line 557, in forms
self._forms_factory.forms())
File "/usr/lib/python2.7/dist-packages/mechanize/_html.py", line 237, in forms
_urlunparse=_rfc3986.urlunsplit,
File "/usr/lib/python2.7/dist-packages/mechanize/_form.py", line 844, in ParseResponseEx
_urlunparse=_urlunparse,
File "/usr/lib/python2.7/dist-packages/mechanize/_form.py", line 979, in _ParseFileEx
data = file.read(CHUNK)
File "/usr/lib/python2.7/dist-packages/mechanize/_response.py", line 195, in read
data = self.wrapped.read(to_read)
File "/usr/lib/python2.7/socket.py", line 384, in read
data = self._sock.recv(left)
File "/usr/lib/python2.7/httplib.py", line 573, in read
return self._read_chunked(amt)
File "/usr/lib/python2.7/httplib.py", line 633, in _read_chunked
value.append(self._safe_read(amt))
File "/usr/lib/python2.7/httplib.py", line 688, in _safe_read
chunk = self.fp.read(min(amt, MAXAMOUNT))
File "/usr/lib/python2.7/socket.py", line 384, in read
data = self._sock.recv(left)
File "/usr/lib/python2.7/ssl.py", line 766, in recv
return self.read(buflen)
File "/usr/lib/python2.7/ssl.py", line 653, in read
v = self._sslobj.read(len)
socket.error: [Errno 104] Connection reset by peer
[~] # /usr/local/sbin/NOIP-Account-Renew
NO-IP Account-Renew Script #190313
Lade Konfiguration aus NOIP_Account_Renew.py
host_id=xxx90 [OK]
host_id=xxx97 [OK]
host_id=xxx07 [OK]
sudo python /home/pi/Scripts/no-ip_updater.py
NO-IP Account-Renew Script #190312
host_id=XXXXXX [OK]
...
sudo python /home/pi/Scripts/no-ip_updater.py
NO-IP Account-Renew Script #190312
Traceback (most recent call last):
File "/home/pi/Scripts/no-ip_updater.py", line 109, in <module>
for link in br.links():
File "/usr/lib/python2.7/dist-packages/mechanize/_html.py", line 42, in __call__
for item in self._iterator:
File "/usr/lib/python2.7/dist-packages/mechanize/_html.py", line 160, in links
for token in p.tags(*(self.urltags.keys()+["base"])):
File "/usr/lib/python2.7/dist-packages/mechanize/_pullparser.py", line 147, in iter_until_exception
yield fn(*args, **kwds)
File "/usr/lib/python2.7/dist-packages/mechanize/_pullparser.py", line 256, in get_tag
tok = self.get_token()
File "/usr/lib/python2.7/dist-packages/mechanize/_pullparser.py", line 236, in get_token
data = self._fh.read(self.chunk)
File "/usr/lib/python2.7/dist-packages/mechanize/_response.py", line 195, in read
data = self.wrapped.read(to_read)
File "/usr/lib/python2.7/socket.py", line 384, in read
data = self._sock.recv(left)
File "/usr/lib/python2.7/httplib.py", line 573, in read
return self._read_chunked(amt)
File "/usr/lib/python2.7/httplib.py", line 615, in _read_chunked
line = self.fp.readline(_MAXLINE + 1)
File "/usr/lib/python2.7/socket.py", line 480, in readline
data = self._sock.recv(self._rbufsize)
File "/usr/lib/python2.7/ssl.py", line 766, in recv
return self.read(buflen)
File "/usr/lib/python2.7/ssl.py", line 653, in read
v = self._sslobj.read(len)
socket.error: [Errno 104] Connection reset by peer
...
NO-IP Account-Renew Script #190312
Traceback (most recent call last):
File "/home/pi/Scripts/no-ip_updater.py", line 98, in <module>
br.select_form(nr=0)
File "/usr/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 499, in select_form
global_form = self._factory.global_form
File "/usr/lib/python2.7/dist-packages/mechanize/_html.py", line 544, in __getattr__
self.forms()
File "/usr/lib/python2.7/dist-packages/mechanize/_html.py", line 557, in forms
self._forms_factory.forms())
File "/usr/lib/python2.7/dist-packages/mechanize/_html.py", line 237, in forms
_urlunparse=_rfc3986.urlunsplit,
File "/usr/lib/python2.7/dist-packages/mechanize/_form.py", line 844, in ParseResponseEx
_urlunparse=_urlunparse,
File "/usr/lib/python2.7/dist-packages/mechanize/_form.py", line 979, in _ParseFileEx
data = file.read(CHUNK)
File "/usr/lib/python2.7/dist-packages/mechanize/_response.py", line 195, in read
data = self.wrapped.read(to_read)
File "/usr/lib/python2.7/socket.py", line 384, in read
data = self._sock.recv(left)
File "/usr/lib/python2.7/httplib.py", line 573, in read
return self._read_chunked(amt)
File "/usr/lib/python2.7/httplib.py", line 633, in _read_chunked
value.append(self._safe_read(amt))
File "/usr/lib/python2.7/httplib.py", line 688, in _safe_read
chunk = self.fp.read(min(amt, MAXAMOUNT))
File "/usr/lib/python2.7/socket.py", line 384, in read
data = self._sock.recv(left)
File "/usr/lib/python2.7/ssl.py", line 766, in recv
return self.read(buflen)
File "/usr/lib/python2.7/ssl.py", line 653, in read
v = self._sslobj.read(len)
socket.error: [Errno 104] Connection reset by peer
#!/usr/bin/env python
# -*- coding: utf-8 -*-
### *|--------------------------------|* ###
### *| NO-IP Account-Renew Script 1.0 |* ###
### *| (c) by DarkStarXxX @ DEB |* ###
### *|--------------------------------|* ###
# Modifiziert von MegaV0lt @ DEB
# Modifiziert von SLASH @ DEB
VERSION=190313
# Wichtiger Hinweis: Externe Konfiguration
# Die Login-Daten für No-IP und eMail können aus einer externen Datei, welche in
# der Variable "CONFIG_FILE" definiert werden muss gelesen werden.
# Besonderheit: Die Datei im Dateisystem muss die Endung ".py" haben.
# Bitte dort die Daten eintragen (Im gleichen Verzeichnis wie das Skript!)
CONFIG_FILE = "NOIP_Account_Renew" # Ohne .py (Im gleichen Verzeichnis wie das Skript!)
# Kann abgeschaltet werden, in dem man CONFIG_FILE = "" setzt. In dem Fall die
# Variablen hier ausfüllen!
USERNAME = "" # No-IP Benutzername
PASSWORD = "" # No-IP Passwort
FROMADRESS = "" # eMail-Sender
TOADRESS = "" # eMail-Empfänger
SMTPSERVER = "" # SMTP-Serveradresse ("" zum deaktivieren)
SMTPPORT = "" # SMTP-Port (Z. B. 25)
SMTPPASS = "" # Server verlangt Autentification ("" zum deaktivieren)
# Vorgaben
LOG_FILE = "" # Kein Log, wenn nächste Zeile auskommentiert ist
#LOG_FILE = "/var/log/NOIP_renew.log" # Dateiname wird auch für die eMail verwendet
MAIL_SUBJECT = "NO-IP Account Updater" # Betreff der Status eMail
MAIL_BODY = "NO-IP Account Updater Service updated your NO-IP Account for another 30 days.\nPlease check the attached Logfile\n\n" # Text in der eMail
HOST_URL = "https://www.noip.com/members/dns/"
RESULT_STR = []
import importlib
import mechanize
import time
import ssl
if hasattr(ssl, '_create_unverified_context'):
ssl._create_default_https_context = ssl._create_unverified_context
# Funktion: update_host - Für jeden Host "Modify" klicken
def update_host(str_host, brow):
global RESULT_STR
brow.select_form(nr=00) ; brow.submit()
# Check if OK
if LOG_FILE:
ts = time.strftime("%d.%m.%Y %H:%M:%S") # Zeitstempel für das Log (19.10.2016 12:51:30)
f1 = open(LOG_FILE, 'a+')
host_id = after(str_host, "?") # Alle Zeichen nach dem ?
if brow.response().read().find("Update will be applied") >= 0:
if LOG_FILE: print >> f1,ts,host_id + " [OK]" # Ausgabe in das Log
print(host_id + " [OK]") # Ausgabe auf der Konsole (und cron)
RESULT_STR.append(host_id + " [OK]") # Für die eMail
else:
if LOG_FILE: print >> f1,ts,host_id + " [FAILED]"
print(host_id + " [FAILED]")
RESULT_STR.append(host_id + " [FAILED]")
return
# Funktion: after - Liefert Zeichenkette nach Zeichen a
def after(value, a):
# Find and validate first part
pos_a = value.rfind(a)
if pos_a == -1: return value # Nicht gefunden: Ganzer Wert zurück!
# Returns chars after the found string.
adjusted_pos_a = pos_a + len(a)
if adjusted_pos_a >= len(value): return ""
return value[adjusted_pos_a:]
# Browser options
br = mechanize.Browser()
br.set_handle_equiv(True) ; br.set_handle_robots(False)
br.set_handle_redirect(True) ; br.set_handle_referer(True)
br.addheaders = [('User-agent', 'Chrome')]
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
### Start
print "NO-IP Account-Renew Script #%s" % VERSION
if CONFIG_FILE:
print('Lade Konfiguration aus ' + CONFIG_FILE + '.py')
myconf = importlib.import_module(CONFIG_FILE, package=None)
USERNAME = myconf.USERNAME ; PASSWORD = myconf.PASSWORD
FROMADRESS = myconf.FROMADRESS ; TOADRESS = myconf.TOADRESS
SMTPSERVER = myconf.SMTPSERVER ; SMTPPORT = myconf.SMTPPORT
SMTPPASS = myconf.SMTPPASS
# Prüfen, ob USERNAME und PASSWORT konfiguriert sind
if not USERNAME:
print('FEHLER: USERNAME ist nicht konfiguriert!') ; quit()
if not PASSWORD:
print('FEHLER: PASSWORD ist nicht konfiguriert!') ; quit()
# Seite öffnen
br.open(HOST_URL)
# Login
br.select_form(nr=0)
br.form["username"] = USERNAME ; br.form["password"] = PASSWORD
br.submit()
# Nicht mehr nötig, da die alternative Seite abgeschaltet wurde (August 2018)
#br.find_link(text='Manage Hosts')
#req = br.click_link(text='Manage Hosts')
#br.open(req)
# Links in Array speichern
mylink = [] # Leeres Array
for link in br.links():
if link.text == 'Modify': mylink += [link]
# Links klicken und Updaten
for link in mylink:
req = br.click_link(link)
br.open(req)
update_host(link.url, br)
####### SMTP Section ############
if not SMTPSERVER: quit() # Nur wenn SMTPSERVER gesetzt ist
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
from email import encoders
msg = MIMEMultipart()
msg['From'] = FROMADRESS ; msg['To'] = TOADRESS
msg['Subject'] = MAIL_SUBJECT
body = MAIL_BODY
for var in RESULT_STR:
body = str(body) + str(var) + "\n"
msg.attach(MIMEText(body, 'plain'))
if LOG_FILE:
filename = after(LOG_FILE, "/") # Dateiname ohne Pfad
attachment = open(LOG_FILE, "rb")
part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)
msg.attach(part)
# Example: Server Address and TCP Port - Exmaple: '192.168.1.1' , 25
server = smtplib.SMTP(SMTPSERVER, SMTPPORT)
server.starttls()
# Server verlangt Autentification (Nur wenn SMTPPASS gesetzt ist)
if SMTPPASS: server.login(FROMADRESS, SMTPPASS)
text = msg.as_string()
server.sendmail(FROMADRESS, TOADRESS, text)
server.quit()
Wir verwenden Cookies und ähnliche Technologien für die folgenden Zwecke:
Akzeptieren Sie Cookies und diese Technologien?
Wir verwenden Cookies und ähnliche Technologien für die folgenden Zwecke:
Akzeptieren Sie Cookies und diese Technologien?