blob: 87761ea34e0519a1b98fa4e15aa56c4583b85a8b [file] [log] [blame]
#! /bin/sh
#
# Laptop Mode Tools installer script
# ----------------------------------
#
# You can configure this installer script by setting the following environment
# variables:
#
# DESTDIR = destination root directory. Leave empty for /.
# INIT_D = destination init.d directory. Set to "none" to disable the
# installation of init scripts.
# MAN_D = directory in which the manual pages are to be installed. This should
# be the base directory, e.g. /usr/local/man.
# INSTALL = command line for install program. By default, this is set to
# "install -o root -g root".
#
# These settings enable / disable support for power management hardware and
# daemons:
#
# ACPI=force / disabled / auto
# PMU=force / disabled / auto
# APM=force / disabled / auto
#
# For each of these settings, "force" means: install the files even if the
# system doesn't support the daemon. "disabled" means: never install the files,
# and "auto" means: autodetect if this power management method is supported.
#
[ -z "$MAN_D" ] && MAN_D="/usr/man"
if [ -z "$ACPI" ] ; then
ACPI=auto
[ -n "$DESTDIR" ] && ACPI=force
fi
if [ -z "$APM" ] ; then
APM=auto
[ -n "$DESTDIR" ] && APM=force
fi
if [ -z "$PMU" ] ; then
PMU=auto
[ -n "$DESTDIR" ] && PMU=force
fi
if [ -z "$INIT_D" ] ; then
# Try non-link directories first, then try links. This helps if one of
# the locations is linked to another, which is the case on some distros.
if [ -d "$DESTDIR/etc/rc.d/init.d" -a ! -L "$DESTDIR/etc/rc.d/init.d" ] ; then
INIT_D="$DESTDIR/etc/rc.d/init.d"
elif [ -d "$DESTDIR/etc/rc.d" -a ! -L "$DESTDIR/etc/rc.d" -a ! -d "$DESTDIR/etc/rc.d/init.d" ] ; then
INIT_D="$DESTDIR/etc/rc.d"
elif [ -d "$DESTDIR/etc/init.d" -a ! -L "$DESTDIR/etc/init.d" ] ; then
INIT_D="$DESTDIR/etc/init.d"
elif [ -d "$DESTDIR/etc/rc.d/init.d" ] ; then
INIT_D="$DESTDIR/etc/rc.d/init.d"
elif [ -d "$DESTDIR/etc/rc.d" ] ; then
INIT_D="$DESTDIR/etc/rc.d"
elif [ -d "$DESTDIR/etc/init.d" ] ; then
INIT_D="$DESTDIR/etc/init.d"
elif [ -n "$DESTDIR" ] ; then
# We're going the package manager route -- make a guess, they
# will adapt it if needed.
INIT_D="$DESTDIR/etc/init.d"
else
echo "Cannot determine location of init scripts. Please modify install.sh."
exit 31
fi
fi
if [ "$INIT_D" != "none" ] ; then
if ( which invoke-rc.d > /dev/null ) ; then
# Debian uses invoke-rc.d
RCPROG=invoke-rc.d
INITSCRIPT=laptop-mode
elif ( which service > /dev/null ) ; then
# RedHat uses service
RCPROG=service
INITSCRIPT=laptop-mode
else
# Any other -- we start it ourselves.
RCPROG=
INITSCRIPT="$INIT_D/laptop-mode"
fi
fi
if [ "`whoami`" != "root" -a -z "$DESTDIR" ] ; then
echo "You need to be root to install laptop mode tools."
exit 10
fi
if [ ! -f /proc/sys/vm/laptop_mode ] ; then
echo "Warning: the kernel you are running does not support laptop mode."
fi
if [ "$INIT_D" != "none" -a -z "$DESTDIR" ] ; then
echo 'Stopping existing laptop mode service (if any).'
$RCPROG $INITSCRIPT stop
fi
if [ -z "$INSTALL" ]; then
INSTALL="install -o root -g root"
fi
$INSTALL -d -m 755 "$DESTDIR/etc/laptop-mode"
$INSTALL -d -m 755 "$DESTDIR/etc/laptop-mode/batt-start"
$INSTALL -d -m 755 "$DESTDIR/etc/laptop-mode/batt-stop"
$INSTALL -d -m 755 "$DESTDIR/etc/laptop-mode/lm-ac-start"
$INSTALL -d -m 755 "$DESTDIR/etc/laptop-mode/lm-ac-stop"
$INSTALL -d -m 755 "$DESTDIR/etc/laptop-mode/nolm-ac-start"
$INSTALL -d -m 755 "$DESTDIR/etc/laptop-mode/nolm-ac-stop"
$INSTALL -d -m 755 "$DESTDIR/usr/share/laptop-mode-tools/modules"
$INSTALL -d -m 755 "$DESTDIR/usr/share/laptop-mode-tools/module-helpers"
$INSTALL -d -m 755 "$DESTDIR/etc/laptop-mode/conf.d"
$INSTALL -d -m 755 "$DESTDIR/etc/laptop-mode/modules"
$INSTALL -d -m 755 "$DESTDIR/usr/sbin"
$INSTALL -d -m 755 "$DESTDIR/$MAN_D/man8"
ALREADY_EXISTED=0
if [ -f "$DESTDIR/etc/laptop-mode/laptop-mode.conf" ] ; then
echo "Not reinstalling configuration file: $DESTDIR/etc/laptop-mode/laptop-mode.conf exists."
ALREADY_EXISTED=1
elif ( ! $INSTALL -m 644 etc/laptop-mode/laptop-mode.conf "$DESTDIR/etc/laptop-mode" ) ; then
echo "$0: Failed to install configuration file in $DESTDIR/etc/laptop-mode/laptop-mode.conf. Installation failed."
exit 12
fi
for CONF in etc/laptop-mode/conf.d/* ; do
if [ -f "$DESTDIR/$CONF" ] ; then
echo "Not reinstalling configuration file $DESTDIR/$CONF."
elif ( ! $INSTALL -m 644 "$CONF" "$DESTDIR/$CONF" ) ; then
echo "$0: Failed to install configuration file $DESTDIR/$CONF. Installation failed."
exit 12
fi
done
if [ -f "$DESTDIR/etc/laptop-mode/lm-profiler.conf" ] ; then
echo "Configuration file $DESTDIR/etc/laptop-mode/lm-profiler.conf already exists."
elif ( ! $INSTALL -m 644 etc/laptop-mode/lm-profiler.conf "$DESTDIR/etc/laptop-mode" ) ; then
echo "$0: Failed to install configuration file in $DESTDIR/etc/laptop-mode/lm-profiler.conf. Installation failed."
exit 12
fi
if ( ! $INSTALL -m 755 usr/sbin/laptop_mode "$DESTDIR/usr/sbin" ) ; then
echo "$0: Failed to install $DESTDIR/usr/sbin/laptop_mode. Installation failed."
exit 11
fi
if ( ! $INSTALL -m 755 usr/sbin/lm-syslog-setup "$DESTDIR/usr/sbin" ) ; then
echo "$0: Failed to install $DESTDIR/usr/sbin/lm-syslog-setup. installation failed."
exit 25
fi
if ( ! $INSTALL -m 755 usr/sbin/lm-profiler "$DESTDIR/usr/sbin" ) ; then
echo "$0: Failed to install $DESTDIR/usr/sbin/lm-profiler. Installation failed."
exit 11
fi
if [ -f "$DESTDIR/usr/share/laptop-mode-tools/modules/core" ] ; then
if ( ! rm "$DESTDIR/usr/share/laptop-mode-tools/modules/core" ) ; then
echo "$0: Failed to install modules into /usr/share/laptop-mode-tools/modules. Installation failed."
exit 35
fi
fi
if ( ! $INSTALL -m 755 usr/share/laptop-mode-tools/modules/* "$DESTDIR/usr/share/laptop-mode-tools/modules" ) ; then
echo "$0: Failed to install modules into /usr/share/laptop-mode-tools/modules. Installation failed."
exit 26
fi
if ( ! $INSTALL -m 755 usr/share/laptop-mode-tools/module-helpers/* "$DESTDIR/usr/share/laptop-mode-tools/module-helpers" ) ; then
echo "$0: Failed to install module helpers into /usr/share/laptop-mode-tools/module-helpers. Installation failed."
exit 37
fi
if ( ! $INSTALL -m 744 man/* "$DESTDIR/$MAN_D/man8" ) ; then
echo "$0: Could not copy manual pages to $DESTDIR/$MAN_D/man8. Installation failed."
exit 23
fi
# Install pm-utils hook only if pm-utils config dir is present, or force the
# install if we have a DESTDIR.
if [ -n "$DESTDIR" -o -d "$DESTDIR/usr/lib/pm-utils/sleep.d" ] ; then
if ( ! $INSTALL -D -m 755 usr/lib/pm-utils/sleep.d/99laptop-mode "$DESTDIR/usr/lib/pm-utils/sleep.d/99laptop-mode" ) ; then
echo "$0: Failed to install 99-laptop-mode into /usr/lib/pm-utils/sleep.d. Installation failed."
exit 36
fi
fi
ACPI_DONE=0
APM_DONE=0
PMU_DONE=0
if [ "$ACPI" = "force" ] || [ "$ACPI" = "enabled" -a ! -d /proc/pmu -a -d "$DESTDIR/etc/acpi" ] ; then
$INSTALL -d -m 755 "$DESTDIR/etc/acpi/actions"
$INSTALL -d -m 755 "$DESTDIR/etc/acpi/events"
# Remove the old action scripts, but not the old event files. Apparently, Gentoo handles
# its speedfreq using /etc/acpi/events/battery, and we were using that too. Simply removing
# the scripts and leaving the event files will hopefully cause acpid to notice that the
# files don't exist and leave it at that.
rm -f "$DESTDIR/etc/acpi/actions/battery.sh" "$DESTDIR/etc/acpi/actions/ac.sh"
if ( ! $INSTALL -m 755 etc/acpi/actions/* "$DESTDIR/etc/acpi/actions" ) ; then
echo "$0: Failed to install ACPI action scripts in $DESTDIR/etc/acpi/actions. Installation failed."
exit 13
fi
if ( ! $INSTALL -m 644 etc/acpi/events/* "$DESTDIR/etc/acpi/events" ) ; then
echo "$0: Failed to install ACPI event file in $DESTDIR/etc/acpi/events. Installation failed."
exit 14
fi
if [ -z "$DESTDIR" ] ; then
killall -HUP acpid
fi
echo "Installed ACPI support."
ACPI_DONE=1
fi
if [ "$APM" = "force" ] || [ "$APM" = "enabled" -a ! -d /proc/pmu -a -d /etc/apm ] ; then
$INSTALL -d -m 755 "$DESTDIR/etc/apm/event.d"
if ( ! $INSTALL -m 755 etc/apm/event.d/* "$DESTDIR/etc/apm/event.d" ) ; then
echo "$0: Failed to install APM event script in $DESTDIR/etc/apm/event.d. Installation failed."
exit 15
fi
echo "Installed APM support."
APM_DONE=1
fi
if [ "$PMU" = "force" ] || [ "$PMU" = "enabled" -a -d /proc/pmu -a -d /etc/power ] ; then
$INSTALL -d -m 755 "$DESTDIR/etc/power/event.d"
$INSTALL -d -m 755 "$DESTDIR/etc/power/scripts.d"
if ( ! $INSTALL -m 755 etc/power/scripts.d/laptop-mode "$DESTDIR/etc/power/scripts.d" ) ; then
echo "$0: Failed to install pbbuttonsd event script in $DESTDIR/etc/power/scripts.d. Installation failed."
exit 33
fi
if ( ! ln -fs ../scripts.d/laptop-mode "$DESTDIR/etc/power/event.d" ) ; then
echo "$0: Failed to install pbbuttonsd event script in $DESTDIR/etc/power/event.d. Installation failed."
exit 34
fi
if [ -f "$DESTDIR/etc/power/pwrctl" ] ; then
if ( ! grep pwrctl-local "$DESTDIR/etc/power/pwrctl" ) ; then
echo "WARNING: "$DESTDIR/etc/power/pwrctl" does not call pwrctl-local. Laptop mode will not start automatically when you use pmud."
fi
if [ ! -f "$DESTDIR/etc/power/pwrctl-local" ] ; then
echo >> "$DESTDIR/etc/power/pwrctl-local"
fi
if ( ! grep laptop_mode "$DESTDIR/etc/power/pwrctl-local" ) ; then
if (! grep -q "#\!" "$DESTDIR/etc/power/pwrctl-local" ); then
sed -i -e "1i\\#! /bin/sh" "$DESTDIR/etc/power/pwrctl-local"
fi
sed -i -e "2i\\/usr/bin/laptop_mode auto" "$DESTDIR/etc/power/pwrctl-local"
else
echo "/etc/power/pwrctl-local already seems to contain a laptop mode call. Not adding an extra one."
fi
fi
if [ -f "$DESTDIR/etc/apm/event.d/laptop-mode" -a -z "$DESTDIR" ] ; then
# This file interferes with the pbbuttonsd integration,
# because pbbuttonsd also emulates APM, so we have to
# remove it.
# We don't do this when DESTDIR != "", because that means we're
# doing an install for a package manager.
rm "$DESTDIR/etc/apm/event.d/laptop-mode"
fi
echo "Installed PMU (pmud/pbbuttonsd) support."
PMU_DONE=1
fi
if [ $APM_DONE -eq 0 -a $ACPI_DONE -eq 0 -a $PMU_DONE -eq 0 ] ; then
echo "ACPI/APM/PMU support was not installed. Laptop mode will not start automatically."
echo "Install either acpid, apmd, pbbuttonsd or pmud (depending on what your laptop supports) and reinstall."
fi
if [ "$INIT_D" != "none" ] ; then
if [ -d "$INIT_D" -o -n "$DESTDIR" ] ; then
$INSTALL -d -m 755 "$INIT_D"
if ( ! $INSTALL -m 755 etc/init.d/laptop-mode "$INIT_D" ) ; then
echo "$0: failed to install init script in $INIT_D. Installation failed."
exit 16
fi
if [ -f "$DESTDIR/etc/rcS.d/S99laptop_mode" ] ; then
# Old symlink.
rm "$DESTDIR/etc/rcS.d/S99laptop-mode"
fi
if [ -z "$DESTDIR" ] ; then
if ( which update-rc.d > /dev/null ) ; then
update-rc.d -f laptop-mode remove
if ( ! update-rc.d laptop-mode defaults 99 ) ; then
echo "$0: update-rc.d failed, laptop mode will not be initialized at bootup."
exit 17
fi
elif ( which chkconfig > /dev/null ) ; then
if ( ! chkconfig laptop-mode on ) ; then
echo "$0: chkconfig failed, laptop mode will not be initialized at bootup."
exit 30
fi
fi
else
# Package manager's route: don't install the init script for
# any particular runlevels. Since we don't have chkconfig or
# update-rc.d available, we can't know for sure how this should
# be done.
/bin/true
fi
else
echo "Directory $INIT_D not found: not installing script to initialize"
echo "laptop mode at boot time."
fi
if [ -z "$DESTDIR" ] ;then
if ( ! $RCPROG $INITSCRIPT start ) ; then
echo "$0: Could not start laptop mode init script /etc/init.d/laptop-mode."
exit 24
fi
fi
# Check for acpid and restart if running
acpi_pid=`pidof acpid`
if [ ! -z $acpi_pid ]; then
echo "Reloading acpid daemon"
killall -SIGHUP acpid;
fi
apm_pid=`pidof apmd`
if [ ! -z $apm_pid ]; then
echo "Reloading apmd daemon"
killall -SIGHUP apmd;
fi
pbbuttonsd_pid=`pidof pbbuttonsd`
if [ ! -z $pbbuttonsd_pid ]; then
echo "Reloading pbbuttonsd daemon"
killall -SIGHUP pbbuttonsd;
fi
pmud_pid=`pidof pmud`
if [ ! -z $pmud_pid ]; then
echo "Reloading pmud daemon"
killall -SIGHUP pmud;
fi
fi
echo "Installation complete."