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