#! /bin/bash set -e BIN=$HOME/bin STATUS_DIR=$HOME/var/run/status STATUS_FILE__WIFI=$STATUS_DIR/wifi STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF=$STATUS_DIR/notified_energy_bellow_half #load=$(cat /proc/loadavg | awk '{printf "%4.2f %4.2f %4.2f", $1, $2, $3}') fan=$(awk '/^speed:/ {printf "%4d", $2}' /proc/acpi/ibm/fan) cpu=$($BIN/khatus_cpu_usage_from_proc_since_last_check) memory=$( free \ | awk ' function round(n) {return int(n + 0.5)} $1 == "Mem:" { total=$2; used=$3; cache=$6; prev_file = "/home/siraaj/var/run/status/memory_used_percentage"; curr = round(used / total * 100); getline prev < prev_file; print curr > prev_file; if (curr > prev) { direction = ">"; } else if (curr < prev) { direction = "<"; } else { direction = "="; } printf("%s%d%%", direction, curr); }') temp=$(awk 'NR == 1 {print $1 / 1000}' /sys/class/thermal/thermal_zone0/temp) disk_io=$( awk ' { bytes_per_sector = 512 bytes_per_unit = 1024 * 1024 curr_sectors_read = $3 curr_sectors_write = $7 prev_file_prefix = "/home/siraaj/var/run/status/disk_io" prev_sectors_read_file = prev_file_prefix "_sectors_read" prev_sectors_write_file = prev_file_prefix "_sectors_write" getline prev_sectors_read < prev_sectors_read_file getline prev_sectors_write < prev_sectors_write_file diff_read_sectors = (curr_sectors_read - prev_sectors_read) diff_write_sectors = (curr_sectors_write - prev_sectors_write) diff_read_bytes = diff_read_sectors * bytes_per_sector diff_write_bytes = diff_write_sectors * bytes_per_sector diff_read = diff_read_bytes / bytes_per_unit diff_write = diff_write_bytes / bytes_per_unit print curr_sectors_read > prev_sectors_read_file print curr_sectors_write > prev_sectors_write_file printf("%0.3f▲ %0.3f▼\n", diff_write, diff_read); } ' /sys/block/dm-1/stat ) disk=$( df \ | awk -v disk_io="$disk_io" ' function round(n) {return int(n + 0.5)} $1 == "/dev/mapper/kubuntu--vg-root" { curr_perc = $5; sub("%$", "", curr_perc); prev_perc_file = "/home/siraaj/var/run/status/disk_space_used"; getline prev_perc < prev_perc_file; print curr_perc > prev_perc_file; if (curr_perc > prev_perc) { direction = ">"; } else if (curr_perc < prev_perc) { direction = "<"; } else { direction = "="; } printf("%s[%d%% %s]", direction, curr_perc, disk_io); }') network=$( awk -v wifi_conn=$(cat $STATUS_FILE__WIFI) ' BEGIN { bytes_per_unit = 1024 * 1024 } NR > 2 { device = $1; sub(":$", "", device); curr_read = $2; curr_write = $10; prev_file_prefix = "/home/siraaj/var/run/status/io_net_" device; prev_read_file = prev_file_prefix "_read"; prev_write_file = prev_file_prefix "_write"; getline prev_read < prev_read_file; getline prev_write < prev_write_file; diff_read = (curr_read - prev_read ) / bytes_per_unit; diff_write = (curr_write - prev_write) / bytes_per_unit; print curr_read > prev_read_file; print curr_write > prev_write_file; devices[device] = sprintf("%0.3f▲ %0.3f▼", diff_write, diff_read); } END { lo = devices["lo"] #eth = devices["enp0s25"] wifi = devices["wlp3s0"] printf("[%s | %s %s]", lo, wifi_conn, wifi) } ' /proc/net/dev ) energy=$( upower -e \ | grep battery \ | xargs upower -i \ | awk ' /^ +percentage: +/ {percentage=$2} /^ +state: +/ {state=$2} END { if (state == "discharging") { direction_of_change = "<" } else if (state == "charging") { direction_of_change = ">" } else { direction_of_change = "=" }; printf("%s%s", direction_of_change, percentage) }') datetime=$(date +'%a, %b %d, %H:%M:%S') #volume_amixer=$( # amixer get Master \ # | tail -1 \ # | awk ' # { # level = $4; # sub("^\\[", "", level); # sub("\\]$", "", level); # print level; # }' \ # ) #volume_amixer=$( # amixer get Master \ # | tail -n 1 \ # | awk '{print $4}' \ # | tr -d '[]' #) volume_pactl=$( pactl list sinks \ | awk ' /^\tMute:/ { printf("%s,", $0); } /^\tVolume:/ { for (i=2; i<=NF; i++) printf(" %s", $i); }' \ | awk -v RS=',' ' /^[ \t]*Mute:/ {mute = $2} /^[ \t]*front-left:/ {left = $4} /^[ \t]*front-right:/ {right = $4} END { if (mute == "yes") { printf("x") } else { printf("%s %s", left, right) } } ' ) volume="[$volume_pactl]" screen_brightness=$( max=$(cat /sys/class/backlight/acpi_video0/max_brightness) cur=$(cat /sys/class/backlight/acpi_video0/brightness) awk -v max=$max -v cur=$cur 'BEGIN {printf("%d%%", cur/max*100)}' ) #bluetooth_status=$( # grep '^status:' /proc/acpi/ibm/bluetooth \ # | awk ' # $2 == "disabled" {printf "off"} # $2 == "enabled" {printf "on"} # ' #) bluetooth_power=$( 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", power_status); }' ) #touchpad_status=$( # xinput list-props 12 \ # | awk ' # /^\tDevice Enabled \([0-9]+\):/ { # status = $4; # printf("%s", status); # }' #) #color_off='\033[0m' #color_on_bg_gray='\033[m\033[40m' energy_direction=$(echo "$energy" | cut -b 1) energy_percentage=$(echo "$energy" | tr -d '<>=%') if [[ "$energy_direction" = '<' ]] then if [[ $energy_percentage -le 5 ]] then DISPLAY=:0.0 notify-send \ -u critical \ "Energy CRITICALLY low: $energy" \ 'CHARGE NOW!!! GO GO GO!!!' elif [[ $energy_percentage -le 10 ]] then DISPLAY=:0.0 notify-send \ -u critical \ "Energy VERY low: $energy" \ 'Plug it in ASAP.' elif [[ $energy_percentage -le 15 ]] then DISPLAY=:0.0 notify-send \ -u critical \ "Energy low: $energy" \ 'Get the charger.' elif [[ $energy_percentage -le 50 ]] then if [[ ! -a "$STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF" ]] then DISPLAY=:0.0 notify-send \ -u normal \ "Energy bellow half: $energy" \ 'Where is the charger?' touch "$STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF" fi fi else rm -f "$STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF" fi weather=$(awk 'NR == 1 {printf("%d°F", $1)}' ~/var/run/metar-KJFK-decoded-temp-fahrenheit) signal_last_msg_age=$( ls -lt --time-style=+%s $HOME/var/lib/signal/latest_message.json \ | awk -v now_seconds=$(date +%s) \ '{ mtime_seconds = $6; seconds = now_seconds - mtime_seconds; minutes = seconds / 60; hours = minutes / 60; days = hours / 24; weeks = days / 7; months = days / 30; #fmt = "%.1f"; fmt = "%d"; #printf(fmt " s\n", seconds); printf(fmt " m\n", minutes); printf(fmt " h\n", hours); printf(fmt " d\n", days); printf(fmt " w\n", weeks); printf(fmt " mo\n", months); }' \ | awk '$1 >= 1' \ | sort -n -k 1 \ | head -1 \ | tr -d ' ' ) mpd_state=$( echo 'status' \ | nc 127.0.0.1 6600 \ | awk ' { status[$1] = $2 } END { state = status["state:"] symbol = "-" if (state == "play") { symbol = "▶" } else if (state == "pause") { symbol = "❚❚" } else if (state == "stop") { symbol = "⬛" } printf("%s", symbol) } ' ) echo \ "\ E$energy\ \ \ M$memory\ \ \ C=[$cpu ${temp}°C ${fan}rpm]\ \ \ D$disk\ \ \ N:$network\ \ \ B:$bluetooth_power\ \ \ S=$screen_brightness\ \ \ V=$volume\ \ $mpd_state\ \ $signal_last_msg_age\ \ $weather\ \ $datetime \ "