byobu/bin/byobu-ugraph

219 行
4.6 KiB
Bash
実行ファイル

#!/bin/bash
#---------------------------------------------------------------------
# Script to display a byobu notification "history graph".
#
# Designed to work with the wonderful byobu(1) but can be run
# stand-alone.
#---------------------------------------------------------------------
#
# Copyright (C) 2011 Canonical Ltd.
#
# Author: James Hunt <james.hunt@canonical.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/>.
#
#---------------------------------------------------------------------
PKG="byobu"
[ -r "$HOME/.config/byoburc" ] && . "$HOME/.config/byoburc"
[ -z "${BYOBU_PREFIX}" ] && export BYOBU_PREFIX="/usr" || export BYOBU_PREFIX
. "${BYOBU_PREFIX}/lib/${PKG}/include/common"
script_name=${0##*/}
min_default=0
max_default=100
points_default=5
theme_default=vbars_8
newline="\n"
rotate=y
error()
{
msg="$*"
echo "ERROR: $msg" >&2
}
die()
{
error "$*"
exit 1
}
usage()
{
cat <<EOT
Description: Display a graph of historical indicator values using
byobu-ulevel.
Usage: $script_name [options] [command [args...]]
Options:
-f <file> : File to read data points from.
(only required if no command specified).
-h : Show this help.
-m <num> : Minimum value (default=$min_default).
-n : Supress output of newline character.
-p <points> : Specify number of data points in graph
(default=$points_default).
-r : Do not rotate file <file> (default is to rotate).
Option implies file <file> should not be written to
so a command cannot follow script options in this case.
-t <theme> : 'byobu-ulevel' theme to use (default=$theme_default).
-x <num> : Maximum value (default=$max_default).
Examples:
Using $script_name to run a command, rotate log and display graph.
Here we specify a command to display available memory.
Trailing echo adds a required newline
Note no filename specified.
$script_name "(/usr/lib/byobu/mem_used | sed -e 's/% //g';echo)"
Using $script_name just to rotate log and display the graph
file=/tmp/load.dat
awk '{ print \$1}' /proc/loadavg >> \$file
# Note: we need to specify what we consider to be a "reasonable" maximum load
$script_name -m 3.0 -f \$file
Notes:
- If you specify 'command', care must be taken with shell quoting to
avoid expansion prior to this script running the command.
- If '-r' is not specified, the file <file> will be rotated such that
at most <points> lines are retained on each invocation of this
script.
EOT
}
get_data()
{
needed_lines=$points
if [ ! -f $file ]
then
return
fi
lines=$(wc -l $file|awk '{print $1}')
if [ $lines -lt $needed_lines ]
then
# insufficient data
return
fi
bytes=$(<${file})
bytes=$(echo "$bytes"|tail -n ${needed_lines})
[ $lines -eq $needed_lines -o $rotate = n ] && echo "$bytes" && return
# rotate
tmp=`tempfile`
echo "$bytes" > $tmp
mv $tmp $file
echo "$bytes"
}
while getopts "f:hm:np:rt:x:" opt
do
case "$opt" in
f)
file="$OPTARG"
;;
h)
usage
exit 0
;;
m)
min=$OPTARG
;;
n)
newline=
;;
p)
points=$OPTARG
;;
r)
rotate=n
;;
t)
theme="$OPTARG"
;;
x)
max=$OPTARG
;;
esac
done
shift $[$OPTIND-1]
cmd="$@"
[ -z "$theme" ] && theme=$theme_default
if [ -z "$cmd" ]
then
if [ -z "$file" ]
then
error "must specify file"
usage
exit 1
fi
fi
if [ -z "$file" ]
then
# we could go cryptic+safe by calling tempfile(1), but that then
# makes it very difficult to find in case of need.
file=/tmp/${USER}-${script_name}-$$.dat
fi
[ -z "$min" ] && min=$min_default
[ -z "$max" ] && max=$max_default
[ -z "$points" ] && points=$points_default
if [ ! -z "$cmd" ]
then
if [ $rotate = n ]
then
error "cannot write to file if rotate disabled"
usage
exit 1
fi
eval "$cmd >>$file"
fi
data=$(get_data)
[ -z "$data" ] && printf "%*.s${newline}" $points && exit 0
for datum in $data
do
byobu-ulevel -n -m $min -x $max -p -c $datum -t $theme
done