#!/bin/bash # Test if the named environment variable is set and not zero length # is_set env-var function is_set { local var=\$"$1" eval "[[ -n \"$var\" ]]" } # Prints backtrace info # filename:lineno:function # backtrace level function backtrace { local level=$1 local deep deep=$((${#BASH_SOURCE[@]} - 1)) echo "[Call Trace]" while [ $level -le $deep ]; do echo "${BASH_SOURCE[$deep]}:${BASH_LINENO[$deep-1]}:${FUNCNAME[$deep-1]}" deep=$((deep - 1)) done } # Prints line number and "message" in error format # err $LINENO "message" function err { local exitcode=$? local xtrace xtrace=$(set +o | grep xtrace) set +o xtrace local msg="[ERROR] ${BASH_SOURCE[2]}:$1 $2" echo $msg 1>&2; if [[ -n ${LOGDIR} ]]; then echo $msg >> "${LOGDIR}/error.log" fi $xtrace return $exitcode } # Prints line number and "message" then exits # die $LINENO "message" function die { local exitcode=$? local xtrace xtrace=$(set +o | grep xtrace) set +o xtrace local line=$1; shift if [ $exitcode == 0 ]; then exitcode=1 fi backtrace 2 err $line "$*" # Give buffers a second to flush sleep 1 $xtrace exit $exitcode } # Checks an environment variable is not set or has length 0 OR if the # exit code is non-zero and prints "message" and exits # NOTE: env-var is the variable name without a '$' # die_if_not_set $LINENO env-var "message" function die_if_not_set { local exitcode=$? local xtrace xtrace=$(set +o | grep xtrace) set +o xtrace local line=$1; shift local evar=$1; shift if ! is_set $evar || [ $exitcode != 0 ]; then die $line "$*" fi $xtrace } # Check the function is defined # die_if_not_defined $LINENO function-name "message" function die_if_not_defined { local xtrace xtrace=$(set +o | grep xtrace) set +o xtrace local line=$1; shift local func_name=$1; shift if ! declare -f "$func_name" > /dev/null; then die $line "$*" fi $xtrace } # Wait until the condition is met. # wait_until condition timeout interval function wait_until { local condition="$1" local timeout=$2 local interval=$3 while eval ${condition} do sleep ${interval} timeout=$((${timeout} - ${interval})) if [[ ${timeout} < 0 ]]; then err $LINENO "timed out ($condition)..." return 1 fi done } # Print IP address of the first vNIC owned by specified VM via virsh # get_first_vnic_ip vm_name function get_first_vnic_ip { local vm_name=$1 _vnic_mac=$(sudo virsh domiflist $vm_name | \ sed -n -e 's/^.*\([0-9a-f]\{2\}\(:[0-9a-f]\{2\}\)\{5\}\).*$/\1/p' | \ head -1) die_if_not_set $LINENO _vnic_mac _vnic_ip=$(arp -e | grep $_vnic_mac | awk '{print $1}') die_if_not_set $LINENO _vnic_ip echo $_vnic_ip }