xref: /titanic_44/usr/src/cmd/power/sysidpm.sh (revision ea8dc4b6d2251b437950c0056bc626b311c73c27)
1#!/bin/sh
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License, Version 1.0 only
7# (the "License").  You may not use this file except in compliance
8# with the License.
9#
10# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11# or http://www.opensolaris.org/os/licensing.
12# See the License for the specific language governing permissions
13# and limitations under the License.
14#
15# When distributing Covered Code, include this CDDL HEADER in each
16# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17# If applicable, add the following below this CDDL HEADER, with the
18# fields enclosed by brackets "[]" replaced with your own identifying
19# information: Portions Copyright [yyyy] [name of copyright owner]
20#
21# CDDL HEADER END
22#
23#
24# Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
25# Use is subject to license terms.
26#
27#pragma ident	"%Z%%M%	%I%	%E% SMI"
28
29# The -c and -u options are used by system configruation.
30USAGE="$0 [-c|-u]"
31TEXTDOMAIN="SUNW_OST_OSCMD"
32export TEXTDOMAIN
33
34# As of Oct. 1, 1995, any new system shipped will have root
35# property "energystar-v2" defined in its prom.
36ESTAR_PROP="energystar-v2"
37
38# Power Management configuration file
39PWR_CONF=/etc/power.conf
40SHUTDOWN_PATTERN="autoshutdown[ 	]"
41TMP=/var/run/tmp1.$$
42
43# If this flag is present, user will be asked the autoshutdown
44# question again even when autoshutdown is already configured.
45ASK_AGAIN_FLAG=/etc/.PM_RECONFIGURE
46
47# This is provided for auto-install.
48# If either of the files is present, autoshutdown will be configured
49# accordingly silently.
50SHUTDOWN_ENABLE_FLAG=/autoshutdown
51SHUTDOWN_DISABLE_FLAG=/noautoshutdown
52
53# Autoshutdown is not supported on diskless systems.
54IS_DISKLESS=""
55
56# Default autoshutdown setup.
57DEFAULT_IDLE_TIME="30"
58DEFAULT_START_TIME="9:00"
59DEFAULT_FINISH_TIME="9:00"
60
61# Currently autoshutdown setup in the configuration file.
62CURRENT_IDLE_TIME=""
63CURRENT_START_TIME=""
64CURRENT_FINISH_TIME=""
65CURRENT_BEHAVIOR=""
66
67# Autoshutdown confirmation message to be prompted in the question1.
68# In the following message, each escape sequence requires three
69# backslashes to prevent the interpretation by the shell and gettext
70# before being passed to ckyorn.  In the message catalog, each message
71# will have two backslashes.
72MSG1=`gettext '\\\tAfter 30 minutes of idle time on this system, your system \
73state\\\n\\\twill automatically be saved to disk, and the system will \
74power-off.\\\n\\\n\\\tLater, when you want to use the system again, and \
75you turn the power\\\n\\\tback on, your system will be restored to its \
76previous state,\\\n\\\tincluding all the programs that you were running.\
77\\\n\\\n\\\tDo you want this automatic power-saving shutdown?\\\n\
78\\\t(If this system is used as a server, answer n)'`
79
80# Message to be prompted in question2.
81# In the following message, each escape sequence requires three
82# backslashes to prevent the interpretation by the shell and gettext
83# before being passed to ckyorn.  In the message catalog, each message
84# will have two backslashes.
85MSG2=`gettext '\\\tDo you want the system to ask about this again, when \
86you next reboot?\\\n\\\t(This gives you the chance to try it before deciding \
87whether\\\n\\\tto keep it.)'`
88
89# The autoshutdown comment to be put into the power management config file.
90SHUTDOWN_COMMENT="# Auto-Shutdown\t\tIdle(min)\tStart/Finish(hh:mm)\tBehavior"
91
92# Set up path.
93PATH="/usr/bin:/usr/sbin:${PATH}"
94export PATH
95
96#
97# Get current autoshutdown setup.
98#
99get_behavior() {
100	grep -s "$SHUTDOWN_PATTERN" $PWR_CONF > /dev/null
101	if [ $? = 0 ]; then
102		set - `grep "$SHUTDOWN_PATTERN" $PWR_CONF`
103		CURRENT_IDLE_TIME=$2
104		CURRENT_START_TIME=$3
105		CURRENT_FINISH_TIME=$4
106		CURRENT_BEHAVIOR=$5
107	fi
108}
109
110#
111# Set the autoshutdown behavior in the configuration file.
112# The autoshutdown token can be preceded by spaces.
113# The resulting configuration will be based on the first autoshutdown
114# line if there is more than one in the configuration file.
115#
116set_behavior() {
117	BEHAVIOR="$1"
118
119	grep -s "$SHUTDOWN_PATTERN" $PWR_CONF > /dev/null
120	if [ $? = 0 ]; then
121		set - `grep "$SHUTDOWN_PATTERN" $PWR_CONF`
122		CURRENT_IDLE_TIME=$2
123		CURRENT_START_TIME=$3
124		CURRENT_FINISH_TIME=$4
125		CURRENT_BEHAVIOR=$5
126	fi
127
128	if [ "$BEHAVIOR" = "unconfigured" ]; then
129		IDLE=$DEFAULT_IDLE_TIME
130		START=$DEFAULT_START_TIME
131		FINISH=$DEFAULT_FINISH_TIME
132	else {
133		if [ "$CURRENT_IDLE_TIME" = "" ]; then
134			IDLE="$DEFAULT_IDLE_TIME"
135		else
136			IDLE="$CURRENT_IDLE_TIME"
137		fi
138
139		if [ "$CURRENT_START_TIME" = "" ]; then
140			START="$DEFAULT_START_TIME"
141		else
142			START="$CURRENT_START_TIME"
143		fi
144
145		if [ "$CURRENT_FINISH_TIME" = "" ]; then
146			FINISH="$DEFAULT_FINISH_TIME"
147		else
148			FINISH="$CURRENT_FINISH_TIME"
149		fi
150	} fi
151
152	grep -v "# Auto-Shutdown[	]" $PWR_CONF | grep -v "$SHUTDOWN_PATTERN" > $TMP
153	echo $SHUTDOWN_COMMENT >> $TMP
154	echo "autoshutdown\t\t${IDLE}\t\t${START} ${FINISH}\t\t${BEHAVIOR}" >> \
155		$TMP
156	cp $TMP $PWR_CONF
157	rm $TMP
158}
159
160#
161# Print out the Energystar guidelines.
162#
163print_estar_guidelines() {
164	echo
165	echo "`gettext '\t================================================================'`"
166	echo "`gettext '\tThis system is configured to conserve energy.'`"
167        echo "`gettext '\t================================================================'`"
168}
169
170#
171# Ask user for autoshutdown confirmation.
172#
173question1() {
174        ans=`ckyorn -Q -d y -p "$1"`
175	case $ans in
176		y|yes|Y|Yes|YES)
177			set_behavior shutdown
178			echo
179			echo "`gettext '\tAutoshutdown remains enabled.'`"
180			break
181			;;
182		n|no|N|No|NO)
183			set_behavior noshutdown
184			echo
185			echo "`gettext '\tAutoshutdown has been disabled.'`"
186			break
187			;;
188	esac
189}
190
191#
192# Ask user whether they want to be asked about the question again during
193# next reboot.
194#
195question2() {
196        ans=`ckyorn -Q -d n -p "$1"`
197	case $ans in
198		y|yes|Y|Yes|YES)
199			touch $ASK_AGAIN_FLAG
200			echo "`gettext '\n\tThe system will ask you about automatic shutdown at the next reboot.'`"
201			break
202			;;
203		n|no|N|No|NO)
204			rm -f $ASK_AGAIN_FLAG
205			echo "`gettext '\n\tThe system will not ask you again about automatic shutdown.'`"
206			break
207			;;
208	esac
209}
210
211
212################
213#     Main     #
214################
215
216#
217# Exit if /etc/power.conf does not exist or is not writable.
218#
219if [ ! -f $PWR_CONF -o ! -w $PWR_CONF ]; then
220	exit 1
221fi
222
223
224#
225# Usage: sysidpm [-c|-u]
226#
227if [ $# -gt 1 ]; then
228	echo $USAGE
229	exit 1
230fi
231
232
233#
234# The postinstall script of some power management package should have
235# added this command into the application list in /etc/.sysidconfig.apps.
236# System configuration and unconfiguration will call those applications
237# with option -c and -u respectively.
238#
239if [ $# -eq 1 ]; then
240	case $1 in
241		-c)	# Does not need to do anything.
242			exit 0 ;;
243		-u)
244			# Reset the behavior back to unconfigured state.
245			set_behavior unconfigured
246
247			# Remove the statefile line too.
248			grep -v statefile $PWR_CONF > $TMP
249			cp $TMP $PWR_CONF
250			rm $TMP
251
252			exit 0 ;;
253		*)
254			echo $USAGE
255			exit 1 ;;
256	esac
257fi
258
259
260#
261# Get current autoshutdown setup.
262#
263get_behavior
264
265#
266# If this is a diskless system, silently disable autoshutdown and exit.
267#
268ROOT_FSTYPE=`df -n / | (read w1 w2 w3; echo $w3)`
269if [ $ROOT_FSTYPE != "ufs" ]; then
270	set_behavior noshutdown
271	exit 0
272fi
273
274
275#
276# If /autoshutdown is present, silently enable autoshutdown and exit.
277#
278if [ -f $SHUTDOWN_ENABLE_FLAG ]; then
279	set_behavior shutdown
280	rm $SHUTDOWN_ENABLE_FLAG
281	exit 0
282fi
283
284#
285# If /noautoshutdown is present, silently disable autoshutdown and
286# exit.
287#
288if [ -f $SHUTDOWN_DISABLE_FLAG ]; then
289	set_behavior noshutdown
290	rm $SHUTDOWN_DISABLE_FLAG
291	exit 0
292fi
293
294
295#
296# If this is an EnergyStar compliant system, the default should
297# have autoshutdown enabled. However we don't want to surprise
298# users, so let's confirm with the user.
299#
300prtconf -vp | grep -s -w ${ESTAR_PROP} > /dev/null
301if [ $? = 0 ]; then
302	if [ "$CURRENT_BEHAVIOR" = "unconfigured" -o -f $ASK_AGAIN_FLAG ]; then
303		print_estar_guidelines
304		question1 "$MSG1"
305		question2 "$MSG2"
306		echo "`gettext '\n\tThe \"Power Management\" chapter in the \"Solaris Common Desktop\n\tEnvironment: User Guide\" describes more about how to change\n\tand set workstation energy-saving features.'`"
307		echo
308	fi
309	exit 0
310fi
311
312#
313# The rest of the cases will have 'default' autoshutdown behavior.
314#
315if [ "$CURRENT_BEHAVIOR" = "unconfigured" ]; then
316	set_behavior default
317	exit 0
318fi
319
320#
321# We are here because either the autoshutdown line has been
322# removed or the behavior has been configured. It can be a result
323# of upgrade. In that case, the configuration file should not
324# be changed. Let's exit.
325exit 0
326