X-Git-Url: https://git.madduck.net/code/vinst.git/blobdiff_plain/e5ea710926dc73f39dc9920237d8557c79ad0e5a..88d4c549e67f2e2e27d1d25199c7adf8ba078abd:/vinst?ds=inline diff --git a/vinst b/vinst index 5ebd3ca..695ae17 100755 --- a/vinst +++ b/vinst @@ -5,12 +5,27 @@ set -e # defaults RAM=512 DISK=20 +STORAGE_POOL=default QEMU_URI=qemu:///system SUITE=wheezy CONSOLE='console=tty0 console=ttyS0,115200n8' +DEBUG=0 +WIPE=0 +RESTART=0 while [ -n "$1" ]; do case "$1" in + (--debug) + DEBUG=1 + ;; + (-S|--suite) + shift + if [ -z "$1" ]; then + echo >&2 'E: --suite/-S needs suite argument' + exit 1 + fi + SUITE="$1" + ;; (-n|--name) shift if [ -z "$1" ]; then @@ -34,6 +49,22 @@ while [ -n "$1" ]; do esac IPADDRESS="$1" ;; + (-d|--dns) + shift + if [ -z "$1" ]; then + echo >&2 'E: --dns/-d needs IP address' + exit 1 + fi + NAMESERVER="$1" + ;; + (-g|--gateway) + shift + if [ -z "$1" ]; then + echo >&2 'E: --gateway/-g needs IP address' + exit 1 + fi + GATEWAY="$1" + ;; (-r|--ram) shift if [ -z "$1" ]; then @@ -50,6 +81,32 @@ while [ -n "$1" ]; do fi DISK="$1" ;; + (-a|--arch) + shift + if [ -z "$1" ]; then + echo >&2 'E: --arch/-a needs arch argument' + exit 1 + fi + ARCH="$1" + ;; + (-m|--mac) + shift + if [ -z "$1" ]; then + echo >&2 'E: --mac/-m needs mac address argument' + exit 1 + fi + MAC="$1" + ;; + (--debug) + DEBUG=1 + set -vx + ;; + (--wipe) + WIPE=1 + ;; + (--restart) + RESTART=1 + ;; esac shift done @@ -64,12 +121,17 @@ BASEDIR=$(cd ${0%/*}; pwd) tmpdir=$(mktemp -d) tar -C $BASEDIR/preseed/$SUITE -cf $tmpdir/commands.tar commands -extra_args="auto $CONSOLE \ +extra_kargs="auto $CONSOLE \ hostname=${HOSTNAME%%.*} \ domain=${HOSTNAME#*.}" +extra_opts= +if [ -n "$DEBUG" ]; then + extra_opts='--debug' +fi + if [ -n "$IPADDRESS" ]; then - if [ -z "$GATEWAY" ]; then + if [ -z "$GATEWAY" ] && [ -x $(command -v ipcalc) ]; then # default to the first IP in the network GATEWAY=$(ipcalc $IPADDRESS | grep HostMin | awk '{print $2}') fi @@ -77,21 +139,39 @@ if [ -n "$IPADDRESS" ]; then IPADDRESS="${IPADDRESS%/*}" : ${NAMESERVER:=$GATEWAY} - extra_args="$extra_args netcfg/disable_dhcp=true \ + extra_kargs="$extra_kargs netcfg/disable_dhcp=true \ netcfg/get_ipaddress=$IPADDRESS \ netcfg/get_netmask=$NETMASK \ netcfg/get_gateway=$GATEWAY \ netcfg/get_nameservers=$NAMESERVER" + BRIDGE=wan + else - extra_args="$extra_args netcfg/disable_dhcp=false" + extra_kargs="$extra_kargs netcfg/disable_dhcp=false" + BRIDGE=virt-br +fi + +if [ -z "$ARCH" ]; then + ARCH=$(dpkg --print-architecture) +fi + +if [ -z "$MAC" ]; then + bytes=$(dd status=none if=/dev/urandom bs=3 count=1 | hexdump -v -e '/1 ":%02X"') + MAC=52:54:00$bytes fi cat >&2 <<_eof hostname: $HOSTNAME + arch: $ARCH + suite: $SUITE ram: $RAM MiB disk: $DISK GiB + wipe: $WIPE console: $CONSOLE + restart: $RESTART +net bridge: $BRIDGE +macaddress: $MAC _eof if [ -n "$IPADDRESS" ]; then cat >&2 <<_eof @@ -106,20 +186,38 @@ else _eof fi -exit 0 +echo >&2 + +virsh --connect=$QEMU_URI vol-create-as $STORAGE_POOL virt-$HOSTNAME ${DISK}G +if [ $WIPE = 1 ]; then + echo >&2 "Wiping disk…" + virsh --connect=$QEMU_URI vol-wipe --pool $STORAGE_POOL --algorithm zero virt-$HOSTNAME +fi + +if [ $DEBUG = 1 ]; then + DEBUGFLAG=--debug + extra_args="$extra_args DEBCONF_DEBUG=5" +fi -exec virt-install --connect=$QEMU_URI \ +virt-install --connect=$QEMU_URI \ + ${DEBUGFLAG:-} \ -n $HOSTNAME \ -r $RAM \ - --disk pool=default,size=$SIZE \ - -w bridge=virt-br \ + --disk vol=$STORAGE_POOL/virt-$HOSTNAME \ + --network bridge=$BRIDGE,mac=$MAC \ --graphics=vnc \ --serial=pty \ --watchdog i6300esb,action=reset \ - --os-variant=debian$SUITE \ - -l $BASEDIR/installer-amd64 \ + --os-variant=debianwheezy \ --initrd-inject=$BASEDIR/preseed/$SUITE/preseed.cfg \ --initrd-inject=$tmpdir/commands.tar \ - --extra-args="$extra_args" \ - --autostart \ + --extra-args="$extra_kargs" \ + --prompt --noautoconsole --autostart $extra_opts \ + -l $BASEDIR/installer-amd64/$SUITE \ "$@" + +virsh --connect=$QEMU_URI console $HOSTNAME + +if [ $RESTART = 1 ]; then + virsh --connect=$QEMU_URI "start $HOSTNAME; console $HOSTNAME" +fi