Hi,
also ich hab das jetzt alles nochmal überarbeitet und erste Tests haben funktioniert. Nun folgt der Alltagstest. Es würde mich freuen, wenn andere meine Ergebnisse bestätigen könnten. Deshalb poste ich hier mal die einzelnen Skripte.
Ich habe die settime und correcttime Skripte im Verzeichnis /etc/_settime abgelegt. Deshalb müssen bei anderen Verzeichnissen die Pfade entsprechend angepasst werden.
Die "Originale" der angepassten Skripte poweroff.pl befinden sich in /usr/bin , das Startskript rcStart in /etc/init.d
Wer diese Möglichkeit testen möchte, sollte die Originaldateien sichern. Ich übernehme für mögliche Fehler KEINE Garantie.
Überall wo ich Änderungen vorgenommen habe sind die originalen Einträge mit ### auskommentiert.
Also zuerst AUSZUGSWEISE die angepasste rcStart
#!/bin/sh
#
# by Thomas Koch <tom@linvdr.org>
# 10.05.2003
#
# ..........................................................
# mount read-only
progress 15 "mount read only"
execute mount -n -o remount,ro /
###
# Hier wird das Skript zur Zeitkorrektur aufgerufen.
/etc/_settime/correcttime
###
# fsck
progress 20 "file system check"
execute fsck -y /
execute fsck -y -A -R
# .............................................................
Alles anzeigen
Dann die angepasste poweroff.pl
#!/usr/bin/perl
##
# by Thomas Koch <tom@linvdr.org>
##
use POSIX qw(strftime sprintf);
my $PROC_ALARM = "/proc/acpi/alarm";
my $DEBUG = 0;
my $WAKEUP_MARGIN = 5;
sub dprint {
$_ = join("", @_);
chomp;
print "$_\n" if($DEBUG);
}
sub setTime {
system("hwclock -w --directisa");
### system("hwclock -w");
}
sub setAlarm {
my $Next = shift;
$Next = $Next - ($WAKEUP_MARGIN * 60);
setTime();
dprint("Next event at ", strftime("%d.%m.%Y %H:%M", localtime($Next)));
if(-e $PROC_ALARM) {
### system(sprintf("echo \"%s\" > %s", strftime("%Y-%m-%d %H:%M", localtime($Next)), $PROC_ALARM));
#
# Übergabe der Aufnahmezeit und Aufruf von settime
system("/etc/_settime/settime", strftime("%Y-%m-%d %H:%M:%S", localtime($Next)) );
###
} else {
dprint("$PROC_ALARM does not exist");
}
}
sub PowerOff {
### Hier wird die RTC nochmal ausgelesen, sonst wurde die Zeit nicht gesetzt, ist halt so.
system("hwclock --show");
### Das Reboot ist nur zum Testen, damit der Rechner nicht immer per Hand eingeschaltet werden muss.
### system("reboot");
system("/bin/busybox poweroff") if(!$DEBUG);
}
if(scalar(@ARGV)) {
# called from vdr
die "Wrong parameter count\n" if(scalar(@ARGV) != 5);
die "$PROC_ALARM missing" if(!-e $PROC_ALARM);
my($Next, $Delta, $Channel, $Recording, $UserShutdown) = @ARGV;
setAlarm($Next) if($Next);
PowerOff();
} else {
# called from cmdline
$next = `svdrpsend.pl next abs`;
if($next =~ /550 No active timers/) {
# XXX turns alarm off, at least, i hope so
#system("echo \"0003-10-20 99:00:00\" > /proc/acpi/alarm");
setTime();
PowerOff();
} elsif($next =~ /250 \d+ (\d+)/) {
setAlarm($1);
PowerOff();
} else {
PowerOff();
}
}
Alles anzeigen
Nun das eingentliche settime Skript von cooper, welches durch seine Hinweise für localtime, also für LinVDR angepasst wurde.
#!/bin/bash
# Der Wakeup-Zeitpunkt im BIOS muss auf den 1. des Monats um 00:00:00 Uhr
# eingestellt werden
BiosWakeup="2004-05-31 23:59:59"
# Aufwachzeit in Sekunden seit Epoch umrechnen
Wakeup=`date -d "$1" +%s`
if [ "$?" -eq "1" ]; then
echo "No date or wrong date format."
echo "Syntax:"
echo " settime \"YYYY-MM-DD hh:mm:ss\""
exit 1
fi
Now=`date +%s`
### Bios=`date -u -d "${BiosWakeup}" +%s`
### Localtime statt UTC
Bios=`date -d "${BiosWakeup}" +%s`
if [ "${Wakeup}" -lt "${Now}" ]; then
echo "Wakup Time is in past."
exit 1
fi
# Zeitdifferenz zwischen Wakeup und aktueller Zeit in Sekunden ausrechnen
Diff=$[${Wakeup}-${Now}]
# Zeitdifferenz zwischen BiosWakeup und jetzt in Sekunden in Datei speichern
echo "$[${Now}-${Bios}+${Diff}]" > /etc/timediff
# Uhr zurück stellen
### date -u -s "${BiosWakeup} ${Diff} seconds ago" >/dev/null
### Localtime statt UTC
date -s "${BiosWakeup} ${Diff} seconds ago" >/dev/null
if [ "$?" -gt "0" ]; then
echo "Can't change system date, not running as root?"
exit 1
fi
# CMOS-Uhr aktualisieren
### hwclock -w --utc
### Localtime statt UTC
hwclock -w --localtime
Alles anzeigen
Zum Abschluß noch das correcttime Skript, ebenfalls für localtime abgeändert.
#!/bin/bash
# Prüfen, ob die CMOS-Uhr überhaupt für das Wakeup verstellt wurde.
if [ -r /etc/timediff ]; then
# Dazu das Änderungsdatum der Datei /etc/timediff besorgen -- damit ist
# zweifelsfrei klar, wann settime die Zeitdifferenz geschrieben hat. Liegt
# die momentane Rechner-Zeit *vor* dem Änderungsdatum von /etc/timediff,
# müssen wir die Zeitdifferenz wieder ausgleichen.
Timediff=`date -r /etc/timediff +%s`
Now=`date +%s`
if [ "${Timediff}" -gt "${Now}" ]; then
# Die Rechnerzeit liegt in der Vergangenheit, die Differenz zur lokalen
# Zeit ist in /etc/timediff gespeichert
Diff=`cat /etc/timediff | head -n 1`
date -s "+${Diff} seconds" >/dev/null
# CMOS-Uhr aktualisieren
### hwclock -w --noadjfile --utc
hwclock -w --noadjfile --localtime
echo "Correcting system time by ${Diff} seconds..."
exit 0
fi
fi
echo "No need to correct system time."
Alles anzeigen
So nun folgt der Alltagstest. Die Funktionalität von LinVDR bleibt voll erhalten, sowohl was die 5Min Vorlauf beim Einschalten als auch was das Ausschalten betrifft.
Viel Spaß.
cooper
Der 5Minuten Versatz beim wiedereinschalten ist nicht mehr aufgetreten, vermutlich zu viel auf einmal gedreht...