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