def refreshHost(host):
	print "Starting refresh " + host + " at "+time.strftime("%H:%M:%S", time.gmtime())
	if MarkLogicEC2Config.isWindows():
		MarkLogicEC2Lib.sys("Reinstalling for "+host,"powershell -file " + reinstallFileName(host))		
	elif MarkLogicEC2Config.isRedHat():
		refreshRedHatHost(host)
	print "Finishing refresh " + host + " at "+time.strftime("%H:%M:%S", time.gmtime())
def setupHost(host):
	print "Setting up "+host
	if MarkLogicEC2Config.isWindows():
		setupWindowsHost(host)
		MarkLogicEC2Lib.sys("Setting up "+host,"powershell -file pws\server-setup.ps1")		
	elif MarkLogicEC2Config.isRedHat():
		setupRedHatHost(host)
def cleanHost(host):
	print "Terminating host "+host
	dns_name = getInstance(host).public_dns_name	
	volumes_for_deletion = []

	# Get attached volumes before terminating - you can't get them after
	for volume in ec2.get_all_volumes():
#		print "Volume is "+volume.id
		if volume.attach_data.instance_id == host:
#			print "Adding "+volume.id
			volumes_for_deletion.append(volume.id)
			
	getInstance(host).terminate()
	
	waitForTerminatedState(host)
	
	# Now delete un-deleted volumes - problem with Red Hat instances is that they're not auto-deleted
	for volume in ec2.get_all_volumes():
		for volume_for_deletion in volumes_for_deletion:
			if volume.id == volume_for_deletion:			
				print "Removing volume " + volume.id
				volume.delete()
		
	if(MarkLogicEC2Config.USE_ELASTIC_IP):	
		if getElasticIP(host):		
			print "Removing elastic ip "+str(getElasticIP(host))
			getElasticIP(host).release()
	
	for file in (adminFileName(host),sessionFileName(host),reinstallFileName(host),RDPFileName(host),sshFileName(host)):
		removeFile(file)
	
	if(MarkLogicEC2Config.isRedHat()):
		MarkLogicEC2Lib.sys("Remove from known hosts file","ssh-keygen -R "+dns_name)
def startInstance(host):
	if(not(isRunning(host))):
		print "Starting thaw of " + host + " at "+time.strftime("%H:%M:%S", time.gmtime())
		ec2.start_instances(host)
		waitForRunningState(host)
		if(MarkLogicEC2Config.USE_ELASTIC_IP):
			getElasticIP(host).associate(host)
			print "Elastic IP added for host " + host + " - " + str(getElasticIP(host))
		waitForReachableState(host)			
		if MarkLogicEC2Config.isRedHat():
			MarkLogicEC2Lib.sys("Check device mapping ...",sshToBoxString(getInstance(host).dns_name) + "'" + lnCommand()+ "'")			
			createSSHLink(host)
		if MarkLogicEC2Config.isWindows():
			createRDPLink(host)
			createSessionLink(host)
			createReinstallScript(host)					
		createAdminConsoleLink(host)
		
		print "Host " + host + " started at "+time.strftime("%H:%M:%S", time.gmtime())
	else:
		print "Host " + host + " already running"
def createHost():
	cmd=""

	print "Starting create host at "+time.strftime("%H:%M:%S", time.gmtime())
	
	if MarkLogicEC2Config.isWindows():
		cmd = '<powershell>Enable-PSRemoting -Force</powershell>'	
		
	reservation = ec2.run_instances(image_id=MarkLogicEC2Config.getImageID(),instance_type=MarkLogicEC2Config.INSTANCE_SIZE,key_name=MarkLogicEC2Config.EC2_KEY_PAIR_NAME,security_groups=[MarkLogicEC2Config.EC2_SECURITY_GROUP_NAME],user_data=cmd)
	
	instance = reservation.instances[0]
	print "Created instance "+ instance.id
	
	waitForRunningState(str(instance.id))

	f = open(MarkLogicEC2Config.HOST_FILE,"a")
	f.write(instance.id+"\n")
	f.close()	
	
	if(MarkLogicEC2Config.USE_ELASTIC_IP):
		allocateIP(instance.id)
		print "Elastic IP added for host " + instance.id + " - " + getHostIP(instance.id)

	waitForReachableState(str(instance.id))			
		
	if MarkLogicEC2Config.isRedHat():
		createSSHLink(str(instance.id))
		volume = ec2.create_volume(MarkLogicEC2Config.DISK_CAPACITY,instance.placement,"")
		while volume.status != 'available':
			print "Volume status is "+volume.status
			time.sleep(5)
			volume = ec2.get_all_volumes([str(volume.id)])[0]
		volume.attach(instance.id,MarkLogicEC2Config.EBS_DEVICE_NAME)
		print MarkLogicEC2Config.DISK_CAPACITY + "G disk volume created"
		print "Volume status is "+volume.status		
	print "Finishing create host at "+time.strftime("%H:%M:%S", time.gmtime())
"""
	Generic MarkLogic install and configuration script     
    	author: Alex Bleasdale <*****@*****.**> 
		updated: Ken Tune <*****@*****.**>
	version: 0.2

"""

ADMIN_ROOT = MARKLOGIC_ROOT + "Admin\\"
WINDOWS_INSTALL_MODE= " /passive /quiet"

INSTALL_CMD=""
START_CMD=""
STOP_CMD=""

if MarkLogicEC2Config.isWindows():
	INSTALL_CMD = INSTALL_DIR + MARKLOGIC_EXE + WINDOWS_INSTALL_MODE
	START_CMD = "net start MarkLogic"
	STOP_CMD = "net stop MarkLogic"
	ADMIN_ROOT = MARKLOGIC_ROOT + "Admin\\"
	COPY_CMD = "copy /Y *.xqy \""+ADMIN_ROOT+"\""

elif MarkLogicEC2Config.isRedHat():
	INSTALL_CMD = "cd " + INSTALL_DIR +"; yum -y install "+ MARKLOGIC_EXE
	START_CMD = "/etc/init.d/MarkLogic start"
	STOP_CMD = "/etc/init.d/MarkLogic stop"
	ADMIN_ROOT = MARKLOGIC_ROOT + "Admin/"
	COPY_CMD = "cp *.xqy "+ADMIN_ROOT

	
LOCALHOST = "localhost" 
def restartHost(host):
	if(MarkLogicEC2Config.isRedHat()):
		MarkLogicEC2Lib.sys("Restarting "+host,sshToBoxString(getInstance(host).dns_name) + "'/etc/init.d/MarkLogic restart'")
		setupHost(host)			
	cluster()
elif(mode == RESTART_MODE):
	if(len(sys.argv) > 2):
		host = getHostForRequest(sys.argv[2])
		restartHost(host)
	else:
		for host in getAvailableHosts():
			restartHost(host)			
elif(mode == DEVICES_MODE):
	if(len(sys.argv) > 2):
		host = getHostForRequest(sys.argv[2])
		MarkLogicEC2Lib.sys("Check device mapping ...",sshToBoxString(getInstance(host).dns_name) + "'" + lnCommand()+ "'")						
	else:
		for host in getAvailableHosts():
			MarkLogicEC2Lib.sys("Check device mapping ...",sshToBoxString(getInstance(host).dns_name) + "'" + lnCommand()+ "'")												
elif(mode == REMOTE_MODE):
	if(len(sys.argv) > 2):			
		dns_name =  getInstance(getHostForRequest(sys.argv[2])).dns_name
		if MarkLogicEC2Config.isRedHat():
			MarkLogicEC2Lib.sys("Logging into box "+dns_name,sshToBoxString(dns_name))
		elif MarkLogicEC2Config.isWindows():
			MarkLogicEC2Lib.sys("Logging into box "+dns_name,"powershell -noexit -file sessions\\"+ dns_name + ".session.ps1")
	else:
		print "You must supply an index or an instance id"
else:
	print mode +" is not a permitted mode"