#!/bin/bash
#########################################################################
# File Name: ConoHa_UPISO.sh
# Author: LookBack
# Email: admin#dwhd.org
# Version:	1.2
# Created Time: 2015年08月11日 星期二 21时37分03秒
# Uupdate Time: 2015年08月22日 星期五 01时19分02秒
#########################################################################


hidingInput() {
	outinfo="" && read -s -n 1 -p "$1" info
	while [ -n "$info" ];do
		outinfo=$outinfo$info && echo -n \*
		read -s -n 1 info
	done
	echo -e "\n" && eval $2=$outinfo
}

getInfo() {
	clear
	read -p "Plz input API username : " UserName && echo
	hidingInput "Plz input API password : " PassWord

	while true; do
		if ! egrep -o '^.{32}\b' <<< $TenantID >/dev/null 2>&1; then
			[ -n "$TenantID" ] && echo -e "\nTenantID Err, Plz input TenantID again~~~!"
			hidingInput "Plz input API Tenant ID : " TenantID
		else
			break
		fi
	done

	[ "$1" = "no" ] || while true; do
		if ! egrep -o '^(http[s]?|ftp[s]?)://' <<< $ISOURL >/dev/null 2>&1; then
			[ -n "$ISOURL" ] && echo -e "\nISO URl Err, Plz input URL again~~~!"
			read -p "Plz input ISO URL : " ISOURL
		else
			break
		fi
	done

	while true; do
		echo -e "\nPlz select the location of the node
\033[31mJapan=1\033[0m,\033[32mSingapore=2\033[0m,\033[31mUSA=3\033[0m"
		read -p 'Plz input "1" or "2" or "3" : ' Node && echo
		if [ "$Node" = "1" ]; then
			Node=tyo1 && break
		elif [ "$Node" = "2" ]; then
			Node=sin1 && break
		elif [ "$Node" = "3" ]; then
			Node=sjc1 && break
		else
			echo -e "\nInput Err, Plz select again~~"
		fi
	done
	[ "$?" = "0" ] && return 0 || return 1
}

checkInfo() {
	while true; do
		if [ ! -x /usr/local/bin/jq ]; then
			[ "$(getconf LONG_BIT)" = "64" ] && wget -4cq https://github.com/stedolan/jq/releases/download/jq-1.4/jq-linux-x86_64 -O /usr/local/bin/jq
			[ "$(getconf LONG_BIT)" = "32" ] && wget -4cq https://github.com/stedolan/jq/releases/download/jq-1.4/jq-linux-x86 -O /usr/local/bin/jq
			chmod +x /usr/local/bin/jq
		fi
		[ "$1" = "no" ] && getInfo no || getInfo
		eval XAuthToken=`curl -s -X POST -H "Accept: application/json" \
			-d "{\"auth\": {\"passwordCredentials\": {\
			\"username\": \"$UserName\",\"password\": \"$PassWord\"},\"tenantId\": \"$TenantID\"\
			}}" https://identity.${Node}.conoha.io/v2.0/tokens | jq '.access.token.id'`
		egrep -o '^.{32}\b' <<< $XAuthToken >/dev/null 2>&1
		[ "$?" = "0" ] && break || echo "Info Err, Plz input again ~~"
	done
	[ "$?" = "0" ] && return 0 || return 1
}

upISO() {
	curl -s -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -H "X-Auth-Token: $XAuthToken" \
	-d "{\"iso-image\": {\"url\": \"$ISOURL\"}}" https://compute.${Node}.conoha.io/v2/$TenantID/iso-images | jq '.request."iso-image".url' && echo
	[ "$?" = "0" ] && return 0 || return 1
}

checkState() {
	echo -e "\033[32m"
	curl -s -X GET -H 'Content-Type: application/json' -H 'Accept: application/json' -H "X-Auth-Token: $XAuthToken" \
	https://compute.${Node}.conoha.io/v2/$TenantID/iso-images | jq '."iso-images"[]|.url,.path,.name,.size' | \
	sed -r "s/^[0-9]+$/&\n/;s/$TenantID/****HID You\'r TenantID****/"
	echo -e "\033[0m"
	[ "$?" = "0" ] && return 0 || return 1
}

getPath() {
	curl -s -X GET -H 'Content-Type: application/json' -H 'Accept: application/json' \
		-H "X-Auth-Token: $XAuthToken" https://compute.${Node}.conoha.io/v2/$TenantID/iso-images | \
		jq . | awk -F'"' '/path/{a[++b]=$4;print "path["b"]="a[b]}'
}

vpsList() {
	eval `curl -s -X GET -H "Accept: application/json" -H "X-Auth-Token: $XAuthToken" \
		https://compute.${Node}.conoha.io/v2/$TenantID/servers/detail | \
		jq '.servers[]|.id' | awk '{print "UUID["NR"]="$0}'`
	eval `curl -s -X GET -H "Accept: application/json" -H "X-Auth-Token: $XAuthToken" \
		https://compute.${Node}.conoha.io/v2/$TenantID/servers/detail | \
		jq '.servers[]|.name' | sed 's/-/./g' | awk '{print "IP["NR"]="$0}'`
	for i in `seq 1 ${#IP[@]}`; do echo "IP[$i]=${IP[$i]}";done
}

checkStatus() {
	vpsStatus=$(curl -s -X GET -H "Accept: application/json" -H "X-Auth-Token: $XAuthToken" \
		https://compute.${Node}.conoha.io/v2/$TenantID/servers/detail | \
		jq '.servers[]|.status,.id' | awk '{if(NR%2!=0)ORS="=";else ORS="\n";print}'| \
		grep "$VPSUUID" | sed -r "s/\"//g;s/(.*)=(.*)/\1/")
}

powerVPS(){
	if [ "$1" = "stop" ]; then
		checkStatus
		if [ "$vpsStatus" = "ACTIVE" ]; then
			echo -e "\033[31mPlz wait 1 min,Now poweroff your VPS..\033[0m"
			curl -s -X POST -H "Accept: application/json" -H "X-Auth-Token: $XAuthToken" \
				-d '{"os-stop": null}' https://compute.${Node}.conoha.io/v2/$TenantID/servers/$VPSUUID/action
			sleep 60
		else
			echo -e "\033[32mStart set vncKeymap.\033[0m$(changeVNCKeyMap)"
			echo -e "\033[31Your VPS is't running...so can't poweroff...\033[0m"
		fi
	elif [ "$1" = "start" ]; then
		curl -s -X POST -H "Accept: application/json" -H "X-Auth-Token: $XAuthToken" \
			-d '{"os-start": null}' https://compute.${Node}.conoha.io/v2/$TenantID/servers/$VPSUUID/action
		while true; do
			checkStatus
			if [ "$vpsStatus" = "ACTIVE" ]; then
				echo -e "\033[32mStart set vncKeymap.\033[0m$(sleep 5 && changeVNCKeyMap)"
				break
			fi
		done
	fi
	[ "$?" = "0" ] || ( clear && echo "Err: Poweroff vps ERR, Now exit script" && exit)
}

changeVNCKeyMap(){
	curl -s -X POST -H "Accept: application/json" -H "X-Auth-Token: $XAuthToken" -d '{"vncKeymap": "en-us"}' \
		https://compute.${Node}.conoha.io/v2/$TenantID/servers/$VPSUUID/action >/dev/null 2>&1
}

QAQ() {
	getPath | sed "s/$TenantID/****HID You\'r TenantID****/" | \
		while read line;do echo -e "\033[32m$line\033[0m" ;done && eval `getPath`
	read -p "Plz enter the PATH that needs to be ${1}mount : " pathNO && \
		echo && vpsList
	read -p "Plz select your VPS : " uuidList && VPSUUID=${UUID[$uuidList]} && echo
}

mountISO(){
	[ -z "$XAuthToken" ] && checkInfo no
	
	[ -z "$1" ] && QAQ && powerVPS stop
	echo && echo -e "\033[32mStart mount ISO...\033[0m"
	curl -s -X POST -H "Accept: application/json" -H "X-Auth-Token: $XAuthToken" \
		-d "{\"mountImage\": \"${path[$pathNO]}\"}" \
		https://compute.${Node}.conoha.io/v2/$TenantID/servers/$VPSUUID/action && sleep 2
	echo && echo -e "\033[32mPrint mount info...\033[0m"
	curl -s -X GET -H "Accept: application/json" -H "X-Auth-Token: $XAuthToken" \
		https://compute.${Node}.conoha.io/v2/$TenantID/servers/$VPSUUID/ | \
		jq '.server.metadata.properties' | sed "s/$TenantID/****HID You\'r TenantID****/"
	if [ "$?" = "0" ]; then
		echo -e "\033[31mPlz wait 10s.\033[0m$(sleep 10)" && \
		echo -e "\033[32mNow Start Running your VPS.\033[0m" && powerVPS start
		sleep 10 && selectUCMUQ
	fi
	return 0 || return 1
}

umountISO() {
	[ -z "$XAuthToken" ] && checkInfo no
	QAQ u
	curl -s -X POST -H "Accept: application/json" -H "X-Auth-Token: $XAuthToken" \
		-d "{\"unmountImage\": \"${path[$pathNO]}\"}" \
		https://compute.${Node}.conoha.io/v2/$TenantID/servers/$VPSUUID/action | jq '.'
	sleep 10 && selectUCMUQ
	#[ "$?" = "0" ] && return 0 || return 1
}

SelectExit() {
	while true; do
		#clear
		echo 'Wait a moment to query the upload state.
Enter "Yes", continue to wait
Enter "No|Quit", exit check'
		read -p "Plz input : " Select
		case "$Select" in
			y|Y|[yY][eE][sS])
				echo -e "\nPlz wait 10s" && sleep 10
				checkState
				;;
			n|N|[nN][oO]|q|Q|[qQ][uU][iI][tT])
				break
				;;
			*)
				echo -e "Input Err......\n"
		esac
	done
	selectUCMUQ
}

selectUCMUQ() {
	while true; do
		clear
		echo "Do you want any other operation?
You can also upload ISO, mount ISO, umount ISO, check upload status again.
'upload ISO' Plz input 'upload/up'
'mount ISO' Plz input 'mount/m'
'umount ISO' Plz input 'umount/u'
Check upload status again, Plz input 'check/c'
Exit script, Plz input 'exit/quit/e/q'"
		read -p 'Plz input : ' Select2
		case "$Select2" in
			upload|up)
				checkInfo && upISO && SelectExit
				;;
			mount|m)
				mountISO
				;;
			umount|u)
				umountISO
				;;
			check|c)
				checkInfo no && checkState && SelectExit
				;;
			exit|quit|e|q)
				exit
				;;
			*)
				echo "Input Error .....\n"
		esac
	done

}

if [ -n "$1" ]; then
	case "$1" in
		upload|up)
			checkInfo && upISO && SelectExit
			;;
		check|c)
			checkInfo no && checkState && SelectExit
			;;
		mount|m)
			mountISO
			;;
		umount|um)
			umountISO
			;;
		*)
			echo $"Example :
Usage: $0 {[upload|u]|[check|c]|[mount|m]|[umount|um]}"
	esac
else
	checkInfo && upISO
	[ "$?" = "0" ] && SelectExit
fi
