Clear MPD state on non-0 exit from MPD song sensor
[khatus.git] / bin / khatus
CommitLineData
438d0d5f
SK
1#! /bin/bash
2
4d314e0f
SK
3set -e
4
d33e9656
SK
5consume() {
6 pipe="$1"
7 debug="$2"
8 bin="$3"
9 prefixes_of_net_interfaces_to_show="$4"
10 tail -f "$pipe" \
11 | stdbuf -o L "$bin"/khatus_controller \
12 -v opt_debug="$debug" \
13 -v opt_mpd_song_max_chars=10 \
14 -v opt_prefixes_of_net_interfaces_to_show="$prefixes_of_net_interfaces_to_show"
15}
16
9ab9a718 17run_producer() {
d33e9656
SK
18 pipe="$1"
19 bin="$2"
20 cmd="$3"
21 msg_head="$4"
c40b9076
SK
22 perf_log="$5"
23
24 if [ ! "$perf_log" = '' ]
25 then
26 # %S system time in seconds
27 # %U user time in seconds
28 # %e elapsed time in seconds
29 # %c context switches involuntary
30 # %w context switches voluntary
31 # %x exit code
32 time_fmt='%S %U %e %c %w %x'
33 time="/usr/bin/time -ao ${perf_log} -f "
34 time_sep=' '
35 else
36 time_fmt=''
37 time=''
38 time_sep=''
39 fi
40
41 ${time}"${time_fmt}"${time_sep}$bin/$cmd \
688fb20e
SK
42 2> >(
43 while read line
15a44039 44 do
d33e9656 45 echo "ERROR ${msg_head} $line" > "$pipe"
15a44039 46 done \
688fb20e
SK
47 ) \
48 | while read line
49 do
d33e9656 50 echo "OK ${msg_head} $line" > "$pipe"
688fb20e 51 done
7a2b16ba
SK
52 cmd_exit_code=${PIPESTATUS[0]}
53 if [ "$cmd_exit_code" -ne 0 ]
54 then
55 echo "ERROR ${msg_head} NON_ZERO_EXIT_CODE $cmd_exit_code" > "$pipe"
56 fi
ab99b556
SK
57}
58
ff74b448 59fork_watcher() {
9ab9a718
SK
60 run_producer "$@" &
61}
62
63fork_poller() {
64 interval="$1"
c40b9076
SK
65 perf_log_dir="$2"
66 shift 2
67
68 if [ ! "$perf_log_dir" = '' ]
69 then
70 cmd="$3"
71 perf_log_file=$(basename "$(echo $cmd | awk '{print $1; exit}')").log
72 mkdir -p "$perf_log_dir"
73 perf_log_path="$perf_log_dir/$perf_log_file"
74 fi
75
15a44039 76 while :
9ab9a718 77 do
c40b9076 78 run_producer "$@" "$perf_log_path"
2b221665 79 sleep "$interval"
438d0d5f
SK
80 done &
81}
82
83main() {
d77c7373
SK
84 declare -A opts=(
85 ["--debug"]=0
86 ["--dir_bin"]="$HOME/bin"
c40b9076 87 ["--dir_perf_logs"]=''
d33e9656 88 ["--file_pipe"]=$(mktemp)
d77c7373
SK
89 ["--weather_station_id"]='KJFK'
90 ["--screen_brightness_device_name"]='acpi_video0'
91 ["--prefixes_of_net_interfaces_to_show"]='w' # comma-separated
b4612a8a 92 ["--wifi_interface"]=''
d77c7373
SK
93 ["--disk_space_device"]='/'
94 ["--disk_io_device"]='sda'
95 ["--thermal_zone"]=0
96 ["--fan_path"]='/proc/acpi/ibm/fan'
97 ["--interval_inp_datetime"]=1
98 ["--interval_inp_brightness"]=1
99 ["--interval_inp_weather"]=$(( 30 * 60)) # 30 minutes
100 ["--interval_inp_mpd_state"]=1
101 ["--interval_inp_mpd_song"]=1
102 ["--interval_inp_volume"]=1
103 ["--interval_inp_bluetooth"]=5
104 ["--interval_inp_net_wifi"]=5
105 ["--interval_inp_net_io"]=1
106 ["--interval_inp_disk_space"]=5
107 ["--interval_inp_disk_io"]=1
108 ["--interval_inp_loadavg"]=1
109 ["--interval_inp_temp"]=1
110 ["--interval_inp_fan"]=1
111 ["--interval_inp_mem"]=1
4d314e0f 112 )
d77c7373 113 while :
4d314e0f 114 do
d77c7373
SK
115 key="$1"
116 val="$2"
117 case "$key" in
118 '')
4d314e0f
SK
119 break
120 ;;
d77c7373
SK
121 * )
122 if [ -v opts["$key"] ]
123 then
124 if [ "$key" == "--debug" ]
125 then
126 opts["$key"]=1
127 shift
128 elif [ "$val" != "" ]
129 then
130 opts["$key"]="$val"
131 shift
132 shift
133 else
134 echo "Option $key requires an argument" >&2
135 exit 1
136 fi
137 else
138 echo "Unknown option: $key" >&2
139 exit 1
140 fi
4d314e0f
SK
141 esac
142 done
143
b4612a8a
SK
144 if [ "${opts['--wifi_interface']}" = '' ]
145 then
146 echo 'Please provide the required parameter: --wifi_interface' >&2
147 exit 1
148 fi
149
6a12cab1
SK
150 (
151 echo '=============================================='
152 echo "Khatus starting with the following parameters:"
153 echo '=============================================='
d77c7373 154 for param in ${!opts[@]}
6a12cab1 155 do
d77c7373 156 echo "$param := ${opts[$param]}"
6a12cab1 157 done \
d77c7373
SK
158 | column -ts: \
159 | sort
6a12cab1 160 echo '----------------------------------------------'
4d314e0f
SK
161 ) >&2
162
d77c7373
SK
163 screen_brightness_device_path='/sys/class/backlight'
164 screen_brightness_device_path+="/${opts['--screen_brightness_device_name']}"
165
166 # Just shorthand
d33e9656 167 pipe="${opts['--file_pipe']}"
d77c7373 168 bin="${opts['--dir_bin']}"
c40b9076 169 perf="${opts['--dir_perf_logs']}"
d77c7373 170
d33e9656
SK
171 rm -f "$pipe"
172 mkfifo "$pipe"
173
f37162a4
SK
174 cmd_sens_screen_brightness='khatus_sensor_screen_brightness'
175 cmd_sens_screen_brightness+=" $screen_brightness_device_path"
2b221665 176
654ea6e2 177 cmd_sens_weather="khatus_sensor_weather $bin ${opts['--weather_station_id']}"
d77c7373
SK
178 cmd_sens_disk_space="khatus_sensor_disk_space ${opts['--disk_space_device']}"
179 cmd_sens_disk_io="khatus_sensor_disk_io ${opts['--disk_io_device']}"
180 cmd_sens_temperature="khatus_sensor_temperature ${opts['--thermal_zone']}"
181 cmd_sens_fan="khatus_sensor_fan ${opts['--fan_path']}"
182 cmd_sens_bluetooth="khatus_sensor_bluetooth_power $bin"
183 cmd_sens_mpd_state="khatus_sensor_mpd_state $bin"
184 cmd_sens_net_addr_io="khatus_sensor_net_addr_io $bin"
185 cmd_sens_volume="khatus_sensor_volume $bin"
b4612a8a 186 cmd_sens_wifi="khatus_sensor_net_wifi_status $bin ${opts['--wifi_interface']}"
fd22859b 187
c40b9076
SK
188 fork_watcher "$pipe" "$bin" "khatus_sensor_energy $bin" 'in:ENERGY'
189 fork_poller "${opts['--interval_inp_datetime']}" "$perf" "$pipe" "$bin" khatus_sensor_datetime 'in:DATE_TIME'
190 fork_poller "${opts['--interval_inp_brightness']}" "$perf" "$pipe" "$bin" "$cmd_sens_screen_brightness" 'in:SCREEN_BRIGHTNESS'
191 fork_poller "${opts['--interval_inp_weather']}" "$perf" "$pipe" "$bin" "$cmd_sens_weather" 'in:WEATHER'
192 fork_poller "${opts['--interval_inp_mpd_state']}" "$perf" "$pipe" "$bin" "$cmd_sens_mpd_state" 'in:MPD_STATE'
193 fork_poller "${opts['--interval_inp_mpd_song']}" "$perf" "$pipe" "$bin" khatus_sensor_mpd_song 'in:MPD_SONG'
194 fork_poller "${opts['--interval_inp_volume']}" "$perf" "$pipe" "$bin" "$cmd_sens_volume" 'in:VOLUME'
195 fork_poller "${opts['--interval_inp_bluetooth']}" "$perf" "$pipe" "$bin" "$cmd_sens_bluetooth" 'in:BLUETOOTH_POWER'
196 fork_poller "${opts['--interval_inp_net_wifi']}" "$perf" "$pipe" "$bin" "$cmd_sens_wifi" 'in:NET_WIFI_STATUS'
197 fork_poller "${opts['--interval_inp_net_io']}" "$perf" "$pipe" "$bin" "$cmd_sens_net_addr_io" 'in:NET_ADDR_IO'
198 fork_poller "${opts['--interval_inp_disk_space']}" "$perf" "$pipe" "$bin" "$cmd_sens_disk_space" 'in:DISK_SPACE'
199 fork_poller "${opts['--interval_inp_disk_io']}" "$perf" "$pipe" "$bin" "$cmd_sens_disk_io" 'in:DISK_IO'
200 fork_poller "${opts['--interval_inp_loadavg']}" "$perf" "$pipe" "$bin" khatus_sensor_loadavg 'in:LOAD_AVG'
201 fork_poller "${opts['--interval_inp_temp']}" "$perf" "$pipe" "$bin" "$cmd_sens_temperature" 'in:TEMPERATURE'
202 fork_poller "${opts['--interval_inp_fan']}" "$perf" "$pipe" "$bin" "$cmd_sens_fan" 'in:FAN'
203 fork_poller "${opts['--interval_inp_mem']}" "$perf" "$pipe" "$bin" khatus_sensor_memory 'in:MEMORY'
d33e9656
SK
204
205 consume \
206 "$pipe" \
207 "${opts['--debug']}" \
208 "$bin" \
209 "${opts['--prefixes_of_net_interfaces_to_show']}"
438d0d5f
SK
210}
211
212main $@
This page took 0.058154 seconds and 4 git commands to generate.