#!/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 TARGET_HOSTNAME ISCSISERVER_HOSTNAME TARGET_HVM_FLAG VMSERVER_HOSTNAME TARGET_MACADDR TARGET_RAM local CONSOLE_MODE # Defaults for options VERBOSELEVEL=2 CONSOLE_MODE=graphics # Process options while [ "X$1" != X ]; do case $1 in # Application specific options --target-hostname=*) TARGET_HOSTNAME=${1#*=} ;; --iscsiserver-hostname=*) ISCSISERVER_HOSTNAME=${1#*=} ;; --target-hvm-flag=*) TARGET_HVM_FLAG=${1#*=} ;; --vmserver-hostname=*) VMSERVER_HOSTNAME=${1#*=} ;; --target-macaddr=*) TARGET_MACADDR=${1#*=} ;; --target-ram=*) TARGET_RAM=${1#*=} ;; --console-mode=*) CONSOLE_MODE=${1#*=} ;; # General options --help|-h) usage 0 ;; --verbose|-v) VERBOSELEVEL=3 ;; -d) VERBOSELEVEL=$2; shift ;; --debug=*) VERBOSELEVEL=${1#*=} ;; --) shift; break ;; -*) usage ;; *) break ;; esac shift done # Process arguments [ $# -ge 1 ] || usage MODE=$1; shift debug 10 "main: MODE=$MODE" # Sanity checks and derivations # Guts case $MODE in create) create --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 "$@" || return $? ;; delete) delete --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 "$@" || return $? ;; list) list "$@" || return $? ;; purge) purge "$@" || return $? ;; *) usage ;; esac return 0 } create() { local TARGET_HOSTNAME ISCSISERVER_HOSTNAME TARGET_HVM_FLAG VMSERVER_HOSTNAME TARGET_MACADDR TARGET_RAM local CONSOLE_MODE # Process options while [ "X$1" != X ]; do case $1 in # Application specific options --target-hostname=*) TARGET_HOSTNAME=${1#*=} ;; --iscsiserver-hostname=*) ISCSISERVER_HOSTNAME=${1#*=} ;; --target-hvm-flag=*) TARGET_HVM_FLAG=${1#*=} ;; --vmserver-hostname=*) VMSERVER_HOSTNAME=${1#*=} ;; --target-macaddr=*) TARGET_MACADDR=${1#*=} ;; --target-ram=*) TARGET_RAM=${1#*=} ;; --console-mode=*) CONSOLE_MODE=${1#*=} ;; # General options --) shift; break ;; -*) internal "create: $1: invalid option" ;; *) break ;; esac shift done # Process arguments [ $# = 0 ] || internal "create: $#: wrong arg count" # Create entry info "creating VM ..." create_or_delete --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 || return $? return 0 } delete() { local TARGET_HOSTNAME ISCSISERVER_HOSTNAME TARGET_HVM_FLAG VMSERVER_HOSTNAME TARGET_MACADDR TARGET_RAM local CONSOLE_MODE # Process options while [ "X$1" != X ]; do case $1 in # Application specific options --target-hostname=*) TARGET_HOSTNAME=${1#*=} ;; --iscsiserver-hostname=*) ISCSISERVER_HOSTNAME=${1#*=} ;; --target-hvm-flag=*) TARGET_HVM_FLAG=${1#*=} ;; --vmserver-hostname=*) VMSERVER_HOSTNAME=${1#*=} ;; --target-macaddr=*) TARGET_MACADDR=${1#*=} ;; --target-ram=*) TARGET_RAM=${1#*=} ;; --console-mode=*) CONSOLE_MODE=${1#*=} ;; # General options --) shift; break ;; -*) internal "delete: $1: invalid option" ;; *) break ;; esac shift done # Process arguments [ $# = 0 ] || internal "delete: $#: wrong arg count" # Delete entry info "deleting VM ..." create_or_delete --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 delete || return $? return 0 } create_or_delete() { local TARGET_HOSTNAME ISCSISERVER_HOSTNAME TARGET_HVM_FLAG VMSERVER_HOSTNAME TARGET_MACADDR TARGET_RAM local MODE LINE DHCPD_OUTPUT ISCSI_IQN ISCSI_IPADDR VIRTINSTALL_VIRTTYPE_OPTS VIRTINSTALL_CONSOLE_OPTS VIRTINSTALL_DISK_OPTS VIRTINSTALL_GPU_OPTS VIRSH_OUTPUT VIRTINSTALL_OUTPUT CONSOLE_MODE # Process options while [ "X$1" != X ]; do case $1 in # Application specific options --target-hostname=*) TARGET_HOSTNAME=${1#*=} ;; --iscsiserver-hostname=*) ISCSISERVER_HOSTNAME=${1#*=} ;; --target-hvm-flag=*) TARGET_HVM_FLAG=${1#*=} ;; --vmserver-hostname=*) VMSERVER_HOSTNAME=${1#*=} ;; --target-macaddr=*) TARGET_MACADDR=${1#*=} ;; --target-ram=*) TARGET_RAM=${1#*=} ;; --console-mode=*) CONSOLE_MODE=${1#*=} ;; # General options --) shift; break ;; -*) internal "create_or_delete: $1: invalid option" ;; *) break ;; esac shift done # Process arguments [ $# = 1 ] || internal "create_or_delete: $#: wrong arg count" MODE=$1 # Sanity checks and derivations validate_vars MODE TARGET_HOSTNAME ISCSISERVER_HOSTNAME TARGET_HVM_FLAG VMSERVER_HOSTNAME TARGET_MACADDR TARGET_RAM CONSOLE_MODE || return $? debug 10 "create_or_delete: MODE=$MODE, 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" check_ssh_access $VMSERVER_HOSTNAME || return $? # We'll need to use the IQN and IP address of the iSCSI server in a moment ISCSI_IQN=$(getiqn $ISCSISERVER_HOSTNAME $TARGET_HOSTNAME) || return $? ISCSI_IPADDR=$(host2ip $ISCSISERVER_HOSTNAME) || return $? VIRTINSTALL_CONSOLE_OPTS="--vnc --vncport=5917" VIRTINSTALL_DISK_OPTS="--disk path=/dev/disk/by-path/ip-$ISCSI_IPADDR:3260-iscsi-$ISCSI_IQN-lun-0" if $TARGET_HVM_FLAG; then VIRTINSTALL_VIRTTYPE_OPTS=--hvm VIRTINSTALL_BOOTMEDIA_OPTS="--pxe" VIRTINSTALL_GPU_OPTS= [ $CONSOLE_MODE != text ] || { error "PV guests' consoles can't be viewed in text mode (do you need '--console-mode=graphics'?)"; return 1; } else VIRTINSTALL_VIRTTYPE_OPTS=--paravirt VIRTINSTALL_BOOTMEDIA_OPTS="--location ${PAACRT_URL%/}/debian-$TARGET_RELEASE.$TARGET_HOSTNAME/dists/$TARGET_RELEASE/main/installer-i386/" VIRTINSTALL_GPU_OPTS=--nographics [ $CONSOLE_MODE != graphics ] || { error "PV guests' consoles may not be viewed in graphics mode (do you need '--console-mode=text'?)"; return 1; } fi # HVMs can only be viewed with a graphics console. PVs can be viewed in either but we choose to # allow only text console. # Guts if [ $MODE = create ]; then debug 10 "create_or_delete: calling virt-install ..." VIRTINSTALL_OUTPUT=$(ssh -n $VMSERVER_HOSTNAME virt-install --connect=xen --name=$TARGET_HOSTNAME --ram=$TARGET_RAM $VIRTINSTALL_BOOTMEDIA_OPTS $VIRTINSTALL_VIRTTYPE_OPTS $VIRTINSTALL_DISK_OPTS --network=bridge:br0 --mac=$TARGET_MACADDR $VIRTINSTALL_CONSOLE_OPTS --noautoconsole 2>&1) || { error "virt-install: failed (output was: $VIRTINSTALL_OUTPUT)"; return 1; } # View console case $CONSOLE_MODE in graphics) info "launching console viewer ..." ssh -Yn $VMSERVER_HOSTNAME virt-viewer $TARGET_HOSTNAME ;; text) info "attaching to text console ..." ssh -t $VMSERVER_HOSTNAME virsh console $TARGET_HOSTNAME ;; none) info "console not attached; you can monitor status with 'mkdi list'" ;; esac elif [ $MODE = delete ]; then VIRSH_OUTPUT=$(ssh -n $VMSERVER_HOSTNAME virsh domstate $TARGET_HOSTNAME 2>&1) || true debug 10 "create_or_delete: VIRSH_OUTPUT is [$VIRSH_OUTPUT]" # Only destroy it if it is not already destroyed. if [ "$VIRSH_OUTPUT" = "shut off" ]; then debug 10 "create_or_delete: $TARGET_HOSTNAME: already destroyed; not destroying" else VIRSH_OUTPUT=$(ssh -n $VMSERVER_HOSTNAME virsh destroy $TARGET_HOSTNAME 2>&1) || true [ "X$VIRSH_OUTPUT" = "XDomain $TARGET_HOSTNAME destroyed" ] || warning "virsh: failed (output was: $VIRSH_OUTPUT)" fi VIRSH_OUTPUT=$(ssh -n $VMSERVER_HOSTNAME virsh undefine $TARGET_HOSTNAME 2>&1) || true [ "X$VIRSH_OUTPUT" = "XDomain $TARGET_HOSTNAME has been undefined" ] || warning "virsh: failed (output was: $VIRSH_OUTPUT)" fi return 0 } purge() { # Guts # Too dangerous to do anything! return 0 } list() { local VMSERVER_HOSTNAME # Process options while [ "X$1" != X ]; do case $1 in # Application specific options # General options --) shift; break ;; -*) internal "list: $1: invalid option" ;; *) break ;; esac shift done # Process arguments [ $# = 0 ] || internal "list: $#: wrong arg count" # Guts for VMSERVER_HOSTNAME in $KNOWN_VMSERVER_HOSTNAMES; do ssh -n $VMSERVER_HOSTNAME virsh list --all | sed -e '/^--/d' -e '/^ Id /d' -e '/^$/d' -e '/Domain-0/d' -e "s/^/$VMSERVER_HOSTNAME: /" done return 0 } usage() { local RC RC=${1:-1} { echo "Usage: $PROGNAME [ ] { create | delete | list }" echo } | if [ $RC = 0 ]; then cat else cat >&2 fi exit $RC } main "$@"