#!/bin/sh
#
# Copyright 2006-2016 Hunan Kylin, Inc.  All Rights Reserved.
# 
# NOTICE: ALL INFORMATION CONTAINED HEREIN IS, AND REMAINS THE PROPERTY OF
# HUNAN KYLIN, INC. AND ITS SUPPLIERS, IF ANY. THE INTELLECTUAL AND
# TECHNICAL CONCEPTS CONTAINED HEREIN ARE PROPRIETARY TO HUNAN KYLIN, INC.
# AND ITS SUPPLIERS AND MAY BE COVERED BY U.S. AND FOREIGN PATENTS, PATENTS IN
# PROCESS, AND ARE PROTECTED BY TRADE SECRET OR COPYRIGHT LAW. DISSEMINATION
# OF THIS INFORMATION OR REPRODUCTION OF THIS MATERIAL IS STRICTLY FORBIDDEN
# UNLESS PRIOR WRITTEN PERMISSION IS OBTAINED FROM HUNAN KYLIN, INC.
#

warn()
{
	echo "${ansi_black_on_yellow}$@" "[m"
}

error()
{
	echo "${ansi_black_on_yellow}$@" "[m"
}

fatal()
{
	error "$@"
	exit 1
}

init_colors()
{
	ansi_black_on_yellow="[30;43m"
	ansi_purple="[01;35m"

	ansi_on="$ansi_purple"
	ansi_off="[m"
}

do_exit()
{
	exit_code=$1
	if [ -n "$op_id" ] ; then
		progress="0"
		[ "$exit_code" != "0" ] && progress="100"
		"$BINPATH/ksvd-util" --send-op-status --op-id $op_id --progress \
			$progress --result "$exit_code|$event_comment"
	fi
	exit $exit_code
}

usage()
{
	retval=${2:-20}

	event_comment="$event_comment|dbg.msg='$1'"

	cat <<EOF
$PRODNAME $PRODVER-$PRODBLD
$COPYRIGHTMSG
EOF
	[ "$1" != "" ] && printf "\nERROR: $1\n"

	cat <<EOF

USAGE: ksvd-create-gold -os <os> [options] <username> <gold>

required:
	-os		[win10|win8|win7|win5|linux|win2012|win2008|win2012R2|win2016]
	<username>
	<gold>		name of the gold image to create, which will be 
			placed in the user's home directory and named <gold>
optional:
	-c <path>	Name of CD/DVD device or .iso image file to install from
			(default: CD/DVD device is guessed)
	-b		Number of bits in CPU (32 or 64), default: 64
	-d		Maximum guest disk size, in gigabytes
	-D              D: (user) or Linux home virtual disk size, in megabytes;
	                (default: 2048)
	-h		Display this help page
	-k <key>	Windows Product Key to pass to Windows installer
			(default: installer prompts for key)
	-l		Use legacy graphics mode (required for older Linux)
	-os32           The OS to be installed is a 32-bit OS
	-m		Amount of RAM for guest, in megabytes
	-p <policy id>	Settings policy to be applied to this session
	-S <num>	Enable SMP (experimental)... <num> is number of cores
	-t <title>	Window title (default: <config-name>)
	--uuid <uuid>   KSVD_SESSION_UUID for this gold image
	--storage-location   storage location of image
	--imagetype     Image Type
	--vvgflag       VDI VDE and GPU flag
	--limittime     checkin limit time
	--gpuvid	vid of gpu
	--gpupid	pid of gpu
	--gpumodel	model of gpu
	--op-id <op-id> Operation id
	-v              verbose mode

EOF
	do_exit $retval
}

# returns name and org in arguments 2, 3
separate_org()
{
	name=$1

	org=`echo "$name" |sed 's/.*#//'`
	orgless_name=`echo "$name" |sed 's/#.*//'`
	eval "$2=\"$orgless_name\""
	eval "$3=\"$org\""
}

get_mc_user_home()
{
	settings_node="$VARPREFIX/settings.node"
	if [ -r "$settings_node" ] ; then
		eval `grep ^UNIQB_MC_USER= "$settings_node"`
	fi
	[ -z "$UNIQB_MC_USER" ] && fatal "UNIQB_MC_USER is not defined"

	home_=`awk -F: "/^$UNIQB_MC_USER/ { print \\$6}" /etc/passwd`
	eval "$1=\"$home_\""
}

# --------------------- main starts here ------------------------------
init_colors

# set environment
real0="$0"
[ -h $0 ] && real0=`ls -l "$0" |sed -e 's|.*-> ||'`
bin_dir=`dirname $real0`
set +e
eval `$bin_dir/uniqbenv`
set +e

# default options
user_image_size="2048"
cpu_bits=64
os=
event_comment="dbg.op=ksvd-create-gold"

# get options
while [ $# -gt 0 -a -z "$gold" ]; do
	opt=$1
	case $opt in
	-h)	usage "" 0 ;;
	-os32)	os32=1;;
	-os)
		shift
		[ -z "$1" ] && usage "missing argument to $opt"
		os="$1";;
	-b)
		shift
		[ -z "$1" ] && usage "missing argument to $opt"
		cpu_bits="$1"
		;;
	-c)
		shift
		[ -z "$1" ] && usage "missing argument to $opt"
		cdrom_path="$1"
		;;
	-m)
		shift
		[ -z "$1" ] && usage "missing argument to $opt"
		override_mem_size="$1"
		;;
	-d)
		shift
		[ -z "$1" ] && usage "missing argument to $opt"
		override_disk_size="$1"
		;;
	-D)
		shift
		[ -z "$1" ] && usage "missing argument to $opt"
		user_image_size="$1"
		;;
	-k)	shift
		[ -z "$1" ] && usage "missing argument to $opt"
		key="$1"
		;;
	-l)	use_legacy_graphics_mode=1;;
	-t)
		shift
		[ -z "$1" ] && usage "missing argument to $opt"
		title="$1"
		;;
	-p)
		shift
		[ -z "$1" ] && usage "missing argument to $opt"
		policy="-p $1"
		;;
	-S)
		shift
		[ -z "$1" ] && usage "missing argument to $opt"
		export UNIQB_GUEST_CPU_CORES="$1"
		;;
	-v)	set -x;;
	--uuid|-uuid)  shift
		[ -z "$1" ] && usage "missing argument to $opt"
		uuid="$1"
		;;
	--vvgflag)  shift
		[ -z "$1" ] && usage "missing argument to $opt"
		vvgflag="$1"
		;;
	--limittime)  shift
		[ -z "$1" ] && usage "missing argument to $opt"
		limittime="$1"
		;;
	--storage-location)  shift
		[ -z "$1" ] && usage "missing argument to $opt"
		stor_loc="$1"
		;;
	--imagetype)  shift
                [ -z "$1" ] && usage "missing argument to $opt"
                image_type="$1"
                ;;
	--gpuvid)  shift
		[ -z "$1" ] && usage "missing argument to $opt"
		gpuvid="$1"
		;;
	--gpupid)  shift
		[ -z "$1" ] && usage "missing argument to $opt"
		gpupid="$1"
		;;
	--gpumodel)  shift
		[ -z "$1" ] && usage "missing argument to $opt"
		gpumodel="$1"
		;;
	--usm)  shift
		[ -z "$1" ] && usage "missing argument to $opt"
		user_disk_mode="$1"
		;;
	--op-id)  shift
		[ -z "$1" ] && usage "missing argument to $opt"
		op_id="$1"
		;;
	-*)
		usage "unrecognized option $1"
		break
		;;
	*)	break;;
	esac
	shift
done
[ -z "$os" ] && usage "-os must be specified"
[ -z "$policy" ] && usage "-p must be specified"

[ $# -lt 2 ] && usage "missing username or gold name"
username_full=`echo "$1" | sed 's/#org-0//'`
gold_full=`echo "$2" | sed 's/#org-0//'`

event_comment="$event_comment|dbg.user=$username_full|dbg.gold=$gold_full"

separate_org $username_full username user_org
separate_org $gold_full gold gold_org

# compute configuration directory and files
gold_path="$HOME/$gold_full"

log_file="$gold_path/installuniqb.log"

# OS-Specific:
user_image_name="USER"

case "$os" in
win5)
	mem_size="128"
	disk_size="8"
	mach_type=11
	floppy="$gold_path/.answer.img"
	cmd_opts="-u $ETCPATH/WIN7AUTO.IMG" 
	;;
win7)
	mem_size="512"
	disk_size="16"
	mach_type=75
	floppy="$gold_path/.win7inst.img"
	cmd_opts="-u $ETCPATH/WIN7AUTO.IMG" 
	;;

win8)
	mem_size="512"
	disk_size="16"
	mach_type=60
	[ $os32 ] && mach_type=61
	floppy="$gold_path/.win7inst.img"
	cmd_opts="-u $ETCPATH/WIN7AUTO.IMG" 
	;;

win10)
        mem_size="512"
        disk_size="16"
        mach_type=70
        [ $os32 ] && mach_type=71
        floppy="$gold_path/.win7inst.img"
        cmd_opts="-u $ETCPATH/WIN7AUTO.IMG"
        ;;

win2008)
	mem_size="512"
	disk_size="16"
	mach_type=80
	[ $os32 ] && mach_type=81
	floppy="$gold_path/.win7inst.img"
	cmd_opts="-u $ETCPATH/WIN7AUTO.IMG" 
	;;

win2012)
	mem_size="512"
	disk_size="16"
	mach_type=50
	# no 32-bit 
	floppy="$gold_path/.win7inst.img"
	cmd_opts="-u $ETCPATH/WIN7AUTO.IMG" 
	;;

win2012R2)
        mem_size="512"
        disk_size="16"
        mach_type=51
        # no 32-bit 
        floppy="$gold_path/.win7inst.img"
        cmd_opts="-u $ETCPATH/WIN7AUTO.IMG"
        ;;

win2016)
        mem_size="512"
        disk_size="16"
        mach_type=53
	# no 32-bit
        floppy="$gold_path/.win7inst.img"
        cmd_opts="-u $ETCPATH/WIN7AUTO.IMG"
        ;;

linux)
	mem_size="256"
	disk_size="12"
	mach_type=6
	[ $use_legacy_graphics_mode ] && mach_type=5
	user_image_name="HOME"
	cmd_opts="-u $ETCPATH/LINUX32.IMG" 
	export UNIQB_LINUX_SSIGNON=yes
	;;

uos)
        mem_size="256"
        disk_size="12"
        mach_type=6
        [ $use_legacy_graphics_mode ] && mach_type=5
        user_image_name="HOME"
        cmd_opts="-u $ETCPATH/LINUX32.IMG"
        export UNIQB_LINUX_SSIGNON=yes
        ;;


armKylin)
	mem_size="256"
        disk_size="12"
        mach_type=9
        user_image_name="HOME"
        cmd_opts="-u $ETCPATH/LINUX32.IMG"
        export UNIQB_LINUX_SSIGNON=yes
        ;;

armuos)
        mem_size="256"
        disk_size="12"
        mach_type=9
        user_image_name="HOME"
        cmd_opts="-u $ETCPATH/LINUX32.IMG"
        export UNIQB_LINUX_SSIGNON=yes
        ;;

swKylin)
	mem_size="256"
	disk_size="12"
	mach_type=21
	user_image_name="HOME"
	cmd_opts="-u $ETCPATH/LINUX32.IMG"
	exprot UNIQB_LINUX_SSIGNON=yes
	;;

loongnix)
        mem_size="256"
        disk_size="12"
        mach_type=20
        user_image_name="HOME"
        cmd_opts="-u $ETCPATH/LINUX32.IMG"
        export UNIQB_LINUX_SSIGNON=yes
        ;;

mipsuos)
        mem_size="256"
        disk_size="12"
        mach_type=20
        user_image_name="HOME"
        cmd_opts="-u $ETCPATH/LINUX32.IMG"
        export UNIQB_LINUX_SSIGNON=yes
        ;;

kylin30)
	mem_size="256"
	disk_size="12"
	mach_type=22
	[ $use_legacy_graphics_mode ] && mach_type=5
	user_image_name="HOME"
	cmd_opts="-u $ETCPATH/LINUX32.IMG"
	export UNIQB_LINUX_SSIGNON=yes
	;;

ubuntu1604)
	mem_size="256"
	disk_size="12"
	mach_type=8
	[ $use_legacy_graphics_mode ] && mach_type=5
	user_image_name="HOME"
	cmd_opts="-u $ETCPATH/LINUX32.IMG" 
	export UNIQB_LINUX_SSIGNON=yes
	;;
*)	usage "unrecognized os type $os";;
esac

[ -z "$title" ] && title="$gold"
[ $override_disk_size ] && disk_size=$override_disk_size
[ $override_mem_size ] && mem_size=$override_mem_size
[ $op_id ] && cmd_opts="$cmd_opts -i $op_id"

# check for existence
if [ -f "$gold_path/GUEST.IMG" -o -f "$gold_path/settings.local" ]; then
	if grep -q "OP_ID=\"$op_id\"" "$gold_path/.session-info" "$gold_path/settings.local" ; then
		# this is a re-issue of the same request
		do_exit 0
	fi
	echo "ksvd-create-gold: existing installation in $gold_path"
	do_exit 50
fi

# create configuration directory
if ! mkdir -p "$gold_path" ; then
	echo "ksvd-create-gold: failed to create configuration directory $gold_path"
	do_exit 40
fi

# create installation floppy media
case $os in
win5)
	[ -n "$key" ] && key_opt="-k $key"
	username_no_domain=`echo "$username" |sed 's/@.*//'`
	if ! "$BINPATH/uniqb-winaflop" -v 5 $key_opt -N "$username_no_domain" "$floppy" ; then
		rmdir "$gold_path"
		do_exit 40
	fi
	cmd_opt_floppy="-f $floppy"
	;;
win7|win2008)
	if ! cp -f "$ETCPATH/INSTALL7.IMG" "$floppy" ; then
		rmdir "$gold_path"
		do_exit 40
	fi
	cmd_opt_floppy="-f $floppy"
	;;
esac

# create log file
cat <<EOF | tee "$log_file"
ksvd-create-gold: installing $os guest
	Configuration Path:	$gold_path
	Session Disk Size:	$disk_size GB
	Session RAM Size:	$mem_size MB
	Installation media:	$cdrom_path
	Storage location:	$stor_loc
	Image Type：		$image_type

Starting installation... please see $log_file for details...

EOF

[ -n "$cdrom_path" ] && cdrom_opt="-c"

# disable POSIX locking during installation
export UNIQB_DISABLE_POSIX_LOCKS=yes

set -x
"$BINPATH/uniqb-runtime" -v "$mach_type" -m "$mem_size" -d "$disk_size" -k "$user_disk_mode" \
	$cdrom_opt "$cdrom_path" $cmd_opt_floppy -U "$user_image_name.$user_image_size" \
	-b "$cpu_bits" -l $stor_loc -G $image_type \
	$cmd_opts $policy -N "$username_full" -C "$gold_full" -t "$title" -D >>$log_file 2>&1
err=$?
set +x

if [ "$err" -ne 0 ]; then
	echo "Installation failed or aborted."
	do_exit 110
fi

[ -n "${limittime}" ] && echo "UNIQB_LIMIT_TIME=\"${limittime}\"" >> "$gold_path/settings.local"
[ -n "$uuid" ] && echo "KSVD_SESSION_UUID=\"$uuid\"" >> "$gold_path/settings.local"

# 2=0x0010
isVde=$[vvgflag&2]
# 13=0x1101
isGpu=$[vvgflag&13]
# 16 =10000
isUefi=$[vvgflag&16]
if [ $vvgflag -eq -1 ]
then
    echo "is_voi=\"yes\"" >> "$gold_path/ksvd.gold.gpu"
    echo "is_gpu=\"no\"" >> "$gold_path/ksvd.gold.gpu"
    echo "is_vde=\"no\"" >> "$gold_path/ksvd.gold.gpu"
else
    echo "is_voi=\"no\"" >> "$gold_path/ksvd.gold.gpu"
    # 2=0x0010
    isVde=$[vvgflag&2]
    # 13=0x1101
    isGpu=$[vvgflag&13]
    if [ $isVde -ne 0 ]
    then
        echo "is_vde=\"yes\"" >> "$gold_path/ksvd.gold.gpu"
    else
        echo "is_vde=\"no\"" >> "$gold_path/ksvd.gold.gpu"
    fi
    if [ $isGpu -ne 0 ]
    then
        echo "is_gpu=\"yes\"" >> "$gold_path/ksvd.gold.gpu"
    else
        echo "is_gpu=\"no\"" >> "$gold_path/ksvd.gold.gpu"
    fi
fi

if [ $isUefi -ne 0 ]
then
	echo "is_uefi=\"yes\"" >> "$gold_path/ksvd.gold.gpu"
else
	echo "is_uefi=\"no\"" >> "$gold_path/ksvd.gold.gpu"
fi

if [ $gpuvid = "null" ]
then
	echo "gpu_vid=\"\"" >> "$gold_path/ksvd.gold.gpu"
else
	echo "gpu_vid=\"$gpuvid\"" >> "$gold_path/ksvd.gold.gpu"
fi

if [ $gpupid = "null" ]
then
	echo "gpu_pid=\"\"" >> "$gold_path/ksvd.gold.gpu"
else
	echo "gpu_pid=\"$gpupid\"" >> "$gold_path/ksvd.gold.gpu"
fi

if [[ $gpumodel = "null" ]]
then
	echo "gpu_model=\"\"" >> "$gold_path/ksvd.gold.gpu"
else
	echo "gpu_model=\"$gpumodel\"" >> "$gold_path/ksvd.gold.gpu"
fi

printf "\nInstallation setup complete.\n\n" | tee -a "$log_file"
do_exit 0


