Diskussion:Acpiwakeupscript
Aus VDR Wiki
(Unterschied zwischen Versionen)
| (3 dazwischenliegende Versionen von einem Benutzer werden nicht angezeigt) | |||
| Zeile 2: | Zeile 2: | ||
Ich bin leider ein Laie aber vielleicht hilft es ja trotzdem. Interessant dürfte das lesen der Timer sein und das erstellen des "Default-Timers". Hier mal das ganze Skript: | Ich bin leider ein Laie aber vielleicht hilft es ja trotzdem. Interessant dürfte das lesen der Timer sein und das erstellen des "Default-Timers". Hier mal das ganze Skript: | ||
| − | #!/bin/bash | + | #!/bin/bash |
| − | # | + | # |
| − | # ShutDown.sh | + | # ShutDown.sh |
| − | # - Prüft, ob gerade eine Aufnahme läuft | + | # - Prüft, ob gerade eine Aufnahme läuft |
| − | # - Kein shutdown am Tag (Serverbetrieb) | + | # - Kein shutdown am Tag (Serverbetrieb) |
| − | # - Täglicher start (Serverbetrieb) | + | # - Täglicher start (Serverbetrieb) |
| − | # | + | # |
| − | set -x | + | set -x |
| − | + | ||
| − | # Gen2VDR V2 | + | # Gen2VDR V2 |
| − | source /etc/vdr.d/conf/vdr | + | source /etc/vdr.d/conf/vdr |
| − | source /etc/vdr.d/conf/gen2vdr.cfg | + | source /etc/vdr.d/conf/gen2vdr.cfg |
| − | + | ||
| − | LOG=/log/shutdown.log | + | LOG=/log/shutdown.log |
| − | SVDRPCMD=/usr/bin/svdrpsend.pl | + | SVDRPCMD=/usr/bin/svdrpsend.pl |
| − | WAKEUP_FILE="/_config/status/Wakeup" | + | WAKEUP_FILE="/_config/status/Wakeup" |
| − | WAKEUP_FLAG="/_config/status/~Wakeup_Flag" | + | WAKEUP_FLAG="/_config/status/~Wakeup_Flag" |
| − | CMD_LST="mplayer noad" | + | CMD_LST="mplayer noad" |
| − | Wakeup=08:35 # Normale Einschaltzeit (HH:MM) | + | Wakeup=08:35 # Normale Einschaltzeit (HH:MM) |
| − | SOn=7 | + | SOn=7 # Serverbetrieb Startzeit (H) im 24h-Format |
| − | SOff=0 # Serverbetrieb Endzeit (H) im 24h-Format | + | SOff=0 # Serverbetrieb Endzeit (H) im 24h-Format |
| − | SEND=/usr/sbin/send # Pfad zum 'Send' (Message Plugin) | + | SEND=/usr/sbin/send # Pfad zum 'Send' (Message Plugin) |
| − | DATE=/bin/date # Pfad zum 'Date' | + | DATE=/bin/date # Pfad zum 'Date' |
| − | POWERDOWNFLAG=/etc/killpower # Stromausfall! | + | POWERDOWNFLAG=/etc/killpower # Stromausfall! |
| − | SHUTDOWN_FILE=/_config/status/~waitforshutdown # at nur einmal starten | + | SHUTDOWN_FILE=/_config/status/~waitforshutdown # at nur einmal starten |
| − | + | ||
| − | logger -s "$0 $*" | + | logger -s "$0 $*" |
| − | + | ||
| − | #Parameter in Variable speichern | + | #Parameter in Variable speichern |
| − | PAR0=$0 | + | PAR0=$0 |
| − | PAR_=$* | + | PAR_=$* |
| − | PAR1=$1 | + | PAR1=$1 |
| − | PAR4=$4 | + | PAR4=$4 |
| − | + | ||
| − | sAktDat="`date -d \"now\" +\"%s\"`" # aktuelles Datum in sekunden | + | sAktDat="`date -d \"now\" +\"%s\"`" # aktuelles Datum in sekunden |
| − | WakeupDat="`date -d \"now\" +\"%Y-%m-%d $Wakeup\"`" # Wakeup-Datum (8:30h) | + | WakeupDat="`date -d \"now\" +\"%Y-%m-%d $Wakeup\"`" # Wakeup-Datum (8:30h) |
| − | sWakeupDat="`date -d \"$WakeupDat\" +\"%s\"`" # Wakeup-Datum in sekunden | + | sWakeupDat="`date -d \"$WakeupDat\" +\"%s\"`" # Wakeup-Datum in sekunden |
| − | + | ||
| − | # WAKEUP_FLAG löschen | + | # WAKEUP_FLAG löschen |
| − | [ -f $WAKEUP_FLAG ] && rm -f $WAKEUP_FLAG | + | [ -f $WAKEUP_FLAG ] && rm -f $WAKEUP_FLAG |
| − | + | ||
| − | function check_ontime () { #Kein ShutDown in der vorgegebenen "Server-Zeit" | + | function check_ontime () { #Kein ShutDown in der vorgegebenen "Server-Zeit" |
| − | + | if [[ `date +%k` -gt $SOn && `date +%k` -ne $SOff ]]; then | |
| − | + | ERR_MSG="Kein Shutdown zwischen $SOn und $SOff Uhr" | |
| − | + | logger -s "[$0] $ERR_MSG" | |
| − | + | $SVDRPCMD MESG $ERR_MSG | |
| − | + | # VDR 'drückt' alle paar Minuten den Power-Knopf. Taste drücken um ihn davon abzuhalten | |
| − | + | sleep 6 | |
| − | + | $SVDRPCMD HITK Back | |
| − | + | exit 2 | |
| − | + | fi | |
return | return | ||
| − | } | + | } |
| − | + | ||
| − | function set_next_shutdown () { | + | function set_next_shutdown () { |
if [ -f $SHUTDOWN_FILE ]; then | if [ -f $SHUTDOWN_FILE ]; then | ||
| − | + | logger -s "[$0] Shutdown already set!" | |
| − | + | #return 1 | |
| − | + | fi | |
echo "$PAR0 $PAR_ > $LOG 2>&1" | at now +$1 minutes | echo "$PAR0 $PAR_ > $LOG 2>&1" | at now +$1 minutes | ||
touch $SHUTDOWN_FILE | touch $SHUTDOWN_FILE | ||
| − | } | + | } |
| − | + | ||
| − | # [Shutdown per CRON] Prüft, ob gerade eine Aufnahme läuft | + | # [Shutdown per CRON] Prüft, ob gerade eine Aufnahme läuft |
| − | if [ "$1" = "cron" ] ; then # Aufruf über cron | + | if [ "$1" = "cron" ] ; then # Aufruf über cron |
| − | + | #Kein ShutDown in der vorgegebenen "Server-Zeit" | |
| − | + | check_ontime | |
| − | + | #Läuft ein Timer? | |
| − | + | RESULT=$($SVDRPCMD -p ${VDR_PORT:-2001} NEXT REL | awk '/^250/ { print $3 }') | |
| − | + | if [[ $RESULT < 1 ]]; then | |
logger -s "[$0] Aufnahme läuft! Shutdown um 20 Minuten verschoben" | logger -s "[$0] Aufnahme läuft! Shutdown um 20 Minuten verschoben" | ||
set_next_shutdown 20 | set_next_shutdown 20 | ||
exit 1 | exit 1 | ||
| − | + | else | |
logger -s "[$0] keine Aufnahme; Shutdown" | logger -s "[$0] keine Aufnahme; Shutdown" | ||
| − | + | fi | |
| − | fi | + | fi |
| − | + | ||
| − | if [ "$1" != "force" ] ; then | + | if [ "$1" != "force" ] ; then |
| − | + | for x in ${CMD_LST} ; do | |
| − | + | if pidof $x >/dev/null ; then | |
$SVDRPCMD MESG "$x läuft! Shutdown in 15 Minuten!" | $SVDRPCMD MESG "$x läuft! Shutdown in 15 Minuten!" | ||
logger -s "[$0] $x läuft! Shutdown in 15 Minuten!" | logger -s "[$0] $x läuft! Shutdown in 15 Minuten!" | ||
| Zeile 88: | Zeile 88: | ||
exit 1 | exit 1 | ||
fi | fi | ||
| − | + | done | |
| − | fi | + | fi |
| − | + | ||
| − | # Eingefügt um Shutdown am Tag zu verhindern (kann mit 'force' umgangen werden) | + | # Eingefügt um Shutdown am Tag zu verhindern (kann mit 'force' umgangen werden) |
| − | if [ "$1" = "force" ] || [ "$1" = "cron" ] ; then # Aufruf über Skript | + | if [ "$1" = "force" ] || [ "$1" = "cron" ] ; then # Aufruf über Skript |
| − | + | logger -s "Shutdown ($1)!" | |
| − | + | PAR1=0 | |
| − | + | ||
| − | + | # Abfrage ob runtergefahren werden soll (Message-Plugin nötig) | |
| − | + | $SEND ask -s -t 5 "Ausschalten abbrechen?" | |
| − | + | RC=$? | |
| − | + | ||
| − | + | case $RC in | |
0) echo -n "Failed (Timeout)";; | 0) echo -n "Failed (Timeout)";; | ||
1) echo -n "Success";; | 1) echo -n "Success";; | ||
| Zeile 110: | Zeile 110: | ||
exit 1 ;; | exit 1 ;; | ||
*) echo -n "unbekannt ($RC)";; | *) echo -n "unbekannt ($RC)";; | ||
| − | + | esac | |
| − | + | ||
| − | + | # Timer einlesen und Auswerten | |
| − | + | while IFS=: read id station date start stop pri life desc epgsearch | |
| − | + | do | |
| − | + | starttime=${start:0:2}:${start:2:2} # ${string:position:length} | |
| − | + | wtimer="`$DATE -d \"$date $starttime\" +\"%s\"`" | |
| − | + | # Ist der letzte Timer der nächste? | |
| − | + | if [ -z $ntimer ] || [ $ntimer -gt $wtimer ] ; then | |
| − | + | if [ "$id" = "1" ] && [ $wtimer -gt $sAktDat ] ; then # Nur aktive Timer die nicht schon laufen | |
| − | + | ntimer=$wtimer | |
| − | + | PAR1=$ntimer | |
| − | + | PAR4=$desc | |
| − | + | #echo "---- Nächster NTimer! ----" | |
| − | + | logger -s "[$0] Nächster Timer: PAR1: $PAR1 PAR4: $PAR4" | |
| − | + | fi | |
| − | + | fi | |
| − | + | done </etc/vdr/timers.conf # Da werden die Timer gespeichert | |
| − | + | ||
| − | + | else | |
| − | + | #Kein ShutDown in der vorgegebenen "Server-Zeit" | |
| − | + | check_ontime | |
| − | + | fi | |
| − | + | ||
| − | + | # Heutiger Startzeitpunkt schon vorbei? | |
| − | + | if [ $sAktDat -gt $sWakeupDat ] ; then | |
| − | + | let sWakeupDat="$sWakeupDat +86400" # +24h | |
| − | + | WakeupDat="`$DATE -d \"1970-01-01 UTC $sWakeupDat seconds\" +\"%Y-%m-%d %R\"`" | |
| − | + | fi | |
| − | + | ||
| − | else | + | # Testen ob der nächste Timer vor dem nächsten Wakeup liegt und falls nötig den Wakeup anassen. |
| − | + | if [ $PAR1 -gt $sWakeupDat ] || [ "$PAR1" = "0" ] ; then | |
| − | + | # Normaler Wakeup | |
| − | fi | + | PAR1=$sWakeupDat |
| − | + | PAR4="" | |
| − | # Heutiger Startzeitpunkt schon vorbei? | + | else |
| − | if [ $sAktDat -gt $sWakeupDat ] ; then | + | # PAR1 wird neuer Starttermin. Vorher in das rechte Format wandeln |
| − | + | NEXT_ALARM="`$DATE -d \"1970-01-01 UTC $PAR1 seconds\" +\"%Y-%m-%d %R\"`" | |
| − | + | fi | |
| − | fi | + | |
| − | + | #Zeit bis zum nächsten Timer | |
| − | # Testen ob der nächste Timer vor dem nächsten Wakeup liegt und falls nötig den Wakeup anassen. | + | let PAR2="$PAR1 - $sAktDat" |
| − | if [ $PAR1 -gt $sWakeupDat ] || [ "$PAR1" = "0" ] ; then | + | |
| − | + | [ -f $SHUTDOWN_FILE ] && rm -f $SHUTDOWN_FILE | |
| − | + | ||
| − | + | # Original Shutdown-Skript aufrufen | |
| − | else | + | ## Beispiel: /_config/bin/vdrshutdown 1165026000 9816 34 nano~Die Welt von morgen 1 |
| − | + | #logger -s "$1 = $PAR1" | |
| − | + | if [ "$PAR4" = "" ] ; then # Nicht vom VDR gestartet | |
| − | fi | + | PAR4="Automatischer-Wakeup" |
| − | + | /_config/bin/vdrshutdown.sh $PAR1 $PAR2 00 "$PAR4" 1 > /var/log/vdrshutdown.log 2>&1 | |
| − | #Zeit bis zum nächsten Timer | + | RC=$? |
| − | let PAR2="$PAR1 - $sAktDat" | + | # SHUTDOWN_FILE löschen damit VDR bein nächsten Start an bleibt |
| − | + | [ -f $WAKEUP_FILE ] && rm -f $WAKEUP_FILE | |
| − | [ -f $SHUTDOWN_FILE ] && rm -f $SHUTDOWN_FILE | + | else |
| − | + | /_config/bin/vdrshutdown.sh $PAR1 $PAR2 $3 "$PAR4" $5 > /var/log/vdrshutdown.log 2>&1 | |
| − | # Original Shutdown-Skript aufrufen | + | RC=$? |
| − | ## Beispiel: /_config/bin/vdrshutdown 1165026000 9816 34 nano~Die Welt von morgen 1 | + | fi |
| − | #logger -s "$1 = $PAR1" | + | |
| − | if [ "$PAR4" = "" ] ; then # Nicht vom VDR gestartet | + | # Rückgabecode |
| − | + | if [ "$RC" = "1" ] ; then | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | else | + | |
| − | + | ||
| − | + | ||
| − | fi | + | |
| − | + | ||
| − | # Rückgabecode | + | |
| − | if [ "$RC" = "1" ] ; then | + | |
set_next_shutdown 10 | set_next_shutdown 10 | ||
| − | + | exit 1 | |
| − | else | + | else |
| − | + | logger -s "RetunCode: $RC" | |
| − | + | exit 0 | |
| − | fi | + | fi |
Aktuelle Version vom 19. Oktober 2008, 09:51 Uhr
ich habe ein ähnliches Skript. Es macht einen täglichen festen Wakeup, außer es liegt ein Timer davor. Ich rechne intern mit den Datum in Sekunden seit 1970, das kann amn dann auch schön in das passende Format konvertieren.
Ich bin leider ein Laie aber vielleicht hilft es ja trotzdem. Interessant dürfte das lesen der Timer sein und das erstellen des "Default-Timers". Hier mal das ganze Skript:
#!/bin/bash
#
# ShutDown.sh
# - Prüft, ob gerade eine Aufnahme läuft
# - Kein shutdown am Tag (Serverbetrieb)
# - Täglicher start (Serverbetrieb)
#
set -x
# Gen2VDR V2
source /etc/vdr.d/conf/vdr
source /etc/vdr.d/conf/gen2vdr.cfg
LOG=/log/shutdown.log
SVDRPCMD=/usr/bin/svdrpsend.pl
WAKEUP_FILE="/_config/status/Wakeup"
WAKEUP_FLAG="/_config/status/~Wakeup_Flag"
CMD_LST="mplayer noad"
Wakeup=08:35 # Normale Einschaltzeit (HH:MM)
SOn=7 # Serverbetrieb Startzeit (H) im 24h-Format
SOff=0 # Serverbetrieb Endzeit (H) im 24h-Format
SEND=/usr/sbin/send # Pfad zum 'Send' (Message Plugin)
DATE=/bin/date # Pfad zum 'Date'
POWERDOWNFLAG=/etc/killpower # Stromausfall!
SHUTDOWN_FILE=/_config/status/~waitforshutdown # at nur einmal starten
logger -s "$0 $*"
#Parameter in Variable speichern
PAR0=$0
PAR_=$*
PAR1=$1
PAR4=$4
sAktDat="`date -d \"now\" +\"%s\"`" # aktuelles Datum in sekunden
WakeupDat="`date -d \"now\" +\"%Y-%m-%d $Wakeup\"`" # Wakeup-Datum (8:30h)
sWakeupDat="`date -d \"$WakeupDat\" +\"%s\"`" # Wakeup-Datum in sekunden
# WAKEUP_FLAG löschen
[ -f $WAKEUP_FLAG ] && rm -f $WAKEUP_FLAG
function check_ontime () { #Kein ShutDown in der vorgegebenen "Server-Zeit"
if `date +%k` -gt $SOn && `date +%k` -ne $SOff ; then
ERR_MSG="Kein Shutdown zwischen $SOn und $SOff Uhr"
logger -s "[$0] $ERR_MSG"
$SVDRPCMD MESG $ERR_MSG
# VDR 'drückt' alle paar Minuten den Power-Knopf. Taste drücken um ihn davon abzuhalten
sleep 6
$SVDRPCMD HITK Back
exit 2
fi
return
}
function set_next_shutdown () {
if [ -f $SHUTDOWN_FILE ]; then
logger -s "[$0] Shutdown already set!"
#return 1
fi
echo "$PAR0 $PAR_ > $LOG 2>&1" | at now +$1 minutes
touch $SHUTDOWN_FILE
}
# [Shutdown per CRON] Prüft, ob gerade eine Aufnahme läuft
if [ "$1" = "cron" ] ; then # Aufruf über cron
#Kein ShutDown in der vorgegebenen "Server-Zeit"
check_ontime
#Läuft ein Timer?
RESULT=$($SVDRPCMD -p ${VDR_PORT:-2001} NEXT REL | awk '/^250/ { print $3 }')
if [[ $RESULT < 1 ]]; then
logger -s "[$0] Aufnahme läuft! Shutdown um 20 Minuten verschoben"
set_next_shutdown 20
exit 1
else
logger -s "[$0] keine Aufnahme; Shutdown"
fi
fi
if [ "$1" != "force" ] ; then
for x in ${CMD_LST} ; do
if pidof $x >/dev/null ; then
$SVDRPCMD MESG "$x läuft! Shutdown in 15 Minuten!"
logger -s "[$0] $x läuft! Shutdown in 15 Minuten!"
set_next_shutdown 15
exit 1
fi
done
fi
# Eingefügt um Shutdown am Tag zu verhindern (kann mit 'force' umgangen werden)
if [ "$1" = "force" ] || [ "$1" = "cron" ] ; then # Aufruf über Skript
logger -s "Shutdown ($1)!"
PAR1=0
# Abfrage ob runtergefahren werden soll (Message-Plugin nötig)
$SEND ask -s -t 5 "Ausschalten abbrechen?"
RC=$?
case $RC in
0) echo -n "Failed (Timeout)";;
1) echo -n "Success";;
2) echo -n "Confirmed (OK)"
$SVDRPCMD MESG "Shutdown abgebrochen!"
exit 1 ;;
3) echo -n "Aborted (Exit)"
$SVDRPCMD MESG "Shutdown abgebrochen!"
exit 1 ;;
*) echo -n "unbekannt ($RC)";;
esac
# Timer einlesen und Auswerten
while IFS=: read id station date start stop pri life desc epgsearch
do
starttime=${start:0:2}:${start:2:2} # ${string:position:length}
wtimer="`$DATE -d \"$date $starttime\" +\"%s\"`"
# Ist der letzte Timer der nächste?
if [ -z $ntimer ] || [ $ntimer -gt $wtimer ] ; then
if [ "$id" = "1" ] && [ $wtimer -gt $sAktDat ] ; then # Nur aktive Timer die nicht schon laufen
ntimer=$wtimer
PAR1=$ntimer
PAR4=$desc
#echo "---- Nächster NTimer! ----"
logger -s "[$0] Nächster Timer: PAR1: $PAR1 PAR4: $PAR4"
fi
fi
done </etc/vdr/timers.conf # Da werden die Timer gespeichert
else
#Kein ShutDown in der vorgegebenen "Server-Zeit"
check_ontime
fi
# Heutiger Startzeitpunkt schon vorbei?
if [ $sAktDat -gt $sWakeupDat ] ; then
let sWakeupDat="$sWakeupDat +86400" # +24h
WakeupDat="`$DATE -d \"1970-01-01 UTC $sWakeupDat seconds\" +\"%Y-%m-%d %R\"`"
fi
# Testen ob der nächste Timer vor dem nächsten Wakeup liegt und falls nötig den Wakeup anassen.
if [ $PAR1 -gt $sWakeupDat ] || [ "$PAR1" = "0" ] ; then
# Normaler Wakeup
PAR1=$sWakeupDat
PAR4=""
else
# PAR1 wird neuer Starttermin. Vorher in das rechte Format wandeln
NEXT_ALARM="`$DATE -d \"1970-01-01 UTC $PAR1 seconds\" +\"%Y-%m-%d %R\"`"
fi
#Zeit bis zum nächsten Timer
let PAR2="$PAR1 - $sAktDat"
[ -f $SHUTDOWN_FILE ] && rm -f $SHUTDOWN_FILE
# Original Shutdown-Skript aufrufen
## Beispiel: /_config/bin/vdrshutdown 1165026000 9816 34 nano~Die Welt von morgen 1
#logger -s "$1 = $PAR1"
if [ "$PAR4" = "" ] ; then # Nicht vom VDR gestartet
PAR4="Automatischer-Wakeup"
/_config/bin/vdrshutdown.sh $PAR1 $PAR2 00 "$PAR4" 1 > /var/log/vdrshutdown.log 2>&1
RC=$?
# SHUTDOWN_FILE löschen damit VDR bein nächsten Start an bleibt
[ -f $WAKEUP_FILE ] && rm -f $WAKEUP_FILE
else
/_config/bin/vdrshutdown.sh $PAR1 $PAR2 $3 "$PAR4" $5 > /var/log/vdrshutdown.log 2>&1
RC=$?
fi
# Rückgabecode
if [ "$RC" = "1" ] ; then
set_next_shutdown 10
exit 1
else
logger -s "RetunCode: $RC"
exit 0
fi