ACC SHELL

Path : /usr/bin/
File Upload :
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