373 lines
8.7 KiB
Bash
Executable File
373 lines
8.7 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# shutil: some shared utilities used by all status scripts
|
|
#
|
|
# Copyright (C) 2011-2023 Dustin Kirkland
|
|
#
|
|
# Authors: Dustin Kirkland <kirkland@byobu.org>
|
|
# Scott Moser <smoser@ubuntu.com>
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, version 3 of the License.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# Define colors
|
|
color_screen() {
|
|
ESC="\005"
|
|
case "$1" in
|
|
"") return 0 ;;
|
|
-) printf "$ESC{-}" ;;
|
|
--) printf "$ESC{-} " ;;
|
|
esc) printf "$ESC" ;;
|
|
bold1) printf "$ESC{=b }" || printf "$ESC{= }" ;;
|
|
bold2) printf "$ESC{+b }" || printf "$ESC{= }" ;;
|
|
none) printf "$ESC{= }" ;;
|
|
invert) printf "$ESC{=r }" ;;
|
|
*)
|
|
local attr fg bg
|
|
case $# in
|
|
2)
|
|
attr= ; fg=$1 ; bg=$2
|
|
;;
|
|
3)
|
|
attr=$1 ; fg=$2 ; bg=$3
|
|
;;
|
|
esac
|
|
if [ "$MONOCHROME" = "1" ]; then
|
|
fg=
|
|
bg=
|
|
fi
|
|
printf "$ESC{=$attr $fg$bg}"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
color_map() {
|
|
case "$1" in
|
|
"k") _RET="black" ;;
|
|
"r") _RET="red" ;;
|
|
"g") _RET="green" ;;
|
|
"y") _RET="yellow" ;;
|
|
"b") _RET="blue" ;;
|
|
"m") _RET="magenta" ;;
|
|
"c") _RET="cyan" ;;
|
|
"w") _RET="white" ;;
|
|
"d") _RET="black" ;;
|
|
"K") _RET="brightblack" ;;
|
|
"R") _RET="brightred" ;;
|
|
"G") _RET="brightgreen" ;;
|
|
"Y") _RET="brightyellow" ;;
|
|
"B") _RET="brightblue" ;;
|
|
"M") _RET="brightmagenta" ;;
|
|
"C") _RET="brightcyan" ;;
|
|
"W") _RET="brightwhite" ;;
|
|
*) _RET="$1" ;;
|
|
esac
|
|
}
|
|
|
|
attr_map() {
|
|
case "$1" in
|
|
"d") _RET=,dim ;;
|
|
"u") _RET=,underscore ;;
|
|
"b") _RET=,bold ;;
|
|
"r") _RET=,reverse ;;
|
|
"s") _RET=,standout ;;
|
|
"B") _RET=,blinking ;;
|
|
"h") _RET=,hidden ;;
|
|
"i") _RET=,italics ;;
|
|
*) _RET= ;;
|
|
esac
|
|
}
|
|
|
|
color_tmux() {
|
|
local back fore attr
|
|
case "$1" in
|
|
"") return 0 ;;
|
|
-) printf "#[default]#[fg=$BYOBU_LIGHT,bg=$BYOBU_DARK]" ;;
|
|
--) printf "#[default]#[fg=$BYOBU_LIGHT]#[bg=$BYOBU_DARK] " ;;
|
|
esc) printf "" ;;
|
|
bold*) printf "#[default]#[fg=bold]" ;;
|
|
none) printf "#[default]#[fg=$BYOBU_LIGHT,bg=$BYOBU_DARK]" ;;
|
|
invert) printf "#[default]#[reverse]" ;;
|
|
*)
|
|
if [ "$#" = "2" ]; then
|
|
color_map "$1"; back="$_RET"
|
|
color_map "$2"; fore="$_RET"
|
|
else
|
|
attr_map "$1"; attr="$_RET"
|
|
color_map "$2"; back="$_RET"
|
|
color_map "$3"; fore="$_RET"
|
|
fi
|
|
[ "$MONOCHROME" = "1" ] && printf "#[default]" || printf "#[default]#[fg=$fore$attr,bg=$back]"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
color() {
|
|
case "$BYOBU_BACKEND" in
|
|
tmux)
|
|
color_tmux "$@"
|
|
;;
|
|
screen)
|
|
color_screen "$@"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# uncommented_lines(char=#)
|
|
# does the standard input have lines that do not start with 'char'?
|
|
uncommented_lines() {
|
|
local line chr="${1:-#}"
|
|
while read line; do
|
|
[ "${line#${chr}}" = "${line}" ] && return 0;
|
|
done
|
|
return 1
|
|
}
|
|
|
|
# newest(file,file,file..)
|
|
# return the newest file in the list
|
|
newest() {
|
|
local c="$1" i
|
|
for i in "$@"; do [ "$i" -nt "$c" ] && c="$i"; done
|
|
[ -e "$c" ] && _RET="$c"
|
|
}
|
|
|
|
error() {
|
|
printf "%s\n" "ERROR: " "$@" 1>&2
|
|
}
|
|
|
|
fail() {
|
|
[ $# -eq 0 ] || error "$@"; exit 1;
|
|
}
|
|
|
|
find_script() {
|
|
# Allow for local status scripts
|
|
if [ -x "$BYOBU_CONFIG_DIR/bin/$1" ]; then
|
|
_RET="$BYOBU_CONFIG_DIR/bin/$1"
|
|
elif [ -x "$BYOBU_PREFIX/lib/$PKG/$1" ]; then
|
|
_RET="$BYOBU_PREFIX/lib/$PKG/$1"
|
|
elif [ -x "$BYOBU_PREFIX/libexec/$PKG/$1" ]; then
|
|
_RET="$BYOBU_PREFIX/libexec/$PKG/$1"
|
|
else
|
|
_RET="/dev/null"
|
|
fi
|
|
}
|
|
|
|
# divide 2 integers and return a floating point number
|
|
# third argument indicates how many digits after the decimal
|
|
fpdiv() {
|
|
local a=$1 b=$2 pres=${3:-3}
|
|
local i=0 mp="10" whole="" part="" chunk="" n=0
|
|
while i=$(($i+1)) && [ $i -le $pres ]; do
|
|
mp="${mp}0"
|
|
chunk="${chunk}?"
|
|
done
|
|
|
|
n=$(((${mp}*${a})/${b}))
|
|
|
|
# round up if necessary
|
|
[ $((($n-5)/10)) = $(($n/10)) ] && n=$(($n+5))
|
|
|
|
# drop the last digit, which was only there for rounding
|
|
n=${n%?}
|
|
whole=${n%${chunk}}
|
|
part=${n#${whole}}
|
|
_RET=${whole:-0}${part:+.${part}}
|
|
return
|
|
}
|
|
|
|
# rtrim(string,chars)
|
|
rtrim() {
|
|
local tab=' ' cr="
|
|
"
|
|
local cur="${1}" set="[${2:- ${tab}${cr}}]" n=""
|
|
while n=${cur%${set}} && [ "$n" != "$cur" ]; do cur=${n}; done
|
|
_RET=${cur}
|
|
}
|
|
|
|
readfile() {
|
|
local c="" r="" cr="
|
|
"
|
|
OIFS="$IFS"; IFS="";
|
|
while read c; do
|
|
r="$r${cr}$c"
|
|
done
|
|
IFS=$OIFS
|
|
_RET=${r}
|
|
return 0
|
|
}
|
|
|
|
metadata_available() {
|
|
# This is really ugly. We need a reliable, fast way of determining
|
|
# if a metadata service is available, that does NOT slow down non-ec2
|
|
# machines.
|
|
local x=0 cache="$BYOBU_CONFIG_DIR/.metadata_available"
|
|
# First, check the cache
|
|
if [ -s "$cache" ]; then
|
|
# Metadata is non-empty, so we have metadata available
|
|
x=1
|
|
else
|
|
# Must seed the cache
|
|
if [ -e /etc/ec2_version ] || [ -e /usr/sbin/update-grub-legacy-ec2 ]; then
|
|
# This *looks* like a machine with metadata, so background a potentially slow check
|
|
timeout 1 wget -q -O- --tries=1 http://169.254.169.254 </dev/null >"$cache" 2>/dev/null &
|
|
sleep 0.02
|
|
[ -s "$cache" ] && x=1
|
|
fi
|
|
fi
|
|
[ "$x" = "1" ]
|
|
}
|
|
|
|
status_freq() {
|
|
# Define status frequencies
|
|
# Use prime number intervals, to decrease collisions, which
|
|
# yields some less expensive status updates.
|
|
# ~86000 ~1 day
|
|
# ~600 ~10 minutes
|
|
# ~180 ~3 minutes
|
|
# ~60 ~1 minute
|
|
case "$1" in
|
|
apport) _RET=67 ;;
|
|
arch) _RET=9999991 ;;
|
|
battery) _RET=61 ;;
|
|
color) _RET=9999991 ;;
|
|
cpu_count) _RET=5 ;;
|
|
cpu_freq) _RET=2 ;;
|
|
cpu_temp) _RET=19 ;;
|
|
custom) _RET=5 ;;
|
|
date) _RET=9999991 ;;
|
|
disk) _RET=13 ;;
|
|
disk_io) _RET=3 ;;
|
|
distro) _RET=9999991 ;;
|
|
entropy) _RET=5 ;;
|
|
fan_speed) _RET=23 ;;
|
|
hostname) _RET=607 ;;
|
|
ip_address) _RET=127 ;;
|
|
load_average) _RET=2 ;;
|
|
logo) _RET=9999991 ;;
|
|
mail) _RET=5 ;;
|
|
memory) _RET=13 ;;
|
|
menu) _RET=9999991 ;;
|
|
network) _RET=3 ;;
|
|
notify_osd) _RET=9999991 ;;
|
|
packages) _RET=211 ;;
|
|
processes) _RET=7 ;;
|
|
raid) _RET=59 ;;
|
|
reboot_required) _RET=5 ;;
|
|
release) _RET=599 ;;
|
|
services) _RET=53 ;;
|
|
session) _RET=9999991 ;;
|
|
swap) _RET=19 ;;
|
|
time) _RET=9999991 ;;
|
|
time_binary) _RET=23 ;;
|
|
time_utc) _RET=11 ;;
|
|
trash) _RET=9999991 ;;
|
|
updates_available) _RET=7 ;;
|
|
uptime) _RET=29 ;;
|
|
users) _RET=11 ;;
|
|
whoami) _RET=86029 ;;
|
|
wifi_quality) _RET=17 ;;
|
|
*) _RET=9999991 ;;
|
|
esac
|
|
}
|
|
|
|
get_now() {
|
|
if [ -r /proc/uptime ]; then
|
|
# return the integer part of the first item in /proc/uptime
|
|
local s c
|
|
read s c < /proc/uptime
|
|
_RET=${s%.*}
|
|
else
|
|
_RET=$(date +%s);
|
|
fi
|
|
}
|
|
|
|
get_network_interface() {
|
|
if [ -n "$MONITORED_NETWORK" ]; then
|
|
# Manual override
|
|
_RET="$MONITORED_NETWORK"
|
|
elif [ -e /proc/net/route ]; then
|
|
# Linux systems, read route and interface from procfs
|
|
local Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT
|
|
while read Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT; do
|
|
[ "$Mask" = "00000000" ] && break
|
|
done < /proc/net/route
|
|
_RET="$Iface"
|
|
elif eval $BYOBU_TEST route >/dev/null 2>&1; then
|
|
# Route command on path
|
|
_RET=$(route get default|grep interface:|awk '{print $2}')
|
|
elif [ -x "/sbin/route" ]; then
|
|
# Mac OSX, shell out to the route command
|
|
_RET=$(/sbin/route get default|grep interface:|awk '{print $2}')
|
|
fi
|
|
}
|
|
|
|
get_distro() {
|
|
local distro="${DISTRO}"
|
|
if [ -n "$DISTRO" ]; then
|
|
# user defined
|
|
true
|
|
elif [ -r "/etc/os-release" ]; then
|
|
distro=$(. /etc/os-release && echo "$NAME")
|
|
case "$distro" in
|
|
Debian*)
|
|
[ -r /etc/lsb-release ] && distro=$(. /etc/lsb-release && [ -n "$GOOGLE_ID" ] && echo "gLinux" || echo "Debian")
|
|
;;
|
|
*)
|
|
# assume first field is what we want
|
|
distro="${distro%% *}";
|
|
;;
|
|
esac
|
|
elif [ -r "/etc/issue" ]; then
|
|
# lsb_release is *really* slow; try to use /etc/issue first
|
|
local issue
|
|
IFS="" read issue < /etc/issue
|
|
case "$issue" in
|
|
Ubuntu*)
|
|
distro="Ubuntu";
|
|
;;
|
|
Debian*)
|
|
distro="Debian"
|
|
;;
|
|
Red\ Hat\ Enterprise*)
|
|
distro="RHEL"
|
|
;;
|
|
*)
|
|
# assume first field is what we want
|
|
distro="${issue%% *}";
|
|
;;
|
|
esac
|
|
elif eval $BYOBU_TEST lsb_release >/dev/null 2>&1; then
|
|
# If lsb_release is available, use it
|
|
local r=$(lsb_release -s -d)
|
|
case "$r" in
|
|
Ubuntu*)
|
|
# Use the -d if an Ubuntu LTS
|
|
distro="Ubuntu"
|
|
;;
|
|
*)
|
|
# But for other distros the description
|
|
# is too long, so build from -i and -r
|
|
distro=$(lsb_release -s -i)
|
|
;;
|
|
esac
|
|
elif eval $BYOBU_TEST sw_vers >/dev/null 2>&1; then
|
|
distro="$(sw_vers -productName)"
|
|
elif eval $BYOBU_TEST uname >/dev/null 2>&1; then
|
|
distro="$(uname -s)"
|
|
else
|
|
distro="Byobu"
|
|
fi
|
|
_RET="$distro"
|
|
}
|
|
|
|
# vi: syntax=sh ts=4 noexpandtab
|