#!/usr/bin/env python


import sys
import os

def error(message):
	sys.stderr.write(str(message))
	sys.stderr.flush()

def usage():
	error("usage: msctl [ stop | start | setload load_value ]\n")
	sys.exit(os.EX_USAGE)

if len(sys.argv) < 2: usage()

command = sys.argv[1]
if command not in [ "stop","setload","start" ]:
	usage()

from MetadataService import Config
config = Config.get()
sockaddr = config.get_socket()


import xmlrpclib
from UnixSocketTransport import UnixSocketTransport
import socket

# Create an object to represent our server.
server_url = 'http://localhost:2081/';
socket_filename = sockaddr
server = xmlrpclib.ServerProxy(server_url,UnixSocketTransport(socket_filename))

def handle_socket_error(e):
	error("Cannot contact metadata service through %s\n"%socket_filename)
	sys.exit(os.EX_UNAVAILABLE)

if command == "setload":
	try: target_load = float(sys.argv[2])
	except:
		usage()

	try: results = server.loadController.setTargetLoad(target_load)
	except socket.error,e:
		handle_socket_error(e)
	if results is not True:
		error("Cannot set target load: ")
		error(results)
		error("\n")
		sys.exit(os.EX_PROTOCOL)

elif command == "stop":
	try: results = server.metadataService.shutDown()
	except socket.error,e:
		handle_socket_error(e)
	if results is not True:
		error("Cannot stop metadata service: %s\n"%results)
		sys.exit(EX_PROTOCOL)
	lockfile = config.get("service","lock file")
	count = 0; maximum = 30
	while os.path.exists(lockfile) and count < maximum:
		count = count + 1
		import time
		time.sleep(1)
	if count >= maximum:
		error("Metadata service refuses to stop\n")
		sys.exit(EX_SOFTWARE)

elif command == "start":
	
	not_running = False
	try: results = server.noexist.dumbmethod()
	except socket.error,e:
		# not running, good
		not_running = True
	except: pass

	if not_running is False:
		error("Metadata service is already running\n")
		import errno
		sys.exit(errno.EALREADY)
	path = os.path.join(os.path.dirname(sys.argv[0]),"metadata-service")
	if not os.path.exists(path):
		error("Cannot find %s\n"%path)
		sys.exit(os.EX_UNAVAILABLE)
	if not os.access(path,os.X_OK):
		error("Cannot run %s\n"%path)
		sys.exit(os.EX_NOPERM)
	try: os.execl(path,path)
	except Exception,e:
		error("Cannot start metadata service: %s\n"%str(e))
		sys.exit(os.EX_OSERR)

else:
	raise AssertionError, "Why the hell did we reach here?"
	sys.exit(os.EX_SOFTWARE)

sys.exit(os.EX_OK)
