#! /bin/ksh
#
# ident "@(#)scinstall_argvars.ksh 1.6     01/02/07 SMI"
#
# Copyright (c) 1999-2001 by Sun Microsystems, Inc.
# All rights reserved.
#

####################################################
#
# argvar_append_tofile_nodename() index filename
#
#	Append SC_ARGVAR_NODENAME[index]
#	to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_nodename()
{
	typeset index=${1}
	typeset filename=${2}
	integer i

	set -f

	# append SC_ARGVAR_NODENAME[index] to the filename
	echo "SC_ARGVAR_NODENAME[${index}]=\"$(echo ${SC_ARGVAR_NODENAME[index]})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_jumpstartdir() filename
#
#	Append SC_ARGVAR_JUMPSTARTDIR to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_jumpstartdir()
{
	typeset filename=${1}

	set -f

	# append SC_ARGVAR_JUMPSTARTDIR to the filename
	echo "SC_ARGVAR_JUMPSTARTDIR=\"$(echo ${SC_ARGVAR_JUMPSTARTDIR})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_sponsornode() index filename
#
#	Append SC_ARGVAR_SPONSORNODE[index]
#	to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_sponsornode()
{
	integer index=${1}
	typeset filename=${2}

	set -f

	# append SC_ARGVAR_SPONSORNODE[index] to the filename
	echo "SC_ARGVAR_SPONSORNODE[${index}]=\"$(echo ${SC_ARGVAR_SPONSORNODE[index]})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_clustername() filename
#
#	Append SC_ARGVAR_CLUSTERNAME to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_clustername()
{
	typeset filename=${1}

	set -f

	# append SC_ARGVAR_CLUSTERNAME to the filename
	echo "SC_ARGVAR_CLUSTERNAME=\"$(echo ${SC_ARGVAR_CLUSTERNAME})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_authlist() filename
#
#	Append SC_ARGVAR_AUTHLIST to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_authlist()
{
	typeset filename=${1}

	set -f

	# append SC_ARGVAR_AUTHLIST to the filename
	echo "SC_ARGVAR_AUTHLIST=\"$(echo ${SC_ARGVAR_AUTHLIST})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_authtype() filename
#
#	Append SC_ARGVAR_AUTHTYPE to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_authtype()
{
	typeset filename=${1}

	set -f

	# append SC_ARGVAR_AUTHTYPE to the filename
	echo "SC_ARGVAR_AUTHTYPE=\"$(echo ${SC_ARGVAR_AUTHTYPE})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_netaddr() filename
#
#	Append SC_ARGVAR_NETADDR and SC_ARGVAR_NETMASK
#	to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_netaddr()
{
	typeset filename=${1}

	set -f

	# append SC_ARGVAR_NETADDR to the filename
	echo "SC_ARGVAR_NETADDR=\"$(echo ${SC_ARGVAR_NETADDR})\"" >>${filename} || return 1

	# append SC_ARGVAR_NETMASK to the filename
	echo "SC_ARGVAR_NETMASK=\"$(echo ${SC_ARGVAR_NETMASK})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_directconnect() filename
#
#	Append SC_ARGVAR_TWONODES and SC_ARGVAR_DIRECT
#	to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_directconnect()
{
	typeset filename=${1}

	set -f

	# append SC_ARGVAR_TWONODES to the filename
	echo "SC_ARGVAR_TWONODES=\"$(echo ${SC_ARGVAR_TWONODES})\"" >>${filename} || return 1

	# append SC_ARGVAR_DIRECT to the filename
	echo "SC_ARGVAR_DIRECT=\"$(echo ${SC_ARGVAR_DIRECT})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_junctions() index filename
#
#	Append SC_ARGVAR_JUNCTIONS[index] and SC_ARGVAR_JUNCTYPES
#	to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_junctions()
{
	integer index=${1}
	typeset filename=${2}

	set -f

	# append SC_ARGVAR_JUNCTIONS[index] to the filename
	echo "SC_ARGVAR_JUNCTIONS[${index}]=\"$(echo ${SC_ARGVAR_JUNCTIONS[index]})\"" >>${filename} || return 1

	# append SC_ARGVAR_JUNCTYPES[index] to the filename
	echo "SC_ARGVAR_JUNCTYPES[${index}]=\"$(echo ${SC_ARGVAR_JUNCTYPES[index]})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_adapters() index filename
#
#	Append SC_ARGVAR_ADAPTERS[index]
#	to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_adapters()
{
	integer index=${1}
	typeset filename=${2}

	set -f

	# append SC_ARGVAR_ADAPTERS[index] to the filename
	echo "SC_ARGVAR_ADAPTERS[${index}]=\"$(echo ${SC_ARGVAR_ADAPTERS[index]})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_etheradap() index filename
#
#	Append SC_ARGVAR_ETHERADAP[index]
#	to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_etheradap()
{
	integer index=${1}
	typeset filename=${2}

	set -f

	# append SC_ARGVAR_ETHERADAP[index] to the filename
	echo "SC_ARGVAR_ETHERADAP[${index}]=\"$(echo ${SC_ARGVAR_ETHERADAP[index]})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_trtypes() index filename
#
#	Append SC_ARGVAR_TRTYPES[index]
#	to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_trtypes()
{
	integer index=${1}
	typeset filename=${2}

	set -f

	# append SC_ARGVAR_TRTYPES[index] to the filename
	echo "SC_ARGVAR_TRTYPES[${index}]=\"$(echo ${SC_ARGVAR_TRTYPES[index]})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_cables() index filename
#
#	Append SC_ARGVAR_E2CABLES[index]
#	to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_cables()
{
	integer index=${1}
	typeset filename=${2}

	set -f

	# append SC_ARGVAR_E2CABLES[index] to the filename
	echo "SC_ARGVAR_E2CABLES[${index}]=\"$(echo ${SC_ARGVAR_E2CABLES[index]})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_ports() index filename
#
#	Append both SC_ARGVAR_E1PORTS[index] and
#	SC_ARGVAR_E2PORTS[index] to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_ports()
{
	integer index=${1}
	typeset filename=${2}

	set -f

	# append SC_ARGVAR_E1PORTS[index] to the filename
	echo "SC_ARGVAR_E1PORTS[${index}]=\"$(echo ${SC_ARGVAR_E1PORTS[index]})\"" >>${filename} || return 1

	# append SC_ARGVAR_E2PORTS[index] to the filename
	echo "SC_ARGVAR_E2PORTS[${index}]=\"$(echo ${SC_ARGVAR_E2PORTS[index]})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_globaldir() index filename
#
#	Append SC_ARGVAR_GDIR[index]
#	to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_globaldir()
{
	integer index=${1}
	typeset filename=${2}

	set -f

	# append SC_ARGVAR_GDIR[index] to the filename
	echo "SC_ARGVAR_GDIR[${index}]=\"$(echo ${SC_ARGVAR_GDIR[index]})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_tofile_services() index filename
#
#	Append SC_ARGVAR_SERVICES[index]
#	to the given "filename".
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_tofile_services()
{
	integer index=${1}
	typeset filename=${2}

	set -f

	# append SC_ARGVAR_SERVICES[index] to the filename
	echo "SC_ARGVAR_SERVICES[${index}]=\"$(echo ${SC_ARGVAR_SERVICES[index]})\"" >>${filename} || return 1

	return 0
}

####################################################
#
# argvar_append_all_tofile() "indices" filename
#
#	Append SC_ARGVAR_ argument variables to "filename"
#	for all given "indices".   If "indices" is NULL,
#	0-7 is used.
#
#       Return:
#		zero		Success
#		non-zero	Failure
#
####################################################
argvar_append_all_tofile()
{
	typeset indices="${1}"
	typeset filename=${2}

	typeset i

	# If "indices" is NULL, do all ${SC_MAXNODES}
	if [[ -z "${indices}" ]]; then
		i=0
		while [[ ${i} -lt ${SC_MAXNODES} ]]
		do
			indices="${indices} ${i}"
			((i += 1))
		done
	fi

	# Array variables
	for i in ${indices}
	do
		argvar_append_tofile_nodename "${i}" ${filename} || return 1
		argvar_append_tofile_sponsornode "${i}" ${filename} || return 1
	done

	# Non-array variables
	argvar_append_tofile_jumpstartdir ${filename} || return 1
	argvar_append_tofile_clustername ${filename} || return 1
	argvar_append_tofile_authlist ${filename} || return 1
	argvar_append_tofile_authtype ${filename} || return 1
	argvar_append_tofile_netaddr ${filename} || return 1
	argvar_append_tofile_directconnect ${filename} || return 1

	# Array variables
	for i in ${indices}
	do
		argvar_append_tofile_junctions "${i}" ${filename} || return 1
		argvar_append_tofile_adapters "${i}" ${filename} || return 1
		argvar_append_tofile_etheradap "${i}" ${filename} || return 1
		argvar_append_tofile_trtypes "${i}" ${filename} || return 1
		argvar_append_tofile_cables "${i}" ${filename} || return 1
		argvar_append_tofile_ports "${i}" ${filename} || return 1
		argvar_append_tofile_globaldir "${i}" ${filename} || return 1
		argvar_append_tofile_services "${i}" ${filename} || return 1
	done

	return 0
}

####################################################
#
# argvar_print_SC_ARGVARS() "index" "command"
#
#	Print an scinstall command from SC_VARARGS.
#	The form of the command is given in "command".
#
#	This function always returns zero.
#
####################################################
argvar_print_SC_ARGVARS()
{
	typeset index="${1}"
	typeset command="${2}"

	integer N

	# Set SC_ARGVARS from the SC_ARGVAR_ set of variables
	set -A SC_ARGVARS
	argvars_to_SC_ARGVARS "${index}" "${command}"

	# Print the first line
	printf "      %s" "${SC_ARGVARS[0]}"

	# Print the remaining lines
	N=1
	while [[ -n "${SC_ARGVARS[N]}" ]]
	do
		printf " \\ \n"
		printf "           %s" "${SC_ARGVARS[N]}"
		((N += 1))
	done
	printf "\n\n"

	return 0
}

####################################################
#
# argvar_set_indices()
#
#	Set SC_INDICES to the list of all indices found in
#	SC_ARGVAR_NODNAME[*].
#
#	This function always returns zero.
#	
####################################################
argvar_set_indices()
{
	integer index
	typeset node
	typeset sc_indices

	# Set sc_indices
	sc_indices=
	for node in ${SC_ARGVAR_NODENAME[*]}
	do
		index=0
		while [[ "${node}" != "${SC_ARGVAR_NODENAME[index]}" ]]
		do
			((index += 1))
		done
		sc_indices="${sc_indices} ${index}"
	done

	# Set SC_INDICES
	SC_INDICES=
	SC_INDICES="$(
	    (
	    	for index in ${sc_indices}
		do
			echo ${index}
		done
	    ) | sort -n -)"

	return 0
}

####################################################
#
# argvars_to_SC_ARGVARS "index" "variables"
#
#	Inspect the SC_ARGVAR variables and
#	insert them into the SC_ARGVARS array
#	as options to scinstall.
#
#	The first element of the SC_ARGVARS array
#	will consist of "variables".  The second two
#	should always be the clustername and sponsornode.
#	Additional elements are formed from the
#	SC_ARGVAR_* variable settings.
#
#	This function always returns zero.
#
####################################################
argvars_to_SC_ARGVARS()
{
	typeset index="${1}"
	typeset variables="${2}"

	typeset adapter
	typeset adapters
	typeset trtypes
	typeset junctions
	typeset junctypes
	typeset cables
	typeset e1ports
	typeset e2ports
	typeset var
	typeset service

	integer N=0
	integer i
	integer first
	integer newcluster=0

	# clear SC_ARGVARS
	set -A SC_ARGVARS

	# Set "newcluster" flag, if this is a new cluster
	if [[ "${SC_ARGVAR_SPONSORNODE[index]}" = "${SC_ARGVAR_NODENAME[index]}" ]]; then
		newcluster=1
	fi

	#
	# Set SC_ARGVARS[N] to variables passed to this func
	#
	if [[ -n "${variables}" ]]; then
		SC_ARGVARS[N]="${variables}"
		((N += 1))
	fi

	#
	# Set SC_ARGVARS[N] to CLUSTERNAME
	#
	if [[ -n "${SC_ARGVAR_CLUSTERNAME}" ]]; then
		SC_ARGVARS[N]="-C ${SC_ARGVAR_CLUSTERNAME}"
		((N += 1))
	fi

	#
	# Set SC_ARGVARS[N] to -F or -N SPONSORNODE
	#
	if [[ ${newcluster} -eq 1 ]]; then
		SC_ARGVARS[N]="-F"
		((N += 1))

	elif [[ -n "${SC_ARGVAR_SPONSORNODE[index]}" ]]; then
		SC_ARGVARS[N]="-N ${SC_ARGVAR_SPONSORNODE[index]}"
		((N += 1))
	fi

	#
	# Add global devices file system, if not the default
	#
	if [[ -n "${SC_ARGVAR_GDIR[index]}" ]] &&
	    [[ "${SC_ARGVAR_GDIR[index]}" != "${SC_DFLT_GDIR}" ]]; then
		SC_ARGVARS[N]="-G ${SC_ARGVAR_GDIR[index]}"
		((N += 1))
	fi

	#
	# Set SC_ARGVARS[N] to SERVICES
	#
	for service in ${SC_ARGVAR_SERVICES[index]}
	do
		if [[ -n "${SC_ARGVARS[N]}" ]]; then
			SC_ARGVARS[N]="${SC_ARGVARS[N]},${service}"
		else
			SC_ARGVARS[N]="-s ${service}"
		fi
	done
	if [[ -n "${SC_ARGVARS[N]}" ]]; then
		((N += 1))
	fi

	#
	# Set SC_ARGVARS[N] to AUTHLIST and AUTHTYPE (only for new cluster)
	#
	if [[ ${newcluster} -eq 1 ]]; then
		first=1
		if [[ -n "${SC_ARGVAR_AUTHLIST}" ]]; then
			for var in ${SC_ARGVAR_AUTHLIST}
			do
				if [[ ${first} -eq 1 ]]; then
					SC_ARGVARS[N]="-T node=${var}"
					first=0
				else
					SC_ARGVARS[N]="${SC_ARGVARS[N]},node=${var}"
				fi
			done
			if [[ -n "${SC_ARGVAR_AUTHTYPE}" ]]; then
				SC_ARGVARS[N]="${SC_ARGVARS[N]},authtype=${SC_ARGVAR_AUTHTYPE}"
			fi
		fi
		if [[ -n "${SC_ARGVARS[N]}" ]]; then
			((N += 1))
		fi
	fi

	#
	# Set SC_ARGVARS[N] to NETADDR and NETMASK (only for new cluster)
	#
	if [[ ${newcluster} -eq 1 ]]; then
		SC_ARGVAR_NETADDR=${SC_ARGVAR_NETADDR:-${SC_DFLT_NETADDR}}
		SC_ARGVAR_NETMASK=${SC_ARGVAR_NETMASK:-${SC_DFLT_NETMASK}}
		if [[ "${SC_ARGVAR_NETADDR}" != "${SC_DFLT_NETADDR}" ]] ||
		    [[ "${SC_ARGVAR_NETMASK}" != "${SC_DFLT_NETMASK}" ]]; then
			SC_ARGVARS[N]="-w netaddr=${SC_ARGVAR_NETADDR}"
	    		if [[ "${SC_ARGVAR_NETMASK}" != "${SC_DFLT_NETMASK}" ]]; then
				SC_ARGVARS[N]="${SC_ARGVARS[N]},netmask=${SC_ARGVAR_NETMASK}"
			fi
		fi
		if [[ -n "${SC_ARGVARS[N]}" ]]; then
			((N += 1))
		fi
	fi

	#
	# Set SC_ARGVARS[N] to the adapter option lists
	#
	set -A adapters ${SC_ARGVAR_ADAPTERS[index]}
	set -A trtypes  ${SC_ARGVAR_TRTYPES[index]}
	i=-1
	for adapter in ${adapters[*]}
	do
		((i += 1))

		if [[ -z "${trtypes[i]}" ]]; then
			continue
		fi
		SC_ARGVARS[N]="${SC_ARGVARS[N]} -A trtype=${trtypes[i]},name=${adapters[i]}"
	done
	if [[ -n "${SC_ARGVARS[N]}" ]]; then
		set -f
		SC_ARGVARS[N]="$(echo ${SC_ARGVARS[N]})"
		set +f
		((N += 1))
	fi

	#
	# Set SC_ARGVARS[N] to the junction option lists (only for new clusters)
	#
	if [[ "${SC_ARGVAR_DIRECT}" = "1" ]]; then
		SC_ARGVARS[N]="-B type=direct"
	elif [[ ${newcluster} -eq 1 ]]; then
		set -A junctions ${SC_ARGVAR_JUNCTIONS[index]}
		set -A junctypes ${SC_ARGVAR_JUNCTYPES[index]}
		i=-1
		for adapter in ${adapters[*]}
		do
			((i += 1))

			if [[ -z "${junctions[i]}" ]] ||
			    [[ -z "${junctypes[i]}" ]]; then
				continue
			fi
			SC_ARGVARS[N]="${SC_ARGVARS[N]} -B type=${junctypes[i]},name=${junctions[i]}"
		done
	fi
	if [[ -n "${SC_ARGVARS[N]}" ]]; then
		set -f
		SC_ARGVARS[N]="$(echo ${SC_ARGVARS[N]})"
		set +f
		((N += 1))
	fi

	#
	# One cable per SC_ARGVARS[N] line (not on new direct connect clusters)
	#
	# Note that new clusters which are directly connected will
	# not have any cables.
	#
	# E1 ports are for the adapters on this end of each endpoint,
	# and E2 ports are for the other end.
	#
	if [[ ${newcluster} -eq 0 ]] ||
	    [[ "${SC_ARGVAR_DIRECT}" != "1" ]]; then
		set -A adapters ${SC_ARGVAR_ADAPTERS[index]}
		set -A cables   ${SC_ARGVAR_E2CABLES[index]}
		set -A e1ports    ${SC_ARGVAR_E1PORTS[index]}
		set -A e2ports    ${SC_ARGVAR_E2PORTS[index]}
		i=-1
		for adapter in ${adapters[*]}
		do
			((i += 1))

			if [[ -z "${cables[i]}" ]] ||
			    [[ "${cables[i]}" = "@" ]]; then
				((i += 1))
				continue
			fi
			SC_ARGVARS[N]="-m endpoint=:${adapters[i]}"

			if [[ -n "${e1ports[i]}" ]] &&
			    [[ "${e1ports[i]}" != "@" ]]; then
				SC_ARGVARS[N]="${SC_ARGVARS[N]}@${e1ports[i]}"
			fi
			SC_ARGVARS[N]="${SC_ARGVARS[N]},endpoint=${cables[i]}"
			if [[ -n "${e2ports[i]}" ]] &&
			    [[ "${e2ports[i]}" != "@" ]]; then
				SC_ARGVARS[N]="${SC_ARGVARS[N]}@${e2ports[i]}"
			fi
			((N += 1))
		done
	fi

	return 0
}

####################################################
#
# sc_clear_all_argvars()
#
#	Clear all SC_ARGVAR_ argument variables
#
#	This function always returns zero.
#	
####################################################
argvar_clear_all_argvars()
{
	set -A SC_ARGVAR_NODENAME
	set -A SC_ARGVAR_JUMPSTARTDIR
	set -A SC_ARGVAR_CLUSTERNAME
	set -A SC_ARGVAR_AUTHLIST
	set -A SC_ARGVAR_AUTHTYPE
	set -A SC_ARGVAR_NETADDR
	set -A SC_ARGVAR_NETMASK
	set -A SC_ARGVAR_TWONODES
	set -A SC_ARGVAR_DIRECT
	set -A SC_ARGVAR_SPONSORNODE
	set -A SC_ARGVAR_JUNCTIONS
	set -A SC_ARGVAR_JUNCTYPES
	set -A SC_ARGVAR_ADAPTERS
	set -A SC_ARGVAR_TRTYPES
	set -A SC_ARGVAR_E2CABLES
	set -A SC_ARGVAR_E1PORTS
	set -A SC_ARGVAR_E2PORTS
	set -A SC_ARGVAR_GDIR
	set -A SC_ARGVAR_SERVICES

	return 0
}
