Version bump to 5.8.2dr1
[strongswan.git] / testing / scripts / function.sh
1 #!/bin/bash
2 # provides some general-purpose script functions
3 #
4 # Copyright (C) 2004 Eric Marchionni, Patrik Rayo
5 # Zuercher Hochschule Winterthur
6 #
7 # This program is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by the
9 # Free Software Foundation; either version 2 of the License, or (at your
10 # option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
11 #
12 # This program is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 # for more details.
16
17 export TERM=xterm
18 RED=$(tput setaf 1)
19 GREEN=$(tput setaf 2)
20 YELLOW=$(tput setaf 3)
21 NORMAL=$(tput op)
22
23 # exit with given error message
24 # $1 - error message
25 die() {
26 echo -e "${RED}$1${NORMAL}"
27 exit 1
28 }
29
30 # execute command
31 # $1 - command to execute
32 # $2 - whether or not to log command exit status
33 # (0 -> disable exit status logging)
34 execute()
35 {
36 cmd=${1}
37 echo $cmd >>$LOGFILE 2>&1
38 $cmd >>$LOGFILE 2>&1
39 status=$?
40 [ "$2" != 0 ] && log_status $status
41 if [ $status != 0 ]; then
42 echo
43 echo "! Command $cmd failed, exiting (status $status)"
44 echo "! Check why here $LOGFILE"
45 exit 1
46 fi
47 }
48
49 # execute command in chroot
50 # $1 - command to execute
51 execute_chroot()
52 {
53 execute "chroot $LOOPDIR env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin $@"
54 }
55
56 # write green status message to console
57 # $1 - msg
58 echo_ok()
59 {
60 echo -e "${GREEN}$1${NORMAL}"
61 }
62
63 # write red status message to console
64 # $1 - msg
65 echo_failed()
66 {
67 echo -e "${RED}$1${NORMAL}"
68 }
69
70 # write yellow status message to console
71 # $1 - msg
72 echo_warn()
73 {
74 echo -e "${YELLOW}$1${NORMAL}"
75 }
76
77 # log an action
78 # $1 - current action description
79 log_action()
80 {
81 /bin/echo -n "[....] $1 "
82 }
83
84 # log an action status
85 # $1 - exit status of action
86 log_status()
87 {
88 tput hpa 0
89 if [ $1 -eq 0 ]; then
90 /bin/echo -ne "[${GREEN} ok ${NORMAL}"
91 else
92 /bin/echo -ne "[${RED}FAIL${NORMAL}"
93 fi
94 echo
95 }
96
97 # the following two functions are stolen from [1]
98 # [1] - http://www.linuxjournal.com/content/use-bash-trap-statement-cleanup-temporary-files
99
100 declare -a on_exit_items
101
102 # perform registered actions on exit
103 on_exit()
104 {
105 for ((onex=${#on_exit_items[@]}-1; onex>=0; onex--))
106 do
107 echo "On_Exit: ${on_exit_items[$onex]}" >>$LOGFILE
108 ${on_exit_items[$onex]} >>$LOGFILE 2>&1
109 done
110 on_exit_items=""
111 trap - EXIT
112 }
113
114 # register a command to execute when the calling script terminates. The
115 # registered commands are called in FILO order.
116 # $* - command to register
117 do_on_exit()
118 {
119 local n=${#on_exit_items[*]}
120 on_exit_items[$n]="$*"
121 if [ $n -eq 0 ]; then
122 trap on_exit EXIT
123 fi
124 }
125
126 # wait for a mount to disappear
127 # $1 - device/image to wait for
128 # $2 - maximum time to wait in seconds, default is 5 seconds
129 graceful_umount()
130 {
131 secs=$2
132 [ ! $secs ] && secs=5
133
134 let steps=$secs*100
135 for st in `seq 1 $steps`
136 do
137 umount $1 >>$LOGFILE 2>&1
138 mount | grep $1 >/dev/null 2>&1
139 [ $? -eq 0 ] || return 0
140 sleep 0.01
141 done
142
143 return 1
144 }
145
146 # load qemu NBD kernel module, if not already loaded
147 load_qemu_nbd()
148 {
149 lsmod | grep ^nbd[[:space:]]* >/dev/null 2>&1
150 if [ $? != 0 ]
151 then
152 log_action "Loading NBD kernel module"
153 execute "modprobe nbd max_part=16"
154 fi
155 }
156
157 # check if given commands exist in $PATH
158 # $* - commands to check
159 check_commands()
160 {
161 for i in $*
162 do
163 command -v $i >/dev/null || { die "Required command $i not found"; exit 1; }
164 done
165 }
166
167 # check if any of the given virtual guests are running
168 # $* - names of guests to check
169 running_any()
170 {
171 command -v virsh >/dev/null || return 1
172 for host in $*
173 do
174 virsh list --name 2>/dev/null | grep "^$host$" >/dev/null && return 0
175 done
176 return 1
177 }
178
179 #############################################
180 # search and replace strings throughout a
181 # whole directory
182 #
183
184 function searchandreplace {
185
186 SEARCHSTRING="$1"
187 REPLACESTRING="$2"
188 DESTDIR="$3"
189
190 [ -d "$DESTDIR" ] || die "$DESTDIR is not a directory!"
191
192
193 ###########################################
194 # search and replace in each found file the
195 # given string
196 #
197
198 for eachfoundfile in `find $DESTDIR -type f`
199 do
200 sed -i -e "s/$SEARCHSTRING/$REPLACESTRING/g" "$eachfoundfile"
201 done
202
203 }