ACC SHELL
Path : /usr/bin/ |
|
Current File : //usr/bin/powersave |
#!/bin/bash
#
# legacy script for the old powersave command line client
#
# Copyright (C) 2008 Holger Macht <hmacht@suse.de>
# Copyright (C) 2010 Michal Vyskocil <mvyskocil@suse.cz> - port to upower
#
# This file is released under the GPLv2.
#
HAL_COMPUTER_PATH="/org/freedesktop/Hal/devices/computer"
########### upower helper functions ################
# call the method from org.freedesktop.UPower interface
function upower_call_method() {
local _method
_method=${1}
[ -z "${_method}" ] && return 1
dbus-send --print-reply \
--system \
--dest=org.freedesktop.UPower \
/org/freedesktop/UPower \
"${_method}"
}
# get a property of an UPower device
function upower_device_get_property() {
local _device _property
_device=${1}
_property=${2}
[ -z "${_device}" -o -z "${_property}" ] && return 1
dbus-send --print-reply \
--system \
--dest=org.freedesktop.UPower \
"${_device}" \
org.freedesktop.DBus.Properties.Get \
string:`echo "${_device}" | tr '/' '.'` ${_property}
}
function upower_available() {
upower_device_get_property /org/freedesktop/UPower string:DaemonVersion &>/dev/null
}
# print all devices are power supply && batteries
function upower_enumerate_batteries() {
for DEVICE in `upower_call_method org.freedesktop.UPower.EnumerateDevices | grep 'object path' | sed 's@.*"\(.*\)"@\1@'`; do
# we don't want to print informations about batteries included in some external components
if upower_device_get_property "${DEVICE}" string:PowerSupply 2>/dev/null | grep -q "false$"; then
continue
fi
# type 2 is battery
if upower_device_get_property "${DEVICE}" string:Type 2>/dev/null | grep uint | grep -q "2$"; then
echo "${DEVICE}"
fi
done
}
# print the ac_adapter found on system
# Note: it prints the first match, as it expects only one per machine
function upower_find_ac_adapter() {
for DEVICE in $(upower_call_method org.freedesktop.UPower.EnumerateDevices | grep -o '/org[A-Za-z0-9/_]*'); do
# type 1 is Line Power
if upower_device_get_property "${DEVICE}" string:Type 2>/dev/null | grep -q "1$"; then
echo "${DEVICE}"
break
fi
done
}
function hal_standby {
dbus-send --system --print-reply --dest=org.freedesktop.Hal \
$HAL_COMPUTER_PATH \
org.freedesktop.Hal.Device.SystemPowerManagement.Standby
}
function upower_standby() {
echo "ERROR: standby is not exported by UPower" 2>/dev/stderr
return 1
}
function hal_suspend_to_ram {
dbus-send --system --print-reply --dest=org.freedesktop.Hal \
$HAL_COMPUTER_PATH \
org.freedesktop.Hal.Device.SystemPowerManagement.Suspend int32:0
}
function upower_suspend_to_ram() {
upower_call_method org.freedesktop.UPower.Suspend
}
function hal_suspend_to_disk {
dbus-send --system --print-reply --dest=org.freedesktop.Hal \
$HAL_COMPUTER_PATH \
org.freedesktop.Hal.Device.SystemPowerManagement.Hibernate
}
function upower_suspend_to_disk() {
upower_call_method org.freedesktop.UPower.Hibernate
}
function hal_battery_info {
C=1
for I in `hal-find-by-capability --capability battery`; do
SEC=`hal-get-property --udi $I --key battery.remaining_time`
MIN=`echo $(($SEC / 60)) minutes`
PERC=`hal-get-property --udi $I --key battery.charge_level.percentage`
STATE_C=`hal-get-property --udi $I --key battery.rechargeable.is_charging`
STATE_D=`hal-get-property --udi $I --key battery.rechargeable.is_discharging`
if [ "$STATE_C" = "$STATE_D" ]; then
STATE="undefined"
else
if [ "$STATE_C" = "true" ]; then
STATE="charging"
else
STATE="discharging"
fi
fi
echo "Battery$C:"
echo -e "\t Remaining percent: $PERC"
echo -e "\t Remaining minutes: $MIN"
echo -e "\t Charging state: $STATE"
let C=C+1
done
}
function dbus-getv {
sed -n "s#.*[ \t]*$1[0-9]*[ \t]*##p"
}
function upower_battery_info {
C=1
for BATTERY in `upower_enumerate_batteries`; do
let SEC="`upower_device_get_property "${BATTERY}" string:TimeToEmpty | dbus-getv int`"
if [ $SEC -ne 0 ]; then
let MIN=SEC/60
else
MIN=0
fi
PERC=`upower_device_get_property "${BATTERY}" string:Percentage | dbus-getv double`
case `upower_device_get_property "${BATTERY}" string:State | dbus-getv uint` in
1) STATE="Charging" ;;
2) STATE="Discharging" ;;
3) STATE="Empty" ;;
4) STATE="Fully charged" ;;
5) STATE="Pending charge" ;;
6) STATE="Pending discharge" ;;
*) STATE="Unknown" ;;
esac
echo "Battery$C:"
echo -e "\t Remaining percent: $PERC%"
echo -e "\t Remaining minutes: $MIN"
echo -e "\t Charging state: $STATE"
let C=C+1
done
}
function hal_ac_status_info {
UDI=`hal-find-by-capability --capability ac_adapter`
if [ -z "$UDI" ]; then
echo "No AC adapter found"
return
fi
AC=`hal-get-property --udi $UDI --key ac_adapter.present`
if [ "$AC" = "false" ]; then
echo "OFFLINE"
else
echo "ONLINE"
fi
}
function upower_ac_status_info() {
UDI=`upower_find_ac_adapter`
if [ -z "$UDI" ]; then
echo "No AC adapter found"
return
fi
if upower_device_get_property "${UDI}" string:Online 2>/dev/null | grep -q 'false$'; then
echo "OFFLINE"
else
echo "ONLINE"
fi
}
function list_schemes {
for I in /etc/pm-profiler/*; do
[ -d $I ] && echo `basename $I`
done
}
function show_scheme_description {
. /etc/pm-profiler/$1/config
echo $NAME:
echo $DESCRIPTION
}
function set_active_scheme {
if [ "$UID" != "0" ]; then
echo "You must be root to enable a profile"
exit 1
fi
/usr/lib/pm-profiler/enable-profile $1
}
function hal_performance_speed {
dbus-send --system --print-reply --dest=org.freedesktop.Hal \
$HAL_COMPUTER_PATH \
org.freedesktop.Hal.Device.CPUFreq.SetCPUFreqGovernor \
string:performance > /dev/null
}
function upower_performance_speed() {
echo "ERROR: not yet implemented using upower" 2> /dev/stderr
return 1
}
function hal_powersave_speed {
dbus-send --system --print-reply --dest=org.freedesktop.Hal \
$HAL_COMPUTER_PATH \
org.freedesktop.Hal.Device.CPUFreq.SetCPUFreqGovernor \
string:powersave > /dev/null
}
function upower_powersave_speed() {
echo "ERROR: not yet implemented using upower" 2> /dev/stderr
return 1
}
function hal_dynamic_speed {
dbus-send --system --print-reply --dest=org.freedesktop.Hal \
$HAL_COMPUTER_PATH \
org.freedesktop.Hal.Device.CPUFreq.SetCPUFreqGovernor \
string:ondemand > /dev/null
}
function upower_dynamic_speed() {
echo "ERROR: not yet implemented using upower" 2> /dev/stderr
return 1
}
function hal_cpufreq_state_info {
HAVE_CPUFREQ=`hal-find-by-capability --capability cpufreq_control`
if [ -z "$HAVE_CPUFREQ" ]; then
echo "CPU Frequency scaling not supported"
return
fi
GOVERNOR="`dbus-send --system --print-reply --dest=org.freedesktop.Hal \
$HAL_COMPUTER_PATH \
org.freedesktop.Hal.Device.CPUFreq.GetCPUFreqGovernor `"
GOVERNOR="`echo $GOVERNOR | sed -e 's/.* string "\(.*\)"/\1/'`"
case "$GOVERNOR" in
ondemand|conservative) echo DYNAMIC ;;
performance) echo PERFORMANCE ;;
powersave) echo POWERSAVE ;;
*) echo "Unknown policy" ;;
esac
}
function upower_cpufreq_state_info() {
echo "ERROR: not yet implemented using upower" 2> /dev/stderr
return 1
}
function usage {
echo
echo -e "ATTENTION:\tThis is a legacy tool to provide basic functionality of the obsolete"
echo -e "\t\tpowersave daemon. It will vanish in future."
echo
echo "Usage: powersave [OPTIONS]"
echo
echo " Suspend/Standby:"
echo -e "\t -U, --suspend-to-disk\t\t set machine into suspend-to-disk (ACPI S4/APM suspend)"
echo -e "\t -u, --suspend-to-ram\t\t set machine into suspend-to-ram (ACPI S3/APM suspend)"
echo -e "\t -m, --standby\t\t\t set machine into standby (ACPI S1/APM standby)"
echo
echo " Print information:"
echo -e "\t -b, --battery-info\t\t general battery info"
echo -e "\t -a, --ac-status-info\t\t power supply info (AC/Battery)"
echo
echo " Profiles:"
echo -e "\t -x, --list-schemes\t\t show all available schemes/profiles"
echo -e "\t -X, --show-scheme-description\t show scheme description"
echo -e "\t -e <x>, --set-active-scheme <x> switch currently active scheme/profile"
echo
echo " CPUFreq modes:"
echo -e "\t -f, --performance-speed\t set cpufreq to performance mode"
echo -e "\t -l, --powersave-speed\t\t set cpufreq to powersave mode"
echo -e "\t -A, --dynamic-speed\t\t set cpufreq to dynamic mode"
echo -e "\t -c, --cpufreq-state-info\t print out the current cpufreq policy"
echo
}
TEMP=`getopt -o muUbe:ahxX:flAc --long suspend-to-ram,suspend-to-disk,set-active-scheme:,\
battery-info,ac-status-info,help,list-schemes,show-scheme-description:,performance-speed,powersave-speed,\
dynamic-speed,cpufreq-state-info,standby \
-n 'example.bash' -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"
if upower_available; then
SYSTEM="upower"
else
SYSTEM="hal"
fi
echo "INFO: using SYSTEM $SYSTEM"
while true ; do
case "$1" in
-m|--standby) ${SYSTEM}_standby ; shift ;;
-u|--suspend-to-ram) ${SYSTEM}_suspend_to_ram; shift ;;
-U|--suspend-to-disk) ${SYSTEM}_suspend_to_disk; shift ;;
-b|--battery-info) ${SYSTEM}_battery_info ; shift ;;
-a|--ac-status-info) ${SYSTEM}_ac_status_info ; shift ;;
-x|--list-schemes) list_schemes ; shift ;;
-X|--show-scheme-description) show_scheme_description $2 ; shift 2 ;;
-f|--performance-speed) ${SYSTEM}_performance_speed ; shift ;;
-l|--powersave-speed) ${SYSTEM}_powersave_speed ; shift ;;
-A|--dynamic-speed) ${SYSTEM}_dynamic_speed ; shift ;;
-c|--cpufreq-state-info) ${SYSTEM}_cpufreq_state_info ; shift ;;
-e|--set-active-scheme) set_active_scheme $2 ; shift 2 ;;
-h|--help) usage ; shift ;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done
ACC SHELL 2018