Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
#!/bin/sh
[ -z ${BOOTED-""} -a -x /bin/ksh ] && exec env BOOTED=yes /bin/ksh "$0" "$@"
#
# Copyright (c) 2005 Daichi GOTO
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
# THE POSSIBILITY OF SUCH DAMAGE.
# author: Daichi GOTO (daichi@ongs.co.jp)
# first edition: Sun Mar 20 03:38:02 2005
# last modified: $Date: 2006/02/01 13:50:34 $
# version: $Revision: 1.53 $
# topless
# display command output on the whole screen like "top"
#
# usage
# topless command...
version='$Revision: 1.53 $'
version=${version#* }
version=${version% *}
usage_msg="usage:
topless [-cwVhv] [-s ] [-n ] [-a ] COMMAND
-c The lines difference from the previous screen update
are colorized. (default: false)
-s Set the screen update periods to seconds.
If the sleep(1) command accepts and honors a non-integer
number of seconds, can be a non-integer number.
(default: 1)
-n The lines are kept colorized for I times screen
update when -c is also enabled. Once a line is colorized,
that line becomes blue on next screen update, and remains
blue until the line returns to be original color.
default: 1)
-a Topless enforce the specified command when COMMAND output
gets difference from the previous output assumed for alert
use, instead of -c use for monochrome monitor or others.
(default: false)
-w Topless will use as many columns as necessary without
regard for your window size. (default: true)
-V Topless gets information header. (default: false)
-h Print help message.
-v Print version.
key command
q quit
environment variables
TMPDIR directory for temporary files
topless version $version"
# default configuration
#
colordiff_mode=false
alert_mode=false
waitsec=1
colorhistnum=1
fitwindowwidth=true
header_mode=false
# check the option arguments
#
while getopts cs:n:a:wVh?v option
do
case "$option" in
c)
colordiff_mode=true
;;
s)
waitsec=$OPTARG
;;
n)
colorhistnum=$OPTARG
;;
a)
alert_mode=true
alertcommand=$OPTARG
;;
w)
fitwindowwidth=false
;;
V)
header_mode=true
;;
h|\?)
echo "$usage_msg" 1>&2
exit 0
;;
v)
echo "topless version $version"
exit 0
;;
esac
done
shift $(($OPTIND - 1))
case $# in
0)
echo "$usage_msg" 1>&2
exit 1
;;
esac
# OS case
#
print="echo -n "
println="echo "
printes="echo -e "
case $(echo -n) in
-n)
print='printf "%s"'
;;
esac
case $(echo -e) in
-e)
print='printf "%b"'
;;
esac
type mktemp > /dev/null 2>&1 ||
mktemp()
{
_tmpfname=${@+"$@"}.$$
> "$_tmpfname"
$println "$_tmpfname"
}
# escape sequence
#
readonly color_red=$($printes "\033[31m")
readonly color_blu=$($printes "\033[34m")
readonly color_org=$($printes "\033[0m")
readonly es_cur_hom=$(tput home) # cursor to home
readonly es_clr_eol=$(tput ce 2> /dev/null || tput el) # clear to end of line
readonly es_clr_eos=$(tput cd 2> /dev/null || tput ed) # clear to end of screen
# trap treatment
#
trap trapexit EXIT HUP INT QUIT ALRM TERM
trap trapresz WINCH
trapexit()
{
rm -f "$difffile"
stty "$termstat"
exit 0
}
trapresz()
{
term_rows=$(tput lines)
term_cols=$(tput cols)
$print "$es_cur_hom$es_clr_eos"
}
# color diff temporary file
#
umask 177
difffile=$(mktemp ${TMPDIR:="$HOME"}/."${0##*/}".XXXXXX)
# terminal device configuration
#
readonly termstat=$(stty -g)
stty quit q # q is quit key
# avoid sleep core dump if ulimit supported
#
type ulimit > /dev/null && ulimit -c 0
# terminal status
#
term_rows=$(tput lines)
term_cols=$(tput cols)
# customize color buffer
#
colorbuffer()
{
count=1
N=0
$println "$difference" |
while :
do
IFS= read line || {
$print "buffer='$_buffer'"
break
}
_buffer=$_buffer${_buffer:+"
"}
case "$N$line" in
0---\ *)
N=1
;;
1---\ *)
N=2
;;
2*)
eval diffcount=\${diff$count:=0}
case "${line%% *}" in
+|!)
diffcount=$colorhistnum
;;
*)
case $diffcount in
[1-9]*)
diffcount=$(($diffcount - 1))
;;
esac
;;
esac
$print "diff$count=$diffcount "
line=${line#[+! ] }
case $diffcount in
$colorhistnum)
_buffer=$_buffer$color_red$line$color_org
;;
[1-9]*)
_buffer=$_buffer$color_blu$line$color_org
;;
0)
_buffer=$_buffer$color_org$line$color_org
;;
esac
;;
esac
done
}
# sh only head(1) like function
#
shead()
{
count=1
while IFS= read line
do
echo "$line"
case $count in
$1)
break
;;
esac
count=$((1 + $count))
done
}
# display command output on the whole screen like "top"
#
firsttime=true
while :
do
buffer=$(eval ${@+"$@"}) || exit
case $fitwindowwidth$header_mode in
truefalse)
buffer=$(echo "$buffer" | shead $term_rows |
LANG=C cut -c 1-$term_cols)
;;
falsefalse)
buffer=$(echo "$buffer" | shead $term_rows)
;;
truetrue)
rows=$(($term_rows - 1))
buffer=$(echo "$buffer" | shead $rows | LANG=C cut -c 1-$term_cols)
;;
falsetrue)
rows=$(($term_rows - 1))
buffer=$(echo "$buffer" | shead $rows)
;;
esac
difference=$($println "$buffer" | diff -C 1000 "$difffile" -)
$println "$buffer" > "$difffile"
case "$difference" in
"")
;;
*)
case $firsttime in
false)
case $alert_mode in
true)
eval $alertcommand
;;
esac
case $colordiff_mode in
true)
colorbuffer=$(colorbuffer)
eval "$colorbuffer"
;;
esac
;;
true)
firsttime=false
;;
esac
;;
esac
case $header_mode in
true)
status="Every ${waitsec}s: ${@+"$@"} - $(date)"
buffer="$status
$buffer"
;;
esac
$print "$es_cur_hom$es_clr_eos$buffer"
sleep $waitsec
done