-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpowerdown-functions
154 lines (130 loc) · 3.05 KB
/
powerdown-functions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/usr/bin/env bash
# powerdown-functions
shopt -s nullglob extglob
# turn on kernel options
opt() {
[[ -f "$1" ]] || return
[[ -w "$1" ]] && echo "$2" | tee "$1" &>/dev/null || echo "[powerdown] cannot write $2 to $1"
}
# unload kernel module
unload_mod() {
has_mod "$1" || return
modprobe -r "$1" || echo "[powerdown] cannot unload module $1"
}
unload_mod_recursive() {
local dep
for dep in $(lsmod | awk -v mod="$1" '$1==mod {gsub(",", " ", $4); print $4}'); do
unload_mod_recursive "$dep"
done
unload_mod "$1"
}
# load kernel module
load_mod() {
has_mod "$1" || return
modprobe "$1" || echo "[powerdown] cannot load module $1"
}
# module exists
has_mod() {
modprobe -nq "$1"
}
# module loaded
mod_loaded() {
grep -qs "^$1 " /proc/modules
}
# brightness scale 0 to 5
# $1 = max file
# $2 = value
num_scale() {
echo $(($(< "$1") / 5 * $2))
}
# command
run() {
"$@" &> /dev/null || echo "[powerdown] cannot run $@"
}
has_bat() {
local bat
for bat in /sys/class/power_supply/BAT*; do
return 0
done
return 1
}
# get current power usage
display_power() {
if ! has_bat; then
echo "[powerdown] no battery"
return
fi
local bat
for bat in /sys/class/power_supply/BAT*; do
local watt
if [[ -f "$bat/power_now" ]]; then
watt="$(bc <<< "scale=3; $(< "$bat/power_now") / 1000000")"
else
watt="$(bc <<< "scale=3; $(< "$bat/current_now") * $(< "$bat/voltage_now") / 1000000000000")"
fi
echo "[powerdown] $(basename "$bat") using $watt watts"
done
}
# get readahead
display_readahead() {
echo "- $1 readahead: $(blockdev --getra "$1")"
}
# dump kernel option content
dump () {
[[ -r "$1" ]] || return
echo "- $1: $(< "$1")"
}
display_module() {
has_mod "$1" || return
echo -n "- $1 "
mod_loaded "$1" && echo "loaded" || echo "not loaded"
}
display_wireless() {
echo "- $1 $(iw dev "$1" get power_save)"
}
hibernate_offset() {
filefrag -v /hibernate | awk 'NR==4 {print $4}' | tr -d .
}
root_part() {
df / | awk 'NR==2 {print $1}'
}
has_swap_part () {
grep -qs swap /etc/fstab
}
can_suspend_to_disk () {
[[ -f /hibernate ]] || has_swap_part
}
swap_part() {
awk '$3=="swap" {print $1; exit}' /etc/fstab
}
resume_boot_option() {
if [[ -f /hibernate ]]; then
echo "resume=$(root_part) resume_offset=$(hibernate_offset)"
elif has_swap_part; then
echo "resume=$(swap_part)"
fi
}
# lock the file until the script finishes
lock() {
local LOCK=/tmp/powerdown.lock
if ! mkdir "$LOCK" 2> /dev/null; then
echo "Working... $LOCK"
exit
fi
trap "rm -rf $LOCK" EXIT
}
# $1 = device path
is_usb_hid() {
local subdev
for subdev in $1/*:*; do
# USB_DEVICE_CLASS 3 = HID
[[ "$(< "$subdev/bInterfaceClass")" == 03 ]] && return 0
done
return 1
}
usb_powersave() {
local usbdev
for usbdev in /sys/bus/usb/devices/+([^:]); do
is_usb_hid "$usbdev" && opt "$usbdev/power/control" on || opt "$usbdev/power/control" auto
done
}