--- a/pkvlm-create Wed Dec 28 11:04:02 2011 +0200
+++ b/pkvlm-create Thu Jan 05 14:28:31 2012 +0200
@@ -1,39 +1,148 @@
#!/bin/bash
-### Parameters
-## Options
-_MOCK=${_MOCK:0}
-_ACK=${_ACK:0}
+### Initialize
+set -u
+set -e
+TESTING=
+
+DO_VIRTINSTALL=
+
+scripts=$(dirname $0)/scripts
+. $scripts/lib.sh
+
+### Command-line input
+## Command-line options
+function _help () {
+ cat <<END
+Usage: $1 [options] [param=value [...]]
+
+Options:
+ -h Show this help text
+
+ -D Debug
+ -v Verbose
+ -q Quiet
+
+ -N Mock command execution
+ -P Skip command prompts
+
+ -I Do a virt-install
+
+ -T Just testing..
+
+Parameters are given as:
+
+ NAME=value-{FOO}
+
+END
+}
+
+while getopts "hDvqNPTI" opt; do
+ case "$opt" in
+ h)
+ _help $0
+
+ exit 0
+ ;;
+
+ D)
+ LOG_DEBUG=y
+ LOG_CMD=y
+
+ ;;
+
+ v)
+ LOG_CMD=y
+
+ log_debug "log: Commands"
+ ;;
+
+ q)
+ LOG_CMD=
+ LOG_INFO=
+
+ log_debug "log: Quiet"
+ ;;
+
+ N)
+ log_info "Mock-executing commands (this will break functionality..)"
+
+ CMD_MOCK=y
+ ;;
+
+ P)
+ log_info "Skipping command confirmations"
+
+ CMD_PROMPT=
+ ;;
+
+ T)
+ log_info "Just testing.."
+
+ TESTING=y
+ ;;
+
+ I)
+ log_info "Do virt-install"
+
+ DO_VIRTINSTALL=y
+ ;;
+ ?)
+ _help $0
+
+ exit 1
+ ;;
+ esac
+done
+
+# forget them
+shift $(( $OPTIND - 1 ))
+
+## Command-line arguments
+log_info "Processing ${#@} arguments"
+for param in "$@"; do
+ name=${param%=*}
+ value=${param##*=}
+
+ # evaluate
+ value=$(expand_line "$value")
+
+ log_debug " $name = $value"
+
+ eval "opt_${name}=${value}"
+done
+
+### State
## Guest info
-GUEST_NAME=$1
+GUEST_NAME=$opt_name
# Basic params
-GUEST_RAM=1G
-GUEST_VCPUS=2
+GUEST_RAM=${opt_ram:-1G}
+GUEST_VCPUS=${opt_cpus:-2}
# OS variant (for virt-install)
-GUEST_OS_VARIANT=debiansqueeze
+GUEST_OS_VARIANT=${opt_os:-debiansqueeze}
## Disk
# Size of LV to create
-DISK_SIZE=10G
+DISK_SIZE=${opt_disk_size:-10G}
# LVM vg to use
-DISK_VG=pvl
+DISK_VG=${opt_disk_vg:-pvl}
# LVM lv to use
-DISK_NAME=${GUEST_NAME}
+DISK_NAME=${opt_disk_lv:-${GUEST_NAME}}
# Path to disk block device
DISK_PATH=/dev/mapper/${DISK_VG}-${DISK_NAME}
-DISK_BUS=virtio
-GUEST_DISK=/dev/vda
+DISK_BUS=${opt_disk_bus:-virtio}
+GUEST_DISK=${opt_guest_disk:-/dev/vda}
## Network
-NET_HOSTNAME=${GUEST_NAME}
-NET_BRIDGE=br-lan
-NET_IPADDR=194.197.235.36
+NET_HOSTNAME=${opt_hostname:-${GUEST_NAME}}
+NET_BRIDGE=${opt_bridge:-br-lan}
+NET_IPADDR=${opt_ip:-194.197.235.36}
## Installation image
# Original Debian Installer image (iso)
@@ -50,15 +159,16 @@
INSTALL_ISO="iso-out/${INSTALL_NAME}.iso"
# Preseed output file in install tree
-INSTALL_PRESEED_NAME="preseed.cfg"
-INSTALL_PRESEED_FILE="${INSTALL_TREE}/${INSTALL_PRESEED_NAME}"
-INSTALL_PRESEED_CHECKSUM= # set later
# Preseed source template
-PRESEED_TEMPLATE="preseed/preseed.cfg"
+PRESEED_NAME="preseed.cfg"
+PRESEED_TEMPLATE="preseed/${PRESEED_NAME}"
+PRESEED_FILE="${INSTALL_TREE}/${PRESEED_NAME}"
PRESEED_ISOLINUX="preseed/isolinux.cfg"
PRESEED_INCLUDES=("preseed/passwords.cfg" "preseed/host.cfg")
+PRESEED_CHECKSUM= # set later
+
## External progs
# Bootable .iso for Debian isolinux-based installer CDs
GENISOIMAGE=/usr/bin/genisoimage
@@ -85,12 +195,55 @@
#SEMANAGE=/usr/sbin/semanage
#RESTORECON=/sbin/restorecon
-### Functions
-set -u
-set -e
+### Prepare
+cat <<END
+Guest:
+ Name: $GUEST_NAME
+ CPUs: $GUEST_VCPUS
+ RAM: $GUEST_RAM
+ OS: $GUEST_OS_VARIANT
-scripts=$(dirname $0)/scripts
-. $scripts/lib.sh
+ Disk: $GUEST_DISK
+
+Disk:
+ Method: LVM
+ Size: $DISK_SIZE
+ LVM:
+ VG: $DISK_VG
+ LV: $DISK_NAME
+
+ Path: $DISK_PATH
+ Bus: $DISK_BUS
+
+Net:
+ Hostname: $NET_HOSTNAME
+ Method: Bridge
+ IP: $NET_IPADDR
+
+ Bridge:
+ Name: $NET_BRIDGE
+
+Installer:
+ Name: $INSTALLER_NAME
+ ISO: $INSTALLER_ISO
+ Tree: $INSTALLER_TREE
+
+Install:
+ Name: $INSTALL_NAME
+ Tree: $INSTALL_TREE
+ ISO: $INSTALL_ISO
+
+Preseed:
+ Name: $PRESEED_NAME
+ Template: $PRESEED_TEMPLATE
+ Target: $PRESEED_FILE
+ Isolinux: $PRESEED_ISOLINUX
+ Includes: $PRESEED_INCLUDES
+
+END
+
+
+[ $TESTING ] && exit 0
### Check
# VM exists?
@@ -103,13 +256,13 @@
die "Installer not found: ${INSTALLER_ISO}"
fi
-### Go!
-# Extract .iso
+### Prepare install
+## Extract .iso
if [ -f ${INSTALLER_FLAG} ]; then
- echo "Installer already unpacked: ${INSTALLER_TREE}"
+ log_info "Installer already unpacked: ${INSTALLER_TREE}"
else
- echo "Unpacking installer: ${INSTALLER_ISO}"
+ log_info "Unpacking installer: ${INSTALLER_ISO}"
cmd extract_iso ${INSTALLER_ISO} ${INSTALLER_TREE}
cmd touch ${INSTALLER_FLAG}
fi
@@ -118,11 +271,13 @@
cmd cp -r ${INSTALLER_TREE} ${INSTALL_TREE}
cmd chmod -R u=rwX,og=rX ${INSTALL_TREE}
-# XXX: Customize preseed
-cmd expand_template ${PRESEED_TEMPLATE} ${INSTALL_PRESEED_FILE}
+log_info "Installer extracted: $INSTALL_TREE"
+
+## Customize preseed
+cmd expand_template ${PRESEED_TEMPLATE} ${PRESEED_FILE}
# md5sum
-INSTALL_PRESEED_CHECKSUM=$(my_md5sum $INSTALL_PRESEED_FILE)
+PRESEED_CHECKSUM=$(my_md5sum $PRESEED_FILE)
# Isolinux .cfg
cmd expand_template ${PRESEED_ISOLINUX} ${INSTALL_TREE}/isolinux/isolinux.cfg
@@ -134,31 +289,38 @@
cmd expand_template $file ${INSTALL_TREE}/${name}
done
-# Create .iso
-[ -f ${INSTALL_ISO} ] && cmd rm -f ${INSTALL_ISO}
-cmd ${GENISOIMAGE} -o ${INSTALL_ISO} ${GENISOIMAGE_OPTS} ${INSTALL_TREE}
-
-[ $_ACK ] && read -p "Continue..."
-
-## LVM
-# Create LV (unless it already exists)
-[ -e $DISK_PATH ] || cmd sudo $LVM lvcreate -L $DISK_SIZE -n $DISK_NAME $DISK_VG
-
-## SELinux?
-#$SEMANAGE fcontext -a -t virt_image_t $DISK
-#$RESTORECON -v $DISK
+log_info "Preseed generated: $PRESEED_FILE"
-## virt-install
-cmd $VIRT_INSTALL \
- --connect $LIBVIRT \
- --name $GUEST_NAME \
- --ram $(expand_MB $GUEST_RAM) --vcpus $GUEST_VCPUS \
- --cdrom "$INSTALL_ISO" \
- --os-variant $GUEST_OS_VARIANT \
- --disk path=$DISK_PATH,bus=$DISK_BUS \
- --network bridge:$NET_BRIDGE \
- --vnc \
- --virt-type $LIBVIRT_TYPE \
- --accelerate --hvm \
- --serial pty
+## Create .iso
+[ -f ${INSTALL_ISO} ] && cmd rm -f ${INSTALL_ISO}
+# generates a lot of output
+cmd ${GENISOIMAGE} -o ${INSTALL_ISO} -quiet ${GENISOIMAGE_OPTS} ${INSTALL_TREE}
+
+log_info "Install ISO generated: $INSTALL_ISO"
+
+### Create virtual machine
+if [ $DO_VIRTINSTALL ]; then
+ ## Disk
+ # Create LV (unless it already exists)
+ [ -e $DISK_PATH ] || cmd_confirm sudo $LVM lvcreate -L $DISK_SIZE -n $DISK_NAME $DISK_VG
+
+ ## SELinux?
+ #$SEMANAGE fcontext -a -t virt_image_t $DISK
+ #$RESTORECON -v $DISK
+
+ ## virt-install
+ cmd_confirm $VIRT_INSTALL \
+ --connect $LIBVIRT \
+ --name $GUEST_NAME \
+ --ram $(expand_MB $GUEST_RAM) --vcpus $GUEST_VCPUS \
+ --cdrom "$INSTALL_ISO" \
+ --os-variant $GUEST_OS_VARIANT \
+ --disk path=$DISK_PATH,bus=$DISK_BUS \
+ --network bridge:$NET_BRIDGE \
+ --vnc \
+ --virt-type $LIBVIRT_TYPE \
+ --accelerate --hvm \
+ --serial pty
+fi
+