dumbshitaward
Freak
- Registriert
- 27. August 2010
- Beiträge
- 274
- Reaktionspunkte
- 88
- Punkte
- 88
So liebe Leute
Es hat zwar länger gedauert als mir lieb war, aber jetzt möchte ich hier mal meine Wakeup und Shutdown-Skripte für OSCam vorstellen.
Sinnvoll ist das für Leute wie mich, deren Server vielleicht vier, fünf Stunden am Tag effektiv was zu tun haben. Zumindest in meinem Fall ist die Bootzeit recht kurz, sodass die Wartezeit bis das Bild kommt nicht sooo lang ist. Man könnte das ganze natürlich auch mit Suspend to RAM/Disk/Both lösen, damit habe ich mich aber noch nicht befasst, kommt aber evtl. noch.
Mein Dank gilt insbesondere aragorn, der mir beim scripten massiv unter die Arme gegriffen hat und rolu2, der mir das Freetz-Image kompiliert hat.
Benötigt wird:
Hardware
- OSCam-Server (prinzipiell sollte es auch für CCCam gehen) mit WOL fähigem Netzwerkchip. Ich nutze einen FutroS400, damit klappts zumindest bei mir.
- FritzBox (wahrscheinlich ginge auch DD-WRT oder OpenWRT, ist aber nicht getestet)
Software:
- die beiden vorgestellten Scripte shutdown_if_idle.sh und wakeup.sh
- ether-wake und tcpdump auf der FritzBox. Ether-Wake scheint in den meisten Images dabei zu sein, tcpdump muss man meist selbst einbauen. Dieses Image Link ist nicht mehr aktiv. habe ich verwendet, ist für die FritzBox 3270v3.
Einrichtung:
Vorausgesetzt wird ein voll funktionierender OSCam-Server, mit eingeschaltetem Logfile.
Wir erstellen nun folgendes Script
Bei $path natürlich den richtigen Pfad angeben.
Das Script prüft folgendes:
- läuft OSCam überhaupt?
- Ist ein User lokal oder per SSH angemeldet?
- verändert sich die letzte Zeile der Datei oscam.log?
Falls OSCam läuft, kein User angemeldet ist und das Logfile sich nicht mehr verändert, wird die Büchse heruntergefahren.
und nennen es z.B. "shutdown_if_idle.sh"
mit
scharf machen und dann
einen Crontab dafür erstellen:
und dort tragen wir dann
ein. So ruft Crontab das Script alle fünf Minuten auf, man kann die Frequenz auch verringern oder erhöhen, einfach die Zahl (= Minuten) beliebig verändern. Pfade wieder entsprechend anpassen.
Nun sollte euer Server bei Nichtgebrauch herunterfahren.
Runter kommen sie natürlich alle, hoch bekommt ihn nicht jeder
Hier kommt die FritzBox ins Spiel: hierfür benötigen wir zwingend Telnet oder SSH (z.B. Dropbear). Ich habe der Einfachheit halber telnet genommen.
Wichtig ist, dass die beiden Pakete tcpdump und ether-wake im Image sind, sonst gehts nicht.
Hier benötigen wir nun unser wakeup-script, ich habe es wakeup.sh genannt
Hier müsst ihr bei
die IP eures Servers eintragen, bei
die MAC-Adresse des Servers.
Bei
ist der entsprechende Sharing-Port einzutragen, weitere Ports können einfach mit "or dst port 23456" hinzugefügt werden.
Wer sein Systemlog der FritzBox nicht vollhämmern will (denn JEDES Paket löst das event aus) kann die eventadds gerne rausnehmen (dann aber aufpassen, denn if... then/else braucht zwingend ein Argument und Kommentare gelten nicht, also einfach : einsetzen).
Ich lasse tcpdump hier auf allen Interfaces der Box horchen, wer z.B. nur den WAN-Anschluss überwachen will setzt bei
einfach "dsl" statt "any" ein. Andere mögliche Interfaces sind z.B. wifi0 oder eth0.
Das Skript stopfen wir nun in einen mehr oder weniger beliebigen Ordner auf der FritzBox bei dem wir Schreibrechte haben. Achtung, /var/tmp ist zwar für solche Dinge gedacht, ist aber nicht persistent, d.h. das Script ist nach einem Reboot weg.
So oder so müssen wir noch in /var/flash die Datei debug.cfg editieren (z.B. mit nvi) und um die Zeile
(oder wie auch immer ihr das Script genannt habt) erweitern. Für $path natürlich wieder den richtigen Pfad angeben.
Um das Problem, dass das Script wenn es z.B. in /var/tmp liegt nach einem Reboot weg ist, zu lösen kann man das wie folgt regeln. Das Script einfach auf einen USB Stick, der an der Box angeschlossen ist auslagern. Dazu folgende Zeilen in die debug.cfg eintragen:
Jetzt sollte euer heruntergefahrener Server bei Anfragen auf dem Sharing-Port aufwachen und booten, ABER
Das ganze funktioniert NICHT im LAN. Grund hierfür ist, dass z.B. MGCamd 1.35a oder auch CCCam 2.3.0 nicht einfach "auf blöd" Anfragen raushauen, sondern die Clients erstmal einen ARP Request who-has $ServerIP raushauen. Der wird aber nicht zufriedenstellend beantwortet, weil Server ja aus ist. Deswegen gibt der Client irgendwann auf und der Server startet nicht, ergo Teufelskreis.
Ich arbeite noch an einer Lösung einen Trigger für die ARP Requests einzubauen, bis dato aber noch ohne zählbaren Erfolg. Ich habe mir in der Zwischenzeit so geholfen, dass ich in meiner newcamd.list einen Dummy-Port eingebaut habe, der über meine dyndns-Adresse arbeitet, denn von AUSSEN lässt sich der Server starten. Entsprechende Portweiterleitungen natürlich ebenso. Den Port muss man nicht mal in der oscam.conf eintragen, ist einfach "denied", relevant ist ja nur, dass eine Anfrage über diesen Port an der FritzBox ankommt. Ist aber nur eine Notlösung, Hilfe dabei ist natürlich wünschenswert.
Tip:
Wer wie ich das Problem hatte, dass der MGCamd Client zwar den Server aufweckt, dann aber erst nach ewigen Zeiten hell macht und das nur schneller funktioniert, wenn man das CAM neu startet, dem könnte folgender Hinweis helfen.
in der mg_cfg gibt es die Schalter N: und Q:
Sieht dann so aus
Wenn wir N auf 07 stellen (= 01 + 02 + 04, also alles an)
und Q
entsprechend verändern (XXX = Zeit in Sekunden), wenn es vorher auf einem hohen Wert stand (bei mir war das z.B. 600), dann klappts auch recht fix. Ich habe das z.B. einfach mal auf 5 gestellt, Problem gelöst.
Ideen und Verbesserungsvorschläge sind natürlich herzlich willkommen, vielleicht kann ja jemand etwas hier ganz oder teilweise gebrauchen.
Es hat zwar länger gedauert als mir lieb war, aber jetzt möchte ich hier mal meine Wakeup und Shutdown-Skripte für OSCam vorstellen.
Sinnvoll ist das für Leute wie mich, deren Server vielleicht vier, fünf Stunden am Tag effektiv was zu tun haben. Zumindest in meinem Fall ist die Bootzeit recht kurz, sodass die Wartezeit bis das Bild kommt nicht sooo lang ist. Man könnte das ganze natürlich auch mit Suspend to RAM/Disk/Both lösen, damit habe ich mich aber noch nicht befasst, kommt aber evtl. noch.
Mein Dank gilt insbesondere aragorn, der mir beim scripten massiv unter die Arme gegriffen hat und rolu2, der mir das Freetz-Image kompiliert hat.
Benötigt wird:
Hardware
- OSCam-Server (prinzipiell sollte es auch für CCCam gehen) mit WOL fähigem Netzwerkchip. Ich nutze einen FutroS400, damit klappts zumindest bei mir.
- FritzBox (wahrscheinlich ginge auch DD-WRT oder OpenWRT, ist aber nicht getestet)
Software:
- die beiden vorgestellten Scripte shutdown_if_idle.sh und wakeup.sh
- ether-wake und tcpdump auf der FritzBox. Ether-Wake scheint in den meisten Images dabei zu sein, tcpdump muss man meist selbst einbauen. Dieses Image Link ist nicht mehr aktiv. habe ich verwendet, ist für die FritzBox 3270v3.
Einrichtung:
Vorausgesetzt wird ein voll funktionierender OSCam-Server, mit eingeschaltetem Logfile.
Wir erstellen nun folgendes Script
Code:
# This script will check for activity in OSCam by constantly checking the log.
# You may have to edit the path to the oscam.log at oscamlog=$PATH and/or set
# the sleep timer according to your preferences.
# The script also checks if OSCam is running at all (you may want to add an
# e-mail notification if you want) and if users are logged in, preventing shutdown
# if so. Execute this script with cron every couple of minutes.
# Created by DumbShitAward @ digital-eliteboard.com
#! bin/bash
oscamlog=/$PATH/oscam.log
# Check if OSCam is running
ps cax | grep oscam.x86 > /dev/null
if [ $? -eq 0 ]; then
# echo 'OSCam still running'
# Read last line of oscam.log and store in variable
firstline=$(sed -n '$p' $oscamlog)
# Check if value stored
# echo "$firstline"
# Wait for activity
sleep 60s
# Read last line of oscam.log again
secondline=$(sed -n '$p' $oscamlog)
# Check again if value is stored
# echo "$secondline"
# Compare lines, check for active users and shut down if inactive
if [ -z "$(who | awk {'print $1'})" ]&&[ "$firstline" = "$secondline" ]; then
echo 'Nobody home. Shutting down...'
sudo shutdown -h now
else echo "$(who)" is still logged in.
fi
else
echo 'OSCam has crashed!!'
fi
Bei $path natürlich den richtigen Pfad angeben.
Das Script prüft folgendes:
- läuft OSCam überhaupt?
- Ist ein User lokal oder per SSH angemeldet?
- verändert sich die letzte Zeile der Datei oscam.log?
Falls OSCam läuft, kein User angemeldet ist und das Logfile sich nicht mehr verändert, wird die Büchse heruntergefahren.
und nennen es z.B. "shutdown_if_idle.sh"
mit
Code:
chmod +x shutdown_if_idle.sh
einen Crontab dafür erstellen:
Code:
crontab -e
Code:
*/5 * * * * /$path/shutdown_if_idle.sh
ein. So ruft Crontab das Script alle fünf Minuten auf, man kann die Frequenz auch verringern oder erhöhen, einfach die Zahl (= Minuten) beliebig verändern. Pfade wieder entsprechend anpassen.
Nun sollte euer Server bei Nichtgebrauch herunterfahren.
Runter kommen sie natürlich alle, hoch bekommt ihn nicht jeder

Hier kommt die FritzBox ins Spiel: hierfür benötigen wir zwingend Telnet oder SSH (z.B. Dropbear). Ich habe der Einfachheit halber telnet genommen.
Wichtig ist, dass die beiden Pakete tcpdump und ether-wake im Image sind, sonst gehts nicht.
Hier benötigen wir nun unser wakeup-script, ich habe es wakeup.sh genannt
Code:
#!/bin/sh
ip="ServerIP"
wolmac="MAC Adresse des Servers"
wolinterface="lan"
time=5
while true; do
if [ ! -x /usr/bin/tcpdump ]; then
eventadd 1 "WakeUp-Script: Tcpdump nicht gefunden. Script beendet."
break 2
fi
eventadd 1 "WakeUp-Script: Tcpdump ueberwacht $ip"
/usr/bin/tcpdump -i any -p -c 1 -n -l dst host $ip and dst port 12345 or dst port 23456 >/dev/null
if test -x /usr/bin/ether-wake ; then
ether-wake -i $wolinterface $wolmac
eventadd 1 "WakeUp-Script: WOL Packet an $wolmac und Adapter: $wolinterface gesendet"
eventadd 1 "WakeUp-Script: wartet $time"
sleep $time
else
eventadd 1 "WakeUp-Script: Ether-wake nicht gefunden. Script beendet."
break 2
fi
done
Hier müsst ihr bei
Code:
ip=
Code:
wolmac=
Bei
Code:
/usr/bin/tcpdump -i any -p -c 1 -n -l dst host $ip and dst port [B]12345 [/B]>/dev/null
Wer sein Systemlog der FritzBox nicht vollhämmern will (denn JEDES Paket löst das event aus) kann die eventadds gerne rausnehmen (dann aber aufpassen, denn if... then/else braucht zwingend ein Argument und Kommentare gelten nicht, also einfach : einsetzen).
Ich lasse tcpdump hier auf allen Interfaces der Box horchen, wer z.B. nur den WAN-Anschluss überwachen will setzt bei
Code:
/usr/bin/tcpdump -i any -p -c 1 -n -l dst host $ip and dst port 12345 >/dev/null
Das Skript stopfen wir nun in einen mehr oder weniger beliebigen Ordner auf der FritzBox bei dem wir Schreibrechte haben. Achtung, /var/tmp ist zwar für solche Dinge gedacht, ist aber nicht persistent, d.h. das Script ist nach einem Reboot weg.
So oder so müssen wir noch in /var/flash die Datei debug.cfg editieren (z.B. mit nvi) und um die Zeile
Code:
./$PATH/wakeup.sh &
Um das Problem, dass das Script wenn es z.B. in /var/tmp liegt nach einem Reboot weg ist, zu lösen kann man das wie folgt regeln. Das Script einfach auf einen USB Stick, der an der Box angeschlossen ist auslagern. Dazu folgende Zeilen in die debug.cfg eintragen:
Code:
cp /var/media/ftp/uStor01/wakeup.sh /var/tmp
cd /var/tmp
chmod +x wakeup.sh
chmod 777 wakeup.sh
./wakeup.sh &
Jetzt sollte euer heruntergefahrener Server bei Anfragen auf dem Sharing-Port aufwachen und booten, ABER
Das ganze funktioniert NICHT im LAN. Grund hierfür ist, dass z.B. MGCamd 1.35a oder auch CCCam 2.3.0 nicht einfach "auf blöd" Anfragen raushauen, sondern die Clients erstmal einen ARP Request who-has $ServerIP raushauen. Der wird aber nicht zufriedenstellend beantwortet, weil Server ja aus ist. Deswegen gibt der Client irgendwann auf und der Server startet nicht, ergo Teufelskreis.
Ich arbeite noch an einer Lösung einen Trigger für die ARP Requests einzubauen, bis dato aber noch ohne zählbaren Erfolg. Ich habe mir in der Zwischenzeit so geholfen, dass ich in meiner newcamd.list einen Dummy-Port eingebaut habe, der über meine dyndns-Adresse arbeitet, denn von AUSSEN lässt sich der Server starten. Entsprechende Portweiterleitungen natürlich ebenso. Den Port muss man nicht mal in der oscam.conf eintragen, ist einfach "denied", relevant ist ja nur, dass eine Anfrage über diesen Port an der FritzBox ankommt. Ist aber nur eine Notlösung, Hilfe dabei ist natürlich wünschenswert.
Tip:
Wer wie ich das Problem hatte, dass der MGCamd Client zwar den Server aufweckt, dann aber erst nach ewigen Zeiten hell macht und das nur schneller funktioniert, wenn man das CAM neu startet, dem könnte folgender Hinweis helfen.
in der mg_cfg gibt es die Schalter N: und Q:
Sieht dann so aus
Code:
# network retry, use summ for several options
# 00 disable
# 01 retry every new ecm
# 02 try to connect to offline shares every Q: seconds
# 04 try to detect and fast reconnect to lost (and not used atm) server
# + XX messages number and YY seconds to reconnect
# mg will reconnect to server, if no answer to last XX ecm/keepalive or
# if no answer for last ecm or keepalive sent for YY seconds
# set to 0 to disable
N: { xx }
Wenn wir N auf 07 stellen (= 01 + 02 + 04, also alles an)
und Q
Code:
# newcamd dead routes connect retry, sec
Q: { XXX }
entsprechend verändern (XXX = Zeit in Sekunden), wenn es vorher auf einem hohen Wert stand (bei mir war das z.B. 600), dann klappts auch recht fix. Ich habe das z.B. einfach mal auf 5 gestellt, Problem gelöst.
Ideen und Verbesserungsvorschläge sind natürlich herzlich willkommen, vielleicht kann ja jemand etwas hier ganz oder teilweise gebrauchen.
Zuletzt bearbeitet: