#!/bin/bash

function display_logo
{
	echo "  =======   ============     ======       ======"
	echo "  =======   ==============   =======     ======="
	echo "    ===       ===     ====     ======   ======"
	echo "    ===       ===========      ======= ======="
	echo "    ===       ===========      === ======= ==="
	echo "    ===       ===     ====     ===  =====  ==="
	echo "  =======   ==============   =====   ===   ====="
	echo "  =======   ============     =====    =    ====="

	echo ""
	echo ""
}

function startup
{
	clearscreen

	echo "Loading...."
	load_cur_values

	# Pause for the logo to be seen
	sleep 2

	# Display the main menu
	main_menu
}

function load_cur_values
{
	if [ -e /root/IBM/NetworkAddresses ]; then
		. /root/IBM/NetworkAddresses
		BOOTPROTOCOL=$bootprotocol
		IP=$ip
		GATEWAY=$gateway
		SUBNET=$subnetmask
		DNS1=$nameserver1
		DNS2=$nameserver2
		DNS3=$nameserver3
		HOSTNAME=$hostname
		DOMAIN=$domainname
	else
		echo ""
		echo "Unable to Load NetworkAddresses - Restoring Defaults"
		restore_netDefaults
	fi
	if [ -e /root/IBM/IBMSetupInformationBlock ]; then
		. /root/IBM/IBMSetupInformationBlock
		VOLUME=$soundmaster
		RESOLUTION=$displayresolution
		COLOR=$displaycolor
		MGMT_ENABLED=$clientserverconfigure
		MGMT_SERVER=$clientserverip
		ROM_MGMT=$clientromflash
		CFLASH_MGMT=$clientcompactflash
	else
		echo ""
		echo "Unable to Load IBMSetupInformationBlock - Restoring Defaults"
		restore_setupDefaults
	fi
}

function restore_displayDefaults
{
	echo -e "\tRestoring default display settings..."
	sleep 1
	RESOLUTION=640
	COLOR=8
}

function restore_mgmtDefaults
{
	echo -e "\tRestoring default management settings..."
	sleep 1
	MGMT_ENABLED=1
	MGMT_SERVER="0.0.0.0"
	ROM_MGMT=1
	CFLASH_MGMT=1
}

function restore_audioDefaults
{
	echo -e "\tRestoring default audio settings..."
	sleep 1
	VOLUME=50
}

function restore_netDefaults
{
	echo -e "\tRestoring default network settings..."
	sleep 1
	BOOTPROTOCOL="dhcp"
	IP="0.0.0.0"
	GATEWAY="0.0.0.0"
	SUBNET="0.0.0.0"
	DNS1="0.0.0.0"
	DNS2="0.0.0.0"
	DNS3="0.0.0.0"
	HOSTNAME=""
	DOMAIN=""
}

function restore_setupDefaults
{
	restore_displayDefaults
	restore_mgmtDefaults
	restore_audioDefaults
}

function clearscreen { clear; echo -e "\n\n"; display_logo; }

function quit
{
	clearscreen
	echo -ne "\nSave changes? (Yes/No/Cancel) "; read -r SAVE
	case $SAVE in
		[yY]|[yY][eE][sS])
			saveSettings
			sync;sync;sync;sync
			echo -e "\n\nReboot The System For Changes To Take Effect\n\n\07"
			exit;;
		[nN]|[nN][oO])	
			echo -e "\n\nChanges Were Discarded\n\n"
			exit;;
		[cC]|[cC][aA][nN][cC][eE][lL])
			main_menu;;
		*)
			echo -e "\n\nInvalid Response\n\n"
			sleep 1
			quit;;
	esac
}

function saveSettings
{
	NETWORKFILE="/root/IBM/NetworkAddresses"
	echo -e "bootprotocol=$BOOTPROTOCOL\nip=$IP\ngateway=$GATEWAY\nsubnetmask=$SUBNET" > $NETWORKFILE
	echo -e "nameserver1=$DNS1\nnameserver2=$DNS2\nnameserver3=$DNS3" >> $NETWORKFILE
	echo -e "hostname=$HOSTNAME\ndomainname=$DOMAIN" >> $NETWORKFILE

	SETUPFILE="/root/IBM/IBMSetupInformationBlock"
	echo -e "soundmaster=$VOLUME\ndisplayresolution=$RESOLUTION\ndisplaycolor=$COLOR" > $SETUPFILE
	echo -e "clientserverconfigure=$MGMT_ENABLED\nclientserverip=$MGMT_SERVER" >> $SETUPFILE
	echo -e "clientromflash=$ROM_MGMT\nclientcompactflash=$CFLASH_MGMT" >> $SETUPFILE
}

function restore
{
	clearscreen
	select i in "$netDefaults" "$displayDefaults" "$audioDefaults" "$mgmtDefaults" "$MAIN"
	do
		case $i in
			"$netDefaults") echo ""; restore_netDefaults; restore;;
			"$displayDefaults") echo ""; restore_displayDefaults; restore;;
			"$audioDefaults") echo ""; restore_audioDefaults; restore;;
			"$mgmtDefaults") echo ""; restore_mgmtDefaults; restore;;
			"$MAIN") main_menu;;
			*) restore;;
		esac
	done
}

function management
{
	clearscreen
	if [ $CFLASH_MGMT -eq 1 ]
		then COMPACT_FLASH="Compact Flash Management - Enabled"
	else
		COMPACT_FLASH="Compact Flash Management - Disabled"
	fi
	if [ $ROM_MGMT -eq 1 ]
		then SYSTEM_ROM="System ROM Management - Enabled"
	else
		SYSTEM_ROM="System ROM Management - Disabled"
	fi
	select i in "Management Server" "$COMPACT_FLASH" "$SYSTEM_ROM" "$MAIN"
	do
		case $i in
			"Management Server") mgmt_server; management;;
			"$COMPACT_FLASH")
				if [ $CFLASH_MGMT -eq 1 ]
					then CFLASH_MGMT=0
				else
					CFLASH_MGMT=1
				fi
				management;;
			"$SYSTEM_ROM")
				if [ $ROM_MGMT -eq 1 ]
					then ROM_MGMT=0
				else
					ROM_MGMT=1
				fi
				management;;
			"$MAIN") main_menu;;
			*) management;;
		esac
	done
}

function mgmt_server
{
	clearscreen
	if [ $MGMT_ENABLED -eq 1 ]
		then MANAGEMENT_SERVER="Management Server - Enabled"
	else
		MANAGEMENT_SERVER="Management Server - Disabled"
	fi
	select i in "$MANAGEMENT_SERVER" "Management Server IP" "$MAIN"
	do
		case $i in
			"$MANAGEMENT_SERVER")
				if [ $MGMT_ENABLED -eq 1 ]
					then MGMT_ENABLED=0
				else
					MGMT_ENABLED=1
				fi
				mgmt_server;;
			"Management Server IP") get_mgmt_serverIP; mgmt_server;;
			"$MAIN") main_menu;;
			*) mgmt_server;;
		esac
	done
}

function get_mgmt_serverIP
{
	clearscreen
	CUR_MGMT_SERVER=$MGMT_SERVER
	echo "Press <RETURN> to keep current value (shown in parenthesis)."
	echo ""
	getServerIP
}

function getServerIP
{
	echo -n "Management Server IP ($MGMT_SERVER): "; read -r MGMT_SERVER
	if [ ! $MGMT_SERVER ]
		then MGMT_SERVER=$CUR_MGMT_SERVER
	fi
	check_valid $MGMT_SERVER "getServerIP"
}

function main_menu
{
	clearscreen
	select i in "Network Settings" "Display Settings" "Audio Settings" "Management" "System" "Quit"
	do
		case $i in
			"Network Settings") networking;;
			"Display Settings") display;;
			"Audio Settings") audio;;
			"Management") management;;
			"System") restore;;
			"Quit") quit;;
			*) main_menu;;
		esac
	done
}

function audio
{
	clearscreen
	CUR_VOLUME=$VOLUME
	echo "Press <RETURN> to keep current value (shown in parenthesis)."
	echo "0 = mute, 100 = full volume"
	echo ""
	getVOLUME
	main_menu
}

function getVOLUME
{
	echo -n "Volume ($VOLUME): "; read -r VOLUME
	if [ ! $VOLUME ]
		then VOLUME=$CUR_VOLUME
	fi
	check_valid $VOLUME "getVOLUME"
	if [ $VOLUME -gt 100 ]
		then VOLUME=100
	elif [ $VOLUME -lt 0 ]
		then VOLUME=0
	fi
}

function display
{
	clearscreen
	select i in "Display Resolution" "Color Depth" "$MAIN"
	do
		case $i in
			"Display Resolution") resolution;;
			"Color Depth") color;;
			$MAIN) main_menu;;
			*) display;;
		esac
	done
}

function color
{
	clearscreen
	case $COLOR in
		8) COLOR8="8 Bit (*)"; COLOR16="16 Bit";;
		16) COLOR8="8 Bit"; COLOR16="16 Bit (*)";;
	esac
	select i in "$COLOR8" "$COLOR16" "$CANCEL"
	do
		case $i in
			"$COLOR8") COLOR=8; display;;
			"$COLOR16") COLOR=16; display;;
			"$CANCEL") display;;
			*) color;;
		esac
	done
}

function resolution
{
	clearscreen
	case $RESOLUTION in
		640) RES_640="640x480 (*)"; RES_800="800x600"; RES_1024="1024x768"; RES_1280="1280x1024";;
		800) RES_640="640x480"; RES_800="800x600 (*)"; RES_1024="1024x768"; RES_1280="1280x1024";;
		1024) RES_640="640x480"; RES_800="800x600"; RES_1024="1024x768 (*)"; RES_1280="1280x1024";;
		1280) RES_640="640x480"; RES_800="800x600"; RES_1024="1024x768"; RES_1280="1280x1024 (*)";;
	esac
	select i in "$RES_640" "$RES_800" "$RES_1024" "$RES_1280" "$CANCEL"
	do
		case $i in
			"$RES_640") RESOLUTION=640; display;;
			"$RES_800") RESOLUTION=800; display;;
			"$RES_1024") RESOLUTION=1024; display;;
			"$RES_1280") RESOLUTION=1280; display;;
			"$CANCEL") display;;
			*) resolution;;
		esac
	done
}

function networking
{
	clearscreen
	case $BOOTPROTOCOL in
		"dhcp") BP_DHCP="DHCP (*)"; BP_BOOTP="BOOTP"; BP_IP="Specify IP Address";;
		"bootp") BP_DHCP="DHCP"; BP_BOOTP="BOOTP (*)"; BP_IP="Specify IP Address";;
		"ip") BP_DHCP="DHCP"; BP_BOOTP="BOOTP"; BP_IP="Specify IP Address (*)";;
	esac
	select i in "$BP_DHCP" "$BP_BOOTP" "$BP_IP" "$MAIN"
	do
		case $i in
			"$BP_DHCP") BOOTPROTOCOL="dhcp"; networking;;
			"$BP_BOOTP") BOOTPROTOCOL="bootp"; networking;;
			"$BP_IP") BOOTPROTOCOL="ip"; set_IP;;
			"$MAIN") main_menu;;
			*) networking;;
		esac
	done
}

function getIP
{
	echo -n "IP Address ($IP): "; read -r IP
	if [ ! $IP ]
		then IP=$CUR_IP
	fi
	check_valid $IP "getIP"
}

function getGATEWAY
{
	echo -n "Gateway ($GATEWAY): "; read -r GATEWAY
	if [ ! $GATEWAY ]
		then GATEWAY=$CUR_GATEWAY
	fi
	check_valid $GATEWAY "getGATEWAY"
}

function getSUBNET
{
	echo -n "Subnet Mask ($SUBNET): "; read -r SUBNET
	if [ ! $SUBNET ]
		then SUBNET=$CUR_SUBNET
	fi
	check_valid $SUBNET "getSUBNET"
}

function getDNS1
{
	echo -n "Nameserver 1 ($DNS1): "; read -r DNS1
	if [ ! $DNS1 ]
		then DNS1=$CUR_DNS1
	fi
	check_valid $DNS1 "getDNS1"
}

function getDNS2
{
	echo -n "Nameserver 2 ($DNS2): "; read -r DNS2
	if [ ! $DNS2 ]
		then DNS2=$CUR_DNS2
	fi
	check_valid $DNS2 "getDNS2"
}

function getDNS3
{
	echo -n "Nameserver 3 ($DNS3): "; read -r DNS3
	if [ ! $DNS3 ]
		then DNS3=$CUR_DNS3
	fi
	check_valid $DNS3 "getDNS3"
}

function set_IP
{
	clearscreen
	CUR_IP=$IP
	CUR_HOSTNAME=$HOSTNAME
	CUR_DOMAIN=$DOMAIN
	CUR_GATEWAY=$GATEWAY
	CUR_SUBNET=$SUBNET
	CUR_DNS1=$DNS1
	CUR_DNS2=$DNS2
	CUR_DNS3=$DNS3
	echo "Press <RETURN> to keep the current value (shown in parenthesis)."
	echo ""

	getIP
	echo -n "Hostname ($HOSTNAME): "; read -r HOSTNAME
	if [ ! $HOSTNAME ]
		then HOSTNAME=$CUR_HOSTNAME
	fi
	echo -n "Domain ($DOMAIN): "; read -r DOMAIN
	if [ ! $DOMAIN ]
		then DOMAIN=$CUR_DOMAIN
	fi
	getGATEWAY
	getSUBNET
	getDNS1
	getDNS2
	getDNS3

	networking
}

function check_valid # number callingFunction
{
	TEMP=`echo $1 | tr -d "[a-z][A-Z][\-\"]"`
	if [ ${#TEMP} -ne ${#1} ]
		then echo -e "\nInvalid value"; $2;
	fi

	TEMP=`echo $1 | cut -f1 -d"."`
	if [ $TEMP -gt 255 ] 
		then echo -e "\nInvalid value"; $2;
	fi	
	TEMP=`echo $1 | cut -f2 -d"."`
	if [ $TEMP -gt 255 ]
		then echo -e "\nInvalid value"; $2;
	fi	
	TEMP=`echo $1 | cut -f3 -d"."`
	if [ $TEMP -gt 255 ]
		then echo -e "\nInvalid value"; $2;
	fi	
	TEMP=`echo $1 | cut -f4 -d"."`
	if [ $TEMP -gt 255 ]
		then echo -e "\nInvalid value"; $2;
	fi	
}

# Define variables used
MAIN="Return To Main Menu"
CANCEL="Cancel"
PS3="Select One: "
netDefaults="Restore Default Network Settings"
displayDefaults="Restore Default Display Settings"
audioDefaults="Restore Default Audio Settings"
mgmtDefaults="Restore Default Management Settings"

COLOR8="8 Bit"
COLOR16="16 Bit"
BP_DHCP="DHCP"
BP_BOOTP="BOOTP"
BP_IP="Specify IP Address"
RES_640="640x480"
RES_800="800x600"
RES_1024="1024x768"
RES_1280="1280x1024"

startup
