import sys, os, socket, select, time, exceptions


def main ():

	iPort = int (sys.argv [1])
	sVMX = "/home/virtual-machines/vmware/win2k_sp4/TEST_WIN2K_SP4.vmx"
	if len (sys.argv) > 2:
		sVMX = sys.argv [2]

	# start server socket ...	
	soc_Server = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
	soc_Server.bind (('', iPort))
	soc_Server.listen (1)

	while True:
		try:
			(soc_Client, sAddress) = soc_Server.accept ()
			while True:
				try:
					data = soc_Client.recv (100)
				except:
					data = ''
				if len (data) == 0:
					soc_Client.close ()
					break;
				if True == data.startswith ('<< '):
					sSnapshot = data [2:].strip ()
					print 'reverting to ' + sSnapshot
					if '' == sSnapshot:
						print '[ERROR] snapshot name not present in request: ->' + data + '<-'
						continue

					sResponse = 'error'
					iAttempts = 0
					while 'error' in sResponse:
						pipe = os.popen ("vmrun revertToSnapshot " + sVMX + ' ' + sSnapshot)
						sResponse = ''.join (pipe.readlines ()).lower ()
						if 'error' in sResponse:
							print 'Error reverting to snapshot ' + sSnapshot
							print sResponse
							time.sleep (5)

							iAttempts += 1
							if iAttempts > 5:
								break

					sResponse = 'error'
					while 'error' in sResponse:
						pipe = os.popen ("vmrun start " + sVMX)
						sResponse = ''.join (pipe.readlines ()).lower ()
						if 'error' in sResponse:
							print 'Error resuming guest OS.'
							print sResponse
							time.sleep (5)

					soc_Client.send ("\n")

		except:
			print sys.exc_info ()[1]
			if sys.exc_info ()[0] == exceptions.KeyboardInterrupt:
				print 'exiting'
				soc_Server.close ()
				return


if __name__ == '__main__':
	sys.exit (main ())
