#!/usr/bin/env python

# $HeadURL: http://localhost/repos/metadata-service/tags/release-0.1.8/bin/msctl $
# $Id: msctl 130 2005-04-01 17:31:03Z rudd-o $

import sys
import os

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

def usage():
	error("usage: msctl [ stop | start | getpid | status | 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","status","getpid" ]:
	usage()

from MetadataService import Config
cfgfile = None # for future specification of the config file
try: config = Config.get(cfgfile)
except Exception,e:
	if not cfgfile: cfgfile = Config.detect_config_file()
	error("Cannot load configuration from %s: %s\n"%(cfgfile,str(e)))
	sys.exit(os.EX_CONFIG)

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 == "getpid":
	try: pid = server.metadataService.getPid()
	except socket.error,e: handle_socket_error(e)
	if type(pid) is not int:
		error("Software error in metadata service: %s\n"%pid)
		sys.exit(EX_PROTOCOL)
	print "%s"%pid
	
elif command == "status":
	try: status = server.metadataService.status()
	except socket.error,e: handle_socket_error(e)
	if type(status) is not str:
		error("Software error in metadata service: %s\n"%status)
		sys.exit(EX_PROTOCOL)
	print status

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

	if not_running is False:
		error("Metadata service is already running with PID %s\n"%pid)
		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)
