#!/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/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 "$@"