chiark / gitweb /
merge work from samual/lalonde
[autopkgtest.git] / xen / readconfig.in
1 # This bash script is sourced by the various tools to set the
2 # adt_... variables and some other useful ones.
3
4 set -e${ADT_SHELLX}
5 set -o pipefail
6
7 #---------- useful general functions ----------
8
9 fail () {
10         echo >&2 "xenlvm: ${0##*/}: error: $*"
11         exit 16
12 }
13
14 x () { echo "x $*"; "$@"; }
15
16 do_udevsettle () {
17         if type udevsettle >/dev/null 2>&1; then
18                 udevsettle
19         elif test -x /sbin/udevsettle; then
20                 udevsettle
21         fi
22 }               
23                 
24 case "$BASH_VERSION" in
25 '')     fail 'scripts using adtxenlvm readconfig must be bash scripts' ;;
26 *)      ;;
27 esac
28
29 #---------- default values for simple settings ----------
30
31 adt_nominum=adt
32 adt_testbed_ram=256
33 adt_freeze_ram=32
34 adt_fs_size=3072M
35 adt_fs_snapsize=2560M
36 adt_fs_cowchunk=8
37 adt_playbase=/var/lib/autopkgtest/xenlvm
38 adt_fs_type=ext3
39 adt_fs_mkfs_args=''
40 adt_vm_reduce_retries=10
41 adt_ssh_keytype=dsa
42
43 adt_debootstrap_components='*'
44 adt_debootstrap_include=libc6-xen,openssh-server,ed
45 adt_debootstrap_includemore=
46 adt_debootstrap_mirrors=''
47 adt_debootstrap_script=''
48
49 adt_fw_localmirrors=''
50 adt_fw_prohibnets='192.168.0.0/24 172.16.0.0/12 10.0.0.0/8'
51 adt_fw_allowglobalports='80'
52
53 adt_guest_macaddr=00:16:3e:7c:aa:7f
54 adt_net_vifscript=/etc/xen/scripts/vif-route-adt
55 adt_normaluser=adtxenu
56
57 #---------- arguments and config file ----------
58
59 cmdline_args () {
60         while [ $# -gt 0 ]; do
61                 arg="$1"
62                 case "$arg" in
63                 --*=*)
64                         value="${arg#*=}"
65
66                         var=${arg%%=*}
67                         var=${var#--}
68                         case "$var" in
69                         *-*)    var="$(printf "%s" "$var" | tr -- - _)" ;;
70                         esac
71                         var=${var#adt_}
72
73                         case $var in
74                         *) ;; # @@varlist@@
75                         *) fail "unknown configuration variable \`$var'" ;;
76                         esac
77
78                         eval "$var=\"\$value\""
79                         shift ;;
80
81                 --)     shift; break ;;
82                 -*)     fail "unknown option \`$arg'" ;;
83                 *)      break ;;
84                 esac
85         done
86         nonoptargs=$#
87 }
88
89 cmdline_args "$@"
90 : "${adt_config:=/etc/autopkgtest/xenlvm_${adt_nominum}_config}"
91 test ! -e "${adt_config}" || . "${adt_config}"
92 cmdline_args "$@"
93
94 #---------- calculated defaults for complex settings ----------
95
96 case "$adt_lvm_vg" in
97 '')
98         printf "searching for default volume group ... "
99         vgdisplay_out=`vgdisplay -c 10>&-`
100         case "$vgdisplay_out" in
101         "")     fail 'no volume groups found';;
102         *"
103 "*)             fail 'several volume groups, config must specify which';;
104         esac
105         adt_lvm_vg=${vgdisplay_out%%:*}
106         case "$adt_lvm_vg" in
107         *[^\ ]\ *) fail "volume group name \`$adt_lvm_vg' has spaces!";;
108         esac
109         adt_lvm_vg=${adt_lvm_vg##* }
110         echo "using system's only volume group: $adt_lvm_vg"
111         ;;
112 esac
113
114 if [ "$adt_readconfig_needkernel" ]; then
115  case "$adt_kernel" in
116  '')
117         printf "searching for kernel ... "
118         for f in /boot/*"`uname -r`"*; do
119                 test -e "$f" || continue
120                 printf "(%s:" "$f"
121                 output="$(file -- "$f")"
122                 case "$output" in
123                 *"gzip compressed data"*) ;;
124                 *) printf "!gzip) "; continue ;;
125                 esac
126                 trap 'rm -f -- "$tf"; exit 127' 0
127                 tf=`mktemp -t`
128                 zcat -- "$f" >"$tf"
129                 output="$(file -- "$tf")"
130                 case "$output" in
131                 *"ELF "*" executable,"*) ;;
132                 *) printf "!ELF) "; continue;;
133                 esac
134                 output="$(objdump -j __xen_guest -s -- "$tf")"
135                 rm -f "$tf"; trap '' 0
136                 case "$output" in
137                 *" __xen_guest:"*) ;;
138                 *) printf "!Xen) "; continue
139                 esac
140                 printf "y) "
141                 test "x$adt_kernel" = x || \
142                         fail 'several kernels, config must specify which'
143                 adt_kernel="$f"
144         done
145         [ "x$adt_kernel" != x ] || \
146                 fail 'could not find currently booted Xen kernel'
147         echo "using currently booted kernel: $adt_kernel"
148         ;;
149  esac
150
151  case "$adt_ramdisk" in
152  none)  echo "ramdisk \`none' specified, using static kernel"
153         adt_ramdisk='' ;;
154  '')    adt_ramdisk="${adt_kernel/\/vmlinuz-//initrd.img-}"
155         test -e "$adt_ramdisk" || \
156  fail "calculated default ramdisk initrd.img \`$adt_ramdisk' does not exist"
157         echo "using calculated default ramdisk initrd.img: $adt_ramdisk" ;;
158  *)     ;;
159  esac
160 fi
161
162 case "$adt_modules" in
163 '')     adt_modules="/lib/modules/`uname -r`" ;;
164 *)      ;;
165 esac
166
167 case "$adt_distro" in
168 '')
169         printf "considering which distro to use ... "
170         test -e /etc/lsb-release || \
171                 fail 'no /etc/lsb-version, config must specify adt_distro'
172         . /etc/lsb-release
173         adt_distro=$DISTRIB_CODENAME
174         echo "using same distro as host: $adt_distro"
175         ;;
176 esac
177
178 hostname_from_ipaddr () {
179  eval '
180   if [ x"$adt_'$1'_hostname" = x ] && \
181      [ x"$adt_'$1'_ipaddr" != x ]; then
182    printf "%s" "finding '$1' hostname from IP address $adt_'$1'_ipaddr: "
183    adt_'$1'_hostname=`adnshost -t ptr +Do +Dt +Dc -i $adt_'$1'_ipaddr`
184    printf "%s\n" "${adt_'$1'_hostname}"
185   fi
186  '
187 }
188
189 hostname_from_ipaddr guest
190 hostname_from_ipaddr host
191
192 if [ x"$adt_host_hostname" = x ]; then
193         printf "finding host hostname, supposely our own FQDN: "
194         adt_host_hostname=`hostname -f`
195         printf "%s\n" "$adt_host_hostname"
196 fi
197
198 if [ x"$adt_guest_hostname" = x ]; then
199         case "$adt_guests_domain" in
200         '')     printf "guessing guest hostname from host hostname: "
201  adt_guest_hostname=$adt_distro.$adt_nominum.${adt_host_hostname#*.} ;;
202         .*)     printf "setting guest hostname using distro and nominum: "
203  adt_guest_hostname=$adt_distro.$adt_nominum$adt_guests_domain ;;
204         *)      printf "setting guest hostname using distro and domain: "
205  adt_guest_hostname=$adt_distro.$adt_guests_domain ;;
206         esac
207         printf "%s\n" "$adt_guest_hostname"
208 fi
209
210 ipaddr_from_hostname () {
211  eval '
212   if [ x"$adt_'$1'_ipaddr" = x ] && \
213      [ x"$adt_'$1'_hostname" != x ]; then
214    printf "%s" "finding '$1' IP address from hostname $adt_'$1'_hostname: "
215    adt_'$1'_ipaddr=`adnshost -t a +Do +Dt +Dc - "$adt_'$1'_hostname"`
216    echo "${adt_'$1'_ipaddr}"
217   fi
218  '
219 }
220
221 ipaddr_from_hostname guest
222 ipaddr_from_hostname host
223
224 search_hook () {
225  eval '
226   printf "looking for '$2' hook ... "
227   case "$adt_'$1'_hook" in
228   "")
229     case "$adt_config" in
230     *_config)
231       adt_'$1'_hook=${adt_config%_config}_'$3'
232       if test -e "$adt_'$1'_hook"; then
233               echo "default exists: $adt_'$1'_hook"
234       else
235               echo "default $adt_'$1'_hook is not a file, so: none"
236               adt_'$1'_hook=""
237       fi
238       ;;
239     *)
240       echo "not specified, not computable from config, so: none"
241       adt_'$1'_hook=""
242       ;;
243     esac
244     ;;
245   *)
246     if test -e "$adt_'$1'_hook"; then
247       echo "exists: $adt_'$1'_hook"
248     else
249       echo "specified as $adt_'$1'_hook, but not a file, so: none"
250       adt_'$1'_hook=""
251     fi
252     ;;
253   esac
254  '
255 }
256
257 search_hook fw firewall fwhook
258 search_hook setup setup setuphook
259
260 boolean_config () {
261   eval '
262     case "${adt_'$1'}" in
263     y*|Y*|1*|t*)        adt_'$1'=true ;;
264     n*|N*|0*|f*)        adt_'$1'=false ;;
265     "")                 adt_'$1'=$2 ;;
266     *)                  fail "unknown boolean value \`$1'\'' for adt_'$1'" ;;
267     esac
268   '
269 }
270
271 # SSH
272 : ${adt_ssh_privkey:=/root/.ssh/id_${adt_ssh_keytype}_${adt_nominum}}
273 : ${adt_ssh_pubkey:=${adt_ssh_privkey}.pub}
274 : ${adt_ssh_keyident_args:=-i ${adt_ssh_privkey}}
275 : ${adt_ssh_keygen_args:=-t ${adt_ssh_keytype}}
276
277 # Xen
278 : ${adt_xmname:=${adt_nominum}_${adt_distro}}
279
280 # In-host-file-system playground
281 : ${adt_play:=${adt_playbase}/${adt_nominum}_${adt_distro}}
282 : ${adt_xmconfig:=${adt_play}/xmconfig}
283 : ${adt_lock:=${adt_play}/lock}
284
285 # LVM
286 boolean_config lvm_erasebase true
287 : ${adt_lvm_baselv:=${adt_nominum}_${adt_distro}_base}
288 : ${adt_lvm_cowdatalv:=${adt_nominum}_${adt_distro}_cowdata}
289 : ${adt_devmapper_cowdev:=${adt_nominum}_${adt_distro}_snap}
290
291 : ${adt_fslink_dir:=adt-xenlvm}
292 : ${adt_fslink_name:=${adt_nominum}_${adt_distro}_fs}
293
294 # Firewall
295 : ${adt_fw_testbedclients:=${adt_host_ipaddr}}
296
297 lvm_baselv_namerhs=${adt_lvm_vg}/${adt_lvm_baselv}
298 lvm_baselv_namepath=/dev/${lvm_baselv_namerhs}
299
300 lvm_cowdata_namerhs=${adt_lvm_vg}/${adt_lvm_cowdatalv}
301 lvm_cowdata_namepath=/dev/${lvm_cowdata_namerhs}
302
303 lvm_snapdev=/dev/mapper/${adt_devmapper_cowdev}
304
305 lvm_fslink_ptrrhs=${adt_fslink_dir}/${adt_fslink_name}
306 lvm_fslink_dirpath=/dev/${adt_fslink_dir}
307 lvm_fslink_ptr=/dev/${adt_fslink_dir}/${adt_fslink_name}
308
309 echo "adtxenlvm: configuration for read for nominum=${adt_nominum}"