pkvlm-create: logging and command-line options
authorTero Marttila <terom@fixme.fi>
Thu, 05 Jan 2012 14:28:31 +0200
changeset 7 ab661ceed4dc
parent 6 8ed4a750d133
child 8 ba98eb53344a
pkvlm-create: logging and command-line options
pkvlm-create
preseed/isolinux.cfg
scripts/lib.sh
--- 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
+
--- a/preseed/isolinux.cfg	Wed Dec 28 11:04:02 2011 +0200
+++ b/preseed/isolinux.cfg	Thu Jan 05 14:28:31 2012 +0200
@@ -10,7 +10,7 @@
 	menu label ^Install (Preseed {GUEST_NAME})
 	menu default
 	kernel /install.amd/vmlinuz
-	append vga=788 initrd=/install.amd/initrd.gz auto=true priority=critical preseed/file=/cdrom/{INSTALL_PRESEED_NAME} preseed/file/checksum={INSTALL_PRESEED_CHECKSUM} -- quiet 
+	append vga=788 initrd=/install.amd/initrd.gz auto=true priority=critical preseed/file=/cdrom/{PRESEED_NAME} preseed/file/checksum={PRESEED_CHECKSUM} -- quiet 
 
 
 
--- a/scripts/lib.sh	Wed Dec 28 11:04:02 2011 +0200
+++ b/scripts/lib.sh	Thu Jan 05 14:28:31 2012 +0200
@@ -1,20 +1,55 @@
 ## library functions
 
+LOG_DEBUG=
+LOG_CMD=y
+LOG_INFO=y
+LOG_WARN=y
+LOG_ERROR=y
+
+function log_debug () {
+    [ $LOG_DEBUG ] && echo "... $@" >&2
+}
+
+function log_info () {
+    [ $LOG_INFO ] && echo "--- $@" >&2
+}
+
+function log_cmd () {
+    [ $LOG_CMD ] && echo ">>> $@" >&2
+}
+
+function log_warn () {
+    [ $LOG_WARN ] && echo "XXX $@" >&2
+}
+
+function log_error () {
+    [ $LOG_ERROR ] && echo "!!! $@" >&2
+}
+
 function die () {
-    echo "!!! $@" >&2
+    log_error "$@"
 
     exit 1
 }
 
 # Execute command verbosely, and exit on failure
+CMD_MOCK=
+CMD_PROMPT=y
+
 function cmd () {
-    echo ">>> $@"
+    log_cmd "$@"
 
-    [ $_MOCK ] && return 0
+    [ $CMD_MOCK ] && return 0
 
     eval "$@" # return $?
 }
 
+function cmd_confirm () {
+    [ $CMD_PROMPT ] && read -p "Confirm: $1"
+
+    cmd "$@"
+}
+
 function expand_MB () {
     local size=${1^}
 
@@ -67,6 +102,22 @@
     )
 }
 
+function expand_line () {
+    local line=$1
+
+    # evaluate {...} expressions
+    # a slight hack, but it works \o/
+    # http://stackoverflow.com/questions/415677/how-to-replace-placeholders-in-a-text-file/7633579#7633579
+    line="${line//\\/\\\\}"
+    line="${line//\"/\\\"}"
+    line="${line//\`/\\\`}"
+    line="${line//\$/\\\$}"
+    line="${line//{/\${}"   # This is just for vim: } "
+
+    # log_debug "($line)" >&2
+    eval "echo \"$line\""
+}
+
 function expand_template () {
     local tpl=$1
     local out=$2
@@ -82,17 +133,7 @@
             echo "$line"
         
         else
-            # evaluate {...} expressions
-            # a slight hack, but it works \o/
-            # http://stackoverflow.com/questions/415677/how-to-replace-placeholders-in-a-text-file/7633579#7633579
-            line="${line//\\/\\\\}"
-            line="${line//\"/\\\"}"
-            line="${line//\`/\\\`}"
-            line="${line//\$/\\\$}"
-            line="${line//{/\${}"   # This is just for vim: } "
-
-            # echo "($line)" >&2
-            (eval "echo \"$line\"") || die "Error at $tpl:$linecount: $line"
+            expand_line "$line" || die "Error at $tpl:$linecount: $line"
         fi
  
     done < $tpl > $out
@@ -110,15 +151,15 @@
         local target=$dst/$name
 
         if [ -d $path ]; then
-            echo "expand_tree: $path -> $target"
-            echo "expand_tree $path $target $filter"
+            log_debug "expand_tree: $path -> $target"
+            expand_tree $path $target $filter
 
         elif [ -f $path ]; then
-            echo "expand_file: $path -> $target"
-            echo "expand_file $path $target"
+            log_debug "expand_file: $path -> $target"
+            expand_file $path $target
 
         else
-            echo "XXX: ignore weird file: $path"
+            log_warn "ignore weird file: $path"
 
         fi
     done