#!/bin/bash
#
# Settime setzt voraus, das das Mainboard-BIOS ber eine Aufwachfunktion
# mit Tag und Uhrzeit verfgt. Diese muss eingeschaltet und auf den
# 31. des Monats um 23:59:59 Uhr gestellt sein.

#
# Definition des Aufwachzeitpunkts. Dieser Zeitpunkt muss in der
# Vergangenheit liegen und sollte der letzte Tag eines Monats mit
# 31 Tagen sein, dem ein Monat mit 30 Tagen vorausgeht. So kann der
# Rechner maximal 61 Tage lang schlafen.
BiosAlarm="2006-05-31 23:59:59"

#
# Unix-Timestamp des Aufwachzeitpunkts
BiosTs=`date -u -d "${BiosAlarm}" +%s`

#
# Parameter berprfen
if [ -z "${1}" -o -n "${1/????-??-?? ??:??:??}" ]; then
  echo "usage: $0 \"YYYY-mm-dd HH:MM:SS\""
  exit 1
fi

#
# Unix-Timestamp des gewnschten Aufwachzeitpunkts
WakeupTs=$(date -d "${1}" +%s)
NowTs=$(date +%s)

if [ "${WakeupTs}" -lt "${NowTs}" ]; then
  echo "Can't wake up in the past."
  exit 1
fi

#
# Zeitdifferenz zwischen Aufwachzeitpunkt und jetzt bestimmen
Diff=$[${WakeupTs}-${NowTs}]

#
# Differenz zwischen zurckgestellter Uhr und jetzt speichern
if [ ! -e /etc/timediff -a -w /etc -o -w /etc/timediff ]; then
  echo "$[${NowTs}-${BiosTs}+${Diff}]" > /etc/timediff
else
  echo "Can't write to /etc/timediff, not running as root?"
  exit 1
fi

#
# Uhr zurckstellen
date -u -s "${BiosAlarm} ${Diff} sec ago" >/dev/null 2>/dev/null

if [ "$?" -gt "0" ]; then
  echo "Can't update system time, not running as root?"
  exit 1
fi

#
# RTC aktualisieren
hwclock -w --utc
