React-to, rather than poll-for, energy events
[khatus.git] / bin / khatus
CommitLineData
438d0d5f
SK
1#! /bin/bash
2
4d314e0f
SK
3set -e
4
6339a4f8 5consume() {
438d0d5f 6 pipe="$1"
2b221665 7 debug="$2"
f37162a4
SK
8 dir_bin="$3"
9 prefixes_of_net_interfaces_to_show="$4"
438d0d5f 10 tail -f "$pipe" \
f37162a4 11 | stdbuf -o L "$dir_bin"/khatus_controller \
2b221665 12 -v opt_debug="$debug" \
365549a9 13 -v opt_mpd_song_max_chars=10 \
f37162a4 14 -v opt_prefixes_of_net_interfaces_to_show="$prefixes_of_net_interfaces_to_show"
438d0d5f
SK
15}
16
ab99b556
SK
17spawn_reactor() {
18 pipe="$1"
19 dir_bin="$2"
20 log="$3"
21 cmd="$4"
22 msg_head="$5"
23 "$dir_bin"/$cmd | while read line; do
24 echo "${msg_head} $line" > "$pipe"
25 done \
26 2> "$log" \
27 &
28}
29
30spawn_poller() {
f37162a4
SK
31 pipe="$1"
32 dir_bin="$2"
f1b794f5
SK
33 log="$3"
34 cmd="$4"
35 msg_head="$5"
36 interval="$6"
438d0d5f 37 while true; do
f37162a4 38 "$dir_bin"/$cmd | while read line; do
2b221665 39 echo "${msg_head} $line" > "$pipe"
f1b794f5
SK
40 done \
41 2> "$log"
2b221665 42 sleep "$interval"
438d0d5f
SK
43 done &
44}
45
46main() {
4d314e0f 47 # Defaults
2b221665 48 debug=0
f37162a4 49 dir_bin="$HOME/bin"
75347e52
SK
50 dir_logs=$(mktemp -d)
51 file_pipe=$(mktemp)
4d314e0f 52 weather_station_id='KJFK'
bbb42518 53 screen_brightness_device_name='acpi_video0'
2b221665 54 prefixes_of_net_interfaces_to_show='w' # comma-separated
c0e8473e 55 disk_space_device='/'
cf698ca8 56 disk_io_device='sda'
5dd1535a 57 thermal_zone=0
b9bdec44 58 fan_path='/proc/acpi/ibm/fan'
4d314e0f 59
3716523b
SK
60 interval_inp_datetime=1
61 interval_inp_brightness=1
62 interval_inp_weather=$(( 30 * 60)) # 30 minutes
63 interval_inp_mpd_state=1
64 interval_inp_mpd_song=1
65 interval_inp_volume=1
66 interval_inp_bluetooth=5
67 interval_inp_net_wifi=5
68 interval_inp_net_io=1
69 interval_inp_disk_space=5
70 interval_inp_disk_io=1
71 interval_inp_loadavg=1
72 interval_inp_temp=1
73 interval_inp_fan=1
74 interval_inp_mem=1
29b3b10d 75
4d314e0f 76 # User-overrides
6a12cab1
SK
77 # ---------------------------------------------------------------------
78 # IMPORTANT:
79 # In order for automatic value reporting, at startup, to work - ensure that
80 # long option names match corresponding variable names!
81 # ---------------------------------------------------------------------
2b221665
SK
82 long_options=''
83 long_options+='debug'
6a12cab1 84 long_options+=',dir_bin:'
75347e52
SK
85 long_options+=',dir_logs:'
86 long_options+=',file_pipe:'
6a12cab1
SK
87 long_options+=',weather_station_id:'
88 long_options+=',screen_brightness_device_name:'
2b221665 89 long_options+=',prefixes_of_net_interfaces_to_show:'
c0e8473e 90 long_options+=',disk_space_device:'
8fe8971a 91 long_options+=',disk_io_device:'
5dd1535a 92 long_options+=',thermal_zone:'
b9bdec44 93 long_options+=',fan_path:'
3716523b
SK
94 long_options+=',interval_inp_datetime:'
95 long_options+=',interval_inp_brightness:'
96 long_options+=',interval_inp_weather:'
97 long_options+=',interval_inp_mpd_state:'
98 long_options+=',interval_inp_mpd_song:'
99 long_options+=',interval_inp_volume:'
100 long_options+=',interval_inp_bluetooth:'
101 long_options+=',interval_inp_net_wifi:'
102 long_options+=',interval_inp_net_io:'
103 long_options+=',interval_inp_disk_space:'
104 long_options+=',interval_inp_disk_io:'
105 long_options+=',interval_inp_loadavg:'
106 long_options+=',interval_inp_temp:'
107 long_options+=',interval_inp_fan:'
108 long_options+=',interval_inp_mem:'
4d314e0f
SK
109 OPTS=$(
110 getopt \
2b221665
SK
111 -o 'd' \
112 -l $long_options \
4d314e0f
SK
113 -- "$@"
114 )
115 eval set -- "$OPTS"
116 while true
117 do
118 case "$1" in
2b221665
SK
119 -d|--debug)
120 debug=1
121 shift
122 ;;
6a12cab1 123 --dir_bin)
f37162a4
SK
124 dir_bin="$2"
125 shift 2
126 ;;
75347e52
SK
127 --dir_logs)
128 dir_logs="$2"
129 shift 2
130 ;;
131 --file_pipe)
132 file_pipe="$2"
4d314e0f
SK
133 shift 2
134 ;;
6a12cab1 135 --weather_station_id)
4d314e0f
SK
136 weather_station_id="$2"
137 shift 2
138 ;;
6a12cab1 139 --screen_brightness_device_name)
bbb42518
SK
140 screen_brightness_device_name="$2"
141 shift 2
142 ;;
2b221665
SK
143 --prefixes_of_net_interfaces_to_show)
144 prefixes_of_net_interfaces_to_show="$2"
145 shift 2
146 ;;
c0e8473e
SK
147 --disk_space_device)
148 disk_space_device="$2"
149 shift 2
150 ;;
cf698ca8
SK
151 --disk_io_device)
152 disk_io_device="$2"
153 shift 2
154 ;;
5dd1535a
SK
155 --thermal_zone)
156 thermal_zone="$2"
157 shift 2
158 ;;
b9bdec44
SK
159 --fan_path)
160 fan_path="$2"
161 shift 2
162 ;;
3716523b
SK
163 --interval_inp_datetime)
164 interval_inp_datetime="$2"
29b3b10d
SK
165 shift 2
166 ;;
3716523b
SK
167 --interval_inp_brightness)
168 interval_inp_brightness="$2"
29b3b10d
SK
169 shift 2
170 ;;
3716523b
SK
171 --interval_inp_weather)
172 interval_inp_weather="$2"
29b3b10d
SK
173 shift 2
174 ;;
3716523b
SK
175 --interval_inp_mpd_state)
176 interval_inp_mpd_state="$2"
29b3b10d
SK
177 shift 2
178 ;;
3716523b
SK
179 --interval_inp_mpd_song)
180 interval_inp_mpd_song="$2"
29b3b10d
SK
181 shift 2
182 ;;
3716523b
SK
183 --interval_inp_volume)
184 interval_inp_volume="$2"
29b3b10d
SK
185 shift 2
186 ;;
3716523b
SK
187 --interval_inp_bluetooth)
188 interval_inp_bluetooth="$2"
29b3b10d
SK
189 shift 2
190 ;;
3716523b
SK
191 --interval_inp_net_wifi)
192 interval_inp_net_wifi="$2"
29b3b10d
SK
193 shift 2
194 ;;
3716523b
SK
195 --interval_inp_net_io)
196 interval_inp_net_io="$2"
29b3b10d
SK
197 shift 2
198 ;;
3716523b
SK
199 --interval_inp_disk_space)
200 interval_inp_disk_space="$2"
29b3b10d
SK
201 shift 2
202 ;;
3716523b
SK
203 --interval_inp_disk_io)
204 interval_inp_disk_io="$2"
29b3b10d
SK
205 shift 2
206 ;;
3716523b
SK
207 --interval_inp_loadavg)
208 interval_inp_loadavg="$2"
29b3b10d
SK
209 shift 2
210 ;;
3716523b
SK
211 --interval_inp_temp)
212 interval_inp_temp="$2"
29b3b10d
SK
213 shift 2
214 ;;
3716523b
SK
215 --interval_inp_fan)
216 interval_inp_fan="$2"
29b3b10d
SK
217 shift 2
218 ;;
3716523b
SK
219 --interval_inp_mem)
220 interval_inp_mem="$2"
29b3b10d
SK
221 shift 2
222 ;;
4d314e0f
SK
223 --)
224 shift
225 break
226 ;;
227 esac
228 done
229
bbb42518
SK
230 screen_brightness_device_path='/sys/class/backlight'
231 screen_brightness_device_path+="/$screen_brightness_device_name"
0c0ebbe1 232
6a12cab1
SK
233 (
234 echo '=============================================='
235 echo "Khatus starting with the following parameters:"
236 echo '=============================================='
237 for param in \
238 $(echo -n "$long_options" \
239 | awk -v RS=, '{sub(":$", ""); print $0}'
240 )
241 do
242 echo "$param := ${!param}"
243 done \
244 | column -ts:
245 echo '----------------------------------------------'
4d314e0f
SK
246 ) >&2
247
75347e52
SK
248 rm -f "$file_pipe"
249 mkfifo "$file_pipe"
438d0d5f 250
f37162a4
SK
251 cmd_sens_screen_brightness='khatus_sensor_screen_brightness'
252 cmd_sens_screen_brightness+=" $screen_brightness_device_path"
2b221665 253
f37162a4 254 cmd_sens_weather="khatus_sensor_weather $weather_station_id"
0c0ebbe1 255
f37162a4 256 cmd_sens_disk_space="khatus_sensor_disk_space $disk_space_device"
c0e8473e 257
f37162a4 258 cmd_sens_disk_io="khatus_sensor_disk_io $disk_io_device"
cf698ca8 259
f37162a4 260 cmd_sens_temperature="khatus_sensor_temperature $thermal_zone"
5dd1535a 261
f37162a4 262 cmd_sens_fan="khatus_sensor_fan $fan_path"
b9bdec44 263
4d314e0f 264 # TODO: Redirect each worker's stderr to a dedicated log file
75347e52
SK
265 pipe="$file_pipe"
266 log="$dir_logs"/khatus_sensors.log
ab99b556
SK
267
268 spawn_reactor "$pipe" "$dir_bin" "$log" "khatus_sensor_energy $dir_bin" 'in:ENERGY'
269
270 spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_datetime 'in:DATE_TIME' $interval_inp_datetime
271 spawn_poller "$pipe" "$dir_bin" "$log" "$cmd_sens_screen_brightness" 'in:SCREEN_BRIGHTNESS' $interval_inp_brightness
272 spawn_poller "$pipe" "$dir_bin" "$log" "$cmd_sens_weather" 'in:WEATHER' $interval_inp_weather
273 spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_mpd_state 'in:MPD_STATE' $interval_inp_mpd_state
274 spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_mpd_song 'in:MPD_SONG' $interval_inp_mpd_song
275 spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_volume 'in:VOLUME' $interval_inp_volume
276 spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_bluetooth_power 'in:BLUETOOTH_POWER' $interval_inp_bluetooth
277 spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_net_wifi_status 'in:NET_WIFI_STATUS' $interval_inp_net_wifi
278 spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_net_addr_io 'in:NET_ADDR_IO' $interval_inp_net_io
279 spawn_poller "$pipe" "$dir_bin" "$log" "$cmd_sens_disk_space" 'in:DISK_SPACE' $interval_inp_disk_space
280 spawn_poller "$pipe" "$dir_bin" "$log" "$cmd_sens_disk_io" 'in:DISK_IO' $interval_inp_disk_io
281 spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_loadavg 'in:LOAD_AVG' $interval_inp_loadavg
282 spawn_poller "$pipe" "$dir_bin" "$log" "$cmd_sens_temperature" 'in:TEMPERATURE' $interval_inp_temp
283 spawn_poller "$pipe" "$dir_bin" "$log" "$cmd_sens_fan" 'in:FAN' $interval_inp_fan
284 spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_memory 'in:MEMORY' $interval_inp_mem
2b221665
SK
285
286 consume \
287 "$pipe" \
288 "$debug" \
f37162a4 289 "$dir_bin" \
2b221665 290 "$prefixes_of_net_interfaces_to_show"
438d0d5f
SK
291}
292
293main $@
This page took 0.056868 seconds and 4 git commands to generate.