Be a bit more-consistent with while loops
[khatus.git] / bin / khatus
1 #! /bin/bash
2
3 set -e
4
5 consume() {
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
17 run_producer() {
18 pipe="$1"
19 bin="$2"
20 log="$3"
21 cmd="$4"
22 msg_head="$5"
23 "$bin"/$cmd \
24 | while read line
25 do
26 echo "${msg_head} $line" > "$pipe"
27 done \
28 2> "$log"
29 # TODO: Perhaps direct log to pipe, so that controller can monitor sensors?
30 }
31
32 fork_reactor() {
33 run_producer "$@" &
34 }
35
36 fork_poller() {
37 interval="$1"
38 shift
39 while :
40 do
41 run_producer "$@"
42 sleep "$interval"
43 done &
44 }
45
46 main() {
47 declare -A opts=(
48 ["--debug"]=0
49 ["--dir_bin"]="$HOME/bin"
50 ["--dir_logs"]=$(mktemp -d)
51 ["--file_pipe"]=$(mktemp)
52 ["--weather_station_id"]='KJFK'
53 ["--screen_brightness_device_name"]='acpi_video0'
54 ["--prefixes_of_net_interfaces_to_show"]='w' # comma-separated
55 ["--disk_space_device"]='/'
56 ["--disk_io_device"]='sda'
57 ["--thermal_zone"]=0
58 ["--fan_path"]='/proc/acpi/ibm/fan'
59 ["--interval_inp_datetime"]=1
60 ["--interval_inp_brightness"]=1
61 ["--interval_inp_weather"]=$(( 30 * 60)) # 30 minutes
62 ["--interval_inp_mpd_state"]=1
63 ["--interval_inp_mpd_song"]=1
64 ["--interval_inp_volume"]=1
65 ["--interval_inp_bluetooth"]=5
66 ["--interval_inp_net_wifi"]=5
67 ["--interval_inp_net_io"]=1
68 ["--interval_inp_disk_space"]=5
69 ["--interval_inp_disk_io"]=1
70 ["--interval_inp_loadavg"]=1
71 ["--interval_inp_temp"]=1
72 ["--interval_inp_fan"]=1
73 ["--interval_inp_mem"]=1
74 )
75 while :
76 do
77 key="$1"
78 val="$2"
79 case "$key" in
80 '')
81 break
82 ;;
83 * )
84 if [ -v opts["$key"] ]
85 then
86 if [ "$key" == "--debug" ]
87 then
88 opts["$key"]=1
89 shift
90 elif [ "$val" != "" ]
91 then
92 opts["$key"]="$val"
93 shift
94 shift
95 else
96 echo "Option $key requires an argument" >&2
97 exit 1
98 fi
99 else
100 echo "Unknown option: $key" >&2
101 exit 1
102 fi
103 esac
104 done
105
106 (
107 echo '=============================================='
108 echo "Khatus starting with the following parameters:"
109 echo '=============================================='
110 for param in ${!opts[@]}
111 do
112 echo "$param := ${opts[$param]}"
113 done \
114 | column -ts: \
115 | sort
116 echo '----------------------------------------------'
117 ) >&2
118
119 screen_brightness_device_path='/sys/class/backlight'
120 screen_brightness_device_path+="/${opts['--screen_brightness_device_name']}"
121
122 # Just shorthand
123 pipe="${opts['--file_pipe']}"
124 bin="${opts['--dir_bin']}"
125 log="${opts['--dir_logs']}"/khatus_sensors.log
126
127 rm -f "$pipe"
128 mkfifo "$pipe"
129
130 cmd_sens_screen_brightness='khatus_sensor_screen_brightness'
131 cmd_sens_screen_brightness+=" $screen_brightness_device_path"
132
133 cmd_sens_weather="khatus_sensor_weather ${opts['--weather_station_id']}"
134 cmd_sens_disk_space="khatus_sensor_disk_space ${opts['--disk_space_device']}"
135 cmd_sens_disk_io="khatus_sensor_disk_io ${opts['--disk_io_device']}"
136 cmd_sens_temperature="khatus_sensor_temperature ${opts['--thermal_zone']}"
137 cmd_sens_fan="khatus_sensor_fan ${opts['--fan_path']}"
138 cmd_sens_bluetooth="khatus_sensor_bluetooth_power $bin"
139 cmd_sens_mpd_state="khatus_sensor_mpd_state $bin"
140 cmd_sens_net_addr_io="khatus_sensor_net_addr_io $bin"
141 cmd_sens_volume="khatus_sensor_volume $bin"
142
143 # TODO: Redirect each worker's stderr to a dedicated log file
144 fork_reactor "$pipe" "$bin" "$log" "khatus_sensor_energy $bin" 'in:ENERGY'
145 fork_poller "${opts['--interval_inp_datetime']}" "$pipe" "$bin" "$log" khatus_sensor_datetime 'in:DATE_TIME'
146 fork_poller "${opts['--interval_inp_brightness']}" "$pipe" "$bin" "$log" "$cmd_sens_screen_brightness" 'in:SCREEN_BRIGHTNESS'
147 fork_poller "${opts['--interval_inp_weather']}" "$pipe" "$bin" "$log" "$cmd_sens_weather" 'in:WEATHER'
148 fork_poller "${opts['--interval_inp_mpd_state']}" "$pipe" "$bin" "$log" "$cmd_sens_mpd_state" 'in:MPD_STATE'
149 fork_poller "${opts['--interval_inp_mpd_song']}" "$pipe" "$bin" "$log" khatus_sensor_mpd_song 'in:MPD_SONG'
150 fork_poller "${opts['--interval_inp_volume']}" "$pipe" "$bin" "$log" "$cmd_sens_volume" 'in:VOLUME'
151 fork_poller "${opts['--interval_inp_bluetooth']}" "$pipe" "$bin" "$log" "$cmd_sens_bluetooth" 'in:BLUETOOTH_POWER'
152 fork_poller "${opts['--interval_inp_net_wifi']}" "$pipe" "$bin" "$log" khatus_sensor_net_wifi_status 'in:NET_WIFI_STATUS'
153 fork_poller "${opts['--interval_inp_net_io']}" "$pipe" "$bin" "$log" "$cmd_sens_net_addr_io" 'in:NET_ADDR_IO'
154 fork_poller "${opts['--interval_inp_disk_space']}" "$pipe" "$bin" "$log" "$cmd_sens_disk_space" 'in:DISK_SPACE'
155 fork_poller "${opts['--interval_inp_disk_io']}" "$pipe" "$bin" "$log" "$cmd_sens_disk_io" 'in:DISK_IO'
156 fork_poller "${opts['--interval_inp_loadavg']}" "$pipe" "$bin" "$log" khatus_sensor_loadavg 'in:LOAD_AVG'
157 fork_poller "${opts['--interval_inp_temp']}" "$pipe" "$bin" "$log" "$cmd_sens_temperature" 'in:TEMPERATURE'
158 fork_poller "${opts['--interval_inp_fan']}" "$pipe" "$bin" "$log" "$cmd_sens_fan" 'in:FAN'
159 fork_poller "${opts['--interval_inp_mem']}" "$pipe" "$bin" "$log" khatus_sensor_memory 'in:MEMORY'
160
161 consume \
162 "$pipe" \
163 "${opts['--debug']}" \
164 "$bin" \
165 "${opts['--prefixes_of_net_interfaces_to_show']}"
166 }
167
168 main $@
This page took 0.099347 seconds and 5 git commands to generate.