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