Samstag, 2. Juli 2011

Asus RT-N56U, automatisierter Reconnect für JDownloader

Zum JDownloader muss man wahrscheinlich nicht viel sagen, die Anwendung dürfte bei Benutzern von Sharehostern einer der beliebtesten Download-Manager sein.

Eine Frage, die sich für jeden JDownloader-Benutzer stellt (wenn er nicht gerade bei jedem Hoster einen Premium-Account hat), lautet: “Wie bringe ich meinem Router bei, sich eine neue, externe IP zu holen?”

Bei meinem Router Asus RT-N56U ist eine mögliche Lösung ein automatisierter Telnet-Aufruf.

In der Web-Oberfläche des Routers wird der Telnet-Zugang aktiviert:image

Danach kann man per “telnet router-ip” eine Telnet-Verbindung  in der DOS-Box zum Router aufbauen (Zugangsdaten sind die gleichen wie für die Web-Oberfläche), landet in einer Linux-Command-Shell (die Router-Firmware basiert auf Linux) und kann dort per Kommando “reboot” den Router neu starten:
image

Hinweis: bei Win-Vista und Win-7 wird der Telnet-Client nicht automatisch installiert, ist ggf. über 
–> Systemsteuerung –> Programme und Funktionen –> Windows-Funktionen aktivieren oder deaktivieren
hinzuzufügen.

Ein Aufruf von www.wieistmeineip.de vor und nach der Aktion zeigt, dass sich die externe IP tatsächlich verändert hat (nach dem Router-Reboot ggf. ein oder zwei Minuten warten, denn das WLAN ist logischerweise eine Weile weg).

Nun muss der ganze Vorgang natürlich noch automatisiert werden. Einen vernünftigen Freeware-Telnet-Client für Windows, der batch-fähig ist, konnte ich nicht finden, daher hab ich mir mit AutoIt ein Bildschirm-Makro erstellt, das die Windows-eigene telnet.exe startet und ihr die benötigten Tastatur-Eingaben unterjubelt. Folgender Quellcode (Router-IP und Passwort natürlich anzupassen) wird als Datei reconnect_asus_router.au3 abgespeichert:

Run("telnet 192.168.2.1")
Sleep(3000)
WinWaitActive("Telnet 192.168.2.1")
Send("admin")
Send("{ENTER}")
Sleep(3000)
Send("hier_steht_das_Passwort")
Send("{ENTER}")
Sleep(3000)
Send("reboot")
Send("{ENTER}")
WinClose("Telnet 192.168.2.1")

Per –> Rechtsklick –> Compile Script kann man sich auch eine reconnect_asus_router.exe daraus erstellen, die dann auch auf Windows-Rechnern ausführbar ist, auf denen keine AutoIt installiert ist.

Unter Linux gibt es für kommandozeilenbasierte Anwendungen wie telnet, ftp usw. ein Automatisierungstool namens expect.

Unter Ubuntu geht die Installation von expect so:
sudo apt-get install expect
sudo apt-get install expect-dev

Man kann ein expect-Skript für die Automatisierung von telnet auch “von Hand” erstellen, meine Versuche diesbezüglich waren aber nicht von Erfolg gekrönt. Es wird wohl schon seinen Grund haben, dass es ein 600-seitiges Buch über expect gibt…

Zum Glück gibt es aber autoexpect, damit kann man die telnet-Sitzung zum Asus-Router inkl. reboot-Befehl in ein expect-Skript aufzeichnen lassen. Das geht so:

1. Pfeil: autoexpect wird aufgerufen, der –f Schalter gibt an, dass das aufgezeichnete Skript reconnect_asus_router.sh heißen soll, das “telnet 192.168.2.1” gibt an, dass eine telnet-Sitzung auf diese IP-Adresse aufgezeichnet werden soll.

2. Pfeil: autoexpect gibt die Info aus, dass die Skript-Aufzeichnung gestartet wurde

3. Pfeil: Asus-Router fragt nach login, es wird eingegeben

4. Pfeil: Asus-Router fragt nach Passwort, es wird eingegeben

5. Pfeil: am Kommandoprompt des Routers wird der reboot-Befehl ausgeführt

6. Pfeil: einmal ENTER-Taste führt zum Schließen der Telnet-Sitzung

7. Pfeil: autoexpect gibt die Info aus, dass die Skript-Datei aufgezeichnet wurde und beendet sich

2

Auf diese Weise wurde ein Skript erzeugt, dass sich mit ./reconnect_asus_router.sh aufrufen lässt und zum Reboot des Asus-Routers führt.

So sieht das Skript aus:

set timeout -1
spawn telnet 192.168.2.1
match_max 100000
expect -exact "Trying 192.168.2.1...\r
Connected to 192.168.2.1.\r
Escape character is '^\]'.\r
\r\r
RT-N56U login: "
send -- "admin\r"
expect -exact "admin\r
Password: "
send -- "hier_steht_das_passwort\r"
expect -exact "\r
\r
\r
BusyBox v1.12.1 (2011-05-11 17:19:46 CST) built-in shell (ash)\r
Enter 'help' for a list of built-in commands.\r
\r
# "
send -- "reboot\r"
expect -exact "reboot\r
# "
send -- "\r"
expect eof

Im JDownloader wird das Reconnect-Skript so hinterlegt:3