Diskussion:Acpiwakeupscript

Aus VDR Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
 
(2 dazwischenliegende Versionen von einem Benutzer werden nicht angezeigt)
Zeile 10: Zeile 10:
 
  #
 
  #
 
  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
Zeile 27: Zeile 27:
 
  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
Zeile 35: Zeile 35:
 
  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
+
if [[ `date +%k` -gt $SOn && `date +%k` -ne $SOff ]]; then
ERR_MSG="Kein Shutdown zwischen $SOn und $SOff Uhr"
+
ERR_MSG="Kein Shutdown zwischen $SOn und $SOff Uhr"
logger -s "[$0] $ERR_MSG"
+
logger -s "[$0] $ERR_MSG"
$SVDRPCMD MESG $ERR_MSG
+
$SVDRPCMD MESG $ERR_MSG
# VDR 'drückt' alle paar Minuten den Power-Knopf. Taste drücken um ihn davon abzuhalten
+
# VDR 'drückt' alle paar Minuten den Power-Knopf. Taste drücken um ihn davon abzuhalten
sleep 6
+
sleep 6
$SVDRPCMD HITK Back
+
$SVDRPCMD HITK Back
exit 2
+
exit 2
fi
+
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!"
+
logger -s "[$0] Shutdown already set!"
#return 1
+
#return 1
fi
+
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"
+
#Kein ShutDown in der vorgegebenen "Server-Zeit"
check_ontime
+
check_ontime
#Läuft ein Timer?
+
#Läuft ein Timer?
RESULT=$($SVDRPCMD -p ${VDR_PORT:-2001} NEXT REL | awk '/^250/ { print $3 }')
+
RESULT=$($SVDRPCMD -p ${VDR_PORT:-2001} NEXT REL | awk '/^250/ { print $3 }')
if [[ $RESULT < 1 ]]; then
+
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
+
else
 
   logger -s "[$0] keine Aufnahme; Shutdown"
 
   logger -s "[$0] keine Aufnahme; Shutdown"
fi
+
fi
 
  fi
 
  fi
 
+
 
  if [ "$1" != "force" ] ; then
 
  if [ "$1" != "force" ] ; then
for x in ${CMD_LST} ; do
+
for x in ${CMD_LST} ; do
if pidof $x >/dev/null ; then
+
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
+
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)!"
+
logger -s "Shutdown ($1)!"
PAR1=0
+
PAR1=0
 
+
# Abfrage ob runtergefahren werden soll (Message-Plugin nötig)
+
# Abfrage ob runtergefahren werden soll (Message-Plugin nötig)
$SEND ask -s -t 5 "Ausschalten abbrechen?"
+
$SEND ask -s -t 5 "Ausschalten abbrechen?"
RC=$?
+
RC=$?
 
+
case $RC in
+
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
+
esac
 
+
 
  # Timer einlesen und Auswerten  
 
  # Timer einlesen und Auswerten  
 
  while IFS=: read id station date start stop pri life desc epgsearch
 
  while IFS=: read id station date start stop pri life desc epgsearch
 
  do
 
  do
#today="`$DATE -d now +\"%G-%m-%d\"`" # YYYY-MM-DD
+
starttime=${start:0:2}:${start:2:2} # ${string:position:length}
  #if [ "$today" == "$date" ] && [ "$start" -gt "$ManWakeUp" ]; then
+
  wtimer="`$DATE -d \"$date $starttime\" +\"%s\"`"  
starttime=${start:0:2}:${start:2:2} # ${string:position:length}
+
# Ist der letzte Timer der nächste?
  #echo "Timer gefunden: $date $starttime (`$DATE -d \"$date $starttime\" +\"%s\"`)"
+
if [ -z $ntimer ] || [ $ntimer -gt $wtimer ] ; then
#echo "`$DATE -d \"$date $starttime\" +\"%Y-%m-%d %R\"`"
+
if [ "$id" = "1" ] && [ $wtimer -gt $sAktDat ] ; then # Nur aktive Timer die nicht schon laufen
#echo "Sicherheitspuffer=" $Puffer "Sekunden"
+
ntimer=$wtimer
#echo "`$DATE -d \"$date $starttime seconds\" +\"%Y-%m-%d %R\"`"
+
PAR1=$ntimer
# Sicherheitspuffer abziehen
+
PAR4=$desc
#let wtimer="`$DATE -d \"$date $starttime\" +\"%s\"` - $WAKEUP_RESERVE"  
+
#echo "---- Nächster NTimer! ----"
wtimer="`$DATE -d \"$date $starttime\" +\"%s\"`"
+
logger -s "[$0] Nächster Timer: PAR1: $PAR1 PAR4: $PAR4"
#echo "Neuer Timer: `$DATE -d \"1970-01-01 UTC $wtimer seconds\" +\"%Y-%m-%d %R\"`  ($wtimer)"
+
fi
  #fi
+
fi
+
done </etc/vdr/timers.conf  # Da werden die Timer gespeichert
# 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
 
  else
#Kein ShutDown in der vorgegebenen "Server-Zeit"
+
#Kein ShutDown in der vorgegebenen "Server-Zeit"
check_ontime
+
check_ontime
 
  fi
 
  fi
 
+
 
  # Heutiger Startzeitpunkt schon vorbei?
 
  # Heutiger Startzeitpunkt schon vorbei?
 
  if [ $sAktDat -gt $sWakeupDat ] ; then
 
  if [ $sAktDat -gt $sWakeupDat ] ; then
let sWakeupDat="$sWakeupDat +86400" # +24h
+
let sWakeupDat="$sWakeupDat +86400" # +24h
WakeupDat="`$DATE -d \"1970-01-01 UTC $sWakeupDat seconds\" +\"%Y-%m-%d %R\"`"
+
WakeupDat="`$DATE -d \"1970-01-01 UTC $sWakeupDat seconds\" +\"%Y-%m-%d %R\"`"
 
  fi
 
  fi
 
+
 
  # Testen ob der nächste Timer vor dem nächsten Wakeup liegt und falls nötig den Wakeup anassen.
 
  # 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
 
  if [ $PAR1 -gt $sWakeupDat ] || [ "$PAR1" = "0" ] ; then
# Normaler Wakeup
+
# Normaler Wakeup
PAR1=$sWakeupDat
+
PAR1=$sWakeupDat
PAR4=""
+
PAR4=""
 
  else
 
  else
# PAR1 wird neuer Starttermin. Vorher in das rechte Format wandeln
+
# PAR1 wird neuer Starttermin. Vorher in das rechte Format wandeln
NEXT_ALARM="`$DATE -d \"1970-01-01 UTC $PAR1 seconds\" +\"%Y-%m-%d %R\"`"
+
NEXT_ALARM="`$DATE -d \"1970-01-01 UTC $PAR1 seconds\" +\"%Y-%m-%d %R\"`"
 
  fi
 
  fi
 
+
 
  #Zeit bis zum nächsten Timer
 
  #Zeit bis zum nächsten Timer
 
  let PAR2="$PAR1 - $sAktDat"
 
  let PAR2="$PAR1 - $sAktDat"
 
+
 
  [ -f $SHUTDOWN_FILE ] && rm -f $SHUTDOWN_FILE
 
  [ -f $SHUTDOWN_FILE ] && rm -f $SHUTDOWN_FILE
 
+
 
  # Original Shutdown-Skript aufrufen
 
  # Original Shutdown-Skript aufrufen
 
  ## Beispiel: /_config/bin/vdrshutdown 1165026000 9816 34 nano~Die Welt von morgen 1
 
  ## Beispiel: /_config/bin/vdrshutdown 1165026000 9816 34 nano~Die Welt von morgen 1
 
  #logger -s "$1 = $PAR1"
 
  #logger -s "$1 = $PAR1"
 
  if [ "$PAR4" = "" ] ; then # Nicht vom VDR gestartet
 
  if [ "$PAR4" = "" ] ; then # Nicht vom VDR gestartet
PAR4="Automatischer-Wakeup"
+
PAR4="Automatischer-Wakeup"
/_config/bin/vdrshutdown.sh $PAR1 $PAR2 00 "$PAR4" 1 > /var/log/vdrshutdown.log 2>&1
+
/_config/bin/vdrshutdown.sh $PAR1 $PAR2 00 "$PAR4" 1 > /var/log/vdrshutdown.log 2>&1
RC=$?
+
RC=$?
# WAKEUP_FLAG entscheidet, ob WAKEUP_FILE gelöscht wird (myexit.sh)
+
# SHUTDOWN_FILE löschen damit VDR bein nächsten Start an bleibt
#touch $WAKEUP_FLAG
+
[ -f $WAKEUP_FILE ] && rm -f $WAKEUP_FILE
# Debug
+
#SDTMP=$(ls --full-time $WAKEUP_FILE | cut -f 6,7 -d " ")
+
# SHUTDOWN_FILE löschen damit VDR bein nächsten Start an bleibt
+
[ -f $WAKEUP_FILE ] && rm -f $WAKEUP_FILE
+
 
  else
 
  else
/_config/bin/vdrshutdown.sh $PAR1 $PAR2 $3 "$PAR4" $5 > /var/log/vdrshutdown.log 2>&1
+
/_config/bin/vdrshutdown.sh $PAR1 $PAR2 $3 "$PAR4" $5 > /var/log/vdrshutdown.log 2>&1
RC=$?
+
RC=$?
 
  fi
 
  fi
 
+
 
  # Rückgabecode
 
  # Rückgabecode
 
  if [ "$RC" = "1" ] ; then
 
  if [ "$RC" = "1" ] ; then
 
   set_next_shutdown 10
 
   set_next_shutdown 10
exit 1
+
exit 1
 
  else
 
  else
logger -s "RetunCode: $RC"
+
logger -s "RetunCode: $RC"
exit 0
+
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