~tormodvolden/ubuntu/karmic/laptop-mode-tools/dupl-hook

« back to all changes in this revision

Viewing changes to usr/sbin/laptop_mode

  • Committer: Bazaar Package Importer
  • Author(s): Tollef Fog Heen
  • Date: 2006-07-10 13:42:58 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20060710134258-p25bl1rnxv021vz0
Tags: 1.31-1ubuntu1
Sync with Debian.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/bin/bash
2
2
 
3
 
# Script to start or stop laptop_mode.
 
3
# Script to start or stop laptop_mode, and to control various settings of the
 
4
# kernel, hardware etc. that influence power consumption.
4
5
#
5
 
# This script is a part of Laptop Mode Tools. If you are running a power management daemon,
6
 
# this script will be automatically called on power state change.
 
6
# This script is a part of Laptop Mode Tools. If you are running a supported
 
7
# power management daemon, this script will be automatically called on power
 
8
# state change.
7
9
#
8
10
# Configure laptop mode tools in /etc/laptop-mode/laptop-mode.conf.
 
11
# Read man pages laptop-mode.conf(8) and laptop_mode(8) for more information.
9
12
#
10
 
# Maintainer: Bart Samwel (bart@samwel.tk)
 
13
# Maintainer:       Bart Samwel (bart@samwel.tk)
 
14
# Project homepage: http://www.xs4all.nl/~bsamwel/laptop_mode/tools
11
15
#
12
16
# Contributors to this script:   Bart Samwel
13
17
#                                Kiko Piris
16
20
#                                Herve Eychenne
17
21
#                                Dax Kelson
18
22
#                                Jan Polacek
 
23
#                                ... and many others that I've stopped
 
24
#                                keeping track of.
19
25
#
20
 
# Based on a script for Linux 2.4 written by Jens Axboe
 
26
# Based on a script for Linux 2.4 written by Jens Axboe.
21
27
 
22
28
#############################################################################
23
29
 
24
 
VERSION=1.11
25
 
 
26
 
if [ "$1" == "defaults" -o "$1" == "readconfig" ] ; then
27
 
        # This special option is used from multiple scripts to set the config defaults
28
 
        # and to read the configuration on top of those.
29
 
        VERBOSE_OUTPUT=0
30
 
        ENABLE_LAPTOP_MODE_ON_BATTERY=1
31
 
        ENABLE_LAPTOP_MODE_ON_AC=0
32
 
        ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED=0
33
 
        PARTITIONS=auto
34
 
        LM_BATT_MAX_LOST_WORK_SECONDS=600
35
 
        LM_AC_MAX_LOST_WORK_SECONDS=360
36
 
        DEF_MAX_AGE=30
37
 
        LM_READAHEAD=3072
38
 
        NOLM_READAHEAD=128
39
 
        CONTROL_READAHEAD=1     
40
 
        CONTROL_NOATIME=1
41
 
        CONTROL_HD_IDLE_TIMEOUT=1
42
 
        LM_AC_HD_IDLE_TIMEOUT=1    # 5 seconds
43
 
        LM_BATT_HD_IDLE_TIMEOUT=1  # 5 seconds
44
 
        NOLM_HD_IDLE_TIMEOUT=244   # 2 hours
45
 
        DEF_UPDATE=5
46
 
        DEF_XFS_AGE_BUFFER=15
47
 
        DEF_XFS_SYNC_INTERVAL=30
48
 
        DEF_XFS_BUFD_INTERVAL=1
49
 
        XFS_HZ=100
50
 
        MINIMUM_BATTERY_MINUTES=7
51
 
        CONTROL_MOUNT_OPTIONS=1
52
 
        BATT_HD_POWERMGMT=1
53
 
        LM_AC_HD_POWERMGMT=255
54
 
        NOLM_AC_HD_POWERMGMT=255
55
 
        CONTROL_HD_POWERMGMT=0
56
 
        CONTROL_HD_WRITECACHE=1
57
 
        NOLM_AC_HD_WRITECACHE=1
58
 
        NOLM_BATT_HD_WRITECACHE=0
59
 
        LM_HD_WRITECACHE=0
60
 
        ACPI_WITHOUT_AC_EVENTS=0
61
 
        LM_DIRTY_RATIO=60
62
 
        LM_DIRTY_BACKGROUND_RATIO=1
63
 
        NOLM_DIRTY_BACKGROUND_RATIO=10
64
 
        NOLM_DIRTY_RATIO=40
65
 
        LM_SECONDS_BEFORE_SYNC=2        
66
 
        BATT_CPU_MAXFREQ=fastest
67
 
        BATT_CPU_MINFREQ=slowest
68
 
        BATT_CPU_GOVENOR=conservative
69
 
        LM_AC_CPU_MAXFREQ=fastest
70
 
        LM_AC_CPU_MINFREQ=slowest
71
 
        LM_AC_CPU_GOVERNOR=ondemand
72
 
        NOLM_AC_CPU_MAXFREQ=fastest
73
 
        NOLM_AC_CPU_MINFREQ=slowest
74
 
        NOLM_AC_CPU_GOVERNOR=performance
75
 
        CONTROL_CPU_FREQUENCY=0
76
 
        HD="/dev/[hs]d[abcdefgh]"
77
 
        CONTROL_SYSLOG_CONF=0
78
 
        LM_AC_SYSLOG_CONF=/etc/syslog-on-ac-with-lm.conf
79
 
        NOLM_AC_SYSLOG_CONF=/etc/syslog-on-ac-without-lm.conf
80
 
        BATT_SYSLOG_CONF=/etc/syslog-on-battery.conf
81
 
        SYSLOG_CONF_SIGNAL_PROGRAM=syslogd
82
 
        SYSLOG_CONF=/etc/syslog.conf
83
 
        CONTROL_DPMS_STANDBY=0
84
 
        BATT_DPMS_STANDBY=300
85
 
        LM_AC_DPMS_STANDBY=1200
86
 
        NOLM_DPMS_STANDBY=1200
87
 
        CONTROL_CPU_THROTTLING=0
88
 
        BATT_CPU_THROTTLING=medium
89
 
        LM_AC_CPU_THROTTLING=minimum
90
 
        NOLM_AC_CPU_THROTTLING=minimum
91
 
        CONTROL_START_STOP=0
92
 
        
93
 
        # Backward compatibility variable that is sometimes
94
 
        # set externally (Debian init system)
95
 
        unset VERBOSE
96
 
        
97
 
        # Source config.
98
 
        if [ -r /etc/laptop-mode/laptop-mode.conf ] ; then
99
 
                . /etc/laptop-mode/laptop-mode.conf
100
 
        else
101
 
                echo $0: Configuration file /etc/laptop-mode/laptop-mode.conf not present or not readable.
102
 
                exit 1
103
 
        fi
104
 
 
105
 
        # Support for old config settings
106
 
        if [ "$AC_HD" != "" ] ; then
107
 
                AC_HD_WITHOUT_LM="$AC_HD"
108
 
                AC_HD_WITH_LM="$AC_HD"
109
 
        fi
110
 
        if [ "$VERBOSE" != "" ] ; then
111
 
                VERBOSE_OUTPUT="$VERBOSE"
112
 
        fi
113
 
        if [ "$CPU_MAXFREQ" != "" ] ; then
114
 
                BATT_CPU_MAXFREQ="$CPU_MAXFREQ"
115
 
        fi
116
 
        if [ "$MAX_AGE" != "" ] ; then
117
 
                LM_BATT_MAX_LOST_WORK_SECONDS="$MAX_AGE"
118
 
                LM_AC_MAX_LOST_WORK_SECONDS="$MAX_AGE"
119
 
        fi
120
 
        if [ "$DEF_AGE" != "" ] ; then
121
 
                DEF_MAX_AGE="$DEF_AGE"
122
 
        fi
123
 
        if [ "$LAPTOP_MODE_ALWAYS_ON" != "" ] ; then
124
 
                ENABLE_LAPTOP_MODE_ALWAYS="$LAPTOP_MODE_ALWAYS_ON"
125
 
        fi
126
 
        if [ "$LM_WHEN_LID_CLOSED" != "" ] ; then
127
 
                ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED="$LM_WHEN_LID_CLOSED"
128
 
        fi
129
 
        if [ "$REMOUNT_PARTITIONS" != "" ] ; then
130
 
                PARTITIONS="$REMOUNT_PARTITIONS"
131
 
        fi
132
 
        if [ "$READAHEAD" != "" ] ; then
133
 
                LM_READAHEAD="$READAHEAD"
134
 
        fi
135
 
        if [ "$DO_REMOUNT_NOATIME" != "" ] ; then
136
 
                CONTROL_NOATIME="$DO_REMOUNT_NOATIME"
137
 
        fi
138
 
        if [ "$DO_HD" != "" ] ; then
139
 
                CONTROL_HD_IDLE_TIMEOUT="$DO_HD"
140
 
        fi
141
 
        if [ "$AC_HD_WITH_LM" != "" ] ; then
142
 
                LM_AC_HD_IDLE_TIMEOUT="$AC_HD_WITH_LM"
143
 
        fi
144
 
        if [ "$AC_HD_WITHOUT_LM" != "" ] ; then
145
 
                NOLM_HD_IDLE_TIMEOUT="$AC_HD_WITHOUT_LM"
146
 
        fi
147
 
        if [ "$BATT_HD" != "" ] ; then
148
 
                LM_BATT_HD_IDLE_TIMEOUT="$BATT_HD"
149
 
        fi              
150
 
        if [ "$DO_REMOUNTS" != "" ] ; then
151
 
                CONTROL_MOUNT_OPTIONS="$DO_REMOUNTS"
152
 
        fi      
153
 
        if [ "$DO_HD_POWERMGMT" != "" ] ; then
154
 
                CONTROL_HD_POWERMGMT="$DO_HD_POWERMGMT"
155
 
        fi
156
 
        if [ "$AC_HDPARM_POWERMGMT_WITH_LM" != "" ] ; then
157
 
                LM_AC_HD_POWERMGMT="$AC_HDPARM_POWERMGMT_WITH_LM"
158
 
        fi
159
 
        if [ "$AC_HDPARM_POWERMGMT_WITHOUT_LM" != "" ] ; then
160
 
                NOLM_AC_HD_POWERMGMT="$AC_HDPARM_POWERMGMT_WITHOUT_LM"
161
 
        fi
162
 
        if [ "$BATT_HDPARM_POWERMGMT" != "" ] ; then
163
 
                BATT_HD_POWERMGMT="$BATT_HDPARM_POWERMGMT"
164
 
        fi
165
 
        if [ "$DO_WRITECACHE" != "" ] ; then
166
 
                CONTROL_HD_WRITECACHE="$DO_WRITECACHE"
167
 
        fi
168
 
        if [ "$AC_WRITECACHE_WITHOUT_LM" != "" ] ; then
169
 
                NOLM_AC_HD_WRITECACHE="$AC_WRITECACHE_WITHOUT_LM"
170
 
        fi
171
 
        if [ "$BATT_WRITECACHE" != "" ] ; then
172
 
                LM_HD_WRITECACHE="$BATT_WRITECACHE"
173
 
        fi
174
 
        if [ "$DIRTY_RATIO" != "" ]; then
175
 
                LM_DIRTY_RATIO="$DIRTY_RATIO"
176
 
        fi
177
 
        if [ "$DIRTY_BACKGROUND_RATIO" != "" ] ; then
178
 
                LM_DIRTY_BACKGROUND_RATIO="$DIRTY_BACKGROUND_RATIO"
179
 
        fi
180
 
        if [ "$DEF_DIRTY_RATIO" != "" ]; then
181
 
                NOLM_DIRTY_RATIO="$DEF_DIRTY_RATIO"
182
 
        fi
183
 
        if [ "$DEF_DIRTY_BACKGROUND_RATIO" != "" ] ; then
184
 
                NOLM_DIRTY_BACKGROUND_RATIO="$DEF_DIRTY_BACKGROUND_RATIO"
185
 
        fi
186
 
        if [ "$DO_CPU" != "" ] ; then
187
 
                CONTROL_CPU_FREQUENCY="$DO_CPU"
188
 
        fi
189
 
        if [ "$CONTROL_CPU_MAXFREQ" != "" ] ; then
190
 
                CONTROL_CPU_FREQUENCY="$CONTROL_CPU_MAXFREQ"
191
 
        fi
192
 
        if [ "$AC_CPU_MAXFREQ_WITH_LM" != "" ] ; then
193
 
                LM_AC_CPU_MAXFREQ="$AC_CPU_MAXFREQ_WITH_LM"
194
 
        fi
195
 
        if [ "$AC_CPU_MAXFREQ_WITHOUT_LM" != "" ] ; then
196
 
                NOLM_AC_CPU_MAXFREQ="$AC_CPU_MAXFREQ_WITHOUT_LM"
197
 
        fi
198
 
        if [ "$DO_SYSLOG" != "" ] ; then
199
 
                CONTROL_SYSLOG_CONF="$DO_SYSLOG"
200
 
        fi
201
 
        if [ "$SYSLOG_SIGNAL_PROGRAM" != "" ] ;then
202
 
                SYSLOG_CONF_SIGNAL_PROGRAM="$SYSLOG_SIGNAL_PROGRAM"
203
 
        fi
204
 
        if [ "$AC_SYSLOG_WITH_LM" != "" ] ; then
205
 
                LM_AC_SYSLOG_CONF="$AC_SYSLOG_WITH_LM"
206
 
        fi
207
 
        if [ "$AC_SYSLOG_WITHOUT_LM" != "" ] ; then
208
 
                NOLM_AC_SYSLOG_CONF="$AC_SYSLOG_WITHOUT_LM"
209
 
        fi
210
 
        if [ "$BATT_SYSLOG" != "" ] ; then
211
 
                BATT_SYSLOG_CONF="$BATT_SYSLOG"
212
 
        fi
213
 
        if [ "$ENABLE_LAPTOP_MODE_ALWAYS" != "" ] ; then
214
 
                ENABLE_LAPTOP_MODE_ON_AC="$ENABLE_LAPTOP_MODE_ALWAYS"
215
 
        fi
216
 
 
217
 
        # Postprocessing
218
 
        if [ "$VERBOSE_OUTPUT" -ne 0 ] ; then
219
 
                OUTPUT="/dev/stdout"
220
 
        else
221
 
                OUTPUT="/dev/null"
222
 
        fi
223
 
 
224
 
        if [ "$PARTITIONS" == "" ] ; then
225
 
                PARTITIONS="auto"
226
 
        fi
227
 
        
228
 
        # Convert seconds to hdparm -S format
229
 
        # Everything over 20 minutes is interpreted as 2 hours.
230
 
        seconds_to_hdparm_S() {
231
 
          if [ "$1" -eq 0 ] ; then
232
 
                # disable.
233
 
                echo 0
234
 
         elif [ "$1" -gt 0 -a "$1" -lt 5 ] ; then
235
 
                # 5 seconds minimum
236
 
                echo 1  
237
 
          elif [ "$1" -le $((240*5)) ] ; then
238
 
                # Values between 1 and 240 signify increments of 5 seconds
239
 
                echo $(($1 / 5))
240
 
          elif [ "$1" -lt $((30*60)) ] ; then
241
 
                # Values between 20 and 30 minutes are rounded up to 30 minutes.
242
 
                echo 241
243
 
          elif [ "$1" -lt $((12*30*60)) ] ; then
244
 
                # Values between 30 minutes and 6 hours (exclusive) yield values between
245
 
                # 241 and 251, in 30-minute increments.
246
 
                echo $(( 240 + ($1 / (30*60)) ))
247
 
          else
248
 
                # Larger values effectively indicate no timeout at all.
249
 
                echo 0
250
 
          fi
251
 
        }
252
 
 
253
 
        # Convert configured idle timeouts to hdparm -S format.
254
 
        if [ "$LM_AC_HD_IDLE_TIMEOUT_SECONDS" != "" ] ; then
255
 
                LM_AC_HD_IDLE_TIMEOUT=$(seconds_to_hdparm_S $LM_AC_HD_IDLE_TIMEOUT_SECONDS)
256
 
        fi
257
 
        if [ "$LM_BATT_HD_IDLE_TIMEOUT_SECONDS" != "" ] ; then
258
 
                LM_BATT_HD_IDLE_TIMEOUT=$(seconds_to_hdparm_S $LM_BATT_HD_IDLE_TIMEOUT_SECONDS)
259
 
        fi
260
 
        if [ "$NOLM_HD_IDLE_TIMEOUT_SECONDS" != "" ] ; then
261
 
                NOLM_HD_IDLE_TIMEOUT=$(seconds_to_hdparm_S $NOLM_HD_IDLE_TIMEOUT_SECONDS)
262
 
        fi
263
 
 
264
 
elif [ "$1" == "status" ] ; then
265
 
 
266
 
        . $0 readconfig
267
 
 
 
30
# The laptop mode tools version number. Extracted by the installer makefile
 
31
# as well, so don't change the format!
 
32
LMTVERSION=1.31
 
33
 
 
34
# This script is loaded from multiple scripts to set the config defaults
 
35
# and to read the configuration on top of those. Only when the command is
 
36
# recognized does this script do anything else.
 
37
VERBOSE_OUTPUT=0
 
38
ENABLE_LAPTOP_MODE_ON_BATTERY=1
 
39
ENABLE_LAPTOP_MODE_ON_AC=0
 
40
ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED=0
 
41
PARTITIONS="auto /dev/mapper/*"
 
42
LM_BATT_MAX_LOST_WORK_SECONDS=600
 
43
LM_AC_MAX_LOST_WORK_SECONDS=360
 
44
DEF_MAX_AGE=30
 
45
LM_READAHEAD=3072
 
46
NOLM_READAHEAD=128
 
47
CONTROL_READAHEAD=1     
 
48
CONTROL_NOATIME=0
 
49
CONTROL_HD_IDLE_TIMEOUT=1
 
50
LM_AC_HD_IDLE_TIMEOUT=1    # 5 seconds
 
51
LM_BATT_HD_IDLE_TIMEOUT=1  # 5 seconds
 
52
NOLM_HD_IDLE_TIMEOUT=244   # 2 hours
 
53
DEF_UPDATE=5
 
54
DEF_XFS_AGE_BUFFER=15
 
55
DEF_XFS_SYNC_INTERVAL=30
 
56
DEF_XFS_BUFD_INTERVAL=1
 
57
XFS_HZ=100
 
58
CONTROL_MOUNT_OPTIONS=1
 
59
BATT_HD_POWERMGMT=1
 
60
LM_AC_HD_POWERMGMT=255
 
61
NOLM_AC_HD_POWERMGMT=255
 
62
CONTROL_HD_POWERMGMT=0
 
63
CONTROL_HD_WRITECACHE=0
 
64
NOLM_AC_HD_WRITECACHE=1
 
65
NOLM_BATT_HD_WRITECACHE=0
 
66
LM_HD_WRITECACHE=0
 
67
LM_DIRTY_RATIO=60
 
68
LM_DIRTY_BACKGROUND_RATIO=1
 
69
NOLM_DIRTY_BACKGROUND_RATIO=10
 
70
NOLM_DIRTY_RATIO=40
 
71
LM_SECONDS_BEFORE_SYNC=2        
 
72
BATT_CPU_MAXFREQ=medium
 
73
BATT_CPU_MINFREQ=slowest
 
74
BATT_CPU_GOVERNOR=ondemand
 
75
LM_AC_CPU_MAXFREQ=fastest
 
76
LM_AC_CPU_MINFREQ=slowest
 
77
LM_AC_CPU_GOVERNOR=ondemand
 
78
NOLM_AC_CPU_MAXFREQ=fastest
 
79
NOLM_AC_CPU_MINFREQ=slowest
 
80
NOLM_AC_CPU_GOVERNOR=performance
 
81
CONTROL_CPU_FREQUENCY=0
 
82
HD="/dev/[hs]d[abcdefgh]"
 
83
CONTROL_SYSLOG_CONF=0
 
84
LM_AC_SYSLOG_CONF=/etc/syslog-on-ac-with-lm.conf
 
85
NOLM_AC_SYSLOG_CONF=/etc/syslog-on-ac-without-lm.conf
 
86
BATT_SYSLOG_CONF=/etc/syslog-on-battery.conf
 
87
SYSLOG_CONF_SIGNAL_PROGRAM=syslogd
 
88
SYSLOG_CONF=/etc/syslog.conf
 
89
CONTROL_DPMS_STANDBY=0
 
90
BATT_DPMS_STANDBY=300
 
91
LM_AC_DPMS_STANDBY=1200
 
92
NOLM_AC_DPMS_STANDBY=1200
 
93
CONTROL_CPU_THROTTLING=0
 
94
BATT_CPU_THROTTLING=medium
 
95
LM_AC_CPU_THROTTLING=minimum
 
96
NOLM_AC_CPU_THROTTLING=minimum
 
97
CONTROL_START_STOP=1
 
98
CONTROL_TERMINAL=0
 
99
BATT_TERMINAL_BLANK_MINUTES=2
 
100
BATT_TERMINAL_POWERDOWN_MINUTES=1
 
101
LM_AC_TERMINAL_BLANK_MINUTES=10
 
102
LM_AC_TERMINAL_BLANK_MINUTES=10
 
103
NOLM_AC_TERMINAL_POWERDOWN_MINUTES=10
 
104
NOLM_AC_TERMINAL_POWERDOWN_MINUTES=50
 
105
ENABLE_AUTO_HIBERNATION=0
 
106
HIBERNATE_COMMAND=/usr/sbin/hibernate
 
107
AUTO_HIBERNATION_ON_CRITICAL_BATTERY_LEVEL=1
 
108
DISABLE_LAPTOP_MODE_ON_CRITICAL_BATTERY_LEVEL=1
 
109
AUTO_HIBERNATION_BATTERY_CHARGE_MAH=0
 
110
AUTO_HIBERNATION_BATTERY_CHARGE_MWH=0
 
111
MINIMUM_BATTERY_CHARGE_MAH=0
 
112
MINIMUM_BATTERY_CHARGE_MWH=0
 
113
ASSUME_SCSI_IS_SATA=1
 
114
 
 
115
# No default on these ones -- we need to detect if they have been set, for
 
116
# backward compatibility with MINIMUM_BATTERY_MINUTES etc.
 
117
AUTO_HIBERNATION_BATTERY_CHARGE_PERCENT=
 
118
MINIMUM_BATTERY_CHARGE_PERCENT=
 
119
 
 
120
# Backward compatibility variable that is sometimes
 
121
# set externally (Debian init system)
 
122
unset VERBOSE
 
123
 
 
124
# Source config.
 
125
if [ -r /etc/laptop-mode/laptop-mode.conf ] ; then
 
126
        . /etc/laptop-mode/laptop-mode.conf
 
127
else
 
128
        echo $0: Configuration file /etc/laptop-mode/laptop-mode.conf not present or not readable.
 
129
        exit 1
 
130
fi
 
131
 
 
132
# Support for old config settings
 
133
if [ "$AC_HD" != "" ] ; then
 
134
        AC_HD_WITHOUT_LM="$AC_HD"
 
135
        AC_HD_WITH_LM="$AC_HD"
 
136
fi
 
137
if [ "$VERBOSE" != "" ] ; then
 
138
        VERBOSE_OUTPUT="$VERBOSE"
 
139
fi
 
140
if [ "$CPU_MAXFREQ" != "" ] ; then
 
141
        BATT_CPU_MAXFREQ="$CPU_MAXFREQ"
 
142
fi
 
143
if [ "$MAX_AGE" != "" ] ; then
 
144
        LM_BATT_MAX_LOST_WORK_SECONDS="$MAX_AGE"
 
145
        LM_AC_MAX_LOST_WORK_SECONDS="$MAX_AGE"
 
146
fi
 
147
if [ "$DEF_AGE" != "" ] ; then
 
148
        DEF_MAX_AGE="$DEF_AGE"
 
149
fi
 
150
if [ "$LAPTOP_MODE_ALWAYS_ON" != "" ] ; then
 
151
        ENABLE_LAPTOP_MODE_ALWAYS="$LAPTOP_MODE_ALWAYS_ON"
 
152
fi
 
153
if [ "$LM_WHEN_LID_CLOSED" != "" ] ; then
 
154
        ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED="$LM_WHEN_LID_CLOSED"
 
155
fi
 
156
if [ "$REMOUNT_PARTITIONS" != "" ] ; then
 
157
        PARTITIONS="$REMOUNT_PARTITIONS"
 
158
fi
 
159
if [ "$READAHEAD" != "" ] ; then
 
160
        LM_READAHEAD="$READAHEAD"
 
161
fi
 
162
if [ "$DO_REMOUNT_NOATIME" != "" ] ; then
 
163
        CONTROL_NOATIME="$DO_REMOUNT_NOATIME"
 
164
fi
 
165
if [ "$DO_HD" != "" ] ; then
 
166
        CONTROL_HD_IDLE_TIMEOUT="$DO_HD"
 
167
fi
 
168
if [ "$AC_HD_WITH_LM" != "" ] ; then
 
169
        LM_AC_HD_IDLE_TIMEOUT="$AC_HD_WITH_LM"
 
170
fi
 
171
if [ "$AC_HD_WITHOUT_LM" != "" ] ; then
 
172
        NOLM_HD_IDLE_TIMEOUT="$AC_HD_WITHOUT_LM"
 
173
fi
 
174
if [ "$BATT_HD" != "" ] ; then
 
175
        LM_BATT_HD_IDLE_TIMEOUT="$BATT_HD"
 
176
fi              
 
177
if [ "$DO_REMOUNTS" != "" ] ; then
 
178
        CONTROL_MOUNT_OPTIONS="$DO_REMOUNTS"
 
179
fi      
 
180
if [ "$DO_HD_POWERMGMT" != "" ] ; then
 
181
        CONTROL_HD_POWERMGMT="$DO_HD_POWERMGMT"
 
182
fi
 
183
if [ "$AC_HDPARM_POWERMGMT_WITH_LM" != "" ] ; then
 
184
        LM_AC_HD_POWERMGMT="$AC_HDPARM_POWERMGMT_WITH_LM"
 
185
fi
 
186
if [ "$AC_HDPARM_POWERMGMT_WITHOUT_LM" != "" ] ; then
 
187
        NOLM_AC_HD_POWERMGMT="$AC_HDPARM_POWERMGMT_WITHOUT_LM"
 
188
fi
 
189
if [ "$BATT_HDPARM_POWERMGMT" != "" ] ; then
 
190
        BATT_HD_POWERMGMT="$BATT_HDPARM_POWERMGMT"
 
191
fi
 
192
if [ "$DO_WRITECACHE" != "" ] ; then
 
193
        CONTROL_HD_WRITECACHE="$DO_WRITECACHE"
 
194
fi
 
195
if [ "$AC_WRITECACHE_WITHOUT_LM" != "" ] ; then
 
196
        NOLM_AC_HD_WRITECACHE="$AC_WRITECACHE_WITHOUT_LM"
 
197
fi
 
198
if [ "$BATT_WRITECACHE" != "" ] ; then
 
199
        LM_HD_WRITECACHE="$BATT_WRITECACHE"
 
200
fi
 
201
if [ "$DIRTY_RATIO" != "" ]; then
 
202
        LM_DIRTY_RATIO="$DIRTY_RATIO"
 
203
fi
 
204
if [ "$DIRTY_BACKGROUND_RATIO" != "" ] ; then
 
205
        LM_DIRTY_BACKGROUND_RATIO="$DIRTY_BACKGROUND_RATIO"
 
206
fi
 
207
if [ "$DEF_DIRTY_RATIO" != "" ]; then
 
208
        NOLM_DIRTY_RATIO="$DEF_DIRTY_RATIO"
 
209
fi
 
210
if [ "$DEF_DIRTY_BACKGROUND_RATIO" != "" ] ; then
 
211
        NOLM_DIRTY_BACKGROUND_RATIO="$DEF_DIRTY_BACKGROUND_RATIO"
 
212
fi
 
213
if [ "$DO_CPU" != "" ] ; then
 
214
        CONTROL_CPU_FREQUENCY="$DO_CPU"
 
215
fi
 
216
if [ "$CONTROL_CPU_MAXFREQ" != "" ] ; then
 
217
        CONTROL_CPU_FREQUENCY="$CONTROL_CPU_MAXFREQ"
 
218
fi
 
219
if [ "$AC_CPU_MAXFREQ_WITH_LM" != "" ] ; then
 
220
        LM_AC_CPU_MAXFREQ="$AC_CPU_MAXFREQ_WITH_LM"
 
221
fi
 
222
if [ "$AC_CPU_MAXFREQ_WITHOUT_LM" != "" ] ; then
 
223
        NOLM_AC_CPU_MAXFREQ="$AC_CPU_MAXFREQ_WITHOUT_LM"
 
224
fi
 
225
if [ "$DO_SYSLOG" != "" ] ; then
 
226
        CONTROL_SYSLOG_CONF="$DO_SYSLOG"
 
227
fi
 
228
if [ "$SYSLOG_SIGNAL_PROGRAM" != "" ] ;then
 
229
        SYSLOG_CONF_SIGNAL_PROGRAM="$SYSLOG_SIGNAL_PROGRAM"
 
230
fi
 
231
if [ "$AC_SYSLOG_WITH_LM" != "" ] ; then
 
232
        LM_AC_SYSLOG_CONF="$AC_SYSLOG_WITH_LM"
 
233
fi
 
234
if [ "$AC_SYSLOG_WITHOUT_LM" != "" ] ; then
 
235
        NOLM_AC_SYSLOG_CONF="$AC_SYSLOG_WITHOUT_LM"
 
236
fi
 
237
if [ "$BATT_SYSLOG" != "" ] ; then
 
238
        BATT_SYSLOG_CONF="$BATT_SYSLOG"
 
239
fi
 
240
if [ "$ENABLE_LAPTOP_MODE_ALWAYS" != "" ] ; then
 
241
        ENABLE_LAPTOP_MODE_ON_AC="$ENABLE_LAPTOP_MODE_ALWAYS"
 
242
fi
 
243
if [ "$MINIMUM_BATTERY_MINUTES" != "" -a "$MINIMUM_BATTERY_CHARGE_PERCENT" == "" ] ; then
 
244
        # Use a very conservative estimate (1% = 1 battery minute, 100 minutes in a battery)
 
245
        # for backward compatibility.
 
246
        MINIMUM_BATTERY_CHARGE_PERCENT="$MINIMUM_BATTERY_MINUTES"
 
247
fi
 
248
if [ -z "$MINIMUM_BATTERY_CHARGE_PERCENT" ] ; then
 
249
        # Apply the default, now that we've determined that this is the minimum.
 
250
        MINIMUM_BATTERY_CHARGE_PERCENT=3
 
251
fi
 
252
if [ "$AUTO_HIBERNATION_BATTERY_MINUTES" != "" -a "$AUTO_HIBERNATION_BATTERY_CHARGE_PERCENT" == "" ] ; then
 
253
        # Use a very conservative estimate (1% = 1 battery minute, 100 minutes in a battery)
 
254
        # for backward compatibility.
 
255
        AUTO_HIBERNATION_BATTERY_CHARGE_PERCENT="$AUTO_HIBERNATION_BATTERY_MINUTES"
 
256
fi
 
257
if [ -z "$AUTO_HIBERNATION_BATTERY_CHARGE_PERCENT" ] ; then
 
258
        # Apply the default, now that we've determined that this is the minimum.
 
259
        AUTO_HIBERNATION_BATTERY_CHARGE_PERCENT=2
 
260
fi
 
261
 
 
262
 
 
263
# Postprocessing
 
264
if [ "$VERBOSE_OUTPUT" -ne 0 ] ; then
 
265
        OUTPUT="/dev/stdout"
 
266
else
 
267
        OUTPUT="/dev/null"
 
268
fi
 
269
 
 
270
if [ "$PARTITIONS" == "" ] ; then
 
271
        PARTITIONS="auto /dev/mapper/*"
 
272
fi
 
273
 
 
274
# Convert seconds to hdparm -S format
 
275
# Everything over 20 minutes is interpreted as 2 hours.
 
276
seconds_to_hdparm_S() {
 
277
  if [ "$1" -eq 0 ] ; then
 
278
        # disable.
 
279
        echo 0
 
280
 elif [ "$1" -gt 0 -a "$1" -lt 5 ] ; then
 
281
        # 5 seconds minimum
 
282
        echo 1  
 
283
  elif [ "$1" -le $((240*5)) ] ; then
 
284
        # Values between 1 and 240 signify increments of 5 seconds
 
285
        echo $(($1 / 5))
 
286
  elif [ "$1" -lt $((30*60)) ] ; then
 
287
        # Values between 20 and 30 minutes are rounded up to 30 minutes.
 
288
        echo 241
 
289
  elif [ "$1" -lt $((12*30*60)) ] ; then
 
290
        # Values between 30 minutes and 6 hours (exclusive) yield values between
 
291
        # 241 and 251, in 30-minute increments.
 
292
        echo $(( 240 + ($1 / (30*60)) ))
 
293
  else
 
294
        # Larger values effectively indicate no timeout at all.
 
295
        echo 0
 
296
  fi
 
297
}
 
298
 
 
299
# Convert configured idle timeouts to hdparm -S format.
 
300
if [ "$LM_AC_HD_IDLE_TIMEOUT_SECONDS" != "" ] ; then
 
301
        LM_AC_HD_IDLE_TIMEOUT=$(seconds_to_hdparm_S $LM_AC_HD_IDLE_TIMEOUT_SECONDS)
 
302
fi
 
303
if [ "$LM_BATT_HD_IDLE_TIMEOUT_SECONDS" != "" ] ; then
 
304
        LM_BATT_HD_IDLE_TIMEOUT=$(seconds_to_hdparm_S $LM_BATT_HD_IDLE_TIMEOUT_SECONDS)
 
305
fi
 
306
if [ "$NOLM_HD_IDLE_TIMEOUT_SECONDS" != "" ] ; then
 
307
        NOLM_HD_IDLE_TIMEOUT=$(seconds_to_hdparm_S $NOLM_HD_IDLE_TIMEOUT_SECONDS)
 
308
fi
 
309
 
 
310
if [ "$1" == "status" ] ; then
268
311
        # Display a status report.
269
312
        echo Mounts:
270
313
        mount | sed "s/^/   /"
287
330
                echo Laptop Mode is NOT allowed to run: /var/run/laptop-mode-enabled does not exist.
288
331
        fi
289
332
        echo
290
 
        STATFILES="/proc/sys/vm/laptop_mode /proc/apm /proc/pmu/info /proc/sys/vm/bdflush /proc/sys/vm/dirty_ratio /proc/sys/fs/xfs/age_buffer /proc/sys/fs/xfs/sync_interval /proc/sys/fs/xfs/lm_age_buffer /proc/sys/fs/xfs/lm_sync_interval /proc/sys/vm/pagebuf/lm_flush_age /proc/sys/fs/xfs/xfsbufd_centisecs /proc/sys/fs/xfs/xfssyncd_centisecs /proc/sys/vm/dirty_background_ratio /proc/sys/vm/dirty_expire_centisecs /proc/sys/fs/xfs/age_buffer/centisecs /proc/sys/vm/dirty_writeback_centisecs /sys/devices/system/cpu/*/cpufreq/cpuinfo_*_freq /proc/acpi/button/lid/*/state /proc/acpi/ac_adapter/*/state /proc/acpi/battery/*/state"
 
333
        STATFILES="/proc/sys/vm/laptop_mode /proc/apm /proc/pmu/info /proc/sys/vm/bdflush /proc/sys/vm/dirty_ratio /proc/sys/fs/xfs/age_buffer /proc/sys/fs/xfs/sync_interval /proc/sys/fs/xfs/lm_age_buffer /proc/sys/fs/xfs/lm_sync_interval /proc/sys/vm/pagebuf/lm_flush_age /proc/sys/fs/xfs/xfsbufd_centisecs /proc/sys/fs/xfs/xfssyncd_centisecs /proc/sys/vm/dirty_background_ratio /proc/sys/vm/dirty_expire_centisecs /proc/sys/fs/xfs/age_buffer/centisecs /proc/sys/vm/dirty_writeback_centisecs /sys/devices/system/cpu/*/cpufreq/cpuinfo_*_freq /sys/devices/system/cpu/*/cpufreq/scaling_governor /proc/acpi/button/lid/*/state /proc/acpi/ac_adapter/*/state /proc/acpi/battery/*/state"
291
334
        for THISFILE in $STATFILES ; do
292
335
                if [ -e $THISFILE ] ; then
293
336
                        echo $THISFILE:
300
343
                fi
301
344
        done
302
345
 
303
 
else
304
 
 
305
 
# Read the config file. Yes, this recursively calls this file. Other files do so too.
306
 
. $0 readconfig
307
 
 
 
346
elif [ "$1" != "readconfig" -a "$1" != "defaults" ] ; then
308
347
 
309
348
#############################################################################
310
349
 
311
350
KLEVEL="$(uname -r |
312
351
                         {
313
 
                                 IFS='.' read a b c
 
352
                                 IFS='.-' read a b c
314
353
                                 echo $a.$b
315
354
                         }
316
355
)"
 
356
KMINOR="$(uname -r |
 
357
                        {
 
358
                                IFS='.-' read a b c d
 
359
                                echo $c
 
360
                        }
 
361
)"
 
362
 
317
363
case "$KLEVEL" in
318
 
        "2.4"|"2.6")
319
 
                ;;
 
364
        "2.4" ) ;;
 
365
        "2.6" ) ;;
320
366
        *)
321
367
                echo "Unhandled kernel version: $KLEVEL ('uname -r' = '$(uname -r)')" >&2
322
368
                exit 1
323
369
                ;;
324
370
esac
325
371
 
 
372
 
 
373
 
326
374
if [ "$1" == "--version" ] ; then
327
 
        echo "Laptop Mode Tools $VERSION"
 
375
        echo "Laptop Mode Tools $LMTVERSION"
328
376
        exit 0
329
377
fi
330
 
echo "Laptop Mode Tools $VERSION" > $OUTPUT
 
378
echo "Laptop Mode Tools $LMTVERSION" >> $OUTPUT
331
379
 
332
380
if [ ! -e /proc/sys/vm/laptop_mode ] ; then
333
 
        echo "Kernel is not patched with laptop_mode patch." >&2
 
381
        echo "Kernel does not have support for laptop mode. Please apply the laptop mode" >&2
 
382
        echo "patch or install a newer kernel." >&2
334
383
        exit 1
335
384
fi
336
385
 
434
483
        NOATIME_OPT=",noatime"
435
484
fi
436
485
 
437
 
ACTION="$1"
438
 
INIT=0   # Display info in init script format?
439
 
if [ "$2" == "init" ] ; then
440
 
        INIT=1
441
 
fi
 
486
INIT=0          # Display info in init script format?
 
487
FORCE=0         # Force reapplying the current state?
 
488
while [ "$1" != "" ] ; do
 
489
        case "$1" in 
 
490
                init) INIT=1 ;;
 
491
                force) FORCE=1 ;;
 
492
                # Old options. We always do "auto" for any option now, but
 
493
                # we still have to accept the options.
 
494
                start) ;;
 
495
                stop) ;;
 
496
                auto) ;;
 
497
                *) echo "Unrecognized option $1."
 
498
                   exit 1 ;;
 
499
        esac
 
500
        shift
 
501
done
442
502
 
443
 
# Used to display laptop mode state later on. This is the enabled/disabled state for
444
 
# laptop mode processing, it tells us nothing about whether laptop mode is actually _active_.
 
503
# Used to display laptop mode state later on. This is the enabled/disabled 
 
504
# state for laptop mode processing, it tells us nothing about whether laptop
 
505
# mode is actually _active_.
445
506
STATE=enabled
446
507
if [ "$ENABLE_LAPTOP_MODE_ON_BATTERY" -eq 0 -a "$ENABLE_LAPTOP_MODE_ON_AC" -eq 0 -a "$ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED" -eq 0 ] ; then
447
508
        STATE=disabled
474
535
        fi
475
536
elif [ -f /proc/pmu/info ] ; then
476
537
        if ( grep "^AC Power.*0$" /proc/pmu/info ) ; then
477
 
                echo "/proc/pmu/info indicates absence of AC power." > $OUTPUT
 
538
                echo "/proc/pmu/info indicates absence of AC power." >> $OUTPUT
478
539
                ON_AC=0
479
540
        else
480
541
                # It is possible that there is no AC Power = 1 in the file,
481
542
                # but we always assume AC power when we're not sure.
482
543
                ON_AC=1
483
 
                echo "/proc/pmu/info indicates presence of AC power." > $OUTPUT
484
 
        fi
485
 
else
486
 
        echo "No ACPI, APM or PMU power management information found -- assuming AC power is present." > $OUTPUT
487
 
fi
488
 
 
489
 
 
490
 
if [ "$ACTION" == "auto" ] ; then
491
 
        if [ "$ON_AC" -eq 1 ] ; then
492
 
                if [ "$ENABLE_LAPTOP_MODE_ON_AC" -ne 0 ] ; then
493
 
                        echo "On AC power: Setting action to \"start\" because ENABLE_LAPTOP_MODE_ON_AC is set." > $OUTPUT
494
 
                        ACTION=start
495
 
                else
496
 
                        echo "On AC power: Setting action to \"stop\" because ENABLE_LAPTOP_MODE_ON_AC is not set." > $OUTPUT
497
 
                        ACTION=stop
498
 
                fi
499
 
        else
500
 
                if [ "$ENABLE_LAPTOP_MODE_ON_BATTERY" -ne 0 ] ; then
501
 
                        echo "On battery power: Setting action to \"start\" because ENABLE_LAPTOP_MODE_ON_BATTERY is set." > $OUTPUT
502
 
                        ACTION=start
503
 
                else
504
 
                        echo "On battery power: Setting action to \"stop\" because ENABLE_LAPTOP_MODE_ON_BATTERY is not set." > $OUTPUT
505
 
                        ACTION=stop
506
 
                fi
507
 
        fi
508
 
 
509
 
        if [ "$ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED" -ne 0 ] ; then
510
 
                if [ -f /proc/acpi/button/lid/*/state ] ; then
511
 
                        if ( cat /proc/acpi/button/lid/*/state | grep "closed" ) ; then
512
 
                                echo "Setting action to \"start\" because the lid is closed." > $OUTPUT
513
 
                                ACTION=start
514
 
                        fi
515
 
                else
516
 
                        echo "Warning: ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED is set, but there is no /proc/acpi/button/lid!"
517
 
                fi
 
544
                echo "/proc/pmu/info indicates presence of AC power." >> $OUTPUT
 
545
        fi
 
546
else
 
547
        echo "No ACPI, APM or PMU power management information found -- assuming AC power is present." >> $OUTPUT
 
548
fi
 
549
 
 
550
 
 
551
 
 
552
# Determine whether to activate or deactivate laptop mode.
 
553
ACTIVATE=0
 
554
 
 
555
if [ "$ON_AC" -eq 1 ] ; then
 
556
        if [ "$ENABLE_LAPTOP_MODE_ON_AC" -ne 0 ] ; then
 
557
                echo "On AC power: Activating, because ENABLE_LAPTOP_MODE_ON_AC is set." >> $OUTPUT
 
558
                ACTIVATE=1
 
559
        else
 
560
                echo "On AC power: Deactivating, because ENABLE_LAPTOP_MODE_ON_AC is not set." >> $OUTPUT
 
561
                ACTIVATE=0
 
562
        fi
 
563
else
 
564
        if [ "$ENABLE_LAPTOP_MODE_ON_BATTERY" -ne 0 ] ; then
 
565
                echo "On battery power: Activating, because ENABLE_LAPTOP_MODE_ON_BATTERY is set." >> $OUTPUT
 
566
                ACTIVATE=1
 
567
        else
 
568
                echo "On battery power: Deactivating, because ENABLE_LAPTOP_MODE_ON_BATTERY is not set." >> $OUTPUT
 
569
                ACTIVATE=0
 
570
        fi
 
571
fi
 
572
 
 
573
if [ "$ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED" -ne 0 ] ; then
 
574
        if [ -f /proc/acpi/button/lid/*/state ] ; then
 
575
                if ( cat /proc/acpi/button/lid/*/state | grep "closed" ) ; then
 
576
                        echo "Setting action to \"start\" because the lid is closed." >> $OUTPUT
 
577
                        ACTIVATE=1
 
578
                fi
 
579
        else
 
580
                echo "Warning: ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED is set, but there is no file"
 
581
                echo "/proc/acpi/button/lid/.../state!"
518
582
        fi
519
583
fi
520
584
 
521
585
# If the init script has not been run or has been run with the "stop"
522
586
# argument, then we should never start laptop mode.
523
587
if [ ! -f /var/run/laptop-mode-enabled ] ; then
524
 
        echo "Laptop mode disabled because /var/run/laptop-mode-enabled is missing." > $OUTPUT
525
 
        ACTION=stop
 
588
        echo "Laptop mode disabled because /var/run/laptop-mode-enabled is missing." >> $OUTPUT
526
589
        STATE=disabled
527
590
fi
528
591
 
529
 
if [ "$ACTION" = start -a -f /etc/default/laptop-mode ] ; then
 
592
if [ "$ACTIVATE" -eq 1 -a -f /etc/default/laptop-mode ] ; then
530
593
        . /etc/default/laptop-mode
531
594
        if ! ( echo "$ENABLE_LAPTOP_MODE" |grep y ) ; then
532
 
                echo "Not starting laptop mode because it is disabled in /etc/default/laptop-mode." > $OUTPUT
533
 
                ACTION=stop
 
595
                echo "Not starting laptop mode because it is disabled in /etc/default/laptop-mode." >> $OUTPUT
534
596
                STATE=disabled
535
597
        fi
536
598
fi
537
599
 
538
 
FULLSTATE=$ACTION,$ON_AC
 
600
if [ "$STATE" == "disabled" ] ; then
 
601
        ACTIVATE=0
 
602
fi
 
603
 
 
604
# Check whether we are allowed to activate the data-loss-sensitive stuff.
 
605
# If the battery charge is too low, we want to disable this, but not the
 
606
# other power-saving stuff.
 
607
 
 
608
if [ "$ACTIVATE" -eq 0 ] ; then
 
609
        ACTIVATE_WITH_POSSIBLE_DATA_LOSS=0
 
610
else
 
611
        ACTIVATE_WITH_POSSIBLE_DATA_LOSS=1
 
612
        if [ ! -d /proc/acpi ] ; then
 
613
                echo "Not ACPI -> no support for minimum battery charge checking." >> $OUTPUT
 
614
        elif [ "$ON_AC" -eq 0 ] ; then
 
615
                echo "On ACPI and not on AC -- checking minimum battery charge." >> $OUTPUT
 
616
                ENOUGH_CHARGE=0
 
617
                ENOUGH_CHARGE_TO_PREVENT_HIBERNATION=0
 
618
                for BATT in /proc/acpi/battery/* ; do
 
619
                        PREV_ENOUGH_CHARGE=$ENOUGH_CHARGE
 
620
                        PREV_ENOUGH_CHARGE_TO_PREVENT_HIBERNATION=$ENOUGH_CHARGE_TO_PREVENT_HIBERNATION
 
621
 
 
622
                        BATT_STATE=$BATT/state
 
623
                        BATT_INFO=$BATT/info
 
624
                        echo "Checking info and state for $BATT." >> $OUTPUT
 
625
 
 
626
                        # Only do if the battery is present
 
627
                        if ( cat $BATT_INFO | grep "present:.*yes" > /dev/null ) ; then
 
628
                                FOUND_AN_ENABLED_CHECK=0
 
629
                                FOUND_AN_ENABLED_HIBERNATION_CHECK=0
 
630
                                
 
631
                                # Get the remaining capacity.
 
632
                                REMAINING=`cat $BATT_STATE | grep "remaining capacity:" | sed  "s/.* \([0-9][0-9]* \).*/\1/" `
 
633
                                if [ -z "$REMAINING" ] ; then
 
634
                                        echo "Battery does not report remaining capacity. Perhaps it is not present?" >> $OUTPUT
 
635
                                        REMAINING=0
 
636
                                fi
 
637
                                echo "Remaining charge: $REMAINING" >> $OUTPUT
 
638
        
 
639
                                CAPACITY=`cat $BATT_INFO | grep "design capacity:" | sed  "s/.* \([0-9][0-9]* \).*/\1/" `
 
640
                                if [ -z "$CAPACITY" ] ; then
 
641
                                        CAPACITY=0
 
642
                                fi
 
643
                                echo "Design capacity: $CAPACITY" >> $OUTPUT
 
644
        
 
645
                                # Check the charge percentage
 
646
                                if [ "$MINIMUM_BATTERY_CHARGE_PERCENT" -ne 0 ] ; then
 
647
                                        FOUND_AN_ENABLED_CHECK=1
 
648
                                        if [ "$CAPACITY" -eq 0 ] ; then
 
649
                                                echo "WARNING: Battery does not report a design capacity. Minimum battery"
 
650
                                                echo "charge checking does not work without a design capacity."
 
651
                                        elif [ "$(($REMAINING * 100 / $CAPACITY))" -ge "$MINIMUM_BATTERY_CHARGE_PERCENT" ] ; then
 
652
                                                ENOUGH_CHARGE=1
 
653
                                        fi
 
654
                                fi
 
655
                                if [ "$AUTO_HIBERNATION_BATTERY_CHARGE_PERCENT" -ne 0 ] ; then
 
656
                                        FOUND_AN_ENABLED_HIBERNATION_CHECK=1
 
657
                                        if [ "$CAPACITY" -eq 0 ] ; then
 
658
                                                echo "WARNING: Battery does not report a design capacity. Auto hibernation"
 
659
                                                echo "does not work without a design capacity."
 
660
                                        elif [ "$(($REMAINING * 100 / $CAPACITY))" -ge "$AUTO_HIBERNATION_BATTERY_CHARGE_PERCENT" ] ; then
 
661
                                                ENOUGH_CHARGE_TO_PREVENT_HIBERNATION=1
 
662
                                        fi
 
663
                                fi
 
664
        
 
665
                                #
 
666
                                # Fallback: hard values.
 
667
                                #
 
668
                                # Determine the reporting unit.
 
669
                                IN_MAH=0
 
670
                                IN_MWH=0
 
671
                                if ( cat $BATT_INFO | grep mWh > /dev/null ) ; then
 
672
                                        IN_MWH=1
 
673
                                elif ( cat $BATT_INFO | grep mAh > /dev/null ) ; then
 
674
                                        IN_MAH=1
 
675
                                fi
 
676
                                
 
677
                                if [ "$IN_MAH" -ne 0 ] ; then
 
678
                                        if [ "$MINIMUM_BATTERY_CHARGE_MAH" -ne 0 ] ; then
 
679
                                                FOUND_AN_ENABLED_CHECK=1
 
680
                                                if [ "$REMAINING" -ge "$MINIMUM_BATTERY_CHARGE_MAH" ] ; then
 
681
                                                        ENOUGH_CHARGE=1
 
682
                                                fi
 
683
                                        fi
 
684
                                        if [ "$AUTO_HIBERNATION_BATTERY_CHARGE_MAH" -ne 0 ] ; then
 
685
                                                FOUND_AN_ENABLED_HIBERNATION_CHECK=1
 
686
                                                if [ "$REMAINING" -ge "$AUTO_HIBERNATION_BATTERY_CHARGE_MAH" ] ; then
 
687
                                                        ENOUGH_CHARGE_TO_PREVENT_HIBERNATION=1
 
688
                                                fi
 
689
                                        fi
 
690
                                elif [ "$IN_MWH" -ne 0 ] ; then
 
691
                                        if [ "$MINIMUM_BATTERY_CHARGE_MWH" -ne 0 ] ; then
 
692
                                                FOUND_AN_ENABLED_CHECK=1
 
693
                                                if [ "$REMAINING" -ge "$MINIMUM_BATTERY_CHARGE_MWH" ] ; then
 
694
                                                        ENOUGH_CHARGE=1
 
695
                                                fi
 
696
                                        fi
 
697
                                        if [ "$AUTO_HIBERNATION_BATTERY_CHARGE_MWH" -ne 0 ] ; then
 
698
                                                FOUND_AN_ENABLED_HIBERNATION_CHECK=1
 
699
                                                if [ "$REMAINING" -ge "$AUTO_HIBERNATION_BATTERY_CHARGE_MWH" ] ; then
 
700
                                                        ENOUGH_CHARGE_TO_PREVENT_HIBERNATION=1
 
701
                                                fi
 
702
                                        fi
 
703
                                else
 
704
                                        echo "Failed to determine battery charge. Battery charge units are not in"
 
705
                                        echo "mWh or mAh."
 
706
                                fi
 
707
                                
 
708
                                CAP_STATE=`cat "$BATT_STATE" | sed -r 's/^capacity state:\s*(.*)\s*$/\1/;t;d'`
 
709
                                if [ "$DISABLE_LAPTOP_MODE_ON_CRITICAL_BATTERY_LEVEL" -ne 0 ] ; then
 
710
                                        if [ "$CAP_STATE" == "critical" ] ; then                                
 
711
                                                # Restore the state we had before checking this battery, so that
 
712
                                                # this battery does not count as having enough charge.
 
713
                                                ENOUGH_CHARGE=$PREV_ENOUGH_CHARGE
 
714
                                        elif [ "$FOUND_AN_ENABLED_CHECK" -eq 0 ] ; then
 
715
                                                # This is the only check that is enabled. In that case a non-critical
 
716
                                                # battery level counts as "enough". (If we would count non-critical
 
717
                                                # battery levels as enough *always*, then the other settings would
 
718
                                                # have no effect; this is only a final fallback.)
 
719
                                                ENOUGH_CHARGE=1
 
720
                                        fi
 
721
                                fi
 
722
                                if [ "$AUTO_HIBERNATION_ON_CRITICAL_BATTERY_LEVEL" -ne 0 ] ; then
 
723
                                        if [ "$CAP_STATE" == "critical" ] ; then                                
 
724
                                                ENOUGH_CHARGE_TO_PREVENT_HIBERNATION=$PREV_ENOUGH_CHARGE_TO_PREVENT_HIBERNATION
 
725
                                        elif [ "$FOUND_AN_ENABLED_HIBERNATION_CHECK" -eq 0 ] ; then
 
726
                                                ENOUGH_CHARGE_TO_PREVENT_HIBERNATION=1
 
727
                                        fi
 
728
                                fi
 
729
                        else
 
730
                                echo "Battery is not present." >> $OUTPUT
 
731
                        fi
 
732
                done
 
733
                if [ "$ENABLE_AUTO_HIBERNATION" -ne 0 -a "$ENOUGH_CHARGE_TO_PREVENT_HIBERNATION" -eq 0 ] ; then
 
734
                        echo "None of the batteries have a charge above the auto-hibernation level." >> $OUTPUT
 
735
                        echo "Starting hibernation." >> $OUTPUT
 
736
                        $HIBERNATE_COMMAND
 
737
                        # Don't continue -- if things are configured correctly, then we
 
738
                        # will be called on resume.
 
739
                        exit 0                  
 
740
                fi
 
741
                if [ "$ENOUGH_CHARGE" -eq 0 ] ; then
 
742
                        echo "None of the batteries have a charge above the minimum level." >> $OUTPUT
 
743
                        echo "Deactivating data loss sensitive features." >> $OUTPUT
 
744
                        ACTIVATE_WITH_POSSIBLE_DATA_LOSS=0
 
745
                fi
 
746
        fi
 
747
fi
 
748
 
 
749
if [ "$INIT" -eq 0 ] ; then
 
750
        echo -n "Laptop mode "
 
751
fi
 
752
 
 
753
# WAS_ACTIVE is used later on. If there is no /var/run/laptop-mode-state, then
 
754
# we know that laptop mode wasn't active before.
539
755
WAS_ACTIVE=0
540
 
echo Checking if desired state is different from current state. > $OUTPUT
 
756
echo Checking if desired state is different from current state. >> $OUTPUT
541
757
if [ -f /var/run/laptop-mode-state ] ; then
542
 
        read PREVFULLSTATE < /var/run/laptop-mode-state
543
 
        if [ "$PREVFULLSTATE" == "start,0" -o "$PREVFULLSTATE" == "start,1" ] ; then
544
 
                WAS_ACTIVE=1
545
 
        fi
546
 
        if [ "$PREVFULLSTATE" == "$FULLSTATE" ] ; then
547
 
                echo -n "$STATE, "
548
 
                if [ "$WAS_ACTIVE" -eq 1 ] ; then
549
 
                        echo "active [unchanged]."
550
 
                else
551
 
                        echo "not active [unchanged]."
 
758
        read WAS_ACTIVE WAS_ON_AC WAS_ACTIVATE_WITH_POSSIBLE_DATA_LOSS < /var/run/laptop-mode-state
 
759
        if [ "$WAS_ON_AC" != "" ] ; then
 
760
                if [ "$WAS_ACTIVE" -eq "$ACTIVATE" -a "$WAS_ON_AC" -eq "$ON_AC" -a "$WAS_ACTIVATE_WITH_POSSIBLE_DATA_LOSS" -eq "$ACTIVATE_WITH_POSSIBLE_DATA_LOSS" -a "$FORCE" -eq 0 ] ; then
 
761
                        echo -n "$STATE, "
 
762
                        if [ "$WAS_ACTIVE" -eq 1 ] ; then
 
763
                                echo -n "active [unchanged]."
 
764
                                if [ "$ACTIVATE_WITH_POSSIBLE_DATA_LOSS" -eq 0 ] ; then
 
765
                                        echo -n ' (Data-loss sensitive features disabled.)'
 
766
                                fi
 
767
                                echo
 
768
                        else
 
769
                                echo "not active [unchanged]."
 
770
                        fi
 
771
                        exit 0
552
772
                fi
553
 
                exit 0
554
 
        fi
555
 
else
556
 
        echo "/var/run/laptop-mode-state does not exist, no previous state." > $OUTPUT
557
 
fi
558
 
echo $FULLSTATE > /var/run/laptop-mode-state
559
 
 
560
 
if [ "$INIT" -eq 0 ] ; then
561
 
        echo -n "Laptop mode "
562
 
fi
 
773
        else
 
774
                echo "/var/run/laptop-mode-state in pre-1.20 format, ignoring previous state." >> $OUTPUT
 
775
                WAS_ACTIVE=0
 
776
        fi
 
777
else
 
778
        echo "/var/run/laptop-mode-state does not exist, no previous state." >> $OUTPUT
 
779
fi
 
780
echo $ACTIVATE $ON_AC $ACTIVATE_WITH_POSSIBLE_DATA_LOSS > /var/run/laptop-mode-state
 
781
 
 
782
if [ "$ACTIVATE" -eq 1 ] ; then
 
783
        echo -n "$STATE, active."
 
784
        if [ "$ACTIVATE_WITH_POSSIBLE_DATA_LOSS" -eq 0 ] ; then
 
785
                echo -n ' (Data-loss sensitive features disabled.)'
 
786
        fi
 
787
        echo
 
788
else
 
789
        echo "$STATE, not active."
 
790
fi
 
791
 
563
792
 
564
793
 
565
794
# Adjust CPU speed first -- that way, response to a switch to AC power will be faster,
566
795
# while switching to battery will take place while we're taking less power on the whole.
567
796
 
 
797
#
 
798
# get_medium_value
 
799
#
 
800
#   Get the medium value from a list of numerical values.
 
801
#   $1 = file containing the list of values
 
802
#
 
803
get_medium_value() {
 
804
        cat "$1" | sed 's/ /\n/g' | sort -n | awk -v RS="" '{n=split($0,a); print a[int((n+1)/2)]}'
 
805
}
 
806
 
 
807
# Set kernel setting, showing an error if this fails.
 
808
# Parameter 1: sysctl/proc path
 
809
# Parameter 2: the value
 
810
set_sysctl() {
 
811
        echo "Executing: echo $2 > $1" >> $OUTPUT
 
812
        if ! echo "$2" > "$1" ; then
 
813
                echo "SETTING OF KERNEL PARAMETER FAILED: echo $2 \> $1"
 
814
        fi
 
815
}
 
816
 
568
817
if [ $CONTROL_CPU_FREQUENCY -eq 1 ] ; then
569
818
        if [ $ON_AC -eq 1 ] ; then
570
 
                if [ "$ACTION" = "start" ] ; then
 
819
                if [ "$ACTIVATE" -eq 1 ] ; then
571
820
                        CPU_MAXFREQ="$LM_AC_CPU_MAXFREQ"
572
821
                        CPU_MINFREQ="$LM_AC_CPU_MINFREQ"
573
822
                        CPU_GOVERNOR="$LM_AC_CPU_GOVERNOR"
592
841
                        if [ "$CPU_MINFREQ" = 'slowest' ]; then
593
842
                                THIS_CPU_MINFREQ=`cat $THISCPU/cpufreq/cpuinfo_min_freq`
594
843
                        fi
 
844
                        if [ "$CPU_MAXFREQ" = "medium" ] ; then
 
845
                                THIS_CPU_MAXFREQ=$(get_medium_value $THISCPU/cpufreq/scaling_available_frequencies)
 
846
                        fi
 
847
                        if [ "$CPU_MINFREQ" = "medium" ] ; then
 
848
                                THIS_CPU_MINFREQ=$(get_medium_value $THISCPU/cpufreq/scaling_available_frequencies)
 
849
                        fi
595
850
                        if [ "$CPU_MAXFREQ" = "fastest" ] ; then
596
851
                                THIS_CPU_MAXFREQ=`cat $THISCPU/cpufreq/cpuinfo_max_freq`
597
852
                        fi
598
853
                        if [ "$CPU_MINFREQ" = "fastest" ] ; then
599
854
                                THIS_CPU_MINFREQ=`cat $THISCPU/cpufreq/cpuinfo_max_freq`
600
855
                        fi
601
 
                        echo "Setting CPU maximum frequency for cpu $THISCPU to $THIS_CPU_MAXFREQ." > $OUTPUT
602
 
                        echo $THIS_CPU_MAXFREQ > $THISCPU/cpufreq/scaling_max_freq
603
 
                        echo "Setting CPU minimum frequency for cpu $THISCPU to $THIS_CPU_MINFREQ." > $OUTPUT
604
 
                        echo $THIS_CPU_MINFREQ > $THISCPU/cpufreq/scaling_min_freq
605
 
                        echo "Setting CPU frequency governor for cpu $THISCPU to $THIS_CPU_GOVERNOR." > $OUTPUT
606
 
                        echo $THIS_CPU_GOVERNOR > $THISCPU/cpufreq/scaling_governor
 
856
                        echo "Setting CPU maximum frequency for cpu $THISCPU to $THIS_CPU_MAXFREQ." >> $OUTPUT
 
857
                        set_sysctl $THISCPU/cpufreq/scaling_max_freq $THIS_CPU_MAXFREQ
 
858
                        echo "Setting CPU minimum frequency for cpu $THISCPU to $THIS_CPU_MINFREQ." >> $OUTPUT
 
859
                        set_sysctl $THISCPU/cpufreq/scaling_min_freq $THIS_CPU_MINFREQ
 
860
                        echo "Setting CPU frequency governor for cpu $THISCPU to $THIS_CPU_GOVERNOR." >> $OUTPUT
 
861
                        set_sysctl $THISCPU/cpufreq/scaling_governor $THIS_CPU_GOVERNOR
607
862
                fi
608
863
        done
609
864
fi
610
865
 
611
 
 
612
866
if [ $CONTROL_CPU_THROTTLING -eq 1 ] ; then
613
867
        if [ $ON_AC -eq 1 ] ; then
614
 
                if [ "$ACTION" = "start" ] ; then
 
868
                if [ "$ACTIVATE" -eq 1 ] ; then
615
869
                        CPU_THROTTLING="$LM_AC_CPU_THROTTLING"
616
870
                else
617
871
                        CPU_THROTTLING="$NOLM_AC_CPU_THROTTLING"
633
887
                        else
634
888
                                THIS_CPU_THROTTLING="$CPU_THROTTLING"
635
889
                        fi
636
 
                        echo "Setting throttling level for cpu $THISCPU to $THIS_CPU_THROTTLING." > $OUTPUT
637
 
                        echo $THIS_CPU_THROTTLING > $THISCPU/throttling
 
890
                        echo "Setting throttling level for cpu $THISCPU to $THIS_CPU_THROTTLING." >> $OUTPUT
 
891
                        set_sysctl $THISCPU/throttling $THIS_CPU_THROTTLING
638
892
                fi
639
893
        done
640
894
fi
647
901
           
648
902
fi
649
903
 
650
 
case "$ACTION" in
651
 
        start)
652
 
                # Take MAX_LOST_WORK_SECONDS from LM_BATT_MAX_LOST_WORK_SECONDS or LM_AC_MAX_LOST_WORK_SECONDS_WITH_LM, depending on power state.
653
 
                MAX_LOST_WORK_SECONDS=$LM_BATT_MAX_LOST_WORK_SECONDS
654
 
                if [ $ON_AC -eq 1 -a "$ACTION" = "start" ] ; then
655
 
                        MAX_LOST_WORK_SECONDS=$LM_AC_MAX_LOST_WORK_SECONDS
656
 
                fi
657
 
 
658
 
                AGE=$((100*$MAX_LOST_WORK_SECONDS))
659
 
                XFS_AGE=$(($XFS_HZ*$MAX_LOST_WORK_SECONDS))
660
 
                echo -n "$STATE, active"
661
 
 
662
 
                if [ -d /proc/sys/vm/pagebuf ] ; then
663
 
                        # (For 2.4 and early 2.6.)
664
 
                        # This only needs to be set, not reset -- it is only used when
665
 
                        # laptop mode is enabled.
666
 
                        echo "Adjusting XFS kernel parameters for 2.4 and early 2.6 kernels." > $OUTPUT
667
 
                        echo $XFS_AGE > /proc/sys/vm/pagebuf/lm_flush_age
668
 
                        echo $XFS_AGE > /proc/sys/fs/xfs/lm_sync_interval
669
 
                elif [ -f /proc/sys/fs/xfs/lm_age_buffer ] ; then
670
 
                        # (A couple of early 2.6 laptop mode patches had these.)
671
 
                        # This only needs to be set, not reset -- it is only used when
672
 
                        # laptop mode is enabled.
673
 
                        echo "Adjusting XFS kernel parameters for early patched 2.6 kernels." > $OUTPUT
674
 
                        echo $XFS_AGE > /proc/sys/fs/xfs/lm_age_buffer
675
 
                        echo $XFS_AGE > /proc/sys/fs/xfs/lm_sync_interval
676
 
                elif [ -f /proc/sys/fs/xfs/age_buffer ] ; then
677
 
                        # (2.6.6)
678
 
                        # But not for these -- they are also used in normal
679
 
                        # operation.
680
 
                        echo "Adjusting XFS kernel parameters for 2.6.6 kernel." > $OUTPUT
681
 
                        echo $XFS_AGE > /proc/sys/fs/xfs/age_buffer
682
 
                        echo $XFS_AGE > /proc/sys/fs/xfs/sync_interval
683
 
                elif [ -f /proc/sys/fs/xfs/age_buffer_centisecs ] ; then
684
 
                        # (2.6.7 upwards)
685
 
                        # And not for these either. These are in centisecs,
686
 
                        # not USER_HZ, so we have to use $AGE, not $XFS_AGE.
687
 
                        echo "Adjusting XFS kernel parameters for >2.6.7 kernel." > $OUTPUT
688
 
                        echo $AGE > /proc/sys/fs/xfs/age_buffer_centisecs
689
 
                        echo $AGE > /proc/sys/fs/xfs/xfssyncd_centisecs
690
 
                        echo 3000 > /proc/sys/fs/xfs/xfsbufd_centisecs
691
 
                fi
692
 
 
693
 
                case "$KLEVEL" in
694
 
                        "2.4")
695
 
                                echo "Adjusting 2.4 kernel parameters to enable laptop mode." > $OUTPUT
696
 
                                echo 1                                  > /proc/sys/vm/laptop_mode
697
 
                                echo "30 500 0 0 $AGE $AGE 60 20 0"     > /proc/sys/vm/bdflush
698
 
                                ;;
699
 
                        "2.6")
700
 
                                echo "Adjusting 2.6 kernel parameters to enable laptop mode." > $OUTPUT
701
 
                                echo "$LM_SECONDS_BEFORE_SYNC"          > /proc/sys/vm/laptop_mode
702
 
                                echo "$AGE"                             > /proc/sys/vm/dirty_writeback_centisecs
703
 
                                echo "$AGE"                             > /proc/sys/vm/dirty_expire_centisecs
704
 
                                echo "$LM_DIRTY_RATIO"                  > /proc/sys/vm/dirty_ratio
705
 
                                echo "$LM_DIRTY_BACKGROUND_RATIO"       > /proc/sys/vm/dirty_background_ratio
706
 
                                ;;
707
 
                esac
708
 
                if [ $CONTROL_MOUNT_OPTIONS -eq 1 ]; then
709
 
                        echo "Remounting filesystems." > $OUTPUT
710
 
                        cat /etc/mtab | while read DEV MP FST OPTS DUMP PASS ; do
711
 
                                DO=0
712
 
                                if ( echo " $PARTITIONS " | grep " $DEV " > /dev/null ) ; then
713
 
                                        DO=1
714
 
                                        echo "$DEV found in PARTITIONS." > $OUTPUT
715
 
                                else
716
 
                                        echo "$DEV not found in PARTITIONS." > $OUTPUT
717
 
                                fi
718
 
                                if ( echo " $PARTITIONS " | grep " $MP " > /dev/null ) ; then
719
 
                                        DO=1
720
 
                                        echo "$MP found in PARTITIONS." > $OUTPUT
721
 
                                else
722
 
                                        echo "$MP not found in PARTITIONS." > $OUTPUT
723
 
                                fi
724
 
                                if ( echo " $PARTITIONS " | grep " auto " > /dev/null ) ; then
725
 
                                        echo "Checking $DEV against HD because PARTITIONS contains \"auto\"." > $OUTPUT
726
 
                                        for THISHD in $HD ; do
727
 
                                                echo "   Considering $THISHD." > $OUTPUT
728
 
                                                if ( echo " $DEV" | grep "$THISHD" > /dev/null ) ; then
729
 
                                                        DO=1
730
 
                                                        echo "   $DEV contains $THISHD, which is in HD, so we will remount it." > $OUTPUT
731
 
                                                fi
732
 
                                        done
733
 
                                fi
734
 
                                if [ "$DO" -ne 0 ] ; then
735
 
                                        echo "Original options: $OPTS" > $OUTPUT
736
 
                                        if [ "$WAS_ACTIVE" -eq 0 ] ; then
737
 
                                                # Coming from inactive state: save last known mount options for the device.
738
 
                                                echo Updating /var/run/laptop-mode-nolm-mountopts.  > $OUTPUT
739
 
                                                if [ -f /var/run/laptop-mode-nolm-mountopts ] ; then 
740
 
                                                        sed -i "s|^$DEV .*$||" /var/run/laptop-mode-nolm-mountopts
741
 
                                                fi
742
 
                                                echo $DEV $OPTS >> /var/run/laptop-mode-nolm-mountopts
743
 
                                        else
744
 
                                                echo Not updating /var/run/laptop-mode-nolm-mountopts because laptop mode was already active. > $OUTPUT
745
 
                                        fi
746
 
                                        if [ "$FST" = 'unknown' ]; then
747
 
                                                echo "Deducing fstype for $MP." > $OUTPUT
748
 
                                                FST=$(deduce_fstype $MP)
749
 
                                                echo "Deduced fstype for $MP as $FST." > $OUTPUT
750
 
                                        fi
751
 
                                        # Strip stuff like ext3,ext2 into just ext3.
752
 
                                        echo Reducing file system type.  > $OUTPUT
753
 
                                        FST=`echo $FST | sed s/,.*//`
 
904
 
 
905
 
 
906
# Adjust kernel settings and mount options (but only if data loss 
 
907
# sensitive features are active)
 
908
if [ "$ACTIVATE_WITH_POSSIBLE_DATA_LOSS" -eq 1 ] ; then
 
909
        # Take MAX_LOST_WORK_SECONDS from LM_BATT_MAX_LOST_WORK_SECONDS or LM_AC_MAX_LOST_WORK_SECONDS_WITH_LM, depending on power state.
 
910
        MAX_LOST_WORK_SECONDS=$LM_BATT_MAX_LOST_WORK_SECONDS
 
911
        if [ $ON_AC -eq 1 ] ; then
 
912
                MAX_LOST_WORK_SECONDS=$LM_AC_MAX_LOST_WORK_SECONDS
 
913
        fi
 
914
 
 
915
        AGE=$((100*$MAX_LOST_WORK_SECONDS))
 
916
        XFS_AGE=$(($XFS_HZ*$MAX_LOST_WORK_SECONDS))
 
917
 
 
918
        if [ -d /proc/sys/vm/pagebuf ] ; then
 
919
                # (For 2.4 and early 2.6.)
 
920
                # This only needs to be set, not reset -- it is only used when
 
921
                # laptop mode is enabled.
 
922
                echo "Adjusting XFS kernel parameters for 2.4 and early 2.6 kernels." >> $OUTPUT
 
923
                set_sysctl /proc/sys/vm/pagebuf/lm_flush_age  $XFS_AGE
 
924
                set_sysctl /proc/sys/fs/xfs/lm_sync_interval  $XFS_AGE
 
925
        elif [ -f /proc/sys/fs/xfs/lm_age_buffer ] ; then
 
926
                # (A couple of early 2.6 laptop mode patches had these.)
 
927
                # This only needs to be set, not reset -- it is only used when
 
928
                # laptop mode is enabled.
 
929
                echo "Adjusting XFS kernel parameters for early patched 2.6 kernels." >> $OUTPUT
 
930
                set_sysctl /proc/sys/fs/xfs/lm_age_buffer    $XFS_AGE
 
931
                set_sysctl /proc/sys/fs/xfs/lm_sync_interval $XFS_AGE
 
932
        elif [ -f /proc/sys/fs/xfs/age_buffer ] ; then
 
933
                # (2.6.6)
 
934
                # But not for these -- they are also used in normal
 
935
                # operation.
 
936
                echo "Adjusting XFS kernel parameters for 2.6.6 kernel." >> $OUTPUT
 
937
                set_sysctl /proc/sys/fs/xfs/age_buffer       $XFS_AGE 
 
938
                set_sysctl /proc/sys/fs/xfs/sync_interval    $XFS_AGE
 
939
        elif [ -f /proc/sys/fs/xfs/age_buffer_centisecs ] ; then
 
940
                # (2.6.7 upwards)
 
941
                # And not for these either. These are in centisecs,
 
942
                # not USER_HZ, so we have to use $AGE, not $XFS_AGE.
 
943
                echo "Adjusting XFS kernel parameters for >2.6.7 kernel." >> $OUTPUT
 
944
                set_sysctl /proc/sys/fs/xfs/age_buffer_centisecs  $AGE
 
945
                set_sysctl /proc/sys/fs/xfs/xfssyncd_centisecs    $AGE
 
946
                set_sysctl /proc/sys/fs/xfs/xfsbufd_centisecs     3000
 
947
        fi
 
948
 
 
949
        case "$KLEVEL" in
 
950
                "2.4")
 
951
                        echo "Adjusting 2.4 kernel parameters to enable laptop mode." >> $OUTPUT
 
952
                        set_sysctl /proc/sys/vm/laptop_mode   1
 
953
                        set_sysctl /proc/sys/vm/bdflush       "30 500 0 0 $AGE $AGE 60 20 0"
 
954
                        ;;
 
955
                "2.6")
 
956
                        echo "Adjusting 2.6 kernel parameters to enable laptop mode." >> $OUTPUT
 
957
                        set_sysctl /proc/sys/vm/laptop_mode               "$LM_SECONDS_BEFORE_SYNC"
 
958
                        set_sysctl /proc/sys/vm/dirty_writeback_centisecs "$AGE"
 
959
                        set_sysctl /proc/sys/vm/dirty_expire_centisecs    "$AGE"
 
960
                        set_sysctl /proc/sys/vm/dirty_ratio               "$LM_DIRTY_RATIO"
 
961
                        set_sysctl /proc/sys/vm/dirty_background_ratio    "$LM_DIRTY_BACKGROUND_RATIO"
 
962
                        ;;
 
963
        esac
 
964
        if [ $CONTROL_MOUNT_OPTIONS -eq 1 ]; then
 
965
                echo "Remounting filesystems." >> $OUTPUT
 
966
                cat /etc/mtab | while read DEV MP FST OPTS DUMP PASS ; do
 
967
                        DO=0
 
968
                        if ( echo " $PARTITIONS " | grep " $DEV " > /dev/null ) ; then
 
969
                                DO=1
 
970
                                echo "$DEV found in PARTITIONS." >> $OUTPUT
 
971
                        else
 
972
                                echo "$DEV not found in PARTITIONS." >> $OUTPUT
 
973
                        fi
 
974
                        if ( echo " $PARTITIONS " | grep " $MP " > /dev/null ) ; then
 
975
                                DO=1
 
976
                                echo "$MP found in PARTITIONS." >> $OUTPUT
 
977
                        else
 
978
                                echo "$MP not found in PARTITIONS." >> $OUTPUT
 
979
                        fi
 
980
                        if ( echo " $PARTITIONS " | grep " auto " > /dev/null ) ; then
 
981
                                echo "Checking $DEV against HD because PARTITIONS contains \"auto\"." >> $OUTPUT
 
982
                                for THISHD in $HD ; do
 
983
                                        echo "   Considering $THISHD." >> $OUTPUT
 
984
                                        if ( echo " $DEV" | grep "$THISHD" > /dev/null ) ; then
 
985
                                                DO=1
 
986
                                                echo "   $DEV contains $THISHD, which is in HD, so we will remount it." >> $OUTPUT
 
987
                                        fi
 
988
                                done
 
989
                        fi
 
990
                        if [ "$DO" -ne 0 ] ; then
 
991
                                echo "Original options: $OPTS" >> $OUTPUT
 
992
                                if [ "$WAS_ACTIVE" -eq 0 ] ; then
 
993
                                        # Coming from inactive state: save last known mount options for the device.
 
994
                                        echo Updating /var/run/laptop-mode-nolm-mountopts.  >> $OUTPUT
 
995
                                        if [ -f /var/run/laptop-mode-nolm-mountopts ] ; then 
 
996
                                                sed -i "s|^$DEV .*$||" /var/run/laptop-mode-nolm-mountopts
 
997
                                        fi
 
998
                                        echo $DEV $OPTS >> /var/run/laptop-mode-nolm-mountopts
 
999
                                else
 
1000
                                        echo Not updating /var/run/laptop-mode-nolm-mountopts because laptop mode was already active. >> $OUTPUT
 
1001
                                fi
 
1002
                                if [ "$FST" = 'unknown' ]; then
 
1003
                                        echo "Deducing fstype for $MP." >> $OUTPUT
 
1004
                                        FST=$(deduce_fstype $MP)
 
1005
                                        echo "Deduced fstype for $MP as $FST." >> $OUTPUT
 
1006
                                fi
 
1007
                                # Strip stuff like ext3,ext2 into just ext3.
 
1008
                                echo Reducing file system type.  >> $OUTPUT
 
1009
                                FST=`echo $FST | sed s/,.*//`
 
1010
                                case "$FST" in
 
1011
                                        "ext3"|"reiserfs")
 
1012
                                                echo Removing commit mount option from original options.  >> $OUTPUT
 
1013
                                                PARSEDOPTS="$(remove_numeric_mount_option commit "$OPTS")"
 
1014
                                                echo "Executing: mount $DEV -t $FST $MP -o remount,$PARSEDOPTS,commit=$MAX_LOST_WORK_SECONDS$NOATIME_OPT" >> $OUTPUT
 
1015
                                                if (! mount $DEV -t $FST $MP -o remount,$PARSEDOPTS,commit=$MAX_LOST_WORK_SECONDS$NOATIME_OPT) ; then
 
1016
                                                        if [ "$FST" == "ext3" -a "$MP" == "/" ] ; then
 
1017
                                                                echo "BIG FAT WARNING: Your root filesystem mounted as ext3 seems to lack support for"
 
1018
                                                                echo "the commit mount option. This usually means that your root filesystem is"
 
1019
                                                                echo "mounted as ext2 because there is no ext3 support in the kernel at boot time,"
 
1020
                                                                echo "usually because you compiled ext3 as a module and don't load it in an initrd."
 
1021
                                                                echo "Note that on recent 2.6 kernels, /proc/mounts shows the correct fs type for"
 
1022
                                                                echo "the device /dev/root. You can check your actual root filesystem mount type"
 
1023
                                                                echo "there. To fix the problem, either make ext3 available at boot time by compiling"
 
1024
                                                                echo "it statically into the kernel, or configure the correct filesystem type in"
 
1025
                                                                echo "/etc/fstab."
 
1026
                                                        fi
 
1027
                                                fi
 
1028
                                                ;;
 
1029
                                        *)
 
1030
                                                echo "Executing: mount $DEV -t $FST $MP -o remount,$OPTS$NOATIME_OPT" >> $OUTPUT
 
1031
                                                mount $DEV -t $FST $MP -o remount,$OPTS$NOATIME_OPT
 
1032
                                                ;;
 
1033
                                esac
 
1034
                                if [ -b $DEV -a "$CONTROL_READAHEAD" -ne 0 ] ; then
 
1035
                                        echo "Executing: blockdev --setra $(($LM_READAHEAD * 2)) $DEV" >> $OUTPUT
 
1036
                                        blockdev --setra $(($LM_READAHEAD * 2)) $DEV >> $OUTPUT 2>&1
 
1037
                                fi
 
1038
                        fi
 
1039
                done
 
1040
        fi
 
1041
else
 
1042
        # DEACTIVATE w.r.t. kernel options and mount point settings
 
1043
        U_AGE=$((100*$DEF_UPDATE))
 
1044
        B_AGE=$((100*$DEF_MAX_AGE))
 
1045
        set_sysctl /proc/sys/vm/laptop_mode 0
 
1046
        if [ -f /proc/sys/fs/xfs/age_buffer -a ! -f /proc/sys/fs/xfs/lm_age_buffer ] ; then
 
1047
                # These need to be restored, if there are no lm_*.
 
1048
                echo "Restoring default XFS settings (pre-centisecs version)." >> $OUTPUT
 
1049
                set_sysctl /proc/sys/fs/xfs/age_buffer    $(($XFS_HZ*$DEF_XFS_AGE_BUFFER))
 
1050
                set_sysctl /proc/sys/fs/xfs/sync_interval $(($XFS_HZ*$DEF_XFS_SYNC_INTERVAL))
 
1051
        elif [ -f /proc/sys/fs/xfs/age_buffer_centisecs ] ; then
 
1052
                # These need to be restored as well.
 
1053
                echo "Restoring default XFS settings." >> $OUTPUT
 
1054
                set_sysctl /proc/sys/fs/xfs/age_buffer_centisecs  $((100*$DEF_XFS_AGE_BUFFER))
 
1055
                set_sysctl /proc/sys/fs/xfs/xfssyncd_centisecs    $((100*$DEF_XFS_SYNC_INTERVAL))
 
1056
                set_sysctl /proc/sys/fs/xfs/xfsbufd_centisecs     $((100*$DEF_XFS_BUFD_INTERVAL))
 
1057
        fi
 
1058
        case "$KLEVEL" in
 
1059
                "2.4")
 
1060
                        echo "Adjusting 2.4 kernel parameters to disable laptop mode." >> $OUTPUT
 
1061
                        set_sysctl /proc/sys/vm/bdflush "30 500 0 0 $U_AGE $B_AGE 60 20 0"
 
1062
                        ;;
 
1063
                "2.6")
 
1064
                        echo "Adjusting 2.6 kernel parameters to disable laptop mode." >> $OUTPUT
 
1065
                        set_sysctl /proc/sys/vm/dirty_writeback_centisecs   "$U_AGE"
 
1066
                        set_sysctl /proc/sys/vm/dirty_expire_centisecs      "$B_AGE"
 
1067
                        set_sysctl /proc/sys/vm/dirty_ratio                 "$NOLM_DIRTY_RATIO"
 
1068
                        set_sysctl /proc/sys/vm/dirty_background_ratio      "$NOLM_DIRTY_BACKGROUND_RATIO"
 
1069
                        ;;
 
1070
        esac
 
1071
        if [ $CONTROL_MOUNT_OPTIONS -eq 1 ] ; then
 
1072
                echo "Remounting filesystems." >> $OUTPUT
 
1073
                cat /etc/mtab | while read DEV MP FST OPTS DUMP PASS ; do
 
1074
                        DO=0
 
1075
                        if ( echo " $PARTITIONS " | grep " $DEV " > /dev/null ) ; then
 
1076
                                DO=1
 
1077
                                echo "$DEV found in PARTITIONS." >> $OUTPUT
 
1078
                        else
 
1079
                                echo "$DEV not found in PARTITIONS." >> $OUTPUT
 
1080
                        fi
 
1081
                        if ( echo " $PARTITIONS " | grep " $MP " > /dev/null ) ; then
 
1082
                                DO=1
 
1083
                                echo "$MP found in PARTITIONS." >> $OUTPUT
 
1084
                        else
 
1085
                                echo "$MP not found in PARTITIONS." >> $OUTPUT
 
1086
                        fi
 
1087
                        if ( echo " $PARTITIONS " | grep " auto " > /dev/null ) ; then
 
1088
                                echo "Checking $DEV against HD because PARTITIONS contains \"auto\"." >> $OUTPUT
 
1089
                                for THISHD in $HD ; do
 
1090
                                        echo "   Considering $THISHD." >> $OUTPUT
 
1091
                                        if ( echo " $DEV" | grep "$THISHD" > /dev/null ) ; then
 
1092
                                                DO=1
 
1093
                                                echo "   $DEV contains $THISHD, which is in HD, so we will remount it." >> $OUTPUT
 
1094
                                        fi
 
1095
                                done
 
1096
                        fi
 
1097
                        if [ "$DO" -ne 0 ] ; then
 
1098
                                # Reset commit and atime options to defaults.
 
1099
                                echo "Original options: $OPTS" >> $OUTPUT
 
1100
                                if [ "$FST" = 'unknown' ]; then
 
1101
                                        echo "Deducing fstype for $MP." >> $OUTPUT
 
1102
                                        FST=$(deduce_fstype $MP)
 
1103
                                        echo "Deduced fstype for $MP as $FST." >> $OUTPUT
 
1104
                                fi
 
1105
                                
 
1106
                                # Strip stuff like ext3,ext2 into just ext3.
 
1107
                                echo Reducing file system type.  >> $OUTPUT
 
1108
                                FST=`echo $FST | sed s/,.*//`
 
1109
                                
 
1110
                                # Retrieve original non-laptop mode mount options and restore them.
 
1111
                                # If the file that stores them doesn't exist, then laptop mode
 
1112
                                # has never been started.
 
1113
                                if [ "$WAS_ACTIVE" -ne 0 -a -f /var/run/laptop-mode-nolm-mountopts ] ; then                                             
 
1114
                                        SAVED_OPTS=`grep "^$DEV " /var/run/laptop-mode-nolm-mountopts`
 
1115
                                
754
1116
                                        case "$FST" in
755
 
                                                "ext3"|"reiserfs")
756
 
                                                        echo Removing commit mount option from original options.  > $OUTPUT
757
 
                                                        PARSEDOPTS="$(remove_numeric_mount_option commit "$OPTS")"
758
 
                                                        echo "Executing: mount $DEV -t $FST $MP -o remount,$PARSEDOPTS,commit=$MAX_LOST_WORK_SECONDS$NOATIME_OPT" > $OUTPUT
759
 
                                                        if (! mount $DEV -t $FST $MP -o remount,$PARSEDOPTS,commit=$MAX_LOST_WORK_SECONDS$NOATIME_OPT) ; then
760
 
                                                                if [ "$FST" == "ext3" -a "$MP" == "/" ] ; then
761
 
                                                                        echo "BIG FAT WARNING: Your root filesystem mounted as ext3 seems to lack support for the commit mount option."
762
 
                                                                        echo "This usually means that your root filesystem is mounted as ext2 because there is no ext3 support in the"
763
 
                                                                        echo "kernel at boot time, usually because you compiled ext3 as a module and don't load it in an initrd."
764
 
                                                                fi
765
 
                                                        fi
 
1117
                                                "ext3"|"reiserfs")                                                              
 
1118
                                                        PARSEDOPTS="$(replace_numeric_mount_option commit commit=0 $SAVED_OPTS $OPTS)"
 
1119
                                                        PARSEDOPTS="$(replace_yesno_mount_option atime atime $SAVED_OPTS $PARSEDOPTS)"
 
1120
                                                        echo Executing: mount $DEV -t $FST $MP -o remount,$PARSEDOPTS >> $OUTPUT
 
1121
                                                        mount $DEV -t $FST $MP -o remount,$PARSEDOPTS
766
1122
                                                        ;;
767
 
                                                "xfs")
768
 
                                                        echo "Executing: mount $DEV -t $FST $MP -o remount,$OPTS$NOATIME_OPT" > $OUTPUT
769
 
                                                        mount $DEV -t $FST $MP -o remount,$OPTS$NOATIME_OPT
 
1123
                                                *)
 
1124
                                                        PARSEDOPTS="$(replace_yesno_mount_option atime atime $SAVED_OPTS $OPTS)"
 
1125
                                                        echo Executing: mount $DEV -t $FST $MP -o remount,$PARSEDOPTS >> $OUTPUT
 
1126
                                                        mount $DEV -t $FST $MP -o remount,$PARSEDOPTS
770
1127
                                                        ;;
771
1128
                                        esac
772
 
                                        if [ -b $DEV -a "$CONTROL_READAHEAD" -ne 0 ] ; then
773
 
                                                echo "Executing: blockdev --setra $(($LM_READAHEAD * 2)) $DEV" > $OUTPUT
774
 
                                                blockdev --setra $(($LM_READAHEAD * 2)) $DEV > $OUTPUT 2>&1
775
 
                                        fi
776
 
                                fi
777
 
                        done
778
 
                fi
779
 
                echo "."
780
 
                ;;
781
 
        stop)
782
 
                U_AGE=$((100*$DEF_UPDATE))
783
 
                B_AGE=$((100*$DEF_MAX_AGE))
784
 
                echo -n "$STATE, not active"
785
 
                echo 0 > /proc/sys/vm/laptop_mode
786
 
                if [ -f /proc/sys/fs/xfs/age_buffer -a ! -f /proc/sys/fs/xfs/lm_age_buffer ] ; then
787
 
                        # These need to be restored, if there are no lm_*.
788
 
                        echo "Restoring default XFS settings (pre-centisecs version)." > $OUTPUT
789
 
                        echo $(($XFS_HZ*$DEF_XFS_AGE_BUFFER))           > /proc/sys/fs/xfs/age_buffer
790
 
                        echo $(($XFS_HZ*$DEF_XFS_SYNC_INTERVAL))        > /proc/sys/fs/xfs/sync_interval
791
 
                elif [ -f /proc/sys/fs/xfs/age_buffer_centisecs ] ; then
792
 
                        # These need to be restored as well.
793
 
                        echo "Restoring default XFS settings." > $OUTPUT
794
 
                        echo $((100*$DEF_XFS_AGE_BUFFER))       > /proc/sys/fs/xfs/age_buffer_centisecs
795
 
                        echo $((100*$DEF_XFS_SYNC_INTERVAL))    > /proc/sys/fs/xfs/xfssyncd_centisecs
796
 
                        echo $((100*$DEF_XFS_BUFD_INTERVAL))    > /proc/sys/fs/xfs/xfsbufd_centisecs
797
 
                fi
798
 
                case "$KLEVEL" in
799
 
                        "2.4")
800
 
                                echo "Adjusting 2.4 kernel parameters to disable laptop mode." > $OUTPUT
801
 
                                echo "30 500 0 0 $U_AGE $B_AGE 60 20 0" > /proc/sys/vm/bdflush
802
 
                                ;;
803
 
                        "2.6")
804
 
                                echo "Adjusting 2.6 kernel parameters to disable laptop mode." > $OUTPUT
805
 
                                echo "$U_AGE"                           > /proc/sys/vm/dirty_writeback_centisecs
806
 
                                echo "$B_AGE"                           > /proc/sys/vm/dirty_expire_centisecs
807
 
                                echo "$NOLM_DIRTY_RATIO"                > /proc/sys/vm/dirty_ratio
808
 
                                echo "$NOLM_DIRTY_BACKGROUND_RATIO"     > /proc/sys/vm/dirty_background_ratio
809
 
                                ;;
810
 
                esac
811
 
                if [ $CONTROL_MOUNT_OPTIONS -eq 1 ] ; then
812
 
                        echo "Remounting filesystems." > $OUTPUT
813
 
                        cat /etc/mtab | while read DEV MP FST OPTS DUMP PASS ; do
814
 
                                DO=0
815
 
                                if ( echo " $PARTITIONS " | grep " $DEV " > /dev/null ) ; then
816
 
                                        DO=1
817
 
                                        echo "$DEV found in PARTITIONS." > $OUTPUT
818
 
                                else
819
 
                                        echo "$DEV not found in PARTITIONS." > $OUTPUT
820
 
                                fi
821
 
                                if ( echo " $PARTITIONS " | grep " $MP " > /dev/null ) ; then
822
 
                                        DO=1
823
 
                                        echo "$MP found in PARTITIONS." > $OUTPUT
824
 
                                else
825
 
                                        echo "$MP not found in PARTITIONS." > $OUTPUT
826
 
                                fi
827
 
                                if ( echo " $PARTITIONS " | grep " auto " > /dev/null ) ; then
828
 
                                        echo "Checking $DEV against HD because PARTITIONS contains \"auto\"." > $OUTPUT
829
 
                                        for THISHD in $HD ; do
830
 
                                                echo "   Considering $THISHD." > $OUTPUT
831
 
                                                if ( echo " $DEV" | grep "$THISHD" > /dev/null ) ; then
832
 
                                                        DO=1
833
 
                                                        echo "   $DEV contains $THISHD, which is in HD, so we will remount it." > $OUTPUT
834
 
                                                fi
835
 
                                        done
836
 
                                fi
837
 
                                if [ "$DO" -ne 0 ] ; then
838
 
                                        # Reset commit and atime options to defaults.
839
 
                                        echo "Original options: $OPTS" > $OUTPUT
840
 
                                        if [ "$FST" = 'unknown' ]; then
841
 
                                                echo "Deducing fstype for $MP." > $OUTPUT
842
 
                                                FST=$(deduce_fstype $MP)
843
 
                                                echo "Deduced fstype for $MP as $FST." > $OUTPUT
844
 
                                        fi
845
 
                                        
846
 
                                        # Strip stuff like ext3,ext2 into just ext3.
847
 
                                        echo Reducing file system type.  > $OUTPUT
848
 
                                        FST=`echo $FST | sed s/,.*//`
849
 
                                        
850
 
                                        # Retrieve original non-laptop mode mount options and restore them.
851
 
                                        # If the file that stores them doesn't exist, then laptop mode
852
 
                                        # has never been started.
853
 
                                        if [ "$WAS_ACTIVE" -ne 0 -a -f /var/run/laptop-mode-nolm-mountopts ] ; then                                             
854
 
                                                SAVED_OPTS=`grep "^$DEV " /var/run/laptop-mode-nolm-mountopts`
855
 
                                        
856
 
                                                case "$FST" in
857
 
                                                        "ext3"|"reiserfs")                                                              
858
 
                                                                PARSEDOPTS="$(replace_numeric_mount_option commit commit=0 $SAVED_OPTS $OPTS)"
859
 
                                                                PARSEDOPTS="$(replace_yesno_mount_option atime atime $SAVED_OPTS $PARSEDOPTS)"
860
 
                                                                echo Executing: mount $DEV -t $FST $MP -o remount,$PARSEDOPTS > $OUTPUT
861
 
                                                                mount $DEV -t $FST $MP -o remount,$PARSEDOPTS
862
 
                                                                ;;
863
 
                                                        "xfs")
864
 
                                                                PARSEDOPTS="$(replace_yesno_mount_option atime atime $SAVED_OPTS $OPTS)"
865
 
                                                                echo Executing: mount $DEV -t $FST $MP -o remount,$PARSEDOPTS > $OUTPUT
866
 
                                                                mount $DEV -t $FST $MP -o remount,$PARSEDOPTS
867
 
                                                                ;;
868
 
                                                esac
869
 
                                        else
870
 
                                                echo "No saved mount options, so apparently we never remounted this filesystem during this session." > $OUTPUT
871
 
                                                echo "Not remounting." > $OUTPUT
872
 
                                        fi
873
 
                                        if [ -b $DEV -a "$CONTROL_READAHEAD" -ne 0 ] ; then
874
 
                                                echo "Executing: blockdev --setra $(($NOLM_READAHEAD * 2)) $DEV" > $OUTPUT
875
 
                                                blockdev --setra $(($NOLM_READAHEAD * 2)) $DEV > /dev/null 2>&1
876
 
                                        fi
877
 
                                fi
878
 
                        done
879
 
                fi
880
 
                echo "."
881
 
                ;;
882
 
        *)
883
 
                echo "Usage: $0 {start|stop|auto|status}" 2>&1
884
 
                exit 1
885
 
                ;;
886
 
 
887
 
esac
 
1129
                                else
 
1130
                                        echo "No saved mount options, so apparently we never remounted this filesystem during this session." >> $OUTPUT
 
1131
                                        echo "Not remounting." >> $OUTPUT
 
1132
                                fi
 
1133
                                if [ -b $DEV -a "$CONTROL_READAHEAD" -ne 0 ] ; then
 
1134
                                        echo "Executing: blockdev --setra $(($NOLM_READAHEAD * 2)) $DEV" >> $OUTPUT
 
1135
                                        blockdev --setra $(($NOLM_READAHEAD * 2)) $DEV > /dev/null 2>&1
 
1136
                                fi
 
1137
                        fi
 
1138
                done
 
1139
        fi
 
1140
fi
 
1141
 
 
1142
 
888
1143
 
889
1144
# Adjust hard drive powermanagement
890
1145
 
 
1146
# Function for drive capability check. This prevents ugly errors in
 
1147
# the kernel output about unsupported commands.
 
1148
#
 
1149
# $1 = drive name
 
1150
# $2 = capability (SDPARM/HDPARM or IDLE_TIMEOUT/POWERMGMT/WRITECACHE)
 
1151
is_capable() {
 
1152
        local dev=${1#/dev/}
 
1153
        local MEDIA=
 
1154
        local BUS=
 
1155
 
 
1156
        HAVE_UDEVINFO=0
 
1157
        if [ -x "$(which udevinfo 2> /dev/null)" ] ; then
 
1158
                UDEVVERSION=$(udevinfo -V | awk '{ print $3; }')
 
1159
                if [ "$UDEVVERSION" -gt 70 ] ; then
 
1160
                        HAVE_UDEVINFO=1
 
1161
                else
 
1162
                        echo "udevinfo present but version not > 070, not using udev" >> $OUTPUT
 
1163
                fi
 
1164
        fi
 
1165
        
 
1166
        # If we are running udev, this is the most portable way
 
1167
        # It assumes more or less recent udev (> 070)
 
1168
        if [ $HAVE_UDEVINFO -ne 0 ] ; then
 
1169
                echo -n "Querying $1 media type using udevinfo: " >> $OUTPUT
 
1170
                eval "$(udevinfo -q env -n $1 2> $OUTPUT | egrep '(ID_TYPE=|ID_BUS=)' >> $OUTPUT 2>&1)"
 
1171
                if [ -n "$ID_TYPE" -a -n "$ID_BUS" ] ; then
 
1172
                        echo "type '$ID_TYPE on bus '$ID_BUS' detected" >> $OUTPUT
 
1173
                        MEDIA=$ID_TYPE
 
1174
                        BUS=$ID_BUS
 
1175
                else
 
1176
                        echo "failed - udev not active?" >> $OUTPUT
 
1177
                fi
 
1178
        fi
 
1179
 
 
1180
        if [ -z "$MEDIA" ] ; then
 
1181
                echo -n "Querying $1 media type using device name: " >> $OUTPUT
 
1182
                case $dev in
 
1183
                        hd*)    # IDE device
 
1184
                                if [ -r /proc/ide/$dev/media ]; then
 
1185
                                        MEDIA="$(cat /proc/ide/$dev/media)"
 
1186
                                        BUS=ata
 
1187
                                        if [ "$MEDIA" = cdrom ] ; then
 
1188
                                                MEDIA=cd
 
1189
                                        fi
 
1190
                                fi
 
1191
                        ;;
 
1192
                        sd*)    # SCSI disk
 
1193
                                # No need to check, sd is always SCSI disk
 
1194
                                MEDIA=disk
 
1195
                                BUS=scsi
 
1196
                        ;;
 
1197
                        sr* | scd* )
 
1198
                                # No need to check, sr or scd is always SCSI CD-ROM
 
1199
                                MEDIA=cd
 
1200
                                BUS=scsi
 
1201
                        ;;
 
1202
 
 
1203
                esac
 
1204
                if [ -n "$MEDIA" ] ; then
 
1205
                        echo "type '$MEDIA' on bus '$BUS' detected" >> $OUTPUT
 
1206
                else
 
1207
                        echo "failed - unknown name" >> $OUTPUT
 
1208
                fi
 
1209
        fi
 
1210
 
 
1211
        if [ -z "$MEDIA" ] ; then
 
1212
                if [ -x "$(which hdparm 2> /dev/null)" ]; then
 
1213
                        echo -n "Querying $1 type using hdparm: " >> $OUTPUT
 
1214
                        if hdparm -I $1 2> $OUTPUT | grep -q CD-ROM >> $OUTPUT 2>&1 ; then
 
1215
                                MEDIA=cd
 
1216
                        else
 
1217
                                MEDIA=disk
 
1218
                        fi
 
1219
                        BUS=ata # or acts like it anyway, because hdparm supports it.
 
1220
                        echo "type '$MEDIA' on bus '$BUS' detected" >> $OUTPUT
 
1221
                fi
 
1222
        fi
 
1223
 
 
1224
        # Sanity check
 
1225
        if [ -z "$MEDIA" -o -z "$BUS" ] ; then
 
1226
                echo "Querying $1 type - unknown type or bus, disabling hdparm/sdparm" >> $OUTPUT
 
1227
                return 1
 
1228
        fi
 
1229
 
 
1230
        if [ "$BUS" == "scsi" -a "$ASSUME_SCSI_IS_SATA" -ne 0 ] ;then
 
1231
                # Treat scsi disks as SATA devices. Unfortunately they are hard
 
1232
                # to recognize -- if anybody has a drive and cares to find out
 
1233
                # how to recognize them, please enlighten me!
 
1234
                BUS=ata
 
1235
        fi
 
1236
 
 
1237
        # Now check what capabilities we support for the
 
1238
        # various media and bus types.
 
1239
        case "$MEDIA:$BUS:$2" in
 
1240
                # Although CD-ROM drives usually support
 
1241
                # idle timeout settings, they don't usually
 
1242
                # support very low values, and we don't want
 
1243
                # to mess with that. We simply ignore anything
 
1244
                # that is a CD player.
 
1245
                cd:*:* ) return 1;;
 
1246
 
 
1247
                # ATA drives support the "hdparm" command but
 
1248
                # not normally the "sdparm" command.
 
1249
                *:ata:HDPARM ) return 0 ;;
 
1250
                *:ata:SDPARM ) return 1 ;;
 
1251
                
 
1252
                # SCSI drives support the "sdparm" command, but
 
1253
                # not normally the "hdparm" command.
 
1254
                *:scsi:SDPARM ) return 0 ;;
 
1255
                *:scsi:HDPARM ) return 1 ;;
 
1256
 
 
1257
                # On ATA disks everything is supported.
 
1258
                disk:ata:* ) return 0 ;;
 
1259
 
 
1260
                # For sdparm we only know how to set the idle
 
1261
                # timeout, nothing else at the moment.
 
1262
                *:scsi:IDLE_TIMEOUT ) return 0 ;;
 
1263
 
 
1264
                # No other capabilities are supported.
 
1265
                * ) return 1 ;;
 
1266
        esac
 
1267
}
 
1268
 
891
1269
if [ $CONTROL_HD_POWERMGMT -eq 1 ] ; then
892
 
        if [ ! -f `which hdparm` ] ; then
893
 
                echo Warning: CONTROL_HD_POWERMGMT is enabled but hdparm is not installed.
 
1270
        if [ $ON_AC -eq 1 ] ; then
 
1271
                if [ "$ACTIVATE" -eq 1 ] ; then
 
1272
                        HD_POWERMGMT=$LM_AC_HD_POWERMGMT
 
1273
                else
 
1274
                        HD_POWERMGMT=$NOLM_AC_HD_POWERMGMT
 
1275
                fi
894
1276
        else
895
 
                if [ $ON_AC -eq 1 ] ; then
896
 
                        if [ "$ACTION" = "start" ] ; then
897
 
                                HD_POWERMGMT=$LM_AC_HD_POWERMGMT
898
 
                        else
899
 
                                HD_POWERMGMT=$NOLM_AC_HD_POWERMGMT
900
 
                        fi
901
 
                else
902
 
                        HD_POWERMGMT=$BATT_HD_POWERMGMT
903
 
                fi
904
 
 
905
 
                echo "Setting powermanagement on drives to $HD_POWERMGMT." > $OUTPUT
906
 
                for THISHD in $HD ; do
907
 
                        if ( ! hdparm -I $THISHD 2>/dev/null |grep CD-ROM > $OUTPUT ) ; then
908
 
                                echo "Executing: hdparm -B $HD_POWERMGMT $THISHD" > $OUTPUT
909
 
                                hdparm -B $HD_POWERMGMT $THISHD > $OUTPUT 2>&1
910
 
                        else
911
 
                                echo "Skipping $THISHD: is a CD-ROM according to hdparm -I." > $OUTPUT
912
 
                        fi
913
 
                done
 
1277
                HD_POWERMGMT=$BATT_HD_POWERMGMT
914
1278
        fi
 
1279
 
 
1280
        echo "Setting powermanagement on drives to $HD_POWERMGMT." >> $OUTPUT
 
1281
        for THISHD in $HD ; do
 
1282
                if is_capable $THISHD POWERMGMT ; then
 
1283
                        if is_capable $THISHD HDPARM ; then
 
1284
                                if [ ! -e `which hdparm 2> /dev/null` ] ; then
 
1285
                                        echo "ERROR: hdparm not installed."
 
1286
                                else
 
1287
                                        echo "Executing: hdparm -B $HD_POWERMGMT $THISHD" >> $OUTPUT
 
1288
                                        hdparm -B $HD_POWERMGMT $THISHD >> $OUTPUT 2>&1
 
1289
                                fi
 
1290
                        else
 
1291
                                echo "Skipping $THISHD: powermgmt only possible with hdparm but drive does not" >> $OUTPUT
 
1292
                                echo "support hdparm." >> $OUTPUT
 
1293
                        fi
 
1294
                else
 
1295
                        echo "Skipping $THISHD: powermanagement control not supported." >> $OUTPUT
 
1296
                fi
 
1297
        done
915
1298
fi
916
1299
 
917
1300
if [ $CONTROL_HD_IDLE_TIMEOUT -eq 1 ] ; then
918
 
        if [ ! -f `which hdparm` ] ; then
919
 
                echo Warning: CONTROL_HD_IDLE_TIMEOUT is enabled but hdparm is not installed.
 
1301
        # Spindown timeouts may only be set when data-loss sensitive
 
1302
        # features are active.
 
1303
        if [ "$ACTIVATE_WITH_POSSIBLE_DATA_LOSS" -eq 1 ] ; then
 
1304
                if [ $ON_AC -eq 1 ] ; then
 
1305
                        HD_IDLE_TIMEOUT=$LM_AC_HD_IDLE_TIMEOUT
 
1306
                        HD_IDLE_TIMEOUT_SECONDS=$LM_AC_HD_IDLE_TIMEOUT_SECONDS
 
1307
                else
 
1308
                        HD_IDLE_TIMEOUT=$LM_BATT_HD_IDLE_TIMEOUT
 
1309
                        HD_IDLE_TIMEOUT_SECONDS=$LM_BATT_HD_IDLE_TIMEOUT_SECONDS
 
1310
                fi
920
1311
        else
921
 
                if [ "$ACTION" = "start" ] ; then
922
 
                        if [ $ON_AC -eq 1 ] ; then
923
 
                                HD_IDLE_TIMEOUT=$LM_AC_HD_IDLE_TIMEOUT
924
 
                        else
925
 
                                HD_IDLE_TIMEOUT=$LM_BATT_HD_IDLE_TIMEOUT
926
 
                        fi
927
 
                else
928
 
                        HD_IDLE_TIMEOUT=$NOLM_HD_IDLE_TIMEOUT
929
 
                fi
930
 
        
931
 
                echo "Setting spindown timeout on drives to $HD_IDLE_TIMEOUT." > $OUTPUT
932
 
                for THISHD in $HD ; do
933
 
                        if ( ! hdparm -I $THISHD 2> /dev/null |grep CD-ROM  > $OUTPUT ) ; then
934
 
                                echo "Executing: hdparm -S $HD_IDLE_TIMEOUT $THISHD" > $OUTPUT
935
 
                                hdparm -S $HD_IDLE_TIMEOUT $THISHD > $OUTPUT 2>&1
936
 
                        else
937
 
                                echo "Skipping $THISHD: is a CD-ROM according to hdparm -I." > $OUTPUT
938
 
                        fi
939
 
                done
 
1312
                HD_IDLE_TIMEOUT=$NOLM_HD_IDLE_TIMEOUT
 
1313
                HD_IDLE_TIMEOUT_SECONDS=$NOLM_HD_IDLE_TIMEOUT_SECONDS
940
1314
        fi
 
1315
        echo "Setting spindown timeout on drives to $HD_IDLE_TIMEOUT_SECONDS seconds." >> $OUTPUT
 
1316
        echo "(hdparm configuration value = $HD_IDLE_TIMEOUT.)" >> $OUTPUT
 
1317
        for THISHD in $HD ; do
 
1318
                if is_capable $THISHD IDLE_TIMEOUT ; then
 
1319
                        if is_capable $THISHD HDPARM ; then
 
1320
                                if [ ! -e `which hdparm 2> /dev/null` ] ; then
 
1321
                                        echo "ERROR: hdparm not installed."
 
1322
                                else
 
1323
                                        echo "Executing: hdparm -S $HD_IDLE_TIMEOUT $THISHD" >> $OUTPUT
 
1324
                                        hdparm -S $HD_IDLE_TIMEOUT $THISHD >> $OUTPUT 2>&1
 
1325
                                fi
 
1326
                        elif is_capable $THISHD SDPARM ; then
 
1327
                                if [ ! -e `which sdparm 2> /dev/null` ] ; then
 
1328
                                        echo "ERROR: sdparm not installed."
 
1329
                                else
 
1330
                                        HD_IDLE_TIMEOUT_DECISECONDS=$(($HD_IDLE_TIMEOUT_SECONDS*10))
 
1331
                                        echo "Executing: sdparm -q -s SCT=$HD_IDLE_TIMEOUT_DECISECONDS $THISHD" >> $OUTPUT
 
1332
                                        sdparm -q -s SCT=$HD_IDLE_TIMEOUT_DECISECONDS $THISHD >> $OUTPUT 2>&1
 
1333
                                fi
 
1334
                        else
 
1335
                                echo "Skipping $THISHD: drive supports neither hdparm nor sdparm." >> $OUTPUT
 
1336
                        fi
 
1337
                else
 
1338
                        echo "Skipping $THISHD: idle timeout control not supported." >> $OUTPUT
 
1339
                fi
 
1340
        done
941
1341
fi
942
1342
 
943
1343
if [ $CONTROL_HD_WRITECACHE -eq 1 ] ; then
944
 
        if [ ! -f `which hdparm` ] ; then
945
 
                echo Warning: CONTROL_HD_WRITECACHE is enabled but hdparm is not installed.
946
 
        else
947
 
                if [ "$ACTION" = "start" ] ; then
 
1344
        # The writecache may only be enabled when data-loss sensitive
 
1345
        # features are active.
 
1346
 
 
1347
        if [ "$ACTIVATE" -eq 1 ] ; then
 
1348
                if [ "$ACTIVATE_WITH_POSSIBLE_DATA_LOSS" -eq 0 ] ; then
 
1349
                        HD_WRITECACHE=0
 
1350
                else
948
1351
                        HD_WRITECACHE=$LM_HD_WRITECACHE
 
1352
                fi
 
1353
        else
 
1354
                if [ $ON_AC -eq 1 ] ; then
 
1355
                        HD_WRITECACHE=$NOLM_AC_HD_WRITECACHE
949
1356
                else
950
 
                        if [ $ON_AC -eq 1 ] ; then
951
 
                                HD_WRITECACHE=$NOLM_AC_HD_WRITECACHE
952
 
                        else
953
 
                                HD_WRITECACHE=$NOLM_BATT_HD_WRITECACHE
954
 
                        fi
 
1357
                        HD_WRITECACHE=$NOLM_BATT_HD_WRITECACHE
955
1358
                fi
956
 
 
957
 
                echo "Setting write cache on drives to $HD_WRITECACHE." > $OUTPUT
958
 
                for THISHD in $HD ; do
959
 
                        if ( ! hdparm -I $THISHD 2> /dev/null |grep CD-ROM > $OUTPUT ) ; then
960
 
                                echo "Executing: hdparm -W $HD_WRITECACHE $THISHD" > $OUTPUT
961
 
                                hdparm -W $HD_WRITECACHE $THISHD > $OUTPUT 2>&1
962
 
                        else
963
 
                                echo "Skipping $THISHD: is a CD-ROM according to hdparm -I." > $OUTPUT
964
 
                        fi
965
 
                done
966
1359
        fi
 
1360
        echo "Setting write cache on drives to $HD_WRITECACHE." >> $OUTPUT
 
1361
        for THISHD in $HD ; do
 
1362
                if is_capable $THISHD WRITECACHE ; then
 
1363
                        if is_capable $THISHD HDPARM ; then
 
1364
                                if [ ! -e `which hdparm 2> /dev/null` ] ; then
 
1365
                                        echo "ERROR: hdparm not installed."
 
1366
                                else
 
1367
                                        echo "Executing: hdparm -W $HD_WRITECACHE $THISHD" >> $OUTPUT
 
1368
                                        hdparm -W $HD_WRITECACHE $THISHD >> $OUTPUT 2>&1
 
1369
                                fi
 
1370
                        else
 
1371
                                echo "Skipping $THISHD: writecache only possible with hdparm but drive does not" >> $OUTPUT
 
1372
                                echo "support hdparm." >> $OUTPUT
 
1373
                        fi
 
1374
                else
 
1375
                        echo "Skipping $THISHD: writecache control not supported." >> $OUTPUT
 
1376
                fi
 
1377
        done
967
1378
fi
968
1379
 
969
1380
if [ $CONTROL_SYSLOG_CONF -eq 1 ] ; then
970
 
        echo "Adjusting syslog configuration." > $OUTPUT
971
 
        if [ $ON_AC -eq 1 ] ; then
972
 
                if [ "$ACTION" = "start" ] ; then
973
 
                        echo "Setting syslog config to $LM_AC_SYSLOG_CONF." > $OUTPUT
974
 
                        ln -fs $LM_AC_SYSLOG_CONF $SYSLOG_CONF
975
 
                elif [ "$ACTION" = "stop" ] ; then
976
 
                        echo "Setting syslog config to $NOLM_AC_SYSLOG_CONF." > $OUTPUT
977
 
                        ln -fs $NOLM_AC_SYSLOG_CONF $SYSLOG_CONF
978
 
                fi
979
 
        else
980
 
                echo "Setting syslog config to $BATT_SYSLOG_CONF." > $OUTPUT
981
 
                ln -fs $BATT_SYSLOG_CONF $SYSLOG_CONF
 
1381
        echo "Adjusting syslog configuration." >> $OUTPUT
 
1382
        if [ "`readlink -f $SYSLOG_CONF`" != "$SYSLOG_CONF" ] ; then
 
1383
                echo "$SYSLOG_CONF is a symlink." >> $OUTPUT
 
1384
                if [ ! -f "$SYSLOG_CONF.no-lm" ] ; then
 
1385
                        echo "But there is no $SYSLOG_CONF.no-lm. This must have been done by an earlier" >> $OUTPUT
 
1386
                        echo "version of laptop-mode-tools." >> $OUTPUT
 
1387
                        echo "Creating it now from $NOLM_AC_SYSLOG_CONF."
 
1388
                        cp "$NOLM_AC_SYSLOG_CONF" "$SYSLOG_CONF.no-lm"
 
1389
                fi
 
1390
        else
 
1391
                echo "$SYSLOG_CONF is not a symlink." >> $OUTPUT
 
1392
                if [ "$STATE" == "enabled" ] ; then
 
1393
                        echo "Saving it to $SYSLOG_CONF.no-lm." >> $OUTPUT
 
1394
                        cp --backup=numbered "$SYSLOG_CONF" "$SYSLOG_CONF.no-lm"
 
1395
                fi
 
1396
        fi
 
1397
 
 
1398
        if [ "$STATE" != "enabled" ] ; then
 
1399
                echo "Laptop mode is not enabled. Restoring $SYSLOG_CONF." >> $OUTPUT
 
1400
                if [ -f "$SYSLOG_CONF.no-lm" ] ; then
 
1401
                        mv "$SYSLOG_CONF.no-lm" "$SYSLOG_CONF"
 
1402
                elif [ "`readlink -f $SYSLOG_CONF`" != "$SYSLOG_CONF" ] ; then
 
1403
                        echo "ERROR: $SYSLOG_CONF is a symlink but $SYSLOG_CONF.no-lm is not present."
 
1404
                fi
 
1405
        elif [ $ON_AC -eq 1 ] ; then
 
1406
                if [ "$ACTIVATE" -eq 1 ] ; then
 
1407
                        echo "Setting syslog config to $LM_AC_SYSLOG_CONF." >> $OUTPUT
 
1408
                        ln -fs "$LM_AC_SYSLOG_CONF" "$SYSLOG_CONF"
 
1409
                else
 
1410
                        echo "Setting syslog config to $NOLM_AC_SYSLOG_CONF." >> $OUTPUT
 
1411
                        ln -fs "$NOLM_AC_SYSLOG_CONF" "$SYSLOG_CONF"
 
1412
                fi
 
1413
        else
 
1414
                echo "Setting syslog config to $BATT_SYSLOG_CONF." >> $OUTPUT
 
1415
                ln -fs "$BATT_SYSLOG_CONF" "$SYSLOG_CONF"
982
1416
        fi
983
1417
        # Notify syslogd of configuration change.
984
1418
        if [ "$SYSLOG_CONF_SIGNAL_PROGRAM" != "" ] ; then
985
 
                echo "Sending SIGHUP to all $SYSLOG_CONF_SIGNAL_PROGRAM processes." > $OUTPUT
 
1419
                echo "Sending SIGHUP to all $SYSLOG_CONF_SIGNAL_PROGRAM processes." >> $OUTPUT
986
1420
                killall -q -HUP $SYSLOG_CONF_SIGNAL_PROGRAM
987
1421
        fi
988
1422
fi
989
1423
 
990
 
# Setting xwindow screen standby suspend off timing
 
1424
# Setting X screen standby/suspend/powerdown timing
991
1425
if [ $CONTROL_DPMS_STANDBY -eq 1 ] ; then
992
1426
        if [ $ON_AC -eq 1 ]; then
993
 
                if [ "$ACTION" = "start" ]; then
 
1427
                if [ "$ACTIVATE" -eq 1 ]; then
994
1428
                        STANDBY="$LM_AC_DPMS_STANDBY"
995
1429
                        SUSPEND=$((STANDBY+30))
996
1430
                        OFF=$((STANDBY+60))
1014
1448
                        # We set screen only for users using xwindow screen. 
1015
1449
                        # Jerome's note: Yes, I know, there is race condition, 
1016
1450
                        # but have no idea for some simple solution.
1017
 
                        for USERSCREEN in `who |grep \:[0-9].*\: |awk '{print $1";"$2}'` ; do
1018
 
                                USER="`echo $USERSCREEN |cut -d ';' -f 1`"
1019
 
                                SCREEN="`echo $USERSCREEN |cut -d ';' -f 2`"
1020
 
                                echo "Set xwindow DPMI for user $USER: $XSET -display $SCREEN dpms $STANDBY $SUSPEND $OFF." > $OUTPUT
1021
 
                                su $USER -c "$XSET -display $SCREEN dpms $STANDBY $SUSPEND $OFF 2>&1" >$OUTPUT
 
1451
                        w -h | while read -r user tty screen REPLY; do
 
1452
                                case "$screen" in *:*)
 
1453
                                        echo "Set X11 DPMI for user $user: $XSET -display $screen dpms $STANDBY $SUSPEND $OFF." >> $OUTPUT
 
1454
                                        su $user -c "$XSET -display $screen dpms $STANDBY $SUSPEND $OFF 2>&1" >>$OUTPUT
 
1455
                                esac
1022
1456
                        done
1023
1457
                        HAVEXSET="1"
1024
1458
                fi
1025
1459
        done
1026
1460
        if [ -z "$HAVEXSET" ]; then
1027
 
                echo "Can't find \"xset\" command, skipping..." > $OUTPUT
1028
 
        fi
1029
 
else
1030
 
        echo "CONTROL_DPMS_STANDBY is disabled, skipping..." > $OUTPUT
1031
 
fi
 
1461
                echo "Can't find \"xset\" command, skipping..." >> $OUTPUT
 
1462
        fi
 
1463
else
 
1464
        echo "CONTROL_DPMS_STANDBY is disabled, skipping..." >> $OUTPUT
 
1465
fi
 
1466
 
 
1467
# Set terminal blanking/powerdown timeouts
 
1468
if [ $CONTROL_TERMINAL -ne 0 ] ; then
 
1469
        if [ $ON_AC -eq 1 ]; then
 
1470
                if [ "$ACTIVATE" -eq 1 ]; then
 
1471
                        BLANK_MINUTES="$LM_AC_BLANK_MINUTES"
 
1472
                        POWERDOWN_MINUTES="$LM_AC_POWERDOWN_MINUTES"
 
1473
                else
 
1474
                        BLANK_MINUTES="$NOLM_AC_BLANK_MINUTES"
 
1475
                        POWERDOWN_MINUTES="$NOLM_AC_POWERDOWN_MINUTES"
 
1476
                fi
 
1477
        else
 
1478
                BLANK_MINUTES="$BATT_BLANK_MINUTES"
 
1479
                POWERDOWN_MINUTES="$BATT_POWERDOWN_MINUTES"
 
1480
        fi
 
1481
        setterm -blank "$BLANK_MINUTES"
 
1482
        setterm -powerdown "$POWERDOWN_MINUTES"
 
1483
else
 
1484
        echo "CONTROL_TERMINAL is disabled, skipping..." >> $OUTPUT
 
1485
fi
 
1486
 
 
1487
 
1032
1488
 
1033
1489
# Start/stop programs 
1034
 
if [ $CONTROL_START_STOP -eq 1 ]; then
 
1490
if [ $CONTROL_START_STOP -eq 1 -a "$STATE" == "enabled" ]; then
1035
1491
        # Empty undo file first. We write the actions we take
1036
1492
        # into this file, so that we can undo them at the
1037
1493
        # next state change. Note: we actually
1041
1497
                
1042
1498
           
1043
1499
        if [ $ON_AC -eq 1 ] ; then
1044
 
                if [ "$ACTION" == "start" ] ; then              
 
1500
                if [ "$ACTIVATE" -eq 1 ] ; then         
1045
1501
                        START_STOP_DIR_PREFIX=/etc/laptop-mode/lm-ac
1046
1502
                else
1047
1503
                        START_STOP_DIR_PREFIX=/etc/laptop-mode/nolm-ac