utils.sh 3.46 KiB
#!/bin/bash
# Copyright (c) 2009, Scott Barr <gsbarr@gmail.com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * 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.
# * Neither the name of the <organization> nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 <copyright holder> 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.
function countdown
{
local OLD_IFS="${IFS}"
IFS=":"
local ARR=( $1 ) ; shift
IFS="${OLD_IFS}"
local PREFIX="$*" ; [ -n "${PREFIX}" ] && PREFIX="${PREFIX}"
local SECONDS=$(( (ARR[0] * 60 * 60) + (ARR[1] * 60) + ARR[2] ))
local START=$(date +%s)
local END=$((START + SECONDS))
local CUR=$START
while [[ $CUR -lt $END ]]
do
CUR=$(date +%s)
LEFT=$((END-CUR))
printf "\r${PREFIX} %02d" \
$((LEFT%60))
sleep 1
done
echo " "
}
function outputVar()
{
y=\$"$1"
x=`eval "expr \"$y\" "`
eval "$1=\"$2\""
}
function valid_input()
{
local correct="no"
Return_Val=""
if [ -z "$2" ]
then
local opts=( yes no )
local opt_list="yes/no"
else
local opts=( `echo $2 | tr "/" " "` )
local opt_list=$2
fi
while [ "$correct" != "yes" ]
do
if [ -n "$3" ]
then
line_prompt="$1 [default: $3] "
else
line_prompt="$1 [$opt_list] "
fi
echo -en "$line_prompt"
read answer
if [ -n "$3" ]
then
answer=$3
else
ret=`echo "${opts[@]}" | grep -w "$answer"`
fi
if [ $? -eq 0 ]
then
correct="yes"
Return_Val=$answer
fi
done
}
function start_spinner()
{
parent_pid=$$
(SP_STRING="/-\\|"; while [ -d /proc/$1 ] && [ -d /proc/$parent_pid ]; do printf "\e[1;37m\e7[ %1.1s ] \e8\e[0m" "$SP_STRING"; sleep .2; SP_STRING=${SP_STRING#"${SP_STRING%?}"}${SP_STRING%?}; done) &
disown
spinner_pid=$!
}
function stop_spinner()
{
if [ $spinner_pid -gt 0 ]
then
kill -HUP $spinner_pid 2>/dev/null
fi
}
function exec_command()
{
printf "%-40s" "$2"
(eval $1 >/dev/null 2>&1) &
pid=$!
start_spinner
wait $pid
status=$?
stop_spinner
if [ $status -eq 0 ];
then
echo -e "\e[1;37m[ \e[0m\e[1;32mok\e[0m\e[1;37m ]\e[0m"
else
echo -e "\e[1;37m[ \e[0m\e[1;31mfailed\e[0m\e[1;37m ]\e[0m"
echo -e "The following command did not complete successfully:"
echo -e "$1"
exit 1
fi
}