-v opt_prefixes_of_net_interfaces_to_show="$prefixes_of_net_interfaces_to_show"
}
-spawn() {
+spawn_reactor() {
+ pipe="$1"
+ dir_bin="$2"
+ log="$3"
+ cmd="$4"
+ msg_head="$5"
+ "$dir_bin"/$cmd | while read line; do
+ echo "${msg_head} $line" > "$pipe"
+ done \
+ 2> "$log" \
+ &
+}
+
+spawn_poller() {
pipe="$1"
dir_bin="$2"
log="$3"
interval_inp_temp=1
interval_inp_fan=1
interval_inp_mem=1
- interval_inp_energy=1
# User-overrides
# ---------------------------------------------------------------------
long_options+=',interval_inp_temp:'
long_options+=',interval_inp_fan:'
long_options+=',interval_inp_mem:'
- long_options+=',interval_inp_energy:'
OPTS=$(
getopt \
-o 'd' \
interval_inp_mem="$2"
shift 2
;;
- --interval_inp_energy)
- interval_inp_energy="$2"
- shift 2
- ;;
--)
shift
break
# TODO: Redirect each worker's stderr to a dedicated log file
pipe="$file_pipe"
log="$dir_logs"/khatus_sensors.log
- spawn "$pipe" "$dir_bin" "$log" khatus_sensor_datetime 'in:DATE_TIME' $interval_inp_datetime
- spawn "$pipe" "$dir_bin" "$log" "$cmd_sens_screen_brightness" 'in:SCREEN_BRIGHTNESS' $interval_inp_brightness
- spawn "$pipe" "$dir_bin" "$log" "$cmd_sens_weather" 'in:WEATHER' $interval_inp_weather
- spawn "$pipe" "$dir_bin" "$log" khatus_sensor_mpd_state 'in:MPD_STATE' $interval_inp_mpd_state
- spawn "$pipe" "$dir_bin" "$log" khatus_sensor_mpd_song 'in:MPD_SONG' $interval_inp_mpd_song
- spawn "$pipe" "$dir_bin" "$log" khatus_sensor_volume 'in:VOLUME' $interval_inp_volume
- spawn "$pipe" "$dir_bin" "$log" khatus_sensor_bluetooth_power 'in:BLUETOOTH_POWER' $interval_inp_bluetooth
- spawn "$pipe" "$dir_bin" "$log" khatus_sensor_net_wifi_status 'in:NET_WIFI_STATUS' $interval_inp_net_wifi
- spawn "$pipe" "$dir_bin" "$log" khatus_sensor_net_addr_io 'in:NET_ADDR_IO' $interval_inp_net_io
- spawn "$pipe" "$dir_bin" "$log" "$cmd_sens_disk_space" 'in:DISK_SPACE' $interval_inp_disk_space
- spawn "$pipe" "$dir_bin" "$log" "$cmd_sens_disk_io" 'in:DISK_IO' $interval_inp_disk_io
- spawn "$pipe" "$dir_bin" "$log" khatus_sensor_loadavg 'in:LOAD_AVG' $interval_inp_loadavg
- spawn "$pipe" "$dir_bin" "$log" "$cmd_sens_temperature" 'in:TEMPERATURE' $interval_inp_temp
- spawn "$pipe" "$dir_bin" "$log" "$cmd_sens_fan" 'in:FAN' $interval_inp_fan
- spawn "$pipe" "$dir_bin" "$log" khatus_sensor_memory 'in:MEMORY' $interval_inp_mem
- spawn "$pipe" "$dir_bin" "$log" khatus_sensor_energy 'in:ENERGY' $interval_inp_energy
+
+ spawn_reactor "$pipe" "$dir_bin" "$log" "khatus_sensor_energy $dir_bin" 'in:ENERGY'
+
+ spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_datetime 'in:DATE_TIME' $interval_inp_datetime
+ spawn_poller "$pipe" "$dir_bin" "$log" "$cmd_sens_screen_brightness" 'in:SCREEN_BRIGHTNESS' $interval_inp_brightness
+ spawn_poller "$pipe" "$dir_bin" "$log" "$cmd_sens_weather" 'in:WEATHER' $interval_inp_weather
+ spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_mpd_state 'in:MPD_STATE' $interval_inp_mpd_state
+ spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_mpd_song 'in:MPD_SONG' $interval_inp_mpd_song
+ spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_volume 'in:VOLUME' $interval_inp_volume
+ spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_bluetooth_power 'in:BLUETOOTH_POWER' $interval_inp_bluetooth
+ spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_net_wifi_status 'in:NET_WIFI_STATUS' $interval_inp_net_wifi
+ spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_net_addr_io 'in:NET_ADDR_IO' $interval_inp_net_io
+ spawn_poller "$pipe" "$dir_bin" "$log" "$cmd_sens_disk_space" 'in:DISK_SPACE' $interval_inp_disk_space
+ spawn_poller "$pipe" "$dir_bin" "$log" "$cmd_sens_disk_io" 'in:DISK_IO' $interval_inp_disk_io
+ spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_loadavg 'in:LOAD_AVG' $interval_inp_loadavg
+ spawn_poller "$pipe" "$dir_bin" "$log" "$cmd_sens_temperature" 'in:TEMPERATURE' $interval_inp_temp
+ spawn_poller "$pipe" "$dir_bin" "$log" "$cmd_sens_fan" 'in:FAN' $interval_inp_fan
+ spawn_poller "$pipe" "$dir_bin" "$log" khatus_sensor_memory 'in:MEMORY' $interval_inp_mem
consume \
"$pipe" \
#! /usr/bin/awk -f
+{ debug("LINE", $0) }
-/^in:ENERGY/\
+/^in:ENERGY battery/\
{
- fields_shift()
- sub("%$", "", $2)
+ debug("ENERGY battery", $0)
+ sub("%$", "", $4)
db["energy_state_prev"] = db["energy_state_curr"]
- db["energy_state_curr"] = $1
- db["energy_percentage"] = ensure_numeric($2)
+ db["energy_state_curr"] = $3
+ db["energy_percentage"] = ensure_numeric($4)
+}
+
+/^in:ENERGY line_power/\
+{
+ debug("ENERGY line_power", $0)
+ db["energy_line_power_prev"] = db["energy_line_power_curr"]
+ db["energy_line_power_curr"] = $3
+}
+
+/^in:ENERGY/\
+{
+ debug("ENERGY ALL", $0)
alert_check_energy()
}
/^in:MEMORY/\
{
- fields_shift()
+ shift()
db["memory_total"] = $1
db["memory_used"] = $2
}
/^in:FAN +status:/\
{
- fields_shift()
+ shift()
db["fan_status"] = $2
}
/^in:FAN +speed:/\
{
- fields_shift()
+ shift()
db["fan_speed"] = $2
}
/^in:FAN +level:/\
{
- fields_shift()
+ shift()
db["fan_level"] = $2
}
/^in:TEMPERATURE/\
{
- fields_shift()
+ shift()
db["temperature"] = $1
}
/^in:LOAD_AVG/\
{
- fields_shift()
+ shift()
set_load_avg()
}
/^in:DISK_IO/\
{
- fields_shift()
+ shift()
set_disk_io()
}
/^in:DISK_SPACE/\
{
- fields_shift()
+ shift()
db["disk_space_used"] = $0
}
/^in:NET_ADDR_IO/\
{
- fields_shift()
+ shift()
set_net_addr_io()
}
/^in:NET_WIFI_STATUS/\
{
- fields_shift()
+ shift()
db["net_wifi_status"] = $0
}
/^in:BLUETOOTH_POWER/\
{
- fields_shift()
+ shift()
db["bluetooth_power"] = $0
}
/^in:SCREEN_BRIGHTNESS/\
{
- fields_shift()
+ shift()
set_screen_brightness()
}
/^in:VOLUME/\
{
- fields_shift()
+ shift()
db["volume"] = $0
}
/^in:MPD_STATE /\
{
- fields_shift()
+ shift()
db["mpd_status_state"] = $1
db["mpd_status_time"] = $2
db["mpd_status_percent"] = $3
/^in:WEATHER/\
{
- fields_shift()
+ shift()
db["weather_temperature"] = $0
}
/^in:DATE_TIME/\
{
- fields_shift()
+ shift()
db["datetime"] = $0
output_msg_status_bar(make_status_bar())
}
function set_mpd_song( key, val) {
key = $2
- fields_shift()
- fields_shift()
+ shift()
+ shift()
val = $0
db_mpd_song[key] = val
debug("set_mpd_song", "", db_mpd_song)
# - snooze time (if already alerted, when to re-alert?)
# - text: subject/body
function alert_check_energy( \
- from, dbg, state_curr, state_prev, remaining, subj, body\
+ from, dbg, state_curr, state_prev, line_power_curr, line_power_prev, \
+ remaining, subj, body\
) {
from = "alert_check_energy"
dbg["state_curr"] = state_curr
dbg["remaining"] = remaining
+ dbg["energy_line_power_prev"] = db["energy_line_power_prev"]
+ dbg["energy_line_power_curr"] = db["energy_line_power_curr"]
debug(from, "", dbg)
- if (state_curr == "discharging") {
- if (state_prev == "charging") {
- alert_trigger_low(from, "PowerUnplugged", "")
- }
+ line_power_curr = db["energy_line_power_curr"]
+ line_power_prev = db["energy_line_power_prev"]
+ if (line_power_curr == "no" && line_power_prev != "no") {
+ alert_trigger_low(from, "PowerUnplugged", "")
+ }
+
+ if (state_curr == "discharging") {
if (remaining < 5) {
subj = "Energy_CRITICALLY_Low"
body = sprintf("%d%% CHARGE NOW!!! GO GO GO!!!", remaining)
db["screen_brightness"] = (cur / max) * 100
}
-function fields_shift( dbg) {
- dbg["head"] = $1
+# TODO: Revise overuse of shift() where it is not really needed
+function shift() {
sub("^" $1 " +", "")
- dbg["body"] = $0
- debug("fields_shift", "", dbg)
}
function make_status_bar( position, bar, sep, i, j) {
vals = sprintf("%s%s%s: %s", vals, sep, key, values[key])
sep = ", "
}
- payload = sprintf("[%s] [%s] [%s]", location, msg, vals)
+ payload = \
+ sprintf("LOCATION[%s] MSG[%s] DATA[%s]", location, msg, vals)
output_msg("DEBUG", payload, "/dev/stderr")
}
}
--- /dev/null
+#! /usr/bin/awk -f
+
+# When parsing 'upower --dump'
+/^Device:[ \t]+/ {
+ device["path"] = $2
+ next
+}
+
+# When parsing 'upower --monitor-detail'
+/^\[[0-9]+:[0-9]+:[0-9]+\.[0-9]+\][ \t]+device changed:[ \t]+/ {
+ device["path"] = $4
+ next
+}
+
+# BEGIN battery
+/ battery/ && device["path"] {
+ device["is_battery"] = 1
+ next
+}
+
+/ state:/ && device["is_battery"] {
+ device["battery_state"] = $2
+ next
+}
+
+/ percentage:/ && device["is_battery"] {
+ device["battery_percentage"] = $2
+ next
+}
+
+/^$/ && device["is_battery"] {
+ printf("battery %s %s\n", device["battery_state"], device["battery_percentage"])
+}
+# END battery
+
+# BEGIN line-power
+/ line-power/ && device["path"] {
+ device["is_line_power"] = 1
+ next
+}
+
+/ online:/ && device["is_line_power"] {
+ device["line_power_online"] = $2
+ next
+}
+
+/^$/ && device["is_line_power"] {
+ printf("line_power %s\n", device["line_power_online"])
+}
+# END line-power
+
+/^$/ {
+ delete device
+ next
+}
set -e
-upower -e \
-| grep battery \
-| xargs upower -i \
-| awk '
- /^ +percentage: +/ { percentage=$2 }
- /^ +state: +/ { state=$2 }
- END { print(state, percentage) }
- '
+dir_bin="$1"
+
+upower --dump | stdbuf -o L "$dir_bin"/khatus_parse_upower
+upower --monitor-detail | stdbuf -o L "$dir_bin"/khatus_parse_upower