From a3bb1cff9b572b224736e0b475026816b274f261 Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Tue, 31 Jul 2018 23:47:57 -0400 Subject: [PATCH 01/16] Re-factor MPD currentsong parsing --- bin/khatus_controller | 52 ++++++++++++++++++++++++++++++-------- bin/khatus_sensor_mpd_song | 33 +----------------------- 2 files changed, 42 insertions(+), 43 deletions(-) diff --git a/bin/khatus_controller b/bin/khatus_controller index 1ff6e83..ae4a8dc 100755 --- a/bin/khatus_controller +++ b/bin/khatus_controller @@ -90,18 +90,32 @@ db["volume"] = $0 } -/^in:MPD_STATE/\ +/^in:MPD_SONG +file:/\ { fields_shift() - db["mpd_state"] = $1 - db["mpd_curr_song_time"] = $2 - db["mpd_curr_song_percent"] = $3 + fields_shift() + db["mpd_song_curr_file"] = $0 } -/^in:MPD_SONG/\ +/^in:MPD_SONG +Title:/\ { fields_shift() - db["mpd_curr_song_name"] = $0 + fields_shift() + db["mpd_song_curr_title"] = $0 +} +/^in:MPD_SONG +Name:/\ +{ + fields_shift() + fields_shift() + db["mpd_song_curr_name"] = $0 +} + +/^in:MPD_STATE /\ +{ + fields_shift() + db["mpd_status_state"] = $1 + db["mpd_status_time"] = $2 + db["mpd_status_percent"] = $3 } /^in:WEATHER/\ @@ -379,7 +393,7 @@ function make_status_net( \ } function make_status_mpd( state, status) { - state = db["mpd_state"] + state = db["mpd_status_state"] if (state == "play") { status = make_status_mpd_state_known("▶") @@ -394,13 +408,29 @@ function make_status_mpd( state, status) { return sprintf("[%s]", status) } -function make_status_mpd_state_known(symbol) { +function make_status_mpd_state_known(symbol, \ + currently_playing, name, title, file\ +) { + name = db["mpd_song_curr_name"] + title = db["mpd_song_curr_title:"] + file = db["mpd_song_curr_file"] + + if (name) { + currently_playing = name + } else if (title) { + currently_playing = title + } else if (file) { + last = split(file, parts, "/") + currently_playing = parts[last] + } else { + currently_playing = "" + } return sprintf(\ "%s %s %s %s", symbol, - db["mpd_curr_song_time"], - db["mpd_curr_song_percent"], - substr(db["mpd_curr_song_name"], 1, opt_mpd_song_max_chars)\ + db["mpd_status_time"], + db["mpd_status_percent"], + substr(currently_playing, 1, opt_mpd_song_max_chars)\ ) } diff --git a/bin/khatus_sensor_mpd_song b/bin/khatus_sensor_mpd_song index 49f7f15..0d119d1 100755 --- a/bin/khatus_sensor_mpd_song +++ b/bin/khatus_sensor_mpd_song @@ -2,35 +2,4 @@ set -e -echo 'currentsong' \ -| nc 127.0.0.1 6600 \ -| awk ' - /^OK/ { - next - } - - { - key = $1 - sub("^" key " +", "") - val = $0 - data[key] = val - } - - END { - name = data["Name:"] - title = data["Title:"] - file = data["file:"] - - if (name) { - out = name - } else if (title) { - out = title - } else if (file) { - last = split(file, parts, "/") - out = parts[last] - } else { - out = "" - } - print out - } - ' +echo 'currentsong' | nc 127.0.0.1 6600 -- 2.20.1 From f5dfebd2b3df7a959357a2eb02706ae45d7a1d49 Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 00:35:13 -0400 Subject: [PATCH 02/16] Add alert - mpd song change --- bin/khatus_controller | 68 +++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/bin/khatus_controller b/bin/khatus_controller index ae4a8dc..836a915 100755 --- a/bin/khatus_controller +++ b/bin/khatus_controller @@ -90,6 +90,15 @@ db["volume"] = $0 } +# ----------------------------------------------------------------------------- +# BEGIN MPD_SONG +/^in:MPD_SONG +OK +/\ +{ + delete db["mpd_song_curr_file"] + delete db["mpd_song_curr_title"] + delete db["mpd_song_curr_name"] +} + /^in:MPD_SONG +file:/\ { fields_shift() @@ -103,6 +112,7 @@ fields_shift() db["mpd_song_curr_title"] = $0 } + /^in:MPD_SONG +Name:/\ { fields_shift() @@ -110,6 +120,13 @@ db["mpd_song_curr_name"] = $0 } +/^in:MPD_SONG +OK$/\ +{ + set_mpd_playing() +} +# END MPD_SONG +# ----------------------------------------------------------------------------- + /^in:MPD_STATE /\ { fields_shift() @@ -131,6 +148,37 @@ output_msg_status_bar(make_status_bar()) } +function set_mpd_playing( \ + currently_playing, name, title, file, last, parts\ +) { + name = db["mpd_song_curr_name"] + title = db["mpd_song_curr_title"] + file = db["mpd_song_curr_file"] + + if (name) { + currently_playing = name + } else if (title) { + currently_playing = title + } else if (file) { + last = split(file, parts, "/") + currently_playing = parts[last] + } else { + currently_playing = "" + } + db["mpd_playing_prev"] = db["mpd_playing_curr"] + db["mpd_playing_curr"] = currently_playing + + alert_check_mpd() +} + +function alert_check_mpd( curr, prev) { + prev = db["mpd_playing_prev"] + curr = db["mpd_playing_curr"] + if (curr != prev) { + alert_trigger_low("alert_check_mpd", "NowPlaying", curr) + } +} + # TODO: Generalize alert spec lang # - trigger threshold # - above/bellow/equal to threshold value @@ -408,29 +456,13 @@ function make_status_mpd( state, status) { return sprintf("[%s]", status) } -function make_status_mpd_state_known(symbol, \ - currently_playing, name, title, file\ -) { - name = db["mpd_song_curr_name"] - title = db["mpd_song_curr_title:"] - file = db["mpd_song_curr_file"] - - if (name) { - currently_playing = name - } else if (title) { - currently_playing = title - } else if (file) { - last = split(file, parts, "/") - currently_playing = parts[last] - } else { - currently_playing = "" - } +function make_status_mpd_state_known(symbol) { return sprintf(\ "%s %s %s %s", symbol, db["mpd_status_time"], db["mpd_status_percent"], - substr(currently_playing, 1, opt_mpd_song_max_chars)\ + substr(db["mpd_playing_curr"], 1, opt_mpd_song_max_chars)\ ) } -- 2.20.1 From e8c1404e2324887381d677b490082d67a80e3f01 Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 00:47:44 -0400 Subject: [PATCH 03/16] Do not alert on playlist clearing --- bin/khatus_controller | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/khatus_controller b/bin/khatus_controller index 836a915..a3b97c7 100755 --- a/bin/khatus_controller +++ b/bin/khatus_controller @@ -174,7 +174,7 @@ function set_mpd_playing( \ function alert_check_mpd( curr, prev) { prev = db["mpd_playing_prev"] curr = db["mpd_playing_curr"] - if (curr != prev) { + if (curr && curr != prev) { alert_trigger_low("alert_check_mpd", "NowPlaying", curr) } } -- 2.20.1 From 30b9a4e1c389d69d400adf0fe4be9b0ec4c4935c Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 01:36:14 -0400 Subject: [PATCH 04/16] Include more info in mpd song change alert --- bin/khatus_controller | 68 +++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 41 deletions(-) diff --git a/bin/khatus_controller b/bin/khatus_controller index a3b97c7..d7f627c 100755 --- a/bin/khatus_controller +++ b/bin/khatus_controller @@ -90,42 +90,9 @@ db["volume"] = $0 } -# ----------------------------------------------------------------------------- -# BEGIN MPD_SONG -/^in:MPD_SONG +OK +/\ -{ - delete db["mpd_song_curr_file"] - delete db["mpd_song_curr_title"] - delete db["mpd_song_curr_name"] -} - -/^in:MPD_SONG +file:/\ -{ - fields_shift() - fields_shift() - db["mpd_song_curr_file"] = $0 -} - -/^in:MPD_SONG +Title:/\ -{ - fields_shift() - fields_shift() - db["mpd_song_curr_title"] = $0 -} - -/^in:MPD_SONG +Name:/\ -{ - fields_shift() - fields_shift() - db["mpd_song_curr_name"] = $0 -} - -/^in:MPD_SONG +OK$/\ -{ - set_mpd_playing() -} -# END MPD_SONG -# ----------------------------------------------------------------------------- +/^in:MPD_SONG OK +MPD/ { delete db_mpd_song; next } +/^in:MPD_SONG OK$/ { set_mpd_playing() ; next } +/^in:MPD_SONG / { set_mpd_song() ; next } /^in:MPD_STATE /\ { @@ -148,12 +115,22 @@ output_msg_status_bar(make_status_bar()) } +function set_mpd_song( key, val) { + key = $2 + fields_shift() + fields_shift() + val = $0 + db_mpd_song[key] = val + debug("set_mpd_song", db_mpd_song) +} + function set_mpd_playing( \ currently_playing, name, title, file, last, parts\ ) { - name = db["mpd_song_curr_name"] - title = db["mpd_song_curr_title"] - file = db["mpd_song_curr_file"] + debug("set_mpd_playing", db_mpd_song) + name = db_mpd_song["Name:"] + title = db_mpd_song["Title:"] + file = db_mpd_song["file:"] if (name) { currently_playing = name @@ -171,11 +148,20 @@ function set_mpd_playing( \ alert_check_mpd() } -function alert_check_mpd( curr, prev) { +function alert_check_mpd( curr, prev, name, body) { prev = db["mpd_playing_prev"] curr = db["mpd_playing_curr"] if (curr && curr != prev) { - alert_trigger_low("alert_check_mpd", "NowPlaying", curr) + name = db_mpd_song["Name:"] + if (name) { + body = name + } else { + body = \ + db_mpd_song["Artist:"] \ + " - " db_mpd_song["Album:"] \ + " - " db_mpd_song["Title:"] + } + alert_trigger_low("alert_check_mpd", "NowPlaying", body) } } -- 2.20.1 From 77dc04037a88f7bd6f801ada5f5cf78c50aa1cad Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 01:53:54 -0400 Subject: [PATCH 05/16] Remove dead code --- bin/khatus_sensor_mpd_state | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/bin/khatus_sensor_mpd_state b/bin/khatus_sensor_mpd_state index b5c9b08..b99ab73 100755 --- a/bin/khatus_sensor_mpd_state +++ b/bin/khatus_sensor_mpd_state @@ -33,18 +33,6 @@ echo 'status' \ } END { - state = status["state:"] - - if (state == "play") { - symbol = "▶" - } else if (state == "pause") { - symbol = "❚❚" - } else if (state == "stop") { - symbol = "⬛" - } else { - symbol = "--" - } - printf(\ "%s %s %s\n", status["state:"], current_time, current_percentage\ -- 2.20.1 From c8b5231001bf1f413b3df8059bcbc7622bf8014a Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 09:02:52 -0400 Subject: [PATCH 06/16] Make alert subject more-explicit --- bin/khatus_controller | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/khatus_controller b/bin/khatus_controller index d7f627c..af254a0 100755 --- a/bin/khatus_controller +++ b/bin/khatus_controller @@ -186,7 +186,7 @@ function alert_check_energy( \ if (state_curr == "discharging") { if (state_prev == "charging") { - alert_trigger_low(from, "Unplugged", "") + alert_trigger_low(from, "PowerUnplugged", "") } if (remaining < 5) { -- 2.20.1 From bb1e4fee366ff3ab86e420833071bfdfdc7f9704 Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 09:18:04 -0400 Subject: [PATCH 07/16] Add msg field to debug --- bin/khatus_controller | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bin/khatus_controller b/bin/khatus_controller index af254a0..d91d49b 100755 --- a/bin/khatus_controller +++ b/bin/khatus_controller @@ -121,13 +121,13 @@ function set_mpd_song( key, val) { fields_shift() val = $0 db_mpd_song[key] = val - debug("set_mpd_song", db_mpd_song) + debug("set_mpd_song", "", db_mpd_song) } function set_mpd_playing( \ currently_playing, name, title, file, last, parts\ ) { - debug("set_mpd_playing", db_mpd_song) + debug("set_mpd_playing", "", db_mpd_song) name = db_mpd_song["Name:"] title = db_mpd_song["Title:"] file = db_mpd_song["file:"] @@ -182,7 +182,7 @@ function alert_check_energy( \ dbg["state_curr"] = state_curr dbg["remaining"] = remaining - debug(from, dbg) + debug(from, "", dbg) if (state_curr == "discharging") { if (state_prev == "charging") { @@ -312,7 +312,7 @@ function fields_shift( dbg) { dbg["head"] = $1 sub("^" $1 " +", "") dbg["body"] = $0 - debug("fields_shift", dbg) + debug("fields_shift", "", dbg) } function make_status_bar( position, bar, sep, i, j) { @@ -460,7 +460,7 @@ function round(n) { return int(n + 0.5) } -function debug(location, values, sep, vals, key, msg) { +function debug(location, msg, values, sep, vals, key, payload) { if (opt_debug) { sep = "" vals = "" @@ -468,8 +468,8 @@ function debug(location, values, sep, vals, key, msg) { vals = sprintf("%s%s%s: %s", vals, sep, key, values[key]) sep = ", " } - msg = location " ==> " vals "." - output_msg("DEBUG", msg, "/dev/stderr") + payload = sprintf("[%s] [%s] [%s]", location, msg, vals) + output_msg("DEBUG", payload, "/dev/stderr") } } -- 2.20.1 From ab99b55675644c1ec18bb6ecbd9479e001f604a1 Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 12:54:51 -0400 Subject: [PATCH 08/16] React-to, rather than poll-for, energy events --- bin/khatus | 55 +++++++++++++++----------- bin/khatus_controller | 84 ++++++++++++++++++++++++---------------- bin/khatus_parse_upower | 55 ++++++++++++++++++++++++++ bin/khatus_sensor_energy | 12 ++---- 4 files changed, 142 insertions(+), 64 deletions(-) create mode 100755 bin/khatus_parse_upower diff --git a/bin/khatus b/bin/khatus index b58d2a2..7205aa9 100755 --- a/bin/khatus +++ b/bin/khatus @@ -14,7 +14,20 @@ consume() { -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" @@ -59,7 +72,6 @@ main() { interval_inp_temp=1 interval_inp_fan=1 interval_inp_mem=1 - interval_inp_energy=1 # User-overrides # --------------------------------------------------------------------- @@ -94,7 +106,6 @@ main() { long_options+=',interval_inp_temp:' long_options+=',interval_inp_fan:' long_options+=',interval_inp_mem:' - long_options+=',interval_inp_energy:' OPTS=$( getopt \ -o 'd' \ @@ -209,10 +220,6 @@ main() { interval_inp_mem="$2" shift 2 ;; - --interval_inp_energy) - interval_inp_energy="$2" - shift 2 - ;; --) shift break @@ -257,22 +264,24 @@ main() { # 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" \ diff --git a/bin/khatus_controller b/bin/khatus_controller index d91d49b..fd60153 100755 --- a/bin/khatus_controller +++ b/bin/khatus_controller @@ -1,92 +1,105 @@ #! /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 } @@ -96,7 +109,7 @@ /^in:MPD_STATE /\ { - fields_shift() + shift() db["mpd_status_state"] = $1 db["mpd_status_time"] = $2 db["mpd_status_percent"] = $3 @@ -104,21 +117,21 @@ /^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) @@ -172,7 +185,8 @@ function alert_check_mpd( curr, prev, name, body) { # - 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" @@ -182,13 +196,18 @@ function 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) @@ -308,11 +327,9 @@ function set_screen_brightness( max, cur) { 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) { @@ -468,7 +485,8 @@ function debug(location, msg, values, sep, vals, key, payload) { 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") } } diff --git a/bin/khatus_parse_upower b/bin/khatus_parse_upower new file mode 100755 index 0000000..6761508 --- /dev/null +++ b/bin/khatus_parse_upower @@ -0,0 +1,55 @@ +#! /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 +} diff --git a/bin/khatus_sensor_energy b/bin/khatus_sensor_energy index f91155f..068ab81 100755 --- a/bin/khatus_sensor_energy +++ b/bin/khatus_sensor_energy @@ -2,11 +2,7 @@ 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 -- 2.20.1 From 9ab9a718d98939164e382f6ff2ba2796db444676 Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 13:14:44 -0400 Subject: [PATCH 09/16] Refactor forking functions --- bin/khatus | 60 ++++++++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/bin/khatus b/bin/khatus index 7205aa9..00f2d9c 100755 --- a/bin/khatus +++ b/bin/khatus @@ -14,7 +14,7 @@ consume() { -v opt_prefixes_of_net_interfaces_to_show="$prefixes_of_net_interfaces_to_show" } -spawn_reactor() { +run_producer() { pipe="$1" dir_bin="$2" log="$3" @@ -23,22 +23,20 @@ spawn_reactor() { "$dir_bin"/$cmd | while read line; do echo "${msg_head} $line" > "$pipe" done \ - 2> "$log" \ - & + 2> "$log" + # TODO: Perhaps direct log to pipe, so that controller can monitor sensors? } -spawn_poller() { - pipe="$1" - dir_bin="$2" - log="$3" - cmd="$4" - msg_head="$5" - interval="$6" - while true; do - "$dir_bin"/$cmd | while read line; do - echo "${msg_head} $line" > "$pipe" - done \ - 2> "$log" +fork_reactor() { + run_producer "$@" & +} + +fork_poller() { + interval="$1" + shift + while true + do + run_producer "$@" sleep "$interval" done & } @@ -265,23 +263,23 @@ main() { pipe="$file_pipe" log="$dir_logs"/khatus_sensors.log - spawn_reactor "$pipe" "$dir_bin" "$log" "khatus_sensor_energy $dir_bin" 'in:ENERGY' + fork_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 + fork_poller $interval_inp_datetime "$pipe" "$dir_bin" "$log" khatus_sensor_datetime 'in:DATE_TIME' + fork_poller $interval_inp_brightness "$pipe" "$dir_bin" "$log" "$cmd_sens_screen_brightness" 'in:SCREEN_BRIGHTNESS' + fork_poller $interval_inp_weather "$pipe" "$dir_bin" "$log" "$cmd_sens_weather" 'in:WEATHER' + fork_poller $interval_inp_mpd_state "$pipe" "$dir_bin" "$log" khatus_sensor_mpd_state 'in:MPD_STATE' + fork_poller $interval_inp_mpd_song "$pipe" "$dir_bin" "$log" khatus_sensor_mpd_song 'in:MPD_SONG' + fork_poller $interval_inp_volume "$pipe" "$dir_bin" "$log" khatus_sensor_volume 'in:VOLUME' + fork_poller $interval_inp_bluetooth "$pipe" "$dir_bin" "$log" khatus_sensor_bluetooth_power 'in:BLUETOOTH_POWER' + fork_poller $interval_inp_net_wifi "$pipe" "$dir_bin" "$log" khatus_sensor_net_wifi_status 'in:NET_WIFI_STATUS' + fork_poller $interval_inp_net_io "$pipe" "$dir_bin" "$log" khatus_sensor_net_addr_io 'in:NET_ADDR_IO' + fork_poller $interval_inp_disk_space "$pipe" "$dir_bin" "$log" "$cmd_sens_disk_space" 'in:DISK_SPACE' + fork_poller $interval_inp_disk_io "$pipe" "$dir_bin" "$log" "$cmd_sens_disk_io" 'in:DISK_IO' + fork_poller $interval_inp_loadavg "$pipe" "$dir_bin" "$log" khatus_sensor_loadavg 'in:LOAD_AVG' + fork_poller $interval_inp_temp "$pipe" "$dir_bin" "$log" "$cmd_sens_temperature" 'in:TEMPERATURE' + fork_poller $interval_inp_fan "$pipe" "$dir_bin" "$log" "$cmd_sens_fan" 'in:FAN' + fork_poller $interval_inp_mem "$pipe" "$dir_bin" "$log" khatus_sensor_memory 'in:MEMORY' consume \ "$pipe" \ -- 2.20.1 From f03e88c6896157abd5517394024162aedebff829 Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 14:04:59 -0400 Subject: [PATCH 10/16] Split batter and line_power alerts --- bin/khatus_controller | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/bin/khatus_controller b/bin/khatus_controller index fd60153..d9218ce 100755 --- a/bin/khatus_controller +++ b/bin/khatus_controller @@ -9,6 +9,7 @@ db["energy_state_prev"] = db["energy_state_curr"] db["energy_state_curr"] = $3 db["energy_percentage"] = ensure_numeric($4) + alert_check_energy_battery() } /^in:ENERGY line_power/\ @@ -16,12 +17,7 @@ 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() + alert_check_energy_line_power() } /^in:MEMORY/\ @@ -184,11 +180,10 @@ function alert_check_mpd( curr, prev, name, body) { # - priority # - snooze time (if already alerted, when to re-alert?) # - text: subject/body -function alert_check_energy( \ - from, dbg, state_curr, state_prev, line_power_curr, line_power_prev, \ - remaining, subj, body\ +function alert_check_energy_battery( \ + from, dbg, state_curr, state_prev, remaining, subj, body\ ) { - from = "alert_check_energy" + from = "alert_check_energy_battery" state_curr = db["energy_state_curr"] state_prev = db["energy_state_prev"] @@ -196,17 +191,8 @@ function 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) - 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" @@ -238,6 +224,23 @@ function alert_check_energy( \ } } +function alert_check_energy_line_power( \ + from, dbg, line_power_curr, line_power_prev, subj, body \ +) { + from = "alert_check_energy_line_power" + + dbg["energy_line_power_prev"] = db["energy_line_power_prev"] + dbg["energy_line_power_curr"] = db["energy_line_power_curr"] + debug(from, "", dbg) + + 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", "") + } +} + function alert_trigger_low(from, subject, body) { alert_trigger("low", from, subject, body) } -- 2.20.1 From fd22859bbb95b488a17e439e9e64de2eef00a04d Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 14:28:04 -0400 Subject: [PATCH 11/16] Split-out and refactor bluetooth status parser --- bin/khatus | 4 +++- bin/khatus_parse_bluetoothctl_show | 36 ++++++++++++++++++++++++++++++ bin/khatus_sensor_bluetooth_power | 36 +++--------------------------- 3 files changed, 42 insertions(+), 34 deletions(-) create mode 100755 bin/khatus_parse_bluetoothctl_show diff --git a/bin/khatus b/bin/khatus index 00f2d9c..f13fc52 100755 --- a/bin/khatus +++ b/bin/khatus @@ -259,6 +259,8 @@ main() { cmd_sens_fan="khatus_sensor_fan $fan_path" + cmd_sens_bluetooth="khatus_sensor_bluetooth_power $dir_bin" + # TODO: Redirect each worker's stderr to a dedicated log file pipe="$file_pipe" log="$dir_logs"/khatus_sensors.log @@ -271,7 +273,7 @@ main() { fork_poller $interval_inp_mpd_state "$pipe" "$dir_bin" "$log" khatus_sensor_mpd_state 'in:MPD_STATE' fork_poller $interval_inp_mpd_song "$pipe" "$dir_bin" "$log" khatus_sensor_mpd_song 'in:MPD_SONG' fork_poller $interval_inp_volume "$pipe" "$dir_bin" "$log" khatus_sensor_volume 'in:VOLUME' - fork_poller $interval_inp_bluetooth "$pipe" "$dir_bin" "$log" khatus_sensor_bluetooth_power 'in:BLUETOOTH_POWER' + fork_poller $interval_inp_bluetooth "$pipe" "$dir_bin" "$log" "$cmd_sens_bluetooth" 'in:BLUETOOTH_POWER' fork_poller $interval_inp_net_wifi "$pipe" "$dir_bin" "$log" khatus_sensor_net_wifi_status 'in:NET_WIFI_STATUS' fork_poller $interval_inp_net_io "$pipe" "$dir_bin" "$log" khatus_sensor_net_addr_io 'in:NET_ADDR_IO' fork_poller $interval_inp_disk_space "$pipe" "$dir_bin" "$log" "$cmd_sens_disk_space" 'in:DISK_SPACE' diff --git a/bin/khatus_parse_bluetoothctl_show b/bin/khatus_parse_bluetoothctl_show new file mode 100755 index 0000000..08a8708 --- /dev/null +++ b/bin/khatus_parse_bluetoothctl_show @@ -0,0 +1,36 @@ +#! /usr/bin/awk -f + +/^Controller / { + controller = $2 + controllers[++ctrl_count] = controller +} + +/^\t[A-Z][A-Za-z]+:/ { + key = $1 + sub(":$", "", key) + sub("^" $1, "") + val = $0 + data[controller, key] = val +} + +END { + # Using the 1st seen controller. Should we select specific instead? + power_status = data[controllers[1], "Powered"] + if (ctrl_count > 0) { + if (power_status == "no") { + show = "off" + } else if (power_status == "yes") { + show = "on" + } else { + print_error("Unexpected bluetooth power status: " power_status) + show = "ERROR" + } + } else { + show = "off" # TODO: Perhaps use differentiated marker? + } + print(show) +} + +function print_error(msg) { + print(msg) > "/dev/stderr" +} diff --git a/bin/khatus_sensor_bluetooth_power b/bin/khatus_sensor_bluetooth_power index 92c2128..7810f7a 100755 --- a/bin/khatus_sensor_bluetooth_power +++ b/bin/khatus_sensor_bluetooth_power @@ -2,36 +2,6 @@ set -e -echo -e 'show \n quit' \ -| bluetoothctl \ -| awk ' - /^Controller / { - controller = $2; - controllers[++ctrl_count] = controller; - } - /^\t[A-Z][A-Za-z]+:/ { - key = $1; - sub(":$", "", key); - val = $2; - for (i=3; i<=NF; i++) { - val = val " " $i}; - data[controller, key] = val; - } - END { - # Using the 1st seen controller. Should we select specific instead? - power_status = data[controllers[1], "Powered"]; - if (ctrl_count > 0) { - if (power_status == "no") { - power_status = "off" - } else if (power_status == "yes") { - power_status = "on" - } else { - printf("Unexpected bluetooth power status: %s\n", power_status)\ - > "/dev/stderr"; - power_status = "ERROR" - } - } else { - power_status = "off" # TODO: Perhaps use differentiated marker? - } - printf("%s\n", power_status); - }' +dir_bin="$1" + +echo -e 'show \n quit' | bluetoothctl | "$dir_bin"/khatus_parse_bluetoothctl_show -- 2.20.1 From edbd982dccaaf54a2fe564258fe8160c9a84ce27 Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 14:29:29 -0400 Subject: [PATCH 12/16] Remove some newlines --- bin/khatus | 5 ----- 1 file changed, 5 deletions(-) diff --git a/bin/khatus b/bin/khatus index f13fc52..4f7b120 100755 --- a/bin/khatus +++ b/bin/khatus @@ -250,15 +250,10 @@ main() { cmd_sens_screen_brightness+=" $screen_brightness_device_path" cmd_sens_weather="khatus_sensor_weather $weather_station_id" - cmd_sens_disk_space="khatus_sensor_disk_space $disk_space_device" - cmd_sens_disk_io="khatus_sensor_disk_io $disk_io_device" - cmd_sens_temperature="khatus_sensor_temperature $thermal_zone" - cmd_sens_fan="khatus_sensor_fan $fan_path" - cmd_sens_bluetooth="khatus_sensor_bluetooth_power $dir_bin" # TODO: Redirect each worker's stderr to a dedicated log file -- 2.20.1 From a9038fad36330d7dca12cfd4bef0147a7d312c0c Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 15:06:13 -0400 Subject: [PATCH 13/16] Update README adding a mascot --- README.md | 3 ++- mascot.jpg | Bin 0 -> 23829 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 mascot.jpg diff --git a/README.md b/README.md index df43d38..a8765f8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ khatus ====== +![mascot](mascot.jpg) -My ad-hoc, text-only status bar scripts I use with +Experimental, system monitor and status (bar) reporter I use with [dwm](https://dwm.suckless.org/) on GNU/Linux. ![screenshot](screenshot.jpg) diff --git a/mascot.jpg b/mascot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6fc44e5aefdf8823e77ada8ed2bd3b840cd15a5b GIT binary patch literal 23829 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 literal 0 HcmV?d00001 -- 2.20.1 From e7a3c6ab3cc5fd8c89a483789cde8d1ca623aaba Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 15:16:32 -0400 Subject: [PATCH 14/16] Split-out and refactor MPD status parser --- bin/khatus | 3 ++- bin/khatus_parse_mpd_status | 39 +++++++++++++++++++++++++++++++++++++ bin/khatus_sensor_mpd_state | 38 +++--------------------------------- 3 files changed, 44 insertions(+), 36 deletions(-) create mode 100755 bin/khatus_parse_mpd_status diff --git a/bin/khatus b/bin/khatus index 4f7b120..ead9dbd 100755 --- a/bin/khatus +++ b/bin/khatus @@ -255,6 +255,7 @@ main() { cmd_sens_temperature="khatus_sensor_temperature $thermal_zone" cmd_sens_fan="khatus_sensor_fan $fan_path" cmd_sens_bluetooth="khatus_sensor_bluetooth_power $dir_bin" + cmd_sens_mpd_state="khatus_sensor_mpd_state $dir_bin" # TODO: Redirect each worker's stderr to a dedicated log file pipe="$file_pipe" @@ -265,7 +266,7 @@ main() { fork_poller $interval_inp_datetime "$pipe" "$dir_bin" "$log" khatus_sensor_datetime 'in:DATE_TIME' fork_poller $interval_inp_brightness "$pipe" "$dir_bin" "$log" "$cmd_sens_screen_brightness" 'in:SCREEN_BRIGHTNESS' fork_poller $interval_inp_weather "$pipe" "$dir_bin" "$log" "$cmd_sens_weather" 'in:WEATHER' - fork_poller $interval_inp_mpd_state "$pipe" "$dir_bin" "$log" khatus_sensor_mpd_state 'in:MPD_STATE' + fork_poller $interval_inp_mpd_state "$pipe" "$dir_bin" "$log" "$cmd_sens_mpd_state" 'in:MPD_STATE' fork_poller $interval_inp_mpd_song "$pipe" "$dir_bin" "$log" khatus_sensor_mpd_song 'in:MPD_SONG' fork_poller $interval_inp_volume "$pipe" "$dir_bin" "$log" khatus_sensor_volume 'in:VOLUME' fork_poller $interval_inp_bluetooth "$pipe" "$dir_bin" "$log" "$cmd_sens_bluetooth" 'in:BLUETOOTH_POWER' diff --git a/bin/khatus_parse_mpd_status b/bin/khatus_parse_mpd_status new file mode 100755 index 0000000..1088b4e --- /dev/null +++ b/bin/khatus_parse_mpd_status @@ -0,0 +1,39 @@ +#! /usr/bin/awk -f + +# Msg BEGINs +/^OK MPD / { delete status; next} + +# Msg ENDs +/^OK$/ { + split(status["time"], time, ":") + seconds_current = time[1] + seconds_total = time[2] + + hours = int(seconds_current / 60 / 60); + secs_beyond_hours = seconds_current - (hours * 60 * 60); + mins = int(secs_beyond_hours / 60); + secs = secs_beyond_hours - (mins * 60); + + if (hours > 0) { + current_time = sprintf("%d:%.2d:%.2d", hours, mins, secs) + } else { + current_time = sprintf("%.2d:%.2d", mins, secs) + } + + if (seconds_total > 0) { + time_percentage = (seconds_current / seconds_total) * 100 + current_percentage = sprintf("%d%%", time_percentage) + } else { + current_percentage = "~" + } + + printf("%s %s %s\n", status["state"], current_time, current_percentage) + next +} + +# Msg content +/^[a-z]+: / { + sub(":$", "", $1) + status[$1] = $2 + next +} diff --git a/bin/khatus_sensor_mpd_state b/bin/khatus_sensor_mpd_state index b99ab73..20cc49a 100755 --- a/bin/khatus_sensor_mpd_state +++ b/bin/khatus_sensor_mpd_state @@ -2,40 +2,8 @@ set -e +dir_bin="$1" + echo 'status' \ | nc 127.0.0.1 6600 \ -| awk ' - { - status[$1] = $2 - } - - /^time: +[0-9]+:[0-9]+$/ { - split($2, time, ":") - seconds_current = time[1] - seconds_total = time[2] - - hours = int(seconds_current / 60 / 60); - secs_beyond_hours = seconds_current - (hours * 60 * 60); - mins = int(secs_beyond_hours / 60); - secs = secs_beyond_hours - (mins * 60); - if (hours > 0) { - current_time = sprintf("%d:%.2d:%.2d", hours, mins, secs) - } else { - current_time = sprintf("%.2d:%.2d", mins, secs) - } - - if (seconds_total > 0) { - time_percentage = (seconds_current / seconds_total) * 100 - current_percentage = sprintf("%d%%", time_percentage) - } else { - current_percentage = "~" - } - } - - END { - printf(\ - "%s %s %s\n", - status["state:"], current_time, current_percentage\ - ) - } - ' +| "$dir_bin"/khatus_parse_mpd_status -- 2.20.1 From 6ab55e649d5dfe847ce0e8e8ec0b1af5a8c7c9a2 Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 15:37:42 -0400 Subject: [PATCH 15/16] Leave 2 cats alone --- bin/khatus_sensor_screen_brightness | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/khatus_sensor_screen_brightness b/bin/khatus_sensor_screen_brightness index 7628987..08a8dfc 100755 --- a/bin/khatus_sensor_screen_brightness +++ b/bin/khatus_sensor_screen_brightness @@ -3,7 +3,7 @@ set -e screen_brightness_device_path="$1" -# TODO: single cat + echo "\ $(cat $screen_brightness_device_path/max_brightness) \ $(cat $screen_brightness_device_path/brightness)\ -- 2.20.1 From 0819928a2ed96fc0d56613ae16169489972fa5b3 Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 1 Aug 2018 15:47:02 -0400 Subject: [PATCH 16/16] Split-out ip addr parser --- bin/khatus | 3 ++- bin/khatus_parse_ip_addr | 37 +++++++++++++++++++++++++++++++++++ bin/khatus_sensor_net_addr_io | 37 ++--------------------------------- 3 files changed, 41 insertions(+), 36 deletions(-) create mode 100755 bin/khatus_parse_ip_addr diff --git a/bin/khatus b/bin/khatus index ead9dbd..da0c78c 100755 --- a/bin/khatus +++ b/bin/khatus @@ -256,6 +256,7 @@ main() { cmd_sens_fan="khatus_sensor_fan $fan_path" cmd_sens_bluetooth="khatus_sensor_bluetooth_power $dir_bin" cmd_sens_mpd_state="khatus_sensor_mpd_state $dir_bin" + cmd_sens_net_addr_io="khatus_sensor_net_addr_io $dir_bin" # TODO: Redirect each worker's stderr to a dedicated log file pipe="$file_pipe" @@ -271,7 +272,7 @@ main() { fork_poller $interval_inp_volume "$pipe" "$dir_bin" "$log" khatus_sensor_volume 'in:VOLUME' fork_poller $interval_inp_bluetooth "$pipe" "$dir_bin" "$log" "$cmd_sens_bluetooth" 'in:BLUETOOTH_POWER' fork_poller $interval_inp_net_wifi "$pipe" "$dir_bin" "$log" khatus_sensor_net_wifi_status 'in:NET_WIFI_STATUS' - fork_poller $interval_inp_net_io "$pipe" "$dir_bin" "$log" khatus_sensor_net_addr_io 'in:NET_ADDR_IO' + fork_poller $interval_inp_net_io "$pipe" "$dir_bin" "$log" "$cmd_sens_net_addr_io" 'in:NET_ADDR_IO' fork_poller $interval_inp_disk_space "$pipe" "$dir_bin" "$log" "$cmd_sens_disk_space" 'in:DISK_SPACE' fork_poller $interval_inp_disk_io "$pipe" "$dir_bin" "$log" "$cmd_sens_disk_io" 'in:DISK_IO' fork_poller $interval_inp_loadavg "$pipe" "$dir_bin" "$log" khatus_sensor_loadavg 'in:LOAD_AVG' diff --git a/bin/khatus_parse_ip_addr b/bin/khatus_parse_ip_addr new file mode 100755 index 0000000..bc833b2 --- /dev/null +++ b/bin/khatus_parse_ip_addr @@ -0,0 +1,37 @@ +#! /usr/bin/awk -f + +/^[0-9]+:/ { + sub(":$", "", $1) + sub(":$", "", $2) + sequence = $1 + interface = $2 + interfaces[sequence] = interface +} + +/^ +inet [0-9]/ { + sub("/[0-9]+", "", $2) + addr = $2 + addrs[interface] = addr +} + +/^ +RX: / {transfer_direction = "r"} +/^ +TX: / {transfer_direction = "w"} + +/^ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ *$/ { + io[interface, transfer_direction] = $1; +} + +END { + for (seq=1; seq<=sequence; seq++) { + interface = interfaces[seq] + label = substr(interface, 1, 1) + addr = addrs[interface] + if (addr) { + curr_read = io[interface, "r"] + curr_write = io[interface, "w"] + print(interface, addr, curr_write, curr_read) + } else { + print(interface) + } + } +} diff --git a/bin/khatus_sensor_net_addr_io b/bin/khatus_sensor_net_addr_io index 48b9b07..dd9086c 100755 --- a/bin/khatus_sensor_net_addr_io +++ b/bin/khatus_sensor_net_addr_io @@ -2,39 +2,6 @@ set -e -ip -s addr \ -| awk ' - /^[0-9]+:/ { - sub(":$", "", $1) - sub(":$", "", $2) - sequence = $1 - interface = $2 - interfaces[sequence] = interface - } +dir_bin="$1" - /^ +inet [0-9]/ { - sub("/[0-9]+", "", $2) - addr = $2 - addrs[interface] = addr - } - - /^ +RX: / {transfer_direction = "r"} - /^ +TX: / {transfer_direction = "w"} - - /^ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ *$/ { - io[interface, transfer_direction] = $1; - } - - END { - for (seq=1; seq<=sequence; seq++) { - interface = interfaces[seq] - label = substr(interface, 1, 1) - if (addrs[interface]) { - curr_read = io[interface, "r"] - curr_write = io[interface, "w"] - print(interface, addrs[interface], curr_write, curr_read) - } else { - print(interface) - } - } - }' +ip -s addr | "$dir_bin"/khatus_parse_ip_addr -- 2.20.1