#!/usr/bin/python
import sys, os, socket, signal, time, stat

base = "/a/static"
scripts = base + "/scripts"
#host = socket.gethostbyname();
host = "localhost"

if len(sys.argv) < 2:
	print "Usage: do-edition <edition>"
	sys.exit(1)

edition = sys.argv[1]

threads = {
	"localhost": 24,
}

# Create some directories
try: os.makedirs(base + "/var/logs")
except: pass
try: os.makedirs(base + "/var/checkpoints")
except: pass

# Set up in_progress symlink
try: os.unlink(base+'/downloads/in_progress')
except: pass
os.symlink(base+'/downloads/'+edition, base+'/downloads/in_progress')

# Start queue server
print "Starting queue server"
queueServer = os.fork()
if 0 == queueServer:
	# Run it in a new group so that its precious finishlang children don't get hurt
	os.close(1)
	os.close(2)
	os.setsid()
	fd = os.open(base+"/var/logs/netqueue.out", os.O_WRONLY|os.O_CREAT|os.O_APPEND, 0666)
	os.dup2(fd, 1)
	os.dup2(fd, 2)
	os.execlp("python", "python", scripts+"/netqueue.py")
	sys.exit(1)

# Wait for it to start up
queueSock = socket.socket()
while queueSock.connect_ex(("localhost", 8200)):
	time.sleep(0.1)


# Start slave threads
slaves = []
for host, number in threads.iteritems():
	for i in range(number):
		print "Starting thread %d on host %s" % (i, host)
		pid = os.fork()
		if pid == 0:
			# Redirect stdout
			os.close(1)
			fd = os.open("%s/var/logs/%s-%d.out" % (base, host, i), os.O_WRONLY|os.O_CREAT|os.O_APPEND, 0666)
			os.dup2(fd, 1)

			# Redirect stderr
			os.close(2)
			fd = os.open("%s/var/logs/%s-%d.err" % (base, host, i), os.O_WRONLY|os.O_CREAT|os.O_APPEND, 0666)
			os.dup2(fd, 2)
			
			if host == "localhost":
				os.execlp("python", "python", scripts+"/queueSlave", host, "8200", base, edition)
				sys.exit(1)
			else:
				os.execlp("ssh", "ssh", host, "python", scripts+"/queueSlave", host, "8200", base, edition)
				sys.exit(1)
		slaves.append(pid)

# Start controller, wait for it to exit
print "Starting controller"
try:
	status = os.spawnlp(os.P_WAIT, "php", "php", "-n", "queueController.php")
except KeyboardInterrupt:
	status = "interrupted"

# Kill queue server
os.kill(queueServer, signal.SIGKILL)

if status == 0:
	print "Controller has exited, all done\n"

	# Set up current symlink
	try: os.unlink(base+'/downloads/in_progress')
	except: pass
	try: os.unlink(base+'/downloads/current')
	except: pass
	os.symlink(base+'/downloads/'+edition, base+'/downloads/current')
else:
	print "Exited with status: " + str(status)

