Skript ausführen wenn kein WLAN Client connected

chr.reuter

Neuer User
Mitglied seit
15 Jun 2009
Beiträge
5
Punkte für Reaktionen
0
Punkte
0
Hallo,

ich möchte auf meiner FritzBox 7270 (mit Freetz) ein Skript ausführen wenn sich der letzte WLAN-Client abgemeldet hat.

Kann mir jemand sagen wie das geht?

Ziel ist das Abschalten der angeschlossenen Peripherie (Festplatte, Drucker) über sispmctl und eine über USB schaltbare Steckdosenleiste.
Die Steuerung der Leiste funzt bereits komplett. Was fehlt ist nur noch das automatische Ausführen des Abschaltungs-Skriptes wenn sich der letzte WLAN Client abgemeldet hat bzw. des Einschalt-Skriptes wenn sich der erste wieder anmeldet.

Ich vermute ich muss einen Cron-Job aufsetzen der die Anzahl der aktiven WLAN-Clients ermittelt und dann ggf. eben das entsprechende Skript ausführt oder eben nichts tut.

Danke für Eure Hilfe!

Chr.
 
Tja, nachdem mir offenbar keiner helfen kann habe ich es mal versucht.

Ergebnis: Ein Skript welches das AVM-Logfile zyklisch (z.B. jede Minute) nach bestimmten Einträgen durchsucht. Jedem Eintrag kann eine Aktion zugeordnet werden. Die Aktion des Eintrags der zuletzt ins File geschrieben wurde wird ausgeführt.
Wenn keiner der definierten Einträge gefunden wurde wird eine einstellbare Default-Aktion ausgeführt.

Mit den Einstellungen im Skript unten wird der Drucker (an Dose 1 der Gembird-SIS-Steckerleiste) automatisch eingeschaltet sobald mindestens 1 WLAN-Client verbunden ist und ausgeschaltet sobald sich der letzte abgemeldet hat (Ausschalten dauert meist mehrere Minuten da der entsprechende Eintrag erst verzögert im Logfile ankommt).

Das Skript lässt sich in ähnlicher Form mit anderen Einstellungen sicher für viele Aufgaben verwenden wo auf bestimmte Ereignisse reagiert werden soll.

Wenn es jemand brauchen kann: einfach das beiliegende Skript in ein beliebiges Verzeichnis auf die Box hochladen, ausführbar machen (chmod a+x Skriptname) und sicherheitshalber noch ins Unix-Format konvertieren (dos2unix Skriptname).
Danach den cron daemon über die Freetz-Oberfläche starten (am besten auf automatisch setzen) und einen Eintrag in der crond-Konfiguration hinzufügen um das Skript zyklisch auszuführen. z.B. für einmal pro Minute einen Stern für alle Zeitwerte und den Skriptnamen eintragen.

Das Skript ist mit dieser Methode bei einem Neustart der Box verloren. Im Freetz-WiKi kann man nachschauen wie man Dateien dauerhaft auf der Box speichert.

Das Skript in dieser Form benötigt die Pakete "bash" und "sispmctl".
Wenn andere Logfiles ausgewertet werden sollen wäre wohl auch "tac" nützlich (siehe Erklärung im Code)

Hier das Skript (bei mir heißt es "isPowerRequired.sh" (Im Original sind die Zeilen eingerückt - wird aber hier nicht richtig dargestellt und alle Zeilen beginnen in Spalte 0 ?!):

Code:
#!/bin/bash
#
# Script created by Christian Reuter
# use freely at your own risk !
#
# scans the AVM event-log-file to find the last entry which tells
# whether a WLAN client is connected or all clients have been disconnected.
# Depending on this information the power of the peripheral devices is 
# switched on / off
#
# Usage: isPowerRequired.sh [-h] [-v]
# -v = verbose mode
# -h = show usage and quit
#

##############################################################
# define the log file scan command, all search patterns and the 
# corresponding actions here !
##############################################################

# log file scan command (i.e. "eventsdump" or "tac myLogFile.log"
# Important: the command must list the log file entries in the order
# "latest line first" to standard out (from where it is piped into grep).
# Note that "tac" is the same as "cat" except that it lists the file contents 
# in reverse order!
# LOGFILE_SCAN_COMMAND="tac awk.txt"
LOGFILE_SCAN_COMMAND="eventsdump"

# strings to search within the log file (must be in double quotes !!)
ALL_SEARCH_STRINGS=(\
"WLAN-Station angemeldet" \
"Keine WLAN-Station mehr angemeldet" \
"WLAN wurde von der Nachtschaltung deaktiviert" \
)

# action to perform if the corresponding search string is found last in the file
# IMPORTANT: the number of actions defined must be equal to the number of 
# search strings defined above!!
ALL_ACTIONS=(\
"sispmctl -o 1" \
"sispmctl -f 1" \
"sispmctl -f 1" \
)

# define the default action (action used when no matching entry can be found)
# DEFAULT_ACTION="echo DEFAULT"
DEFAULT_ACTION="sispmctl -f 1"

##############################################################
# end of user - definitions
##############################################################

# by default run quietly
VERBOSE="OFF"

# parse input parameters
args=($*)
for arg in ${args[@]}
do
    case ${arg[i]} in
        -v) VERBOSE="ON"
            ;;
        -h) echo "usage: $0 [-v] [-h] // -v = verbose mode, -h = show this message"
            exit
            ;;
        *)  echo "invalid argument: ${arg[i]}"
            exit
            ;;
    esac
done


# for debugging only: print all search patterns and their corresponding actions
if [[ ${VERBOSE} == "ON" ]]; then
    for (( i = 0 ; i < ${#ALL_SEARCH_STRINGS[@]} ; i++ ))
    do    
        echo "SEARCH_STRING $i: ${ALL_SEARCH_STRINGS[$i]}"
        echo "ACTION $i       : ${ALL_ACTIONS[$i]}"
    done
fi

# pre-define the resulting action in case we do not find anything
ACTION=${DEFAULT_ACTION}
LAST_ACTION_LINE=999999

# loop over all search strings
for (( i = 0 ; i < ${#ALL_SEARCH_STRINGS[@]} ; i++ ))
do
    # for debugging only: print current search pattern
    if [[ ${VERBOSE} == "ON" ]]; then
        echo "LINE: ${ALL_SEARCH_STRINGS[$i]}"
    fi
    
    # find the last line containing the string
    LINE=`${LOGFILE_SCAN_COMMAND} | grep "${ALL_SEARCH_STRINGS[$i]}" -m 1 -n`
    
    # check if a matching line has been found
    if [[ ${LINE} != "" ]]; then    
        # for debugging only:
        if [[ ${VERBOSE} == "ON" ]]; then
            echo "matching line found!"
        fi
    
        # cut away everything except the line number
        LINE_NR=${LINE%%:*}
        # for debugging only:
        if [[ ${VERBOSE} == "ON" ]]; then
            echo "LINE_NR: ${LINE_NR}"
        fi
        
        # set this search string's action if it appears later in the file
        if [[ ${LINE_NR} -lt ${LAST_ACTION_LINE} ]]; then
            ACTION=${ALL_ACTIONS[$i]};
            LAST_ACTION_LINE=${LINE_NR}
            if [[ ${VERBOSE} == "ON" ]]; then
                echo "new action: ${ACTION}"
            fi
        else
            if [[ ${VERBOSE} == "ON" ]]; then
                echo "entry was later than entry of current action!"
            fi
        fi    
    else    
        # for debugging only:
        if [[ ${VERBOSE} == "ON" ]]; then
            echo "no matching line found!"        
        fi
    fi    
done

# perform the resulting action
${ACTION}

# uncomment the following line to add an entry in the AVM-event log!
# eventadd 1 "$0 wurde ausgefuehrt!"
 
Zuletzt bearbeitet:
Und nicht zu vergessen: Du hast gar keinbe Hilfe gebraucht. Wie wäre es dann noch mit der Unterbringung im Wiki z.B.? :)
 
Und nicht zu vergessen: Du hast gar keinbe Hilfe gebraucht. Wie wäre es dann noch mit der Unterbringung im Wiki z.B.? :)
Im Wiki möchte ich das Ding nicht sofort unterbringen.
Sollte m.E. erst noch etwas "abhängen" d.h. ein paar andere User sollten Ihre Erfahrungen / Verbesserungen posten.

Aber ich hätte schon selbst einen Verbesserungsvorschlag für den ich diesmal etwas Unterstützung brauchen könnte:

Ideal wäre es eigentlich wenn der Drucker eingeschaltet wird wenn ein Druckauftrag eintrudelt und ausgeschaltet wird sobald dieser abgearbeitet ist. Dann ist das Ding echt nur noch an wenn es tatsächlich gebraucht wird.

Die erste Idee war den Inhalt des Druckspooler-Verzeichnisses zu überwachen aber das ist wohl nicht so einfach.

Soweit ich das bisher beurteilen kann wird der Drucker über von AVM weder über samba noch über cups angesprochen sondern direkt von dem Prozess /sbin/printserv der auf Port 9100 hört und die Druckaufträge direkt an den USB-Port weiterleitet.
=> Frage: stimmt das so ?

ps listet gleich 4 dieser Prozesse auf => 2. Frage warum 4 Prozesse für 1 Drucker ?

Eine Möglichkeit wäre den Quellcode von printserv so zu ändern, dass man dem Programm ein bei Eintreffen eines Auftrages auszuführendes Skript per Kommandozeilenoption mitgeben kann.
=> Fragen:
Läuft der Prozess überhaupt und "horcht" auf den Port wenn kein Drucker angeschlossen ist ?
Weiß jemand wie man an den Quellcode kommt ?

Eine andere Möglichkeit wäre ein Programm das erkennt wenn auf Port 9100 etwas ankommt und unabhängig von printserv das Skipt startet.
Fragen:
Gibt es bereits ein Programm das so etwas kann?

Weiß noch jemand andere Möglichkeiten ?

Grüße,

chr.
 
Da mein Canon Pixma kaputt ist, kann ich es nicht sleber testen, aber zum Thema "nur an, wenns muss":

Zumindest bei den Canon ists so (wenn die direkt angeschlossen sind), dass die sich abschalten nach ein paar Minuten und sobald wieder was per USB losgeht dann wieder angehen. Scheint also auch vom Model abzuhängen.

Wie es aussieht wenn die an der Box hängen hab ich nicht probiert, der HP CLJ macht das ja auch nicht, das weiß ich ;)
 
Das stimmt schon dass die meisten Drucker in den Standby-Modus gehen wenn nicht gedruckt wird. Das Schöne an der per USB schaltbaren Steckerleiste ist aber, dass man die Verbraucher eben komplett vom Netz trennen kann und der Stromverbrauch damit auf 0 geht. Die Leiste selbst verbraucht dabe fast nichts (sonst hätte die ganze Aktion nicht viel Sinn).

Mir ging es bei der Aktion ja auch nicht nur um den bzw. die Drucker sondern auch um die externe Festplatte den Scanner etc. Da kommt übers Jahr schon was zusammen wenn die alle dauernd im Standby laufen.

Mit der Gembird SIS und sispmctl ist ja eh schon die halbe Miete erledigt. Jetzt braucht es eigentlich nur noch ein wenig Intelligenz was wann aufgrund welcher Ereignisse ein- bzw. ausgeschaltet wird.
 
@vice_pres:
Soweit ich das mitverfolgt habe, schaltet er ja den Drucker über eine fernsteuerbare Steckdose an und aus, weil sein Drucker sich nicht selbst abschaltet/ in den Energiesparmodus geht.
Ob die Drucker (habe selbst einen CanonPixma IP4000 an der Box) aber wirklich weniger Strom brauchen, wenn die LED am Drucker aus ist, wage ich ernsthaft zu bezweifeln. Ich könnte das ja bei Gelegenheit mal mit meinem EnergieCheck3000 testen (wenn Interesse daran besteht).

EDIT:
Grade dann mal getestet:
Mein Drucker braucht im Standby (LED an) und Aus (LED aus) jeweils 1,0 bis 1,1 Watt (soweit man dem EnergyCheck hier vertauen kann). Das Abschalten der LED ist also nur ein "Alibi-Aus".
 
Zuletzt bearbeitet:
Im Wiki möchte ich das Ding nicht sofort unterbringen.
Sollte m.E. erst noch etwas "abhängen" d.h. ein paar andere User sollten Ihre Erfahrungen / Verbesserungen posten.

Ein Wiki wächst und lebt von Veränderungen. Also nur zu. Nicht zwangsläufig das komplett fertig ins Wiki stellen, sondern auch ruhig sachen, die noch entwickelt werden, und es können auch durchaus mehrere partizipieren wenn so etwas im Wiki steht.
 
@SaschaBr
Das würd mich mal brennend interessieren wieviel der Drucker im Vergleich Standby/Normal braucht.
 
Hatte ich oben schon editiert:
EDIT:
Grade dann mal getestet:
Mein Drucker braucht im Standby (LED an) und Aus (LED aus) jeweils 1,0 bis 1,1 Watt (soweit man dem EnergyCheck hier vertauen kann). Das Abschalten der LED ist also nur ein "Alibi-Aus".

Also wie ich vermutet hatte: Kein Unterschied.
 

Neueste Beiträge

Statistik des Forums

Themen
246,274
Beiträge
2,249,293
Mitglieder
373,863
Neuestes Mitglied
RuthBeatty
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.