123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- #!/bin/sh
- #
- # Written by Gabriel Burt <gburt@novell.com>
- # Copyright 2008 Novell, Inc.
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of version 2 of the GNU General Public License as
- # published by the Free Software Foundation.
- #
- # Use rtcwake to wake the computer from sleep or hibernate
- # as configured in /etc/pm/config.d/rtcwake.config
- . "${PM_FUNCTIONS}"
- rtcwake_cmd="/usr/sbin/rtcwake";
- command_exists $rtcwake_cmd || exit $NA
- rtcwake_config_file="/etc/pm/config.d/rtcwake.conf"
- function start_of_day {
- echo `date -d "$1" "+%D"`
- }
- function since_epoch {
- echo `date -d "$1" "+%s"`
- }
- function day_of_week {
- echo `date -d "$1" "+%u"`
- }
- function isAlarmDow {
- is=0
- for dow in $RTCWAKE_DAYS; do
- if test "x$dow" = "x$1"; then
- is=1;
- break;
- fi
- done
- echo $is
- }
- function set_alarm
- {
- # If USER_RTCWAKE_ALLOWED is yes and the user passed in a num_seconds_to_sleep variable, then
- # we will respect it (and ignore the system config)
- # Do require that the number of seconds is at least 30 though.
- if test "x$USER_RTCWAKE_ALLOWED" != "xno" && test "x$NUM_SECONDS_TO_SLEEP" != "x" && test $(($NUM_SECONDS_TO_SLEEP > 30)) == 1; then
- echo "Have NUM_SECONDS_TO_SLEEP: $NUM_SECONDS_TO_SLEEP";
- # Actually set/configure the rtcwake
- sh -c "$rtcwake_cmd -m on -s $NUM_SECONDS_TO_SLEEP &"
- elif test "x$1" = "xyes"; then
- echo "alarm enabled, configuring rtcwake...";
- echo "RTCWAKE time: $RTCWAKE_TIME";
- echo "RTCWAKE days: $RTCWAKE_DAYS";
- next_alarm=0
- now=$(since_epoch now);
- # The next alarm has to be at most 7 days from now
- for days_from_now in 0 1 2 3 4 5 6 7; do
- # Get the date N days from now
- alarm_day=$(start_of_day "$days_from_now day");
- # Check that this day is an alarm-enabled day of the week
- alarm_dow=$(day_of_week $alarm_day);
- is_alarm_dow=$(isAlarmDow $alarm_dow);
- if test "x$is_alarm_dow" = "x1"; then
- # Get the actual alarm time on that day
- alarm_time=$(since_epoch "$alarm_day $RTCWAKE_TIME");
- # Ensure the alarm time is more than 15 minutes from now
- # - otherwise we set the alarm for the next slot
- # 900 seconds = 15 minutes * 60 seconds/minute
- is_enough_in_future=$(($alarm_time - $now > 900));
- if test "x$is_enough_in_future" = "x1"; then
- next_alarm=$alarm_time
- break;
- fi
- fi
- done
- if test "x$next_alarm" != "x0"; then
- # Recalculate now to be as accurate as possible
- now=$(since_epoch now);
- seconds_from_now=$(($next_alarm - $now));
- echo "Will set alarm for $seconds_from_now seconds from now, at $alarm_day $RTCWAKE_TIME ($next_alarm)"
- # Actually set/configure the rtcwake
- sh -c "$rtcwake_cmd -m on -s $seconds_from_now &"
- else
- echo "No acceptable time found to set the rtcwake alarm. Review your configuration in $rtcwake_config_file"
- exit $NA
- fi
- else
- echo "rtcwake alarm not enabled in $rtcwake_config_file, doing nothing...";
- exit $NA
- fi
- }
- case "$1" in
- suspend) set_alarm $SUSPEND_RTCWAKE_ENABLED ;;
- hibernate) set_alarm $HIBERNATE_RTCWAKE_ENABLED ;;
- *) exit $NA ;;
- esac
|