chiark / gitweb /
finalise changelog
[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 xl () { echo "x $*"; 3>&- 4>&- "$@"; }
16
17 case "$BASH_VERSION" in
18 '')     fail 'scripts using adtxenlvm readconfig must be bash scripts' ;;
19 *)      ;;
20 esac
21
22 #---------- default values for simple settings ----------
23
24 : ${adt_nominum:=adt}
25 : ${adt_testbed_ram:=256}
26 : ${adt_freeze_ram:=32}
27 : ${adt_fs_size:=6144M}
28 : ${adt_fs_snapsize:=5120M}
29 : ${adt_fs_cowchunk:=8}
30 : ${adt_swap_size:=5120M}
31 : ${adt_playbase:=/var/lib/autopkgtest/xenlvm}
32 : ${adt_fs_type:=ext3}
33 : ${adt_fs_mkfs_args:=}
34 : ${adt_vm_reduce_retries:=10}
35 : ${adt_ssh_keytype:=dsa}
36
37 : ${adt_debootstrap_opts:=}
38 : ${adt_debootstrap_components:='*'}
39 : ${adt_debootstrap_include:=openssh-server,ed}
40 : ${adt_debootstrap_includemore:=}
41 : ${adt_debootstrap_mirrors:=}
42 : ${adt_debootstrap_script:=}
43
44 : ${adt_fw_localmirrors:=}
45 : ${adt_fw_prohibnets:=192.168.0.0/24 172.16.0.0/12 10.0.0.0/8}
46 : ${adt_fw_allowglobalports:=80}
47
48 : ${adt_guest_macaddr:=00:16:3e:7c:aa:7f}
49 : ${adt_net_vifscript:=/etc/xen/scripts/vif-route-adt}
50 : ${adt_normaluser:=adtxenu}
51
52 #---------- arguments and config file ----------
53
54 cmdline_args () {
55         while [ $# -gt 0 ]; do
56                 arg="$1"
57                 case "$arg" in
58                 --*=*)
59                         value="${arg#*=}"
60
61                         var=${arg%%=*}
62                         var=${var#--}
63                         case "$var" in
64                         *-*)    var="$(printf "%s" "$var" | tr -- - _)" ;;
65                         esac
66                         var=${var#adt_}
67
68                         case $var in
69                         *) ;; # @@varlist@@
70                         *) fail "unknown configuration variable \`$var'" ;;
71                         esac
72
73                         eval "adt_$var=\"\$value\"; export adt_$var"
74                         shift ;;
75
76                 --)     shift; break ;;
77                 -*)     fail "unknown option \`$arg'" ;;
78                 *)      break ;;
79                 esac
80         done
81         nonoptargs=$#
82 }
83
84 cmdline_args "$@"
85 : "${adt_config:=/etc/autopkgtest/xenlvm_${adt_nominum}_config}"
86 test ! -e "${adt_config}" || . "${adt_config}"
87 cmdline_args "$@"
88
89 #---------- settings needed for locking ----------
90
91 if [ ! "${adt_readconfig_initscript}" ]; then
92  case "$adt_distro" in
93  '')
94         printf "considering which distro to use ... "
95         test -e /etc/lsb-release || \
96                 fail 'no /etc/lsb-version, config must specify adt_distro'
97         . /etc/lsb-release
98         adt_distro=$DISTRIB_CODENAME
99         echo "using same distro as host: $adt_distro"
100         ;;
101  esac
102 fi
103
104 # In-host-file-system playground
105 : ${adt_play:=${adt_playbase}/${adt_nominum}_${adt_distro}}
106 : ${adt_xmconfig:=${adt_play}/xmconfig}
107 : ${adt_lock:=${adt_play}.lock}
108
109 if [ "${adt_readconfig_needlock}" ] &&
110    [ "x${adt_lock}" != xnone ] && \
111    [ "x${ADT_LOCKED}" != "x$adt_lock" ]; then
112  if [ "${adt_whenlock_replumb81}" ]; then
113    exec >&8 8>&-
114  fi
115  ADT_LOCKED="$adt_lock" exec with-lock-ex -w "$adt_lock" "$0" "$@"
116 fi
117
118 #---------- calculated defaults for complex settings ----------
119
120 if [ ! "${adt_readconfig_initscript}" ]; then
121  case "$adt_lvm_vg" in
122  '')
123         printf "searching for default volume group ... "
124         vgdisplay_out=`vgdisplay -c 3>&- 8>&-`
125         case "$vgdisplay_out" in
126         "")     fail 'no volume groups found';;
127         *"
128  "*)            fail 'several volume groups, config must specify which';;
129         esac
130         adt_lvm_vg=${vgdisplay_out%%:*}
131         case "$adt_lvm_vg" in
132         *[^\ ]\ *) fail "volume group name \`$adt_lvm_vg' has spaces!";;
133         esac
134         adt_lvm_vg=${adt_lvm_vg##* }
135         echo "using system's only volume group: $adt_lvm_vg"
136         ;;
137  esac
138 fi
139
140 if [ "$adt_readconfig_needkernel" ]; then
141  case "$adt_kernel" in
142  '')
143         printf "searching for kernel ... "
144         for f in /boot/*"`uname -r`"*; do
145                 test -e "$f" || continue
146                 printf "(%s:" "$f"
147                 output="$(file -- "$f")"
148                 case "$output" in
149                 *"gzip compressed data"*) ;;
150                 *) printf "!gzip) "; continue ;;
151                 esac
152                 trap 'rm -f -- "$tf"; exit 127' 0
153                 tf=`mktemp -t`
154                 zcat -- "$f" >"$tf"
155                 output="$(file -- "$tf")"
156                 case "$output" in
157                 *"ELF "*" executable,"*) ;;
158                 *) printf "!ELF) "; continue;;
159                 esac
160                 output="$(objdump -j __xen_guest -s -- "$tf")"
161                 rm -f "$tf"; trap '' 0
162                 case "$output" in
163                 *" __xen_guest:"*) ;;
164                 *) printf "!Xen) "; continue
165                 esac
166                 printf "y) "
167                 test "x$adt_kernel" = x || \
168                         fail 'several kernels, config must specify which'
169                 adt_kernel="$f"
170         done
171         [ "x$adt_kernel" != x ] || \
172                 fail 'could not find currently booted Xen kernel'
173         echo "using currently booted kernel: $adt_kernel"
174         ;;
175  esac
176
177  case "$adt_ramdisk" in
178  none)  echo "ramdisk \`none' specified, using static kernel"
179         adt_ramdisk='' ;;
180  '')    adt_ramdisk="${adt_kernel/\/vmlinuz-//initrd.img-}"
181         test -e "$adt_ramdisk" || \
182  fail "calculated default ramdisk initrd.img \`$adt_ramdisk' does not exist"
183         echo "using calculated default ramdisk initrd.img: $adt_ramdisk" ;;
184  *)     ;;
185  esac
186 fi
187
188 case "$adt_modules" in
189 '')     adt_modules="/lib/modules/`uname -r`" ;;
190 *)      ;;
191 esac
192
193 hostname_from_ipaddr () {
194  eval '
195   if [ x"$adt_'$1'_hostname" = x ] && \
196      [ x"$adt_'$1'_ipaddr" != x ]; then
197    printf "%s" "finding '$1' hostname from IP address $adt_'$1'_ipaddr: "
198    adt_'$1'_hostname=`adnshost -t ptr +Do +Dt +Dc -i $adt_'$1'_ipaddr`
199    printf "%s\n" "${adt_'$1'_hostname}"
200   fi
201  '
202 }
203
204 hostname_from_ipaddr host
205
206 if [ ! "${adt_readconfig_initscript}" ]; then
207  hostname_from_ipaddr guest
208 fi
209
210 if [ x"$adt_host_hostname" = x ]; then
211         printf "finding host hostname, supposely our own FQDN: "
212         adt_host_hostname=`hostname -f`
213         printf "%s\n" "$adt_host_hostname"
214 fi
215
216 if [ ! "${adt_readconfig_initscript}" ]; then
217  if [ x"$adt_guest_hostname" = x ]; then
218         case "$adt_guests_domain" in
219         '')     printf "guessing guest hostname from host hostname: "
220  adt_guest_hostname=$adt_distro.$adt_nominum.${adt_host_hostname#*.} ;;
221         .*)     printf "setting guest hostname using distro and nominum: "
222  adt_guest_hostname=$adt_distro.$adt_nominum$adt_guests_domain ;;
223         *)      printf "setting guest hostname using distro and domain: "
224  adt_guest_hostname=$adt_distro.$adt_guests_domain ;;
225         esac
226         printf "%s\n" "$adt_guest_hostname"
227  fi
228 fi
229
230 ipaddr_from_hostname () {
231  eval '
232   if [ x"$adt_'$1'_ipaddr" = x ] && \
233      [ x"$adt_'$1'_hostname" != x ]; then
234    printf "%s" "finding '$1' IP address from hostname $adt_'$1'_hostname: "
235    adt_'$1'_ipaddr=`adnshost -t a +Do +Dt +Dc - "$adt_'$1'_hostname"`
236    echo "${adt_'$1'_ipaddr}"
237   fi
238  '
239 }
240
241 ipaddr_from_hostname host
242 if [ ! "${adt_readconfig_initscript}" ]; then
243  ipaddr_from_hostname guest
244 fi
245
246 search_hook () {
247  eval '
248   printf "looking for '$2' hook ... "
249   case "$adt_'$1'_hook" in
250   "")
251     case "$adt_config" in
252     *_config)
253       adt_'$1'_hook=${adt_config%_config}_'$3'
254       if test -e "$adt_'$1'_hook"; then
255               echo "default exists: $adt_'$1'_hook"
256       else
257               echo "default $adt_'$1'_hook is not a file, so: none"
258               adt_'$1'_hook=""
259       fi
260       ;;
261     *)
262       echo "not specified, not computable from config, so: none"
263       adt_'$1'_hook=""
264       ;;
265     esac
266     ;;
267   *)
268     if test -e "$adt_'$1'_hook"; then
269       echo "exists: $adt_'$1'_hook"
270     else
271       echo "specified as $adt_'$1'_hook, but not a file, so: none"
272       adt_'$1'_hook=""
273     fi
274     ;;
275   esac
276  '
277 }
278
279 search_hook fw firewall fwhook
280 search_hook setup setup setuphook
281 search_hook sshauthkeys "ssh auth keys" sshauthkeys
282
283 boolean_config () {
284   eval '
285     case "${adt_'$1'}" in
286     y*|Y*|1*|t*)        adt_'$1'=true ;;
287     n*|N*|0*|f*)        adt_'$1'=false ;;
288     "")                 adt_'$1'=$2 ;;
289     *)                  fail "unknown boolean value \`$1'\'' for adt_'$1'" ;;
290     esac
291   '
292 }
293
294 # SSH
295 : ${adt_ssh_privkey:=/root/.ssh/id_${adt_ssh_keytype}_${adt_nominum}}
296 : ${adt_ssh_pubkey:=${adt_ssh_privkey}.pub}
297 : ${adt_ssh_keyident_args:=-i ${adt_ssh_privkey}}
298 : ${adt_ssh_keygen_args:=-t ${adt_ssh_keytype}}
299
300 # Xen
301 : ${adt_xmname:=${adt_nominum}_${adt_distro}}
302
303 # LVM
304 boolean_config lvm_erasebase true
305
306 : ${adt_lvm_baselv:=${adt_nominum}_${adt_distro}_base}
307 : ${adt_lvm_cowdatalv:=${adt_nominum}_${adt_distro}_cowdata}
308 : ${adt_devmapper_cowdev:=${adt_nominum}_${adt_distro}_snap}
309
310 : ${adt_fslink_dir:=adt-xenlvm}
311 : ${adt_fslink_name:=${adt_nominum}_${adt_distro}_fs}
312
313 # LVM - swap
314 : ${adt_lvm_eraseswap:=$adt_lvm_erasebase}
315
316 : ${adt_lvm_swapbaselv:=${adt_nominum}_${adt_distro}_swapbase}
317 : ${adt_lvm_swapcowdatalv:=${adt_nominum}_${adt_distro}_swapcowdata}
318 : ${adt_devmapper_swapcowdev:=${adt_nominum}_${adt_distro}_swapsnap}
319
320 : ${adt_swaplink_dir:=adt-xenlvm}
321 : ${adt_swaplink_name:=${adt_nominum}_${adt_distro}_swap}
322
323 : ${adt_lvm_swapvg:=$adt_lvm_vg}
324
325 : ${adt_swap_snapsize:=$adt_swap_size}
326 : ${adt_swap_cowchunk:=$adt_fs_cowchunk}
327
328 case "$adt_swap_size" in
329 *[!0A-Za-z]*)   provide_swap=true       ;;
330 *)              provide_swap=false      ;;
331 esac
332
333 # Firewall
334 : ${adt_fw_testbedclients:=${adt_host_ipaddr}}
335
336 for fs in fs swap; do swap=${fs#fs}; eval "
337   lvm_baselv_${swap}namerhs=\${adt_lvm_${swap}vg}/\${adt_lvm_${swap}baselv}
338   lvm_baselv_${swap}namepath=/dev/\${lvm_baselv_${swap}namerhs}
339
340   lvm_cowdata_${swap}namerhs=\${adt_lvm_${swap}vg}/\${adt_lvm_${swap}cowdatalv}
341   lvm_cowdata_${swap}namepath=/dev/\${lvm_cowdata_${swap}namerhs}
342
343   lvm_${swap}snapdev=/dev/mapper/\${adt_devmapper_${swap}cowdev}
344
345   lvm_${fs}link_ptrrhs=\${adt_${fs}link_dir}/\${adt_${fs}link_name}
346   lvm_${fs}link_dirpath=/dev/\${adt_${fs}link_dir}
347   lvm_${fs}link_ptr=/dev/\${adt_${fs}link_dir}/\${adt_${fs}link_name}
348   "
349 done
350
351 echo "adtxenlvm: configuration for read for nominum=${adt_nominum}"