diff --git a/usr/lib/byobu/battery b/usr/lib/byobu/battery index be544596..9abb3c6b 100755 --- a/usr/lib/byobu/battery +++ b/usr/lib/byobu/battery @@ -21,14 +21,6 @@ PKG="byobu" color 2>/dev/null || color() { true; } -search () { - local str expr - str="$1" - expr="$2" - echo "$str" | sed -n "s/${expr}/\1/p" -} - - if [ "$1" = "--detail" ]; then for bat in /proc/acpi/battery/*; do cat "$bat/info" @@ -37,46 +29,56 @@ if [ "$1" = "--detail" ]; then exit 0 fi -for bat in $BATTERY /proc/acpi/battery/*; do - # make sure that this battery is present - infofile=$(cat "$bat/info") - present=$(search "$infofile" "present: *\(.*\)") - [ "${present}" = "no" ] && continue +battery_info() { + local bat line present sign state percent full rem color bcolor + for bat in $BATTERY /proc/acpi/battery/*; do + [ -f "$bat/info" ] || continue - # obtain full and remaining battery values - statefile=$(cat "$bat/state") - full=$(search "$infofile" "last full capacity: *\(.*\) m[AW]h") - rem=$(search "$statefile" "remaining capacity: *\(.*\) m[AW]h") + present=""; full=""; rem=""; state="" + while read line; do + set -- ${line} + case "$line" in + present:*) + # make sure that this battery is present + [ "$2" = "no" ] && continue 2 + present="$2";; + last\ full\ capacity:*) full="$4";; + esac + [ -n "$present" -a -n "$full" ] && break + done < "${bat}/info" - percent=$( echo "$rem" "$full" | awk '{printf "%.0f", 100*$1/$2}') - if [ "$percent" -lt 33 ]; then - color="R k" - bcolor="b R k" - elif [ "$percent" -lt 67 ]; then - color="Y k" - bcolor="b Y k" - else - color="G k" - bcolor="b G k" - fi - percent="$percent%" + while read line; do + set -- ${line} + case "$line" in + remaining\ capacity:*) rem="$3";; + charging\ state:*) state="$3";; + esac + [ -n "$rem" -a -n "$state" ] && break + done < "$bat/state" - state=$(search "$statefile" "charging state: *\(.*\)") - case $state in - charging) - sign="+" - ;; - discharging) - sign="-" - ;; - charged) - sign="=" - percent= - ;; - *) - sign="$state" - ;; - esac - color $bcolor; printf "%s" "$percent"; color -; color $color; printf "|%s|" "$sign"; color -- - break -done + percent=$(((100*$rem)/$full)) + + if [ "$percent" -lt 33 ]; then + color="R k" + bcolor="b R k" + elif [ "$percent" -lt 67 ]; then + color="Y k" + bcolor="b Y k" + else + color="G k" + bcolor="b G k" + fi + percent="$percent%" + + case $state in + charging) sign="+" ;; + discharging) sign="-" ;; + charged) sign="="; percent="" ;; + *) sign="$state" ;; + esac + color $bcolor; printf "%s" "$percent"; color -; color $color; printf "|%s|" "$sign"; color -- + break + done +} + +battery_info "$@" diff --git a/usr/lib/byobu/cpu_temp b/usr/lib/byobu/cpu_temp index 90cbae9e..2845b912 100755 --- a/usr/lib/byobu/cpu_temp +++ b/usr/lib/byobu/cpu_temp @@ -36,7 +36,7 @@ fi for i in $MONITORED_TEMP /sys/class/hwmon/hwmon*/temp*_input /proc/acpi/ibm/thermal $DIR/*/temperature; do case "$i" in *temp*_input) - [ -s "$i" ] && t=$(awk '{printf "%0.f",$1/1000}' "$i") + [ -s "$i" ] && read t < "$i" && t=$(($t/1000)) ;; *) [ -s "$i" ] && t=$(sed -e "s/^[^0-9]\+//" -e "s/\s.*$//" "$i") @@ -45,7 +45,7 @@ for i in $MONITORED_TEMP /sys/class/hwmon/hwmon*/temp*_input /proc/acpi/ibm/ther if [ -n "$t" ]; then unit="$ICON_C" if [ "$TEMP" = "F" ]; then - t=$(echo "$t" | awk '{printf "%.0f", $1 *9/5 + 32}') + t=$(($t*9/5 + 32)) unit="$ICON_F" fi color b k Y; printf "%s" "$t"; color -; color k Y; printf "%s%s" "$ICON" "$unit"; color -- diff --git a/usr/lib/byobu/date b/usr/lib/byobu/date index d5129afd..5d87ff54 100755 --- a/usr/lib/byobu/date +++ b/usr/lib/byobu/date @@ -25,8 +25,10 @@ case "$1" in date +%Y-%m-%d ;; *) - msg="$(echo SGFwcHkgQmlydGhkYXkgU2NyZWVuIC0tIGh0dHA6Ly9iaXQubHkvc2NyZWVuLWJkYXkK | base64 -di)" - [ "$(date +%d)" = "20" ] && [ "$(date +%m)" = "03" ] && screen -X -S "byobu" at "*" echo "[$msg]" + bd=$(date "+%m%d") + [ "$bd" = "0320" ] && + msg="$(echo SGFwcHkgQmlydGhkYXkgU2NyZWVuIC0tIGh0dHA6Ly9iaXQubHkvc2NyZWVuLWJkYXkK | base64 -di)" && + screen -X -S "byobu" at "*" echo "[$msg]" printf "\005Y-\005m-\005d " ;; esac diff --git a/usr/lib/byobu/disk b/usr/lib/byobu/disk index d616614a..2150753d 100755 --- a/usr/lib/byobu/disk +++ b/usr/lib/byobu/disk @@ -28,9 +28,26 @@ fi # Default to /, but let users override [ -z "$MONITORED_DISK" ] && MP="/" || MP="$MONITORED_DISK" case $MP in - /dev/*) MP=$(grep "$MP" /proc/mounts | awk '{print $2}') ;; + /dev/*) MP=$(awk '$1 == m { print $2; exit(0); }' "m=$MP" /proc/mounts);; esac -disk=$(df -h -P "$MP" 2>/dev/null || df -h "$MP") -disk=$(echo "$disk" | tail -n 1 | awk '{print $2 " " $5}' | sed "s/\([^0-9\. ]\)/ \1/g" | awk '{printf "%d%sB,%d%%", $1, $2, $3}') -printf "$(color M W)%s$(color -) " "$disk" | sed "s/\([0-9]\+\)/$(color -)$(color b M W)\1$(color -)$(color M W)/g" +get_size_pct() { + # this could be done faster with 'stat --file-system --format' + # but then we'd have to do blocks -> human units ourselves + local out="" MP=$1 size="" pct="" unit="" + out=$({ df -h -P "$MP" 2>/dev/null || df -h "$MP"; } | + awk 'END { printf("%s %s", $2, $5); }') + set -- ${out} + size=${1}; pct=${2}; + + unit=${size#${size%?}} # get the unit (last char) + size=${size%?}; # take the unit off + pct=${pct%?}; # take off the '%' + + _UNIT=${unit}; _SIZE=${size}; _PCT=${pct}; +} + +get_size_pct "${MP}" + +color b M W; echo -n "$_SIZE"; color -; color M W; echo -n "${_UNIT}B,"; color -; +color b M W; echo -n "$_PCT"; color -; color M W; echo -n "%" ; color -; diff --git a/usr/lib/byobu/fan_speed b/usr/lib/byobu/fan_speed index 94d767b1..fc6219bb 100755 --- a/usr/lib/byobu/fan_speed +++ b/usr/lib/byobu/fan_speed @@ -28,25 +28,35 @@ DIR="/sys/class/hwmon" # Let's check a few different probes for fan speed -# This seems to cover most of them: -for i in $(find $DIR/*/*/ -type f -name "fan1_input"); do - speed=$(cat "$i") - if [ "$speed" -gt 0 ]; then - color bold1; printf "%s" "$speed"; color -; color none; printf "rpm"; color -- - exit 0 - fi -done - -# But others (e.g. Dell Inspirons) seem to be here: -if [ -r /proc/i8k ]; then - for speed in $(awk '{ print $7, $8 }' /proc/i8k); do +fan_speed_info() { + local i="" speed=0 + # This seems to cover most of them: + for i in /sys/class/hwmon/*/*/fan1_input; do + [ -f "$i" ] || continue + read speed < "$i" if [ "$speed" -gt 0 ]; then - # I8K_FAN_MULT defaults to 30 (buggy BIOS workaround?), - # use `modprobe i8k fan_mult=1` to disable if unneeded, - # resulting in nonsensical speeds - [ "$speed" -gt 10000 ] && speed=$((${speed} / 30)) color bold1; printf "%s" "$speed"; color -; color none; printf "rpm"; color -- - exit 0 + return 0 fi done -fi + + # But others (e.g. Dell Inspirons) seem to be here: + if [ -r /proc/i8k ]; then + local line="" + read line < /proc/i8k + set -- $line + for speed in $7 $8; do + if [ "$speed" -gt 0 ]; then + # I8K_FAN_MULT defaults to 30 (buggy BIOS workaround?), + # use `modprobe i8k fan_mult=1` to disable if unneeded, + # resulting in nonsensical speeds + [ "$speed" -gt 10000 ] && speed=$((${speed} / 30)) + color bold1; printf "%s" "$speed"; color -; color none; printf "rpm"; color -- + return 0 + fi + done + fi +} + +fan_speed_info "$@" + diff --git a/usr/lib/byobu/ip_address b/usr/lib/byobu/ip_address index 659ac84f..c8388095 100755 --- a/usr/lib/byobu/ip_address +++ b/usr/lib/byobu/ip_address @@ -35,8 +35,10 @@ if [ -n "$MONITORED_NETWORK" ]; then interface="$MONITORED_NETWORK" else case "$IPV6" in - 1|true|yes) interface=$(grep -v "\Wlo$" /proc/net/ipv6_route | tail -n1 | awk '{print $10}') ;; - *) interface=$(tail -n1 /proc/net/route | awk '{print $1}') ;; + 1|true|yes) + interface=$(awk '$10 != "lo" { iface=$10 ; }; END { print iface; }' \ + /proc/net/ipv6_route);; + *) interface=$(awk 'END {print $1}' /proc/net/route);; esac fi diff --git a/usr/lib/byobu/mem_available b/usr/lib/byobu/mem_available index f71ad79a..970680a1 100755 --- a/usr/lib/byobu/mem_available +++ b/usr/lib/byobu/mem_available @@ -26,19 +26,26 @@ if [ "$1" = "--detail" ]; then exit 0 fi -. "$DATA/status" -[ "$mem_used" = "1" ] && comma="," || whitespace=" " +mem_available_info() { + local mem_used comma whitespace unit mem name + . "$DATA/status" + [ "$mem_used" = "1" ] && comma="," || whitespace=" " -mem=`head -n1 /proc/meminfo | awk '{print $2}'` -if [ $mem -ge 1048576 ]; then - mem=$(echo "$mem" | awk '{ printf "%.1f", $1 / 1048576 }') - unit="GB" -elif [ $mem -ge 1024 ]; then - mem=$(echo "$mem" | awk '{ printf "%.0f", $1 / 1024 }') - unit="MB" -else - mem="$mem" - unit="KB" -fi + read name mem unit < /proc/meminfo + if [ $mem -ge 1048576 ]; then + fpdiv "$mem" 1048567 1 + mem=${_RET} + unit="GB" + elif [ $mem -ge 1024 ]; then + mem=$(echo "$mem" | awk '{ printf "%.0f", $1 / 1024 }') + fpdiv "$mem" 1024 1 + mem=${_RET} + unit="MB" + else + mem="$mem" + unit="KB" + fi + color b g W; printf "%s" "$mem"; color -; color g W; printf "%s%s" "$unit" "$comma"; color -; printf "%s" "$whitespace" +} -color b g W; printf "%s" "$mem"; color -; color g W; printf "%s%s" "$unit" "$comma"; color -; printf "%s" "$whitespace" +mem_available_info "$@" diff --git a/usr/lib/byobu/mem_used b/usr/lib/byobu/mem_used index add4f150..a45dd116 100755 --- a/usr/lib/byobu/mem_used +++ b/usr/lib/byobu/mem_used @@ -25,5 +25,41 @@ if [ "$1" = "--detail" ]; then exit 0 fi -f=$(free | awk '/buffers\/cache:/ {printf "%.0f", 100*$3/($3 + $4)}') +meminfo_used() { + # originally, this script did: + # f=$(free | awk '/buffers\/cache:/ {printf "%.0f", 100*$3/($3 + $4)}') + # this method is more dependent on /proc/meminfo, but uses the same formula + # for deriving the output of 'free' that is used in procps 'free.c' + + # kb_main_free, kb_main_total, kb_main_buffers, kb_main_cached + local free="" total="" buffers="" cached="" + local kb_main_used=0 buffers_plus_cached=0 fo_buffers=0 fo_cached=0 + while read tok val unit; do + case "$tok" in + MemTotal:) total=${val};; + MemFree:) free=${val};; + Buffers:) buffers=${val};; + Cached:) cached=${val};; + esac + [ -n "${free}" -a -n "${total}" -a -n "${buffers}" -a -n "${cached}" ] && break; + done < /proc/meminfo + + kb_main_used=$(($total-$free)) + buffers_plus_cached=$(($buffers+$cached)) + + # "free output" buffers and cache (output from 'free') + fo_buffers=$(($kb_main_used - $buffers_plus_cached)) + fo_cached=$(($kb_main_free + $buffers_plus_cached)) + + #fpdiv $((100*${fo_buffers})) "${total}" 0; _RET=${_RET%.}; return + _RET=$(((100*${fo_buffers}) / ${total})) +} + +if [ -r /proc/meminfo ]; then + meminfo_used + f=${_RET} +else + f=$(free | awk '/buffers\/cache:/ {printf "%.0f", 100*$3/($3 + $4)}') +fi + color b g W; printf "%s" "$f"; color -; color g W; printf "%%"; color -- diff --git a/usr/lib/byobu/raid b/usr/lib/byobu/raid index 9f0fde45..79a0c6cf 100755 --- a/usr/lib/byobu/raid +++ b/usr/lib/byobu/raid @@ -29,16 +29,18 @@ case $1 in ;; esac -if grep -qs " blocks .*\[.*_.*\]$" /proc/mdstat; then +pct="%" +while read line; do # Errors in your raid - msg="RAID" -fi - -if grep -qs \% /proc/mdstat; then - p=$(grep -m1 \% /proc/mdstat | sed -e "s/\%.*/%/" -e "s/.* //") - [ -z "$msg" ] && msg="RAID" - msg="$msg,$p" -fi + case "$line" in + *\ blocks\ *\[*_*\]$) + [ -z "${msg}" ] && msg="RAID";; + *%*) + p="${line%%${pct}*}${pct}"; p=${p##* }; + [ -z "$msg" ] && msg="RAID" + msg="$msg,$p";; + esac +done < /proc/mdstat if [ -n "$msg" ]; then color B w r; printf "%s" "$msg"; color -- diff --git a/usr/lib/byobu/release b/usr/lib/byobu/release index 06181abb..6e0d7fdd 100755 --- a/usr/lib/byobu/release +++ b/usr/lib/byobu/release @@ -25,45 +25,54 @@ if [ "$1" = "--detail" ]; then exit 0 fi -if [ -n "$DISTRO" ]; then - # user defined - true -elif [ -r "/etc/issue" ]; then - # lsb_release is *really* slow; try to use /etc/issue first - issue=$(grep -m1 "^[A-Za-z]" /etc/issue) - case "$issue" in - Ubuntu*) - DISTRO=$(head -n1 /etc/issue | awk '{print $1 " " $2}') - ;; - Debian*) - DISTRO="Debian $(cat /etc/debian_version)" - ;; - *) - DISTRO=$(echo "$issue" | sed "s/ [^0-9]* / /" | awk '{print $1 " " $2}') - ;; - esac -elif which lsb_release >/dev/null 2>&1; then - if [ "$1" = "--detail" ]; then - lsb_release -a 2>/dev/null - exit 0 +release_info() { + local DISTRO="${DISTRO}" issue ver r i + if [ -n "$DISTRO" ]; then + # user defined + true + elif [ -r "/etc/issue" ]; then + # lsb_release is *really* slow; try to use /etc/issue first + read issue < /etc/issue + case "$issue" in + Ubuntu*) + set -- $issue; + DISTRO="$1 $2"; + ;; + Debian*) + read ver < /etc/debian_version + DISTRO="Debian $ver" + ;; + *) + # assume first 2 fields are what we want + set -- $issue; + DISTRO="$1 $2"; + ;; + esac + elif command -v lsb_release >/dev/null 2>&1; then + if [ "$1" = "--detail" ]; then + lsb_release -a 2>/dev/null + exit 0 + fi + # If lsb_release is available, use it + r=$(lsb_release -s -d) + case "$r" in + Ubuntu*.*.*) + # Use the -d if an Ubuntu LTS + DISTRO="$r" + ;; + *) + # But for other distros the description + # is too long, so build from -i and -r + i=$(lsb_release -s -i) + r=$(lsb_release -s -r) + DISTRO="$i $r" + ;; + esac + else + DISTRO="Byobu" fi - # If lsb_release is available, use it - r=$(lsb_release -s -d) - case "$r" in - Ubuntu*.*.*) - # Use the -d if an Ubuntu LTS - DISTRO="$r" - ;; - *) - # But for other distros the description - # is too long, so build from -i and -r - i=$(lsb_release -s -i) - r=$(lsb_release -s -r) - DISTRO="$i $r" - ;; - esac -else - DISTRO="Byobu" -fi -color bold2; printf "%s" "$DISTRO"; color -- + color bold2; printf "%s" "$DISTRO"; color -- +} + +release_info "$@" diff --git a/usr/lib/byobu/swap b/usr/lib/byobu/swap index b2732e77..e0a38361 100755 --- a/usr/lib/byobu/swap +++ b/usr/lib/byobu/swap @@ -25,19 +25,40 @@ if [ "$1" = "--detail" ]; then exit 0 fi -f=$(free | awk '/Swap:/ {printf "%.0f", 100*$3/($3 + $4)}' 2>/dev/null || echo 0) -mem=$(free | awk '/Swap:/ {print $2}') -if [ $mem -ge 1048576 ]; then - mem=$(echo "$mem" | awk '{ printf "%.1f", $1 / 1048576 }') - unit="GB" -elif [ $mem -ge 1024 ]; then - mem=$(echo "$mem" | awk '{ printf "%.0f", $1 / 1024 }') - unit="MB" -else - mem="$mem" - unit="KB" -fi +swap_info() { + local stotal="" sfree="" name val unit mem f; + while read name val unit; do + if [ "$name" = "SwapTotal:" ]; then + stotal="$val" + elif [ "$name" = "SwapFree:" ]; then + sfree="$val" + else + continue + fi + [ -n "$stotal" -a -n "$sfree" ] && break; + done < /proc/meminfo -[ "$f" = "0" ] && exit 0 + [ "${stotal:-0}" = "0" ] && return 0 -color b G W; printf "s%s" "$mem"; color -; color G W; printf "%s," "$unit"; color -; color b G W; printf "%s" "$f"; color -; color G W; printf "%%"; color -- + mem=${stotal} + f=$(((100*($stotal-$sfree))/$stotal)) + [ "$f" = "0" ] && return 0 + if [ $mem -ge 1048576 ]; then + fpdiv "${mem}" 1048576 1 + mem=${_RET} + unit="GB" + elif [ $mem -ge 1024 ]; then + fpdiv "${mem}" 1024 0 + mem=${_RET%.} + unit="MB" + else + mem="$mem" + unit="KB" + fi + + color b G W; printf "s%s" "$mem"; color -; color G W; printf "%s," "$unit"; color -; + color b G W; printf "%s" "$f"; color -; color G W; printf "%%"; color -- + return +} + +swap_info "$@" diff --git a/usr/lib/byobu/updates_available b/usr/lib/byobu/updates_available index 7181d4cc..4e7f3e76 100755 --- a/usr/lib/byobu/updates_available +++ b/usr/lib/byobu/updates_available @@ -22,12 +22,12 @@ DATA="$HOME/.$PKG" color 2>/dev/null || color() { true; } if [ "$1" = "--detail" -o "$1" = "--short" ]; then - if which apt-get >/dev/null; then + if command -v apt-get >/dev/null; then detail=`apt-get -s -o Debug::NoLocking=true upgrade` if [ "$1" = "--detail" ]; then printf "$detail" else - short=`printf "$detail" | grep -c ^Inst` + short=`printf "%s" "$detail" | grep -c ^Inst` printf "$short" fi fi @@ -61,18 +61,18 @@ update_cache() { # and let the next cache check pick up the results. if [ -x /usr/lib/update-notifier/apt-check ]; then # If apt-check binary exists, use it - /usr/lib/update-notifier/apt-check 2>&1 | tail -n 1 | sed "s/;/ /" > $mycache & - elif which apt-get >/dev/null; then + /usr/lib/update-notifier/apt-check 2>&1 | awk '-F;' 'END { print $1, $2 }' > "$mycache" & + elif command -v apt-get >/dev/null; then # If apt-get exists, use it apt-get -s -o Debug::NoLocking=true upgrade | grep -c ^Inst > $mycache & - elif which zypper >/dev/null; then + elif command -v zypper >/dev/null; then # If zypper exists, use it zypper --no-refresh lu --best-effort | grep -c 'v |' > $mycache & - elif which yum >/dev/null; then + elif command -v yum >/dev/null; then # If yum exists, use it # TODO: We need a better way of counting updates available from a RH expert yum list updates -q | grep -vc "Updated Packages" > $mycache & - elif which pacman >/dev/null; then + elif command -v pacman >/dev/null; then # If pacman (Archlinux) exists, use it LC_ALL=C pacman -Sup | grep -vc "^\(::\| \)" > $mycache & fi @@ -84,11 +84,11 @@ update_needed() { mycache=$1 # The cache doesn't exist: create it [ ! -e "$mycache" ] && return 0 - if which apt-get >/dev/null; then + if command -v apt-get >/dev/null; then # Debian/ubuntu [ "/var/lib/apt" -nt "$mycache" ] || [ "/var/lib/apt/lists" -nt "$mycache" ] return $? - elif which pacman >/dev/null; then + elif command -v pacman >/dev/null; then # Archlinux for db in /var/lib/pacman/sync/*.db; do [ "$db" -nt "$mycache" ] && return 0 @@ -102,7 +102,7 @@ update_needed() { mycache="$DIR/$PKG.updates-available" # If mycache is present, use it -[ -r $mycache ] && print_updates `grep "^[0-9]" $mycache | sed "s/ .*$//"` +[ -r $mycache ] && print_updates `sed -n '/[^0-9]/s/ .*$//p' $mycache` # If we really need to do so (mycache doesn't exist, or the package database has changed), # background an update now