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!"