Add temperature
[khatus.git] / bin / khatus_loop
index f05e1ec..f707a00 100755 (executable)
@@ -2,11 +2,34 @@
 
 set -e
 
+produce_temperature() {
+    thermal_zone="$1"
+    cat "/sys/class/thermal/thermal_zone${thermal_zone}/temp"
+}
+
+produce_loadavg() {
+    cat /proc/loadavg
+}
+
+produce_disk_io() {
+    disk_io_device="$1"
+    awk '
+        {
+            r = $3
+            w = $7
+            print w, r
+        }
+        ' "/sys/block/$disk_io_device/stat"
+}
+
+produce_disk_space() {
+    disk_space_device="$1"
+    df --output=pcent "$disk_space_device" | awk 'NR == 2 {print $1}'
+}
+
 produce_net_addr_io() {
     ip -s addr \
-    | awk \
-        -v prefixes_of_interfaces_to_show="$PREFIXES_OF_INTERFACES_TO_SHOW" \
-        '
+    | awk '
         BEGIN {
             bytes_per_unit = 1024 * 1024
         }
@@ -251,6 +274,30 @@ consume() {
         -v opt_mpd_song_max_chars=10 \
         -v opt_prefixes_of_net_interfaces_to_show="$prefixes_of_net_interfaces_to_show" \
         '
+            /^in:TEMPERATURE/\
+            {
+                split_msg_parts()
+                db["temperature"] = $1
+            }
+
+            /^in:LOAD_AVG/\
+            {
+                split_msg_parts()
+                set_load_avg()
+            }
+
+            /^in:DISK_IO/\
+            {
+                split_msg_parts()
+                set_disk_io()
+            }
+
+            /^in:DISK_SPACE/\
+            {
+                split_msg_parts()
+                db["disk_space_used"] = msg_body
+            }
+
             /^in:NET_ADDR_IO/\
             {
                 split_msg_parts()
@@ -313,6 +360,26 @@ consume() {
                 print make_bar()
             }
 
+            function set_load_avg(    sched) {
+                split($4, sched, "/")
+                db["load_avg_1min"]             = $1
+                db["load_avg_5min"]             = $2
+                db["load_avg_15min"]            = $3
+                db["kern_sched_queue_runnable"] = sched[1]
+                db["kern_sched_queue_total"]    = sched[2]
+                db["kern_sched_latest_pid"]     = $5
+            }
+
+            function set_disk_io(    curr_w, curr_r, prev_w, prev_r) {
+                curr_w = $1
+                curr_r = $2
+                prev_w = db["disk_io_curr_w"]
+                prev_r = db["disk_io_curr_r"]
+                db["disk_io_curr_w"] = curr_w
+                db["disk_io_curr_r"] = curr_r
+                db["disk_io_diff_w"] = curr_w - prev_w
+                db["disk_io_diff_r"] = curr_r - prev_r
+            }
 
             function set_net_addr_io(    \
                 interface, address, io_curr_w, io_curr_r, io_prev_w, io_prev_r\
@@ -357,6 +424,8 @@ consume() {
             }
 
             function make_bar(    position, bar, sep, i, j) {
+                position[++i] = make_status_cpu()
+                position[++i] = make_status_disk()
                 position[++i] = make_status_net()
                 position[++i] = sprintf("B=%s", db["bluetooth_power"])
                 position[++i] = sprintf("*%d%%", db["screen_brightness"])
@@ -373,6 +442,21 @@ consume() {
                 return bar
             }
 
+            function make_status_cpu(    load, temp) {
+                load = db["load_avg_1min"]
+                temp = db["temperature"] / 1000
+                return sprintf("C=[%4.2f %d°C]", load, temp)
+            }
+
+            function make_status_disk(    bytes_per_sector, bytes_per_mb, w, r) {
+                bytes_per_sector = 512
+                bytes_per_mb     = 1024 * 1024
+                w = (db["disk_io_diff_w"] * bytes_per_sector) / bytes_per_mb
+                r = (db["disk_io_diff_r"] * bytes_per_sector) / bytes_per_mb
+                return \
+                    sprintf("D=[%s %0.3f▲ %0.3f▼]", db["disk_space_used"], w, r)
+            }
+
             function make_status_net(    \
                 out,
                 number_of_interfaces_to_show,
@@ -488,6 +572,9 @@ main() {
     weather_station_id='KJFK'
     screen_brightness_device_name='acpi_video0'
     prefixes_of_net_interfaces_to_show='w'  # comma-separated
+    disk_space_device='/'
+    disk_io_device='sda'
+    thermal_zone=0
 
     # User-overrides
     long_options=''
@@ -496,6 +583,8 @@ main() {
     long_options+=',weather-station:'
     long_options+=',screen-device:'
     long_options+=',prefixes_of_net_interfaces_to_show:'
+    long_options+=',disk_space_device:'
+    long_options+=',thermal_zone:'
     OPTS=$(
         getopt \
             -o 'd' \
@@ -526,6 +615,18 @@ main() {
                 prefixes_of_net_interfaces_to_show="$2"
                 shift 2
                 ;;
+            --disk_space_device)
+                disk_space_device="$2"
+                shift 2
+                ;;
+            --disk_io_device)
+                disk_io_device="$2"
+                shift 2
+                ;;
+            --thermal_zone)
+                thermal_zone="$2"
+                shift 2
+                ;;
             --)
                 shift
                 break
@@ -544,7 +645,10 @@ main() {
         echo "    screen_brightness_device_name|= $screen_brightness_device_name"
         echo "    screen_brightness_device_path|= $screen_brightness_device_path"
         echo "    weather_station_id|= $weather_station_id"
-        echo "    prefixes_of_net_interfaces_to_show|=$prefixes_of_net_interfaces_to_show"
+        echo "    prefixes_of_net_interfaces_to_show|= $prefixes_of_net_interfaces_to_show"
+        echo "    disk_space_device|= $disk_space_device"
+        echo "    disk_io_device|= $disk_io_device"
+        echo "    thermal_zone|= $thermal_zone"
       ) | column -ts\|
       echo ''
     ) >&2
@@ -558,6 +662,12 @@ main() {
 
     cmd_produce_weather="produce_weather $weather_station_id"
 
+    cmd_produce_disk_space="produce_disk_space $disk_space_device"
+
+    cmd_produce_disk_io="produce_disk_io $disk_io_device"
+
+    cmd_produce_temperature="produce_temperature $thermal_zone"
+
     # TODO: Redirect each worker's stderr to a dedicated log file
     spawn produce_datetime                 "$pipe" 'in:DATE_TIME' 1
     spawn "$cmd_produce_screen_brightness" "$pipe" 'in:SCREEN_BRIGHTNESS' 1
@@ -568,6 +678,10 @@ main() {
     spawn produce_bluetooth_power          "$pipe" 'in:BLUETOOTH_POWER' 5
     spawn produce_net_wifi_status          "$pipe" 'in:NET_WIFI_STATUS' 5
     spawn produce_net_addr_io              "$pipe" 'in:NET_ADDR_IO' 1
+    spawn "$cmd_produce_disk_space"        "$pipe" 'in:DISK_SPACE' 1
+    spawn "$cmd_produce_disk_io"           "$pipe" 'in:DISK_IO' 1
+    spawn produce_loadavg                  "$pipe" 'in:LOAD_AVG' 1
+    spawn "$cmd_produce_temperature"       "$pipe" 'in:TEMPERATURE' 1
     spawn produce_bar_req                  "$pipe" 'out:BAR'      1
 
     consume \
This page took 0.05256 seconds and 4 git commands to generate.