#!/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 # Defaults for options VERBOSELEVEL=2 # 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#*=} ;; # 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 "$@" || 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 "$@" || 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 # 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#*=} ;; # 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 pool ..." 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 create || return $? return 0 } delete() { local TARGET_HOSTNAME ISCSISERVER_HOSTNAME TARGET_HVM_FLAG VMSERVER_HOSTNAME TARGET_MACADDR TARGET_RAM # 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#*=} ;; # 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 pool ..." 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 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 VIRSH_OUTPUT # 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#*=} ;; # 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 || 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" 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 $? # Guts if [ $MODE = create ]; then debug 10 "create_or_delete: writing a config file for the iSCSI storage pool ..." echo -e "\n$TARGET_HOSTNAME\n\n\n\n\n\n/dev/disk/by-path\n\n" | ssh $VMSERVER_HOSTNAME "cat > /tmp/$TARGET_HOSTNAME.xml" VIRSH_OUTPUT=$(ssh -n $VMSERVER_HOSTNAME virsh pool-define /tmp/$TARGET_HOSTNAME.xml 2>&1) debug 10 "create_or_delete: loading the config file for the iSCSI storage pool ..." [ "X$VIRSH_OUTPUT" = "XPool $TARGET_HOSTNAME defined from /tmp/$TARGET_HOSTNAME.xml" ] || { error "virsh: failed (output was: $VIRSH_OUTPUT)"; return 1; } debug 10 "create_or_delete: marking the iSCSI storage pool for autostart ..." VIRSH_OUTPUT=$(ssh -n $VMSERVER_HOSTNAME virsh pool-autostart $TARGET_HOSTNAME 2>&1) [ "X$VIRSH_OUTPUT" = "XPool $TARGET_HOSTNAME marked as autostarted" ] || { error "virsh: failed (output was: $VIRSH_OUTPUT)"; return 1; } debug 10 "create_or_delete: activating the iSCSI storage pool ..." VIRSH_OUTPUT=$(ssh -n $VMSERVER_HOSTNAME virsh pool-start $TARGET_HOSTNAME 2>&1) [ "X$VIRSH_OUTPUT" = "XPool $TARGET_HOSTNAME started" ] || { error "virsh: failed (output was: $VIRSH_OUTPUT)"; return 1; } elif [ $MODE = delete ]; then VIRSH_OUTPUT=$(ssh -n $VMSERVER_HOSTNAME virsh pool-destroy $TARGET_HOSTNAME 2>&1) || true [ "X$VIRSH_OUTPUT" = "XPool $TARGET_HOSTNAME destroyed" ] || warning "virsh: failed (output was: $VIRSH_OUTPUT)" VIRSH_OUTPUT=$(ssh -n $VMSERVER_HOSTNAME virsh pool-undefine $TARGET_HOSTNAME 2>&1) || true [ "X$VIRSH_OUTPUT" = "XPool $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 # Note grepping out 'vmstore-', to try to ensure that we only list iSCSI pools for VMs ssh -n $VMSERVER_HOSTNAME virsh pool-list --all | grep -v vmstore- | sed -e '/^--/d' -e '/^Name/d' -e '/^$/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 "$@"