Be a bit more-consistent with while loops
[khatus.git] / bin / khatus
CommitLineData
438d0d5f
SK
1#! /bin/bash
2
4d314e0f
SK
3set -e
4
6339a4f8 5consume() {
438d0d5f 6 pipe="$1"
2b221665 7 debug="$2"
d77c7373 8 bin="$3"
f37162a4 9 prefixes_of_net_interfaces_to_show="$4"
438d0d5f 10 tail -f "$pipe" \
d77c7373 11 | stdbuf -o L "$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 17run_producer() {
ab99b556 18 pipe="$1"
d77c7373 19 bin="$2"
ab99b556
SK
20 log="$3"
21 cmd="$4"
22 msg_head="$5"
15a44039
SK
23 "$bin"/$cmd \
24 | while read line
25 do
26 echo "${msg_head} $line" > "$pipe"
27 done \
9ab9a718
SK
28 2> "$log"
29 # TODO: Perhaps direct log to pipe, so that controller can monitor sensors?
ab99b556
SK
30}
31
9ab9a718
SK
32fork_reactor() {
33 run_producer "$@" &
34}
35
36fork_poller() {
37 interval="$1"
38 shift
15a44039 39 while :
9ab9a718
SK
40 do
41 run_producer "$@"
2b221665 42 sleep "$interval"
438d0d5f
SK
43 done &
44}
45
46main() {
d77c7373
SK
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
4d314e0f 74 )
d77c7373 75 while :
4d314e0f 76 do
d77c7373
SK
77 key="$1"
78 val="$2"
79 case "$key" in
80 '')
4d314e0f
SK
81 break
82 ;;
d77c7373
SK
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
4d314e0f
SK
103 esac
104 done
105
6a12cab1
SK
106 (
107 echo '=============================================='
108 echo "Khatus starting with the following parameters:"
109 echo '=============================================='
d77c7373 110 for param in ${!opts[@]}
6a12cab1 111 do
d77c7373 112 echo "$param := ${opts[$param]}"
6a12cab1 113 done \
d77c7373
SK
114 | column -ts: \
115 | sort
6a12cab1 116 echo '----------------------------------------------'
4d314e0f
SK
117 ) >&2
118
d77c7373
SK
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"
438d0d5f 129
f37162a4
SK
130 cmd_sens_screen_brightness='khatus_sensor_screen_brightness'
131 cmd_sens_screen_brightness+=" $screen_brightness_device_path"
2b221665 132
d77c7373
SK
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"
fd22859b 142
4d314e0f 143 # TODO: Redirect each worker's stderr to a dedicated log file
d77c7373
SK
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'
2b221665
SK
160
161 consume \
162 "$pipe" \
d77c7373
SK
163 "${opts['--debug']}" \
164 "$bin" \
165 "${opts['--prefixes_of_net_interfaces_to_show']}"
438d0d5f
SK
166}
167
168main $@
This page took 0.045494 seconds and 4 git commands to generate.