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