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