pkvlm-create
changeset 7 ab661ceed4dc
parent 4 bf9d63195f9d
child 8 ba98eb53344a
--- 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
+