#!/bin/bash set -e PROGNAME=$(basename $0) # $HeadURL: http://sos16-vip/svn/kickstart/trunk/bin/defaults-dumper $ $LastChangedRevision: 669 $ # Load libraries . $(dirname $0)/../include/mkdi.sh main() { local DELETE_OLD_VM_FLAG CONSOLE_MODE # Defaults for options VERBOSELEVEL=2 DELETE_OLD_VM_FLAG=false CONSOLE_MODE=graphics # Process options while [ "X$1" != X ]; do case $1 in --delete-old-vm=*) DELETE_OLD_VM_FLAG=${1#*=} ;; --console-mode=*) CONSOLE_MODE=${1#*=} ;; # General options -v|--verbose) VERBOSELEVEL=3 ;; -d) VERBOSELEVEL=$2; shift ;; --debug=*) VERBOSELEVEL=${1#*=} ;; -h|--help) usage 0 ;; --) shift; break ;; -*) usage ;; *) break ;; esac shift done # Process arguments [ $# -ge 1 ] || usage MODE=$1; shift debug 10 "main: MODE=$MODE" # Delegate case $MODE in edit) edit "$@" || return $? ;; create) create --delete-old-vm=$DELETE_OLD_VM_FLAG --console-mode=$CONSOLE_MODE "$@" || return $? ;; delete) delete "$@" || return $? ;; list) list "$@" || return $? ;; purge) purge "$@" || return $? ;; *) usage ;; esac return 0 } edit() { local TARGET_HOSTNAME CMDLINE # Process options # Process arguments [ $# -le 1 ] || usage [ $# = 0 ] || { TARGET_HOSTNAME=$1; shift; } debug 10 "edit: TARGET_HOSTNAME=$TARGET_HOSTNAME" # Guts CMDLINE="$PARAMETERSEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME edit $*" debug 10 "edit: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "$(basename $PARAMETERSEDITOR_CMD): failed"; return $RC; } return 0 } create() { local TARGET_HOSTNAME local DELETE_OLD_VM_FLAG CONSOLE_MODE # Defaults for options DELETE_OLD_VM_FLAG=false CONSOLE_MODE=graphics # Process options while [ "X$1" != X ]; do case $1 in --delete-old-vm=*) DELETE_OLD_VM_FLAG=${1#*=} ;; --console-mode=*) CONSOLE_MODE=${1#*=} ;; --) shift; break ;; -*) usage ;; *) break ;; esac shift done # Process arguments [ $# = 1 ] || usage TARGET_HOSTNAME=$1; shift # Create installation create_or_delete --delete-old-vm=$DELETE_OLD_VM_FLAG --console-mode=$CONSOLE_MODE --target-hostname=$TARGET_HOSTNAME create || return $? return 0 } delete() { local TARGET_HOSTNAME # Defaults for options # Process options while [ "X$1" != X ]; do case $1 in --) shift; break ;; -*) usage ;; *) break ;; esac shift done # Process arguments [ $# = 1 ] || usage TARGET_HOSTNAME=$1; shift # Delete installation create_or_delete --target-hostname=$TARGET_HOSTNAME delete || return $? return 0 } create_or_delete() { local TARGET_HOSTNAME ISCSISERVER_HOSTNAME TARGET_HVM_FLAG TARGET_MACADDR TARGET_IPADDR RELEASE_CMDLINE VMSERVER_HOSTNAME DELETE_OLD_VM_FLAG TARGET_RELEASE TARGET_VM_FLAG ISCSISERVER_VOLUME_GROUP TARGET_ROOT_DISK_SIZE TARGET_RAM TARGET_PROFILE MAILTO local DB_VAR CMDLINE INSTALL_IN_PROGRESS_FLAG VM_EXISTS_ALREADY_FLAG POOL_EXISTS_ALREADY_FLAG STORAGE_EXISTS_ALREADY_FLAG REPO_EXISTS_ALREADY_FLAG CONSOLE_MODE MODE # Defaults for options DELETE_OLD_VM_FLAG=false CONSOLE_MODE=graphics # Process options while [ "X$1" != X ]; do case $1 in --delete-old-vm=*) DELETE_OLD_VM_FLAG=${1#*=} ;; --console-mode=*) CONSOLE_MODE=${1#*=} ;; --target-hostname=*) TARGET_HOSTNAME=${1#*=} ;; --) shift; break ;; -*) usage ;; *) break ;; esac shift done # Process arguments [ $# = 1 ] || usage MODE=$1; shift # Sanity checks and derivations if [ $MODE = create ]; then # Remember '!' applies to the pipeline, not the first command individually. And the # pipeline's return code comes from the *last* command. ! $INPROGRESSEDITOR_CMD list | grep -q $TARGET_HOSTNAME || { error "install in progress; use '$PROGNAME delete $TARGET_HOSTNAME' to stop it"; return 1; } load_parameters || return $? expand_autos || return $? debug 10 "create: TARGET_HOSTNAME=$TARGET_HOSTNAME, ISCSISERVER_HOSTNAME=$ISCSISERVER_HOSTNAME, TARGET_HVM_FLAG=$TARGET_HVM_FLAG, TARGET_MACADDR=$TARGET_MACADDR, TARGET_IPADDR=$TARGET_IPADDR, RELEASE_CMDLINE=\"$RELEASE_CMDLINE\", VMSERVER_HOSTNAME=$VMSERVER_HOSTNAME, DELETE_OLD_VM_FLAG=DELETE_OLD_VM_FLAG, TARGET_RELEASE=$TARGET_RELEASE, TARGET_VM_FLAG=$TARGET_VM_FLAG, ISCSISERVER_VOLUME_GROUP=$ISCSISERVER_VOLUME_GROUP, TARGET_ROOT_DISK_SIZE=$TARGET_ROOT_DISK_SIZE, TARGET_RAM=$TARGET_RAM, TARGET_PROFILE=$TARGET_PROFILE, CONSOLE_MODE=$CONSOLE_MODE, MAILTO=$MAILTO" validate_vars TARGET_HOSTNAME ISCSISERVER_HOSTNAME TARGET_HVM_FLAG TARGET_MACADDR TARGET_IPADDR RELEASE_CMDLINE VMSERVER_HOSTNAME DELETE_OLD_VM_FLAG TARGET_RELEASE TARGET_VM_FLAG ISCSISERVER_VOLUME_GROUP TARGET_ROOT_DISK_SIZE TARGET_RAM TARGET_PROFILE CONSOLE_MODE MAILTO || return $? ! $TARGET_VM_FLAG || { # Check if old VM exists { $VMEDITOR_CMD list | grep -q $TARGET_HOSTNAME && VM_EXISTS_ALREADY_FLAG=true; } || VM_EXISTS_ALREADY_FLAG=false { $POOLEDITOR_CMD list | grep -q $TARGET_HOSTNAME && POOL_EXISTS_ALREADY_FLAG=true; } || POOL_EXISTS_ALREADY_FLAG=false { $STORAGEEDITOR_CMD list | grep -q $TARGET_HOSTNAME && STORAGE_EXISTS_ALREADY_FLAG=true; } || STORAGE_EXISTS_ALREADY_FLAG=false { $REPOEDITOR_CMD list | grep -q $TARGET_HOSTNAME && REPO_EXISTS_ALREADY_FLAG=true; } || REPO_EXISTS_ALREADY_FLAG=false if { $VM_EXISTS_ALREADY_FLAG || $POOL_EXISTS_ALREADY_FLAG || $STORAGE_EXISTS_ALREADY_FLAG || $REPO_EXISTS_ALREADY_FLAG; } && ! $DELETE_OLD_VM_FLAG; then error "VM exists (do you need to use option '--delete-old-vm=true'?)" return 1 elif ! $VM_EXISTS_ALREADY_FLAG && ! $POOL_EXISTS_ALREADY_FLAG && ! $STORAGE_EXISTS_ALREADY_FLAG && ! $REPO_EXISTS_ALREADY && $DELETE_OLD_VM_FLAG; then error "VM does not exist (do you need to *not* use option '--delete-old-vm=true'?)" return 1 fi } elif [ $MODE = delete ]; then $INPROGRESSEDITOR_CMD list | grep -q $TARGET_HOSTNAME || { error "you're trying to delete something that does not exist!"; return 1; } load_parameters --table=in_progress || return $? debug 10 "delete: TARGET_HOSTNAME=$TARGET_HOSTNAME, ISCSISERVER_HOSTNAME=$ISCSISERVER_HOSTNAME, TARGET_HVM_FLAG=$TARGET_HVM_FLAG, TARGET_MACADDR=$TARGET_MACADDR, TARGET_IPADDR=$TARGET_IPADDR, RELEASE_CMDLINE=\"$RELEASE_CMDLINE\", VMSERVER_HOSTNAME=$VMSERVER_HOSTNAME, TARGET_RELEASE=$TARGET_RELEASE, TARGET_VM_FLAG=$TARGET_VM_FLAG, ISCSISERVER_VOLUME_GROUP=$ISCSISERVER_VOLUME_GROUP, TARGET_ROOT_DISK_SIZE=$TARGET_ROOT_DISK_SIZE, TARGET_RAM=$TARGET_RAM, TARGET_PROFILE=$TARGET_PROFILE, MAILTO=$MAILTO" validate_vars TARGET_HOSTNAME ISCSISERVER_HOSTNAME TARGET_HVM_FLAG TARGET_MACADDR TARGET_IPADDR VMSERVER_HOSTNAME TARGET_RELEASE TARGET_VM_FLAG ISCSISERVER_VOLUME_GROUP TARGET_ROOT_DISK_SIZE TARGET_RAM TARGET_PROFILE || return $? fi # Guts if [ $MODE = create ]; then ! $TARGET_VM_FLAG || { ! $VM_EXISTS_ALREADY_FLAG || warning "old VM will be recreated in 10 seconds ..." ! $POOL_EXISTS_ALREADY_FLAG || warning "old pool will be recreated in 10 seconds ..." ! $STORAGE_EXISTS_ALREADY_FLAG || warning "storage for old VM will be recreated in 10 seconds ..." ! $REPO_EXISTS_ALREADY_FLAG || warning "repo for old VM will be recreated in 10 seconds ..." ! { $VM_EXISTS_ALREADY_FLAG || $POOL_EXISTS_ALREADY_FLAG || $STORAGE_EXISTS_ALREADY_FLAG || $REPO_EXISTS_ALREADY_FLAG; } || sleep 10 ! $VM_EXISTS_ALREADY_FLAG || { CMDLINE="$VMEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-ram=$TARGET_RAM delete" eval "$CMDLINE" || { RC=$?; error "vm-editor: failed"; return $RC; } } ! $POOL_EXISTS_ALREADY_FLAG || { CMDLINE="$POOLEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-ram=$TARGET_RAM delete" eval "$CMDLINE" || { RC=$?; error "pool-editor: failed"; return $RC; } } ! $STORAGE_EXISTS_ALREADY_FLAG || { CMDLINE="$STORAGEEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE delete" eval "$CMDLINE" || { RC=$?; error "storage-editor: failed"; return $RC; } } ! $REPO_EXISTS_ALREADY_FLAG || { CMDLINE="$REPOEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-release=$TARGET_RELEASE create" eval "$CMDLINE" || { RC=$?; error "repo-editor: failed"; return $RC; } } } # Create everything! CMDLINE="$INPROGRESSEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --release-cmdline=\"$RELEASE_CMDLINE\" --target-vm-flag=$TARGET_VM_FLAG --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-release=$TARGET_RELEASE --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE --target-profile=$TARGET_PROFILE --target-ram=$TARGET_RAM --mailto=$MAILTO create" debug 10 "create: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$? error "$(basename $INPROGRESSEDITOR_CMD): failed; cleaning up ..." return $RC } CMDLINE="$REPOEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-release=$TARGET_RELEASE create" debug 10 "create: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$? error "$(basename $REPOEDITOR_CMD): failed; cleaning up ..." $INPROGRESSEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-vm-flag=$TARGET_VM_FLAG --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-release=$TARGET_RELEASE --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE --target-profile=$TARGET_PROFILE --target-ram=$TARGET_RAM delete || true return $RC } CMDLINE="$PXEEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-macaddr=$TARGET_MACADDR --target-release=$TARGET_RELEASE create" debug 10 "create: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$? error "$(basename $PXEEDITOR_CMD): failed; cleaning up ..." $REPOEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-release=$TARGET_RELEASE delete || true $INPROGRESSEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-vm-flag=$TARGET_VM_FLAG --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-release=$TARGET_RELEASE --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE --target-profile=$TARGET_PROFILE --target-ram=$TARGET_RAM delete || true return $RC } CMDLINE="$PRESEEDEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-release=$TARGET_RELEASE create" debug 10 "create: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$? error "$(basename $PRESEEDEDITOR_CMD): failed; cleaning up ..." $PXEEDITOR_CMD --debug=$VERBOSELEVEL -target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-macaddr=$TARGET_MACADDR --target-release=$TARGET_RELEASE delete || true $REPOEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-release=$TARGET_RELEASE delete || true $INPROGRESSEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-vm-flag=$TARGET_VM_FLAG --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-release=$TARGET_RELEASE --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE --target-profile=$TARGET_PROFILE --target-ram=$TARGET_RAM delete || true return $RC } CMDLINE="$SCRIPTEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-release=$TARGET_RELEASE create" debug 10 "create: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$? error "$(basename $PRESEEDEDITOR_CMD): failed; cleaning up ..." $PRESEEDEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-release=$TARGET_RELEASE delete || true $PXEEDITOR_CMD --debug=$VERBOSELEVEL -target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-macaddr=$TARGET_MACADDR --target-release=$TARGET_RELEASE delete || true $REPOEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-release=$TARGET_RELEASE delete || true $INPROGRESSEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-vm-flag=$TARGET_VM_FLAG --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-release=$TARGET_RELEASE --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE --target-profile=$TARGET_PROFILE --target-ram=$TARGET_RAM delete || true return $RC } CMDLINE="$DHCPDEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-ipaddr=$TARGET_IPADDR create" debug 10 "create: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$? error "$(basename $DHCPDEDITOR_CMD): failed; cleaning up ..." $SCRIPTEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-release=$TARGET_RELEASE delete || true $PRESEEDEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-release=$TARGET_RELEASE delete || true $PXEEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-macaddr=$TARGET_MACADDR --target-release=$TARGET_RELEASE delete || true $REPOEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-release=$TARGET_RELEASE delete || true $INPROGRESSEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-vm-flag=$TARGET_VM_FLAG --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-release=$TARGET_RELEASE --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE --target-profile=$TARGET_PROFILE --target-ram=$TARGET_RAM delete || true return $RC } ! $TARGET_VM_FLAG || { CMDLINE="$STORAGEEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE create" debug 10 "create: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$? error "$(basename $STORAGEEDITOR_CMD): failed; cleaning up ..." $DHCPDEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-ipaddr=$TARGET_IPADDR delete || true $SCRIPTEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-release=$TARGET_RELEASE delete || true $PRESEEDEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-release=$TARGET_RELEASE delete || true $PXEEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-macaddr=$TARGET_MACADDR --target-release=$TARGET_RELEASE delete || true $REPOEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-release=$TARGET_RELEASE delete || true $INPROGRESSEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-vm-flag=$TARGET_VM_FLAG --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-release=$TARGET_RELEASE --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE --target-profile=$TARGET_PROFILE --target-ram=$TARGET_RAM delete || true return $RC } CMDLINE="$POOLEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-ram=$TARGET_RAM create" debug 10 "create: calling [$CMDLINE] ..." eval "$CMDLINE" || { # on error remove dhcp reservation and PXE file before returning RC=$? error "$(basename $POOLEDITOR_CMD): failed; cleaning up ..." $STORAGEEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE delete || true $DHCPDEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-ipaddr=$TARGET_IPADDR delete || true $SCRIPTEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-release=$TARGET_RELEASE delete || true $PRESEEDEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-release=$TARGET_RELEASE delete || true $PXEEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-macaddr=$TARGET_MACADDR --target-release=$TARGET_RELEASE delete || true $REPOEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-release=$TARGET_RELEASE delete || true $INPROGRESSEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-vm-flag=$TARGET_VM_FLAG --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-release=$TARGET_RELEASE --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE --target-profile=$TARGET_PROFILE --target-ram=$TARGET_RAM delete || true return $RC } CMDLINE="$VMEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-ram=$TARGET_RAM --console-mode=$CONSOLE_MODE create" debug 10 "create: calling [$CMDLINE] ..." eval "$CMDLINE" || { # on error remove dhcp reservation and PXE file before returning RC=$? error "$(basename $VMEDITOR_CMD): failed; cleaning up ..." $POOLEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-ram=$TARGET_RAM delete || true $STORAGEEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE delete || true $DHCPDEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-ipaddr=$TARGET_IPADDR delete || true $SCRIPTEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-release=$TARGET_RELEASE delete || true $PRESEEDEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-release=$TARGET_RELEASE delete || true $PXEEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-macaddr=$TARGET_MACADDR --target-release=$TARGET_RELEASE delete || true $REPOEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-release=$TARGET_RELEASE delete || true $INPROGRESSEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-vm-flag=$TARGET_VM_FLAG --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-release=$TARGET_RELEASE --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE --target-profile=$TARGET_PROFILE --target-ram=$TARGET_RAM delete || true return $RC } } elif [ $MODE = delete ]; then ## RECURSE! #debug 10 "delete: MKDI_LOOKUP_DONE_FLAG=$MKDI_LOOKUP_DONE_FLAG" #[ "X$MKDI_LOOKUP_DONE_FLAG" = Xtrue ] || { # export MKDI_LOOKUP_DONE_FLAG=true # debug 10 "delete: execing [$RELEASE_CMDLINE] ..." # exec $RELEASE_CMDLINE # internal "delete: exec failed" #} # Guts ! $TARGET_VM_FLAG || [ "X$RELEASER_FLAG" = Xtrue ] || { CMDLINE="$VMEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-ram=$TARGET_RAM delete" debug 10 "delete: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "vm-editor: failed"; return $RC; } CMDLINE="$POOLEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-ram=$TARGET_RAM delete" debug 10 "delete: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "pool-editor: failed"; return $RC; } CMDLINE="$STORAGEEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE delete" debug 10 "delete: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "storage-editor: failed"; return $RC; } } CMDLINE="$DHCPDEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-ipaddr=$TARGET_IPADDR --target-macaddr=$TARGET_MACADDR --target-ipaddr=$TARGET_IPADDR delete" debug 10 "delete: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "dhcpd-editor: failed"; return $RC; } CMDLINE="$SCRIPTEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-release=$TARGET_RELEASE delete" debug 10 "delete: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "script-editor: failed"; return $RC; } CMDLINE="$PRESEEDEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-release=$TARGET_RELEASE delete" debug 10 "delete: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "preseed-editor: failed"; return $RC; } CMDLINE="$PXEEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-macaddr=$TARGET_MACADDR --target-release=$TARGET_RELEASE delete" debug 10 "delete: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "pxe-editor: failed"; return $RC; } [ "X$RELEASER_FLAG" = Xtrue ] || { CMDLINE="$REPOEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-release=$TARGET_RELEASE delete" debug 10 "delete: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "repo-editor: failed"; return $RC; } } CMDLINE="$INPROGRESSEDITOR_CMD --debug=$VERBOSELEVEL --target-hostname=$TARGET_HOSTNAME --target-macaddr=$TARGET_MACADDR --target-vm-flag=$TARGET_VM_FLAG --iscsiserver-hostname=$ISCSISERVER_HOSTNAME --target-ipaddr=$TARGET_IPADDR --target-hvm-flag=$TARGET_HVM_FLAG --vmserver-hostname=$VMSERVER_HOSTNAME --target-release=$TARGET_RELEASE --iscsiserver-volume-group=$ISCSISERVER_VOLUME_GROUP --target-root-disk-size=$TARGET_ROOT_DISK_SIZE --target-profile=$TARGET_PROFILE --target-ram=$TARGET_RAM delete" debug 10 "delete: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "inprogress-editor: failed"; return $RC; } # If we're being called by the releaser, then that means the installation # completed successfully and we need to inform root. [ "X$RELEASER_FLAG" != Xtrue ] || mailx -s "$TARGET_HOSTNAME installation completed successfully" $MAILTO < /dev/null fi return 0 } purge() { # Process options # Process arguments [ $# = 0 ] || usage # Guts CMDLINE="$VMEDITOR_CMD --debug=$VERBOSELEVEL purge" debug 10 "purge: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "vm-editor: failed"; return $RC; } CMDLINE="$POOLEDITOR_CMD --debug=$VERBOSELEVEL purge" debug 10 "purge: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "pool-editor: failed"; return $RC; } CMDLINE="$STORAGEEDITOR_CMD --debug=$VERBOSELEVEL purge" debug 10 "purge: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "storage-editor: failed"; return $RC; } CMDLINE="$DHCPDEDITOR_CMD --debug=$VERBOSELEVEL purge" debug 10 "purge: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "dhcpd-editor: failed"; return $RC; } CMDLINE="$SCRIPTEDITOR_CMD --debug=$VERBOSELEVEL purge" debug 10 "purge: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "script-editor: failed"; return $RC; } CMDLINE="$PRESEEDEDITOR_CMD --debug=$VERBOSELEVEL purge" debug 10 "purge: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "preseed-editor: failed"; return $RC; } CMDLINE="$PXEEDITOR_CMD --debug=$VERBOSELEVEL purge" debug 10 "purge: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "pxe-editor: failed"; return $RC; } CMDLINE="$REPOEDITOR_CMD --debug=$VERBOSELEVEL purge" debug 10 "purge: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "repo-editor: failed"; return $RC; } CMDLINE="$INPROGRESSEDITOR_CMD --debug=$VERBOSELEVEL purge" debug 10 "purge: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "inprogress-editor: failed"; return $RC; } return 0 } list() { local CMDLINE # Process options # Process arguments [ $# = 0 ] || usage # Guts echo "VMs" echo "===" echo CMDLINE="$VMEDITOR_CMD --debug=$VERBOSELEVEL list" debug 10 "list: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "vm-editor: failed"; return $RC; } echo echo "pools" echo "=====" echo CMDLINE="$POOLEDITOR_CMD --debug=$VERBOSELEVEL list" debug 10 "list: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "pool-editor: failed"; return $RC; } echo echo "storage" echo "=======" echo CMDLINE="$STORAGEEDITOR_CMD --debug=$VERBOSELEVEL list" debug 10 "list: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "storage-editor: failed"; return $RC; } echo echo "DHCP reservations" echo "=================" echo CMDLINE="$DHCPDEDITOR_CMD --debug=$VERBOSELEVEL list" debug 10 "list: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "dhcpd-editor: failed"; return $RC; } echo echo "script files" echo "============" echo CMDLINE="$SCRIPTEDITOR_CMD --debug=$VERBOSELEVEL list" debug 10 "list: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "script-editor: failed"; return $RC; } echo echo "preseed files" echo "=============" echo CMDLINE="$PRESEEDEDITOR_CMD --debug=$VERBOSELEVEL list" debug 10 "list: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "preseed-editor: failed"; return $RC; } echo echo "PXE files" echo "=========" echo CMDLINE="$PXEEDITOR_CMD --debug=$VERBOSELEVEL list" debug 10 "list: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "pxe-editor: failed"; return $RC; } echo echo "repos" echo "=====" echo debug 10 "list: calling repo-editor ..." CMDLINE="$REPOEDITOR_CMD --debug=$VERBOSELEVEL list" debug 10 "list: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "repo-editor: failed"; return $RC; } echo echo "in-progress records" echo "===================" echo debug 10 "list: calling inprogress-editor ..." CMDLINE="$INPROGRESSEDITOR_CMD --debug=$VERBOSELEVEL list" debug 10 "list: calling [$CMDLINE] ..." eval "$CMDLINE" || { RC=$?; error "inprogress-editor: failed"; return $RC; } echo return 0 } usage() { local RC RC=${1:-1} { echo "Usage: $PROGNAME [ ] { edit [ ] | create | delete | list | purge }" echo echo "Options: --delete-old-vm=true overwrite an existing VM" echo } | if [ $RC = 0 ]; then cat else cat >&2 fi exit $RC } expand_autos() { local DB_VAR DB_VAL RC CMDLINE # Process arguments [ $# = 0 ] || internal "expand_autos: $#: invalid argument count" for DB_VAR in $DB_VARS; do eval "DB_VAL=\"\$$DB_VAR\"" if [ "X$DB_VAL" != Xauto ]; then : elif [ $DB_VAR = MAILTO ]; then { [ "X$ADMINEMAIL" != X ] && MAILTO=$ADMINEMAIL; } || { error "ADMINEMAIL: not defined (do you need to run 'export ADMINEMAIL=root'?)"; return 1; } elif [ $DB_VAR = RELEASE_CMDLINE ]; then RELEASE_CMDLINE="$MKDI_CMD --debug=$VERBOSELEVEL delete $TARGET_HOSTNAME" elif [ $DB_VAR = TARGET_MACADDR ]; then TARGET_MACADDR=$(perl -e 'printf "00:16:3e:%02x:%02x:%02x\n", map { int(rand()*256) } 1..3') elif [ $DB_VAR = TARGET_IPADDR ]; then TARGET_IPADDR=$(host $TARGET_HOSTNAME 2> /dev/null | sed 's/.*\t//') # The function calling this one is going to call validate_vars() to # validate all the results. If the hostname is not resolvable then # the error message "mkdi: ERROR: : not a legal value for target_ipaddr" # is not the most helpful. So here we do our own validation simply to # be able to put a nicer message. validate_ipaddr "$TARGET_IPADDR" || { RC=$?; error "$TARGET_HOSTNAME: not resolvable"; return $RC; } elif eval "[ \"X\$DFLT_$DB_VAR\" = X ]"; then internal "expand_autos: DFLT_$DB_VAR: not defined" else eval "$DB_VAR=\"\$DFLT_$DB_VAR\"" fi done } main "$@"