1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

HowTo Shutdown & WOL Scripte für OSCam-Server

Dieses Thema im Forum "CS Root & Vserver" wurde erstellt von dumbshitaward, 21. August 2012.

  1. dumbshitaward
    Offline

    dumbshitaward Freak

    Registriert:
    27. August 2010
    Beiträge:
    273
    Zustimmungen:
    95
    Punkte für Erfolge:
    28
    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

    Dieser Link ist nur für Mitglieder!!! Jetzt kostenlos Registrieren ?

    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
    scharf machen und dann
    einen Crontab dafür erstellen:
    Code:
    crontab -e
    und dort tragen wir dann
    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=
    die IP eures Servers eintragen, bei
    Code:
    wolmac=
    die MAC-Adresse des Servers.
    Bei
    Code:
      /usr/bin/tcpdump -i any -p -c 1 -n -l dst host $ip and dst port [B]12345 [/B]>/dev/null  
    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
    Code:
      /usr/bin/tcpdump -i  any -p -c 1 -n -l dst host $ip and dst port 12345 >/dev/null
    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

    Code:
    ./$PATH/wakeup.sh &
    (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:
    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: 22. August 2012
    #1

Diese Seite empfehlen