#!/bin/sh
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
# The -c and -u options are used by system configruation.
USAGE="$0 [-c|-u]"
TEXTDOMAIN="SUNW_OST_OSCMD"
export TEXTDOMAIN
# As of Oct. 1, 1995, any new system shipped will have root
# property "energystar-v2" defined in its prom.
ESTAR_PROP="energystar-v2"
# Power Management configuration file
PWR_CONF=/etc/power.conf
SHUTDOWN_PATTERN="autoshutdown[ ]"
TMP=/var/run/tmp1.$$
# If this flag is present, user will be asked the autoshutdown
# question again even when autoshutdown is already configured.
ASK_AGAIN_FLAG=/etc/.PM_RECONFIGURE
# This is provided for auto-install.
# If either of the files is present, autoshutdown will be configured
# accordingly silently.
SHUTDOWN_ENABLE_FLAG=/autoshutdown
SHUTDOWN_DISABLE_FLAG=/noautoshutdown
# Autoshutdown is not supported on diskless systems.
IS_DISKLESS=""
# Default autoshutdown setup.
DEFAULT_IDLE_TIME="30"
DEFAULT_START_TIME="9:00"
DEFAULT_FINISH_TIME="9:00"
# Currently autoshutdown setup in the configuration file.
CURRENT_IDLE_TIME=""
CURRENT_START_TIME=""
CURRENT_FINISH_TIME=""
CURRENT_BEHAVIOR=""
# Autoshutdown confirmation message to be prompted in the question1.
# In the following message, each escape sequence requires three
# backslashes to prevent the interpretation by the shell and gettext
# before being passed to ckyorn. In the message catalog, each message
# will have two backslashes.
MSG1=`gettext '\\\tAfter 30 minutes of idle time on this system, your system \
state\\\n\\\twill automatically be saved to disk, and the system will \
power-off.\\\n\\\n\\\tLater, when you want to use the system again, and \
you turn the power\\\n\\\tback on, your system will be restored to its \
previous state,\\\n\\\tincluding all the programs that you were running.\
\\\n\\\n\\\tDo you want this automatic power-saving shutdown?\\\n\
\\\t(If this system is used as a server, answer n)'`
# Message to be prompted in question2.
# In the following message, each escape sequence requires three
# backslashes to prevent the interpretation by the shell and gettext
# before being passed to ckyorn. In the message catalog, each message
# will have two backslashes.
MSG2=`gettext '\\\tDo you want the system to ask about this again, when \
you next reboot?\\\n\\\t(This gives you the chance to try it before deciding \
whether\\\n\\\tto keep it.)'`
# The autoshutdown comment to be put into the power management config file.
SHUTDOWN_COMMENT="# Auto-Shutdown\t\tIdle(min)\tStart/Finish(hh:mm)\tBehavior"
# Set up path.
PATH="/usr/bin:/usr/sbin:${PATH}"
export PATH
#
# Get current autoshutdown setup.
#
get_behavior() {
grep -s "$SHUTDOWN_PATTERN" $PWR_CONF > /dev/null
if [ $? = 0 ]; then
set - `grep "$SHUTDOWN_PATTERN" $PWR_CONF`
CURRENT_IDLE_TIME=$2
CURRENT_START_TIME=$3
CURRENT_FINISH_TIME=$4
CURRENT_BEHAVIOR=$5
fi
}
#
# Set the autoshutdown behavior in the configuration file.
# The autoshutdown token can be preceded by spaces.
# The resulting configuration will be based on the first autoshutdown
# line if there is more than one in the configuration file.
#
set_behavior() {
BEHAVIOR="$1"
grep -s "$SHUTDOWN_PATTERN" $PWR_CONF > /dev/null
if [ $? = 0 ]; then
set - `grep "$SHUTDOWN_PATTERN" $PWR_CONF`
CURRENT_IDLE_TIME=$2
CURRENT_START_TIME=$3
CURRENT_FINISH_TIME=$4
CURRENT_BEHAVIOR=$5
fi
if [ "$BEHAVIOR" = "unconfigured" ]; then
IDLE=$DEFAULT_IDLE_TIME
START=$DEFAULT_START_TIME
FINISH=$DEFAULT_FINISH_TIME
else {
if [ "$CURRENT_IDLE_TIME" = "" ]; then
IDLE="$DEFAULT_IDLE_TIME"
else
IDLE="$CURRENT_IDLE_TIME"
fi
if [ "$CURRENT_START_TIME" = "" ]; then
START="$DEFAULT_START_TIME"
else
START="$CURRENT_START_TIME"
fi
if [ "$CURRENT_FINISH_TIME" = "" ]; then
FINISH="$DEFAULT_FINISH_TIME"
else
FINISH="$CURRENT_FINISH_TIME"
fi
} fi
grep -v "# Auto-Shutdown[ ]" $PWR_CONF | grep -v "$SHUTDOWN_PATTERN" > $TMP
echo $SHUTDOWN_COMMENT >> $TMP
echo "autoshutdown\t\t${IDLE}\t\t${START} ${FINISH}\t\t${BEHAVIOR}" >> \
$TMP
cp $TMP $PWR_CONF
rm $TMP
}
#
# Print out the Energystar guidelines.
#
print_estar_guidelines() {
echo
echo "`gettext '\t================================================================'`"
echo "`gettext '\tThis system is configured to conserve energy.'`"
echo "`gettext '\t================================================================'`"
}
#
# Ask user for autoshutdown confirmation.
#
question1() {
ans=`ckyorn -Q -d y -p "$1"`
case $ans in
y|yes|Y|Yes|YES)
set_behavior shutdown
echo
echo "`gettext '\tAutoshutdown remains enabled.'`"
break
;;
n|no|N|No|NO)
set_behavior noshutdown
echo
echo "`gettext '\tAutoshutdown has been disabled.'`"
break
;;
esac
}
#
# Ask user whether they want to be asked about the question again during
# next reboot.
#
question2() {
ans=`ckyorn -Q -d n -p "$1"`
case $ans in
y|yes|Y|Yes|YES)
touch $ASK_AGAIN_FLAG
echo "`gettext '\n\tThe system will ask you about automatic shutdown at the next reboot.'`"
break
;;
n|no|N|No|NO)
rm -f $ASK_AGAIN_FLAG
echo "`gettext '\n\tThe system will not ask you again about automatic shutdown.'`"
break
;;
esac
}
################
# Main #
################
#
# Exit if /etc/power.conf does not exist or is not writable.
#
if [ ! -f $PWR_CONF -o ! -w $PWR_CONF ]; then
exit 1
fi
#
# Usage: sysidpm [-c|-u]
#
if [ $# -gt 1 ]; then
echo $USAGE
exit 1
fi
#
# The postinstall script of some power management package should have
# added this command into the application list in /etc/.sysidconfig.apps.
# System configuration and unconfiguration will call those applications
# with option -c and -u respectively.
#
if [ $# -eq 1 ]; then
case $1 in
-c) # Does not need to do anything.
exit 0 ;;
-u)
# Reset the behavior back to unconfigured state.
set_behavior unconfigured
# Remove the statefile line too.
grep -v statefile $PWR_CONF > $TMP
cp $TMP $PWR_CONF
rm $TMP
exit 0 ;;
*)
echo $USAGE
exit 1 ;;
esac
fi
#
# Get current autoshutdown setup.
#
get_behavior
#
# If this is a diskless system, silently disable autoshutdown and exit.
#
ROOT_FSTYPE=`df -n / | (read w1 w2 w3; echo $w3)`
if [ $ROOT_FSTYPE != "ufs" ]; then
set_behavior noshutdown
exit 0
fi
#
# If /autoshutdown is present, silently enable autoshutdown and exit.
#
if [ -f $SHUTDOWN_ENABLE_FLAG ]; then
set_behavior shutdown
rm $SHUTDOWN_ENABLE_FLAG
exit 0
fi
#
# If /noautoshutdown is present, silently disable autoshutdown and
# exit.
#
if [ -f $SHUTDOWN_DISABLE_FLAG ]; then
set_behavior noshutdown
rm $SHUTDOWN_DISABLE_FLAG
exit 0
fi
#
# If this is an EnergyStar compliant system, the default should
# have autoshutdown enabled. However we don't want to surprise
# users, so let's confirm with the user.
#
prtconf -vp | grep -s -w ${ESTAR_PROP} > /dev/null
if [ $? = 0 ]; then
if [ "$CURRENT_BEHAVIOR" = "unconfigured" -o -f $ASK_AGAIN_FLAG ]; then
print_estar_guidelines
question1 "$MSG1"
question2 "$MSG2"
# Currently, we do not have documentation for changing and
# setting workstation energy-saving features. When we do,
# gettext messages should be emitting here. see CR6520924
#
echo
fi
exit 0
fi
#
# The rest of the cases will have 'default' autoshutdown behavior.
#
if [ "$CURRENT_BEHAVIOR" = "unconfigured" ]; then
set_behavior default
exit 0
fi
#
# We are here because either the autoshutdown line has been
# removed or the behavior has been configured. It can be a result
# of upgrade. In that case, the configuration file should not
# be changed. Let's exit.
exit 0