DdnsAutoLogin: Unterschied zwischen den Versionen
imported>3x3cut0r |
imported>3x3cut0r |
||
(13 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
In diesem Artikel geht es um die Möglichkeit, sich bei | In diesem Artikel geht es um die Möglichkeit, sich bei DDNS-Diensten, wie beispielsweise NoIP.com, mittels Python-Script automatisch anmelden zu können, um das Löschen der Hosts nach 30 Tagen zu verhindern. | ||
Der offizielle Weg wäre sich bei dem jeweiligen Dienst einen Pro Account für meistens 25$ im Jahr zu holen, um das Löschen der Hosts nach 30 Tagen zu verhindern. | |||
== Voraussetzungen == | == Voraussetzungen == | ||
* DSM >= 3.2 | * DSM >= 3.2 | ||
* Python >= 2.6 | * Python >= 2.6 (nicht kompatibel mit 3.x!) | ||
Python kann problemlos über das DSM-Paketzentrum gedownloadet und installiert werden. | Python 2.x kann problemlos über das DSM-Paketzentrum gedownloadet und auch bei installiertem Python 3.x parallel installiert und betrieben werden. | ||
== Das Script | == Das Script == | ||
<pre style="width: *; height: | === Dyn.com (ehemals DynDns.org) === | ||
#! | <pre style="width: *; height: 10pc; overflow-y: scroll;"> | ||
#!/bin/python2 | |||
import urllib | import urllib | ||
Zeile 94: | Zeile 95: | ||
def main(argv): | def main(argv): | ||
username = "" | username = "meine-dyn.com-eMail@beispiel.de" | ||
password = "" | password = "mein-dyn.com-Login-Passwort" | ||
logfile = "/var/log/dyndnsAutoLogin.log" | logfile = "/var/log/dyndnsAutoLogin.log" | ||
hiddenval = "" | hiddenval = "" | ||
Zeile 149: | Zeile 150: | ||
</pre> | </pre> | ||
=== NoIP.com === | |||
<pre style="width: *; height: 10pc; overflow-y: scroll;"> | |||
#!/bin/python2 | |||
import urllib | |||
import urllib2 | |||
import cookielib | |||
import getopt | |||
import sys | |||
import logging | |||
def getHiddenRandHTMLResponse(response): | |||
target = "<input type=\"hidden\" name=\"_token\" value=\"" | |||
targetresponse = "<div id=\"sign-up-wrap\"" | |||
parsedres = response[response.find(targetresponse):len(response)] | |||
return parsedres[parsedres.find(target)+len(target):parsedres.find(target)+len(target)+40] | |||
def checkLogin(response): | |||
target = "<title> My No-IP" | |||
if response.find(target) == -1: | |||
return False | |||
return True | |||
def usage(): | |||
print "usage: ./noipAutoLogin [options]" | |||
print "" | |||
print "options:" | |||
print "-h, --help show this help message and exit" | |||
print "-u, --username set your NoIP login_username" | |||
print "-p, --password set your NoIP login_password" | |||
print "" | |||
print "example:" | |||
print "./noipAutoLogin -u username -p password" | |||
class HTMLSession: | |||
cj = None | |||
opener = None | |||
txHeaders = None | |||
def __init__(self, txHeaders): | |||
#The CookieJar will hold any cookies necessary throughout the login process. | |||
self.cj = cookielib.MozillaCookieJar() | |||
self.txHeaders = txHeaders | |||
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj)) | |||
urllib2.install_opener(self.opener) | |||
def setHeaders(self, txheaders): | |||
self.txHeaders = txHeaders | |||
def getHeaders(self): | |||
return self.txHeaders | |||
def openURI(self, uri, txdata): | |||
try: | |||
req = urllib2.Request(uri, txdata, self.txHeaders) | |||
# create a request object | |||
handle = urllib2.urlopen(req) | |||
# and open it to return a handle on the url | |||
except IOError as e: | |||
print 'we failed to open "%s".' % uri | |||
if hasattr(e, 'code'): | |||
print 'We failed with error code - %s.' % e.code | |||
logging.error('We failed with error code - %s.' % e.code) | |||
elif hasattr(e, 'reason'): | |||
print "The error object has the following 'reason' attribute :" | |||
print e.reason | |||
print "This usually means the server doesn't exist,'" | |||
print "is down, or we don't have an internet connection." | |||
return None | |||
else: | |||
return handle.read() | |||
def main(argv): | |||
username = "meine-NoIP-eMail@beispiel.de" | |||
password = "mein-NoIP-Login-Passwort" | |||
logfile = "/var/logs/noipAutoLogin.log" | |||
hiddenval = "" | |||
theurl = "https://www.noip.com/login" | |||
thelogouturl = "https://www.noip.com/logout" | |||
txdata = None | |||
txheaders = {'User-agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'} | |||
# fake a user agent, some websites (like google) don't like automated exploration | |||
logging.basicConfig(filename=logfile,level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y/%m/%d %H:%M:%S') | |||
try: | |||
opts, args = getopt.getopt(argv, "hu:p:", ["help", "username=","password="]) | |||
except getopt.GetoptError: | |||
usage() | |||
logging.warning('Manual login with incorrect parameters') | |||
exit(2) | |||
for opt, arg in opts: | |||
if opt in ("-h", "--help"): | |||
usage() | |||
exit(2) | |||
elif opt in ("-u", "--username"): | |||
username = arg | |||
elif opt in ("-p", "--password"): | |||
password = arg | |||
myhtmlsession = HTMLSession(txheaders) | |||
response = myhtmlsession.openURI(theurl, None) | |||
if response == None: | |||
sys.exit(0) | |||
hiddenval = getHiddenRandHTMLResponse(response) | |||
txdata = urllib.urlencode({'username':username, 'password':password, 'Login':"1", 'submit_login_page':"1", '_token':hiddenval, 'Login': "Sign In"}) | |||
response = myhtmlsession.openURI(theurl, txdata) | |||
if response == None: | |||
sys.exit(0) | |||
#we should sleep here for about 10 seconds. | |||
if checkLogin(response): | |||
print 'We have succesfully logged into NoIP.' | |||
logging.info('We have succesfully logged into NoIP.') | |||
else: | |||
print 'Login failed' | |||
logging.info('Login failed') | |||
response = myhtmlsession.openURI(thelogouturl, None) | |||
if response == None: | |||
sys.exit(0) | |||
if __name__ == "__main__": | |||
main(sys.argv[1:]) | |||
</pre> | |||
'''Wer noch DSM <= 4.x benutzt muss die erste Zeile mit folgender ersetzen:''' | |||
<pre style="width: *"> | |||
#!/volume1/@appstore/Python/usr/local/bin/python | |||
</pre> | |||
'''Wer noch DSM = 5.x benutzt muss die erste Zeile mit folgender ersetzen:''' | |||
<pre style="width: *"> | |||
#!/usr/local/packages/@appstore/Python/usr/local/bin/python | |||
</pre> | |||
'''Weitere Script-Wünsche für andere DDNS-Anbieter können gerne im Forum erfragt werden: [http://www.synology-forum.de/showthread.html?41476-Neue-SLA-bei-kostenlosen-Dyndns-Accounts-mittels-AutoLoginScript-umgehen Link]''' | |||
== Einstellungen und Parameter == | == Einstellungen und Parameter == | ||
In der "def main" (Zeile 81) lassen sich folgende Einstellungen treffen: | In der "def main" (ca. Zeile 81) lassen sich folgende Einstellungen treffen: | ||
* '''username:''' Dein | * '''username:''' Dein DDNS Benutzername | ||
* '''password:''' Dein | * '''password:''' Dein DDNS Passwort | ||
* '''logfile:''' Der Pfad zum Logfile (Standardmäßig /var/log/ | * '''logfile:''' Der Pfad zum Logfile (Standardmäßig /var/log/ddnsAutoLogin.log, hier empfiehlt sich aber ein Pfad, der auch über die FileStation erreichbar ist, um das Logfile auch mit der DSM auslesen, bzw. herunterladen zu können. Beispielsweise einen Gemeinsamen Ordner. "/volume1/Pfad/zum/Gemeinsamen/Ordner/ddnsAutoLogin.log") | ||
* '''hiddenval:''' Wert für versteckte Elemente in Formularen ( | * '''hiddenval:''' Wert für versteckte Elemente in Formularen. (Ist zufallsgeneriert und wird vom Script auf der Seite automatisch ausgelesen und eingetragen) | ||
* '''theurl:''' Die URL zur Login-Seite | * '''theurl:''' Die URL zur Login-Seite | ||
* '''thelogouturl:''' Die URL zur Logout-Seite | * '''thelogouturl:''' Die URL zur Logout-Seite | ||
Zeile 170: | Zeile 313: | ||
* Das Script in die Zwischenablage kopieren und in einen Editor seiner Wahl einfügen. (Der Editor muss "Line ending = LF" unterstützen und es muss auch eingestellt sein! Im selben Zug kann man auch schauen ob der Editor Tabs durch 4 Leerzeichen ersetzt und dies auch einstellen. Wenn man das Script hier rauskopiert entfällt das, da die Tabs schon ersetzt wurden.) | * Das Script in die Zwischenablage kopieren und in einen Editor seiner Wahl einfügen. (Der Editor muss "Line ending = LF" unterstützen und es muss auch eingestellt sein! Im selben Zug kann man auch schauen ob der Editor Tabs durch 4 Leerzeichen ersetzt und dies auch einstellen. Wenn man das Script hier rauskopiert entfällt das, da die Tabs schon ersetzt wurden.) | ||
* Einstellungen (Benutzername, Passwort und Logfile) eintragen | * Einstellungen (Benutzername, Passwort und Logfile) eintragen | ||
* Das Script mit dem Namen " | * Das Script mit dem Namen "ddnsAutoLogin" speichern (Wichtig: ohne Dateiendung und wie schon erwähnt mit "Line ending = LF"!) | ||
* Kopieren des Scripts auf die NAS. Am besten mit der | * Kopieren des Scripts auf die NAS. Am besten mit der FileStation oder über eine Netzfreigabe in einen Ordner seiner Wahl. (Ich habe es bei mir nach /volume1/install/scripts/ kopiert) | ||
* Aufrufen des Aufgabenplaners in der DSM-Systemsteuerung | * Aufrufen des Aufgabenplaners in der DSM-Systemsteuerung | ||
#Erstellen / Benutzer-definiertes Skript | #Erstellen / Benutzer-definiertes Skript | ||
#Allgemeine Einstellungen / Vorgang: | #Allgemeine Einstellungen / Vorgang: ddnsAutoLogin (Beliebiger Name für den Aufgabenplan) | ||
#Allgemeine Einstellungen / Benutzer: root | #Allgemeine Einstellungen / Benutzer: root | ||
#Befehl ausführen: /volume1/install/scripts/ | #Befehl ausführen: /volume1/install/scripts/ddnsAutoLogin (hier den richtigen absoluten Pfad und Namen zu seinem vorher gespeicherten Script) | ||
#Unter Zeitplan nun das gewünschte Intervall einstellen (Ich empfehle einmal täglich. Mindestens jedoch mehr als einmal im Monat!) | #Unter Zeitplan nun das gewünschte Intervall einstellen (Ich empfehle einmal täglich. Mindestens jedoch mehr als einmal im Monat!) | ||
#Fertig! | #Fertig! | ||
Um zu prüfen ob das Script ordnungsgemäß funktioniert liest man einfach in seiner Logfile (/var/log/ | Um zu prüfen ob das Script ordnungsgemäß funktioniert liest man einfach in seiner Logfile (/var/log/ddnsAutoLogin.log) nach. Diese sieht so aus: | ||
<pre> | <pre> | ||
2013/05/30 00:00:06 - INFO - We have succesfully logged into DynDNS. | 2013/05/30 00:00:06 - INFO - We have succesfully logged into DynDNS. | ||
Zeile 192: | Zeile 335: | ||
* Beim Kopieren bzw. Bearbeiten des Scripts wurden Tabs anstelle von Leerzeichen verwendet (1 Tab muss durch 4 Leerzeichen ersetzt werden!) | * Beim Kopieren bzw. Bearbeiten des Scripts wurden Tabs anstelle von Leerzeichen verwendet (1 Tab muss durch 4 Leerzeichen ersetzt werden!) | ||
* Der Benutzername, das Passwort oder die Logfile wurde ohne doppelte Anführungszeichen ( " " ) in das Script eingetragen | * Der Benutzername, das Passwort oder die Logfile wurde ohne doppelte Anführungszeichen ( " " ) in das Script eingetragen | ||
* Das Logging funktioniert nicht bei gesetztem relativen Pfad (logfile = "./ | * Das Logging funktioniert nicht bei gesetztem relativen Pfad (logfile = "./ddnsAutoLogin.log") wenn man den Aufgabenplaner benutzt. | ||
* Falsche Python Version installiert. Python < 2.6 wirft folgende Fehlermeldung: | * Falsche Python Version installiert. Python < 2.6 wirft folgende Fehlermeldung: | ||
<pre> | <pre> | ||
DiskStation> ./ | DiskStation> ./ddnsAutoLogin | ||
./ | ./ddnsAutoLogin:66: Warning: 'as' will become a reserved keyword in Python 2.6 | ||
File "./ | File "./ddnsAutoLogin", line 66 | ||
except IOError as e: | except IOError as e: | ||
^ | ^ | ||
Zeile 203: | Zeile 346: | ||
</pre> | </pre> | ||
Wenn Python mittels Paketmanager installiert wurde (>=2.6) und dieser Fehler kommt stimmt möglicherweise der interne symbolische Link auf python2.7 nicht bzw. wurde nicht gesetzt. Dann mal probieren die erste Zeile mit folgender zu ersetzen: | Wenn Python mittels Paketmanager installiert wurde (>=2.6) und dieser Fehler kommt stimmt möglicherweise der interne symbolische Link auf python2.7 nicht bzw. wurde nicht gesetzt. Dann mal probieren die erste Zeile mit folgender zu ersetzen: | ||
<pre>#!/volume1/@appstore/Python/usr/local/bin/python2.7</pre> | <pre>#!/usr/local/packages/@appstore/Python/usr/local/bin/python2.7</pre> | ||
<br> | |||
* Das Script lässt sich nicht ausführen und die Konsole meldet ein | |||
<pre>/bin/sh: ./ddnsAutoLogin: not found</pre> | |||
Hierfür kann es mehrere Ursachen geben: | |||
# Das Script wurde von einem nicht vorhandenen Pfad heraus aufgerufen. Einfach mal versuchen den vollständigen Pfad anzugeben:<pre>DiskStation> /volume1/install/scripts/ddnsAutoLogin</pre> | |||
# Die erste Zeile im Script, die sogenannte Shebang-Zeile (oder auch Magic Line) ist nicht richtig.<pre>#!/usr/local/packages/@appstore/Python/usr/local/bin/python</pre>in diesem Zug prüfen ob python (bzw python2.7) auch im Ordner /usr/local/packages/@appstore/Python/usr/local/bin/ vorhanden ist. Den Ordner sich auf der Konsole einfach mal listen lassen:<pre>DiskStation> ls -la /usr/local/packages/@appstore/Python/usr/local/bin/</pre>Hier sind vorallem folgende Einträge wichtig:<pre>lrwxrwxrwx 1 root root 9 2013-07-11 15:54 python -> python2.7 lrwxrwxrwx 1 root root 9 2013-07-11 15:54 python2 -> python2.7 -rwxr-xr-x 1 root root 2794888 2013-05-31 14:02 python2.7</pre> | |||
# Der verwendete Editor hat das falsche "Line ending" benutzt. Statt LF (UNIX) wurde CRLF (Windows) verwendet. In diesem Fall sieht ein <pre>DiskStation> cat /volume1/install/scripts/ddnsAutoLogin</pre>dann so aus:<pre>#!/usr/local/packages/@appstore/Python/usr/local/bin/python^M ^M import urllib^M import urllib2^M import cookielib^M import getopt^M import sys^M import logging^M ^M ... </pre>Die fehlerhaften Zeilenumbrüche "^M" müssen dann entweder händisch, mit vi beispielsweise, entfernt werfen oder das Script muss mit den richtigen Line endings erneut kopiert werden! | |||
<br> | |||
[[Benutzer:3x3cut0r|3x3cut0r]] 12:27, 15. Jun. 2014 (CEST) |
Aktuelle Version vom 3. Juli 2016, 21:56 Uhr
In diesem Artikel geht es um die Möglichkeit, sich bei DDNS-Diensten, wie beispielsweise NoIP.com, mittels Python-Script automatisch anmelden zu können, um das Löschen der Hosts nach 30 Tagen zu verhindern.
Der offizielle Weg wäre sich bei dem jeweiligen Dienst einen Pro Account für meistens 25$ im Jahr zu holen, um das Löschen der Hosts nach 30 Tagen zu verhindern.
Voraussetzungen
- DSM >= 3.2
- Python >= 2.6 (nicht kompatibel mit 3.x!)
Python 2.x kann problemlos über das DSM-Paketzentrum gedownloadet und auch bei installiertem Python 3.x parallel installiert und betrieben werden.
Das Script
Dyn.com (ehemals DynDns.org)
#!/bin/python2 import urllib import urllib2 import cookielib import getopt import sys import logging def getRandHTMLResponse(response): target = "<form id=\'login" targetresponse = "<div id=\'loginbox\'" response = response[response.find(targetresponse):len(response)] return response[response.find(target)+len(target):response.find(target)+len(target):response.find(target)+len(target)+4] def getHiddenRandHTMLResponse(response): target = "<input type=\'hidden\' name=\'multiform\' value=\'" targetresponse = "<div id=\'loginbox\'" parsedres = response[response.find(targetresponse):len(response)] return parsedres[parsedres.find(target)+len(target):parsedres.find(target)+len(target)+34] def checkLogin(response): target = "<title>My Dyn Account</title>" if response.find(target) == -1: return False return True def usage(): print "usage: ./dyndnsAutoLogin [options]" print "" print "options:" print "-h, --help show this help message and exit" print "-u, --username set your DynDns login_username" print "-p, --password set your DynDns login_password" print "" print "example:" print "./dyndnsAutoLogin -u username -p password" class HTMLSession: cj = None opener = None txHeaders = None def __init__(self, txHeaders): #The CookieJar will hold any cookies necessary throughout the login process. self.cj = cookielib.MozillaCookieJar() self.txHeaders = txHeaders self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj)) urllib2.install_opener(self.opener) def setHeaders(self, txheaders): self.txHeaders = txHeaders def getHeaders(self): return self.txHeaders def openURI(self, uri, txdata): try: req = urllib2.Request(uri, txdata, self.txHeaders) # create a request object handle = urllib2.urlopen(req) # and open it to return a handle on the url except IOError as e: print 'we failed to open "%s".' % uri if hasattr(e, 'code'): print 'We failed with error code - %s.' % e.code logging.error('We failed with error code - %s.' % e.code) elif hasattr(e, 'reason'): print "The error object has the following 'reason' attribute :" print e.reason print "This usually means the server doesn't exist,'" print "is down, or we don't have an internet connection." return None else: return handle.read() def main(argv): username = "meine-dyn.com-eMail@beispiel.de" password = "mein-dyn.com-Login-Passwort" logfile = "/var/log/dyndnsAutoLogin.log" hiddenval = "" theurl = "https://account.dyn.com/entrance/" thelogouturl = "https://account.dyn.com/entrance/?__logout=1" txdata = None txheaders = {'User-agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'} # fake a user agent, some websites (like google) don't like automated exploration logging.basicConfig(filename=logfile,level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y/%m/%d %H:%M:%S') try: opts, args = getopt.getopt(argv, "hu:p:", ["help", "username=","password="]) except getopt.GetoptError: usage() logging.warning('Manual login with incorrect parameters') exit(2) for opt, arg in opts: if opt in ("-h", "--help"): usage() exit(2) elif opt in ("-u", "--username"): username = arg elif opt in ("-p", "--password"): password = arg myhtmlsession = HTMLSession(txheaders) response = myhtmlsession.openURI(theurl, None) if response == None: sys.exit(0) hiddenval = getHiddenRandHTMLResponse(response) txdata = urllib.urlencode({'username':username, 'password':password, 'multiform':hiddenval, 'submit': "Log in"}) response = myhtmlsession.openURI(theurl, txdata) if response == None: sys.exit(0) #we should sleep here for about 10 seconds. if checkLogin(response): print 'We have succesfully logged into DynDNS.' logging.info('We have succesfully logged into DynDNS.') else: print 'Login failed' logging.info('Login failed') response = myhtmlsession.openURI(thelogouturl, None) if response == None: sys.exit(0) if __name__ == "__main__": main(sys.argv[1:])
NoIP.com
#!/bin/python2 import urllib import urllib2 import cookielib import getopt import sys import logging def getHiddenRandHTMLResponse(response): target = "<input type=\"hidden\" name=\"_token\" value=\"" targetresponse = "<div id=\"sign-up-wrap\"" parsedres = response[response.find(targetresponse):len(response)] return parsedres[parsedres.find(target)+len(target):parsedres.find(target)+len(target)+40] def checkLogin(response): target = "<title> My No-IP" if response.find(target) == -1: return False return True def usage(): print "usage: ./noipAutoLogin [options]" print "" print "options:" print "-h, --help show this help message and exit" print "-u, --username set your NoIP login_username" print "-p, --password set your NoIP login_password" print "" print "example:" print "./noipAutoLogin -u username -p password" class HTMLSession: cj = None opener = None txHeaders = None def __init__(self, txHeaders): #The CookieJar will hold any cookies necessary throughout the login process. self.cj = cookielib.MozillaCookieJar() self.txHeaders = txHeaders self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj)) urllib2.install_opener(self.opener) def setHeaders(self, txheaders): self.txHeaders = txHeaders def getHeaders(self): return self.txHeaders def openURI(self, uri, txdata): try: req = urllib2.Request(uri, txdata, self.txHeaders) # create a request object handle = urllib2.urlopen(req) # and open it to return a handle on the url except IOError as e: print 'we failed to open "%s".' % uri if hasattr(e, 'code'): print 'We failed with error code - %s.' % e.code logging.error('We failed with error code - %s.' % e.code) elif hasattr(e, 'reason'): print "The error object has the following 'reason' attribute :" print e.reason print "This usually means the server doesn't exist,'" print "is down, or we don't have an internet connection." return None else: return handle.read() def main(argv): username = "meine-NoIP-eMail@beispiel.de" password = "mein-NoIP-Login-Passwort" logfile = "/var/logs/noipAutoLogin.log" hiddenval = "" theurl = "https://www.noip.com/login" thelogouturl = "https://www.noip.com/logout" txdata = None txheaders = {'User-agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'} # fake a user agent, some websites (like google) don't like automated exploration logging.basicConfig(filename=logfile,level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y/%m/%d %H:%M:%S') try: opts, args = getopt.getopt(argv, "hu:p:", ["help", "username=","password="]) except getopt.GetoptError: usage() logging.warning('Manual login with incorrect parameters') exit(2) for opt, arg in opts: if opt in ("-h", "--help"): usage() exit(2) elif opt in ("-u", "--username"): username = arg elif opt in ("-p", "--password"): password = arg myhtmlsession = HTMLSession(txheaders) response = myhtmlsession.openURI(theurl, None) if response == None: sys.exit(0) hiddenval = getHiddenRandHTMLResponse(response) txdata = urllib.urlencode({'username':username, 'password':password, 'Login':"1", 'submit_login_page':"1", '_token':hiddenval, 'Login': "Sign In"}) response = myhtmlsession.openURI(theurl, txdata) if response == None: sys.exit(0) #we should sleep here for about 10 seconds. if checkLogin(response): print 'We have succesfully logged into NoIP.' logging.info('We have succesfully logged into NoIP.') else: print 'Login failed' logging.info('Login failed') response = myhtmlsession.openURI(thelogouturl, None) if response == None: sys.exit(0) if __name__ == "__main__": main(sys.argv[1:])
Wer noch DSM <= 4.x benutzt muss die erste Zeile mit folgender ersetzen:
#!/volume1/@appstore/Python/usr/local/bin/python
Wer noch DSM = 5.x benutzt muss die erste Zeile mit folgender ersetzen:
#!/usr/local/packages/@appstore/Python/usr/local/bin/python
Weitere Script-Wünsche für andere DDNS-Anbieter können gerne im Forum erfragt werden: Link
Einstellungen und Parameter
In der "def main" (ca. Zeile 81) lassen sich folgende Einstellungen treffen:
- username: Dein DDNS Benutzername
- password: Dein DDNS Passwort
- logfile: Der Pfad zum Logfile (Standardmäßig /var/log/ddnsAutoLogin.log, hier empfiehlt sich aber ein Pfad, der auch über die FileStation erreichbar ist, um das Logfile auch mit der DSM auslesen, bzw. herunterladen zu können. Beispielsweise einen Gemeinsamen Ordner. "/volume1/Pfad/zum/Gemeinsamen/Ordner/ddnsAutoLogin.log")
- hiddenval: Wert für versteckte Elemente in Formularen. (Ist zufallsgeneriert und wird vom Script auf der Seite automatisch ausgelesen und eingetragen)
- theurl: Die URL zur Login-Seite
- thelogouturl: Die URL zur Logout-Seite
- txdata: Muss auf "None" stehen!
- txheaders: Als welcher Browser sich das Script ausgeben soll (hier Mozilla/4.0)
Wichtig ist hier alles in doppelten Anführungszeichen zu schreiben ( " " )
Für Konsolen-Benutzer: Benutzername und Passwort können auch über die jeweiligen Parameter (-u username -p password) dem Script übergeben werden.
Installation und Einbinden mittels DSM Aufgabenplaner
- Das Script in die Zwischenablage kopieren und in einen Editor seiner Wahl einfügen. (Der Editor muss "Line ending = LF" unterstützen und es muss auch eingestellt sein! Im selben Zug kann man auch schauen ob der Editor Tabs durch 4 Leerzeichen ersetzt und dies auch einstellen. Wenn man das Script hier rauskopiert entfällt das, da die Tabs schon ersetzt wurden.)
- Einstellungen (Benutzername, Passwort und Logfile) eintragen
- Das Script mit dem Namen "ddnsAutoLogin" speichern (Wichtig: ohne Dateiendung und wie schon erwähnt mit "Line ending = LF"!)
- Kopieren des Scripts auf die NAS. Am besten mit der FileStation oder über eine Netzfreigabe in einen Ordner seiner Wahl. (Ich habe es bei mir nach /volume1/install/scripts/ kopiert)
- Aufrufen des Aufgabenplaners in der DSM-Systemsteuerung
- Erstellen / Benutzer-definiertes Skript
- Allgemeine Einstellungen / Vorgang: ddnsAutoLogin (Beliebiger Name für den Aufgabenplan)
- Allgemeine Einstellungen / Benutzer: root
- Befehl ausführen: /volume1/install/scripts/ddnsAutoLogin (hier den richtigen absoluten Pfad und Namen zu seinem vorher gespeicherten Script)
- Unter Zeitplan nun das gewünschte Intervall einstellen (Ich empfehle einmal täglich. Mindestens jedoch mehr als einmal im Monat!)
- Fertig!
Um zu prüfen ob das Script ordnungsgemäß funktioniert liest man einfach in seiner Logfile (/var/log/ddnsAutoLogin.log) nach. Diese sieht so aus:
2013/05/30 00:00:06 - INFO - We have succesfully logged into DynDNS. 2013/05/30 08:00:05 - INFO - We have succesfully logged into DynDNS. 2013/05/30 16:00:04 - INFO - We have succesfully logged into DynDNS. 2013/05/30 17:36:43 - INFO - Login failed
Häufige Fehler
- Beim Kopieren bzw. Bearbeiten des Scripts wurden Tabs anstelle von Leerzeichen verwendet (1 Tab muss durch 4 Leerzeichen ersetzt werden!)
- Der Benutzername, das Passwort oder die Logfile wurde ohne doppelte Anführungszeichen ( " " ) in das Script eingetragen
- Das Logging funktioniert nicht bei gesetztem relativen Pfad (logfile = "./ddnsAutoLogin.log") wenn man den Aufgabenplaner benutzt.
- Falsche Python Version installiert. Python < 2.6 wirft folgende Fehlermeldung:
DiskStation> ./ddnsAutoLogin ./ddnsAutoLogin:66: Warning: 'as' will become a reserved keyword in Python 2.6 File "./ddnsAutoLogin", line 66 except IOError as e: ^ SyntaxError: invalid syntax
Wenn Python mittels Paketmanager installiert wurde (>=2.6) und dieser Fehler kommt stimmt möglicherweise der interne symbolische Link auf python2.7 nicht bzw. wurde nicht gesetzt. Dann mal probieren die erste Zeile mit folgender zu ersetzen:
#!/usr/local/packages/@appstore/Python/usr/local/bin/python2.7
- Das Script lässt sich nicht ausführen und die Konsole meldet ein
/bin/sh: ./ddnsAutoLogin: not found
Hierfür kann es mehrere Ursachen geben:
- Das Script wurde von einem nicht vorhandenen Pfad heraus aufgerufen. Einfach mal versuchen den vollständigen Pfad anzugeben:
DiskStation> /volume1/install/scripts/ddnsAutoLogin
- Die erste Zeile im Script, die sogenannte Shebang-Zeile (oder auch Magic Line) ist nicht richtig.
#!/usr/local/packages/@appstore/Python/usr/local/bin/python
in diesem Zug prüfen ob python (bzw python2.7) auch im Ordner /usr/local/packages/@appstore/Python/usr/local/bin/ vorhanden ist. Den Ordner sich auf der Konsole einfach mal listen lassen:DiskStation> ls -la /usr/local/packages/@appstore/Python/usr/local/bin/
Hier sind vorallem folgende Einträge wichtig:lrwxrwxrwx 1 root root 9 2013-07-11 15:54 python -> python2.7 lrwxrwxrwx 1 root root 9 2013-07-11 15:54 python2 -> python2.7 -rwxr-xr-x 1 root root 2794888 2013-05-31 14:02 python2.7
- Der verwendete Editor hat das falsche "Line ending" benutzt. Statt LF (UNIX) wurde CRLF (Windows) verwendet. In diesem Fall sieht ein
DiskStation> cat /volume1/install/scripts/ddnsAutoLogin
dann so aus:#!/usr/local/packages/@appstore/Python/usr/local/bin/python^M ^M import urllib^M import urllib2^M import cookielib^M import getopt^M import sys^M import logging^M ^M ...
Die fehlerhaften Zeilenumbrüche "^M" müssen dann entweder händisch, mit vi beispielsweise, entfernt werfen oder das Script muss mit den richtigen Line endings erneut kopiert werden!
3x3cut0r 12:27, 15. Jun. 2014 (CEST)