LUG STORMARN
Home News
Info
Mitglieder
Kontakt


automatisches Login bei DSLonAir


(von Ulf Leichsenring, 25. Juli 2005)



In Bad Oldesloe ist seit kurzem DSLonAir (Breitband-Internet-Anbindung via WLAN) verfügbar.

Leider erfolgt der Login bei DSLonAir zur Zeit nur über ein HTTP-Login-Formular. Somit wird ein automatisierter Login - z.B. durch den Linux Server - erschwert. Nach Aussage des DSLonAir Supports arbeitet man gerade an einer alternativen Loginmethode über PPPOE. Wann diese verfügbar sein wird konnte der durchaus kompetente Mitarbeiter der DSLonAir-Hotline leider noch nicht nennen.

Zur Überbrückung der Zwischenzeit habe ich folgendes gebastelt:

Für alle die für das webbasierte Login bei DSLonAir ein Script zur automatisierten Online-Prüfung und ggfs. Relogin (z.B. nach der Zwangstrennung) gesucht haben, habe ich dieses kleine Linux Bash Script geschrieben.
Am Besten wird es einfach regelmäßig (z.B. alle 5 Minuten) per Cron Job aufgerufen. Es prüft anhand eines kurzen HTTP Requests zu einer konfigurierbaren Website, ob man noch online ist. Sollte der Request einen HTTP Returcode 302 liefern, hat DSLonAir einen Redirect auf die DSLonAir Login Seite zurückgeliefert. Dann führt das Script einen neuen Login aus.

Es benötigt das Tool curl, welches aber bei den gängigen Linux Distributionen mitgeliefert wird.

Das Script ist für jeden frei. Jeder kann damit machen was er möchte. Die Nutzung des Script erfolgt aber auf eigene Gefahr! Ich übernehme keinerlei Haftung! Auch garantiere ich nicht, dass die im Script angegebene URL zum Testen des Onlinestatus überhaupt erreichbar ist. Ihr könnt die Test-URL gerne verwenden, aber ohne Gewähr. Am besten sucht sich jeder selber eine kleine URL die er regelmäßig prüft. Der HTTP Request muss nur bei korrekt geladener Seite den Returncode 200 liefern und die Seite sollte möglichst klein sein, um nicht sein DSL Volumen schon durch diese Tests über Gebühr zu beanspruchen.

ich habe mir auch ein paar Gedanken zur Sicherheit gemacht. Dieses Script prüft z.B., ob die umgeleitete Seite tatsächlich zu DSLonAir gehört und die HTTP Kommunikation zur Anmeldung verschlüsselt via HTTPS stattfindet. Ohne diese Prüfung könnte es dazu führen, dass man evtl. von einem Angreifer auf eine andere Seite umgeleitet wird und man seine Anmeldedaten dorthin pustet.
Die Anmeldedaten werden von diesem Script nun nur gesendet, wenn sie per HTTPS an den Host "dbd.dslonair.de" übermittelt werden sollen. Ansonsten wird eine entsprechende Fehlermeldung im Logfile /var/log/dsl-logon.log ausgegeben.


Feedback, Kritik und Verbesserungsvorschläge usw. zu diesem Script sind aber ausdrücklich erwünscht. Einfach eine Mail an mich.


Hier zum Download und hier als Source:

#!/bin/bash
#

# 23.07.2005	Version 0.1	Initiale Version
# 24.07.2005	Version 0.2	Pruefungen auf Plausibilitaet der LoginURL eingebaut 
#				(muss https://dbd.dslonair.de) sein



# Dieses Script prüft den Onlinestatus der DSLonAir Verbindung
# und fuehrt ggfs. einen erneuten Login aus
#
# Dabei stellt es sicher, dass die Anmeldung nur per HTTPS an dem Host dbd.dslonair.de erfolgt


# Hier die individuellen Parameter eintragen
TESTURL=http://dsl.leichsenring.net/ok.html
LOGINUSR=hier Dein DSL Username
LOGINPWD=hier Dein DSL Passwort

# Logile
LOGFILE=/var/log/dsl-logon.log

# Testen, ob eine http-Verbindung zum Internet (zur Test-URL) möglich ist
RESULT=$(curl --silent --output /dev/null --write-out "%{http_code}" $TESTURL)

if [ $RESULT == 302 ]; then
	
	# Wenn $RESULT = 302 ist, dann wurde von DSLonAir ein Redirect zur Anmeldeseite gesendet (http_code=302)
	# und es muss ein Login durchgeführt werden

	# temp File für Cookie erzeugen
	TMPCOOKIE=$(mktemp -t cookie.XXXXXX)

	# Die effective URL der Loginseite ermitteln (weil dynamisch) und Cookie speichern
	LOGINURL=$(curl --silent --cookie-jar $TMPCOOKIE --location --output /dev/null \
	                --write-out "%{url_effective}" $TESTURL)

	# Die ermittelte URL einigen Sicherheits- und Plausibilitaetsprüfungen unterziehen
	# Die Anmeldedaten sollen nur per https and das System dbd.dslonair.de gesendet werden

	# wir nehmen mal an die LoginURL sei nicht ok
	LOGINURL_OK=false

	# ermittel aus der LoginURL die Protokollangabe (http oder https)
	PROTOCOL=$(echo $LOGINURL | sed -e "s/:\/\/.*//")

	# ermittel aus der LoginURL den Hostanteil
	LOGINHOST=$(echo $LOGINURL | sed -e "s/.*:\/\///")
	LOGINHOST=$(echo $LOGINHOST | sed -e "s/\/.*//")

	# Wenn Protokoll "https" und Host "dbd.dslonair.de" ist, dann ist es ok
	if [ $PROTOCOL == "https" -a $LOGINHOST == "dbd.dslonair.de" ]; then
		LOGINURL_OK=true
	fi
	
	# Wenn die URL Pruefung soweit ok ist, dann die Anmeldung durchduehren
	if [ $LOGINURL_OK == true ]; then

		# Loginparameter (User/Password) per HTTP POST zusammen mit dem gespeicherten Cookie
		# an die ermittelte URL senden
		RESULT2=$(curl --silent --cookie $TMPCOOKIE --output /dev/null --write-out "%{http_code}" \
		               --data "__ac_name=$LOGINUSR" --data "__ac_password=$LOGINPWD" $LOGINURL)

		# http-Returncode des Anmeldevorgangs pruefen
		if [ $RESULT2 != 200 ]; then
			
			# http-code != 200 heisst grob gesehen "nicht in Ordnung"
			echo "$(date): Logonfehler! http_code = $RESULT2; URL = $LOGINURL" >>$LOGFILE
		else
			# http-code = 200 heisst grob gesehen "in Ordnung"
			echo "$(date): Logon erfolgreich! http_code = $RESULT2; URL = $LOGINURL" >>$LOGFILE
		fi
	else

		# Login URL ist nicht korrekt gewesen
		echo "$(date): Fehler! URL = $LOGINURL" >>$LOGFILE
	fi

	rm $TMPCOOKIE

elif [ $RESULT != 200 ]; then
	echo "$(date): unbekannter Fehler bei Online-Test! http_code = $RESULT" >>$LOGFILE
#else
#	echo "$(date): Online-Test ok! http_code = $RESULT" >>$LOGFILE
fi

# End of Script