tahoe-lafs/allmydata/scripts/runner.py

161 lines
4.0 KiB
Python
Raw Normal View History

#! /usr/bin/python
import os, sys, signal, time
from twisted.python import usage
class StartOptions(usage.Options):
optParameters = [
["basedir", "C", ".", "which directory to start the node in"],
]
class StopOptions(usage.Options):
optParameters = [
["basedir", "C", ".", "which directory to stop the node in"],
]
class RestartOptions(usage.Options):
optParameters = [
["basedir", "C", ".", "which directory to restart the node in"],
]
class CreateClientOptions(usage.Options):
optParameters = [
["basedir", "C", ".", "which directory to create the client in"],
]
class CreateQueenOptions(usage.Options):
optParameters = [
["basedir", "C", ".", "which directory to create the queen in"],
]
client_tac = """
# -*- python -*-
from allmydata import client
from twisted.application import service
c = client.Client()
application = service.Application("allmydata_client")
c.setServiceParent(application)
"""
queen_tac = """
# -*- python -*-
from allmydata import queen
from twisted.application import service
c = queen.Queen()
application = service.Application("allmydata_queen")
c.setServiceParent(application)
"""
class Options(usage.Options):
synopsis = "Usage: allmydata <command> [command options]"
subcommands = [
["create-client", None, CreateClientOptions],
["create-queen", None, CreateQueenOptions],
["start", None, StartOptions],
["stop", None, StopOptions],
["restart", None, RestartOptions],
]
def postOptions(self):
if not hasattr(self, 'subOptions'):
raise usage.UsageError("must specify a command")
def run():
config = Options()
try:
config.parseOptions()
except usage.error, e:
print "%s: %s" % (sys.argv[0], e)
print
c = getattr(config, 'subOptions', config)
print str(c)
sys.exit(1)
command = config.subCommand
so = config.subOptions
if command == "create-client":
rc = create_client(so)
elif command == "create-queen":
rc = create_queen(so)
elif command == "start":
rc = start(so)
elif command == "stop":
rc = stop(so)
elif command == "restart":
rc = restart(so)
rc = rc or 0
sys.exit(rc)
def create_client(config):
basedir = config['basedir']
os.mkdir(basedir)
f = open(os.path.join(basedir, "client.tac"), "w")
f.write(client_tac)
f.close()
print "client created, please copy roster_pburl into the directory"
def create_queen(config):
basedir = config['basedir']
os.mkdir(basedir)
f = open(os.path.join(basedir, "queen.tac"), "w")
f.write(queen_tac)
f.close()
print "queen created"
def start(config):
basedir = config['basedir']
if os.path.exists(os.path.join(basedir, "client.tac")):
tac = "client.tac"
type = "client"
elif os.path.exists(os.path.join(basedir, "queen.tac")):
tac = "queen.tac"
type = "queen"
else:
print "%s does not look like a node directory" % basedir
sys.exit(1)
os.chdir(basedir)
rc = os.system("twistd -y %s" % tac)
if rc == 0:
print "node probably started"
else:
print "node probably not started"
return 1
def stop(config):
basedir = config['basedir']
pidfile = os.path.join(basedir, "twistd.pid")
if not os.path.exists(pidfile):
print "%s does not look like a running node directory (no twistd.pid)" % basedir
return 1
pid = open(pidfile, "r").read()
pid = int(pid)
timer = 0
os.kill(pid, signal.TERM)
time.sleep(0.1)
while timer < 5:
# poll once per second until twistd.pid goes away, up to 5 seconds
try:
os.kill(pid, 0)
except OSError:
print "process %d is dead" % pid
return
timer += 1
time.sleep(1)
print "never saw process go away"
return 1
def restart(config):
rc = stop(config)
if rc:
print "not restarting"
return rc
return start(config)