forked from MirrorHub/synapse
Give appropriate exit codes when synctl fails (#5992)
This commit is contained in:
parent
a86a290850
commit
d58cad635e
2 changed files with 40 additions and 4 deletions
1
changelog.d/5992.feature
Normal file
1
changelog.d/5992.feature
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Give appropriate exit codes when synctl fails.
|
43
synctl
43
synctl
|
@ -71,7 +71,20 @@ def abort(message, colour=RED, stream=sys.stderr):
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
def start(configfile, daemonize=True):
|
def start(configfile: str, daemonize: bool = True) -> bool:
|
||||||
|
"""Attempts to start synapse.
|
||||||
|
Args:
|
||||||
|
configfile: path to a yaml synapse config file
|
||||||
|
daemonize: whether to daemonize synapse or keep it attached to the current
|
||||||
|
session
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
True if the process started successfully
|
||||||
|
False if there was an error starting the process
|
||||||
|
|
||||||
|
If deamonize is False it will only return once synapse exits.
|
||||||
|
"""
|
||||||
|
|
||||||
write("Starting ...")
|
write("Starting ...")
|
||||||
args = SYNAPSE
|
args = SYNAPSE
|
||||||
|
|
||||||
|
@ -83,25 +96,40 @@ def start(configfile, daemonize=True):
|
||||||
try:
|
try:
|
||||||
subprocess.check_call(args)
|
subprocess.check_call(args)
|
||||||
write("started synapse.app.homeserver(%r)" % (configfile,), colour=GREEN)
|
write("started synapse.app.homeserver(%r)" % (configfile,), colour=GREEN)
|
||||||
|
return True
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
write(
|
write(
|
||||||
"error starting (exit code: %d); see above for logs" % e.returncode,
|
"error starting (exit code: %d); see above for logs" % e.returncode,
|
||||||
colour=RED,
|
colour=RED,
|
||||||
)
|
)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def start_worker(app, configfile, worker_configfile):
|
def start_worker(app: str, configfile: str, worker_configfile: str) -> bool:
|
||||||
|
"""Attempts to start a synapse worker.
|
||||||
|
Args:
|
||||||
|
app: name of the worker's appservice
|
||||||
|
configfile: path to a yaml synapse config file
|
||||||
|
worker_configfile: path to worker specific yaml synapse file
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
True if the process started successfully
|
||||||
|
False if there was an error starting the process
|
||||||
|
"""
|
||||||
|
|
||||||
args = [sys.executable, "-B", "-m", app, "-c", configfile, "-c", worker_configfile]
|
args = [sys.executable, "-B", "-m", app, "-c", configfile, "-c", worker_configfile]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
subprocess.check_call(args)
|
subprocess.check_call(args)
|
||||||
write("started %s(%r)" % (app, worker_configfile), colour=GREEN)
|
write("started %s(%r)" % (app, worker_configfile), colour=GREEN)
|
||||||
|
return True
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
write(
|
write(
|
||||||
"error starting %s(%r) (exit code: %d); see above for logs"
|
"error starting %s(%r) (exit code: %d); see above for logs"
|
||||||
% (app, worker_configfile, e.returncode),
|
% (app, worker_configfile, e.returncode),
|
||||||
colour=RED,
|
colour=RED,
|
||||||
)
|
)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def stop(pidfile, app):
|
def stop(pidfile, app):
|
||||||
|
@ -292,11 +320,14 @@ def main():
|
||||||
write("All processes exited; now restarting...")
|
write("All processes exited; now restarting...")
|
||||||
|
|
||||||
if action == "start" or action == "restart":
|
if action == "start" or action == "restart":
|
||||||
|
error = False
|
||||||
if start_stop_synapse:
|
if start_stop_synapse:
|
||||||
# Check if synapse is already running
|
# Check if synapse is already running
|
||||||
if os.path.exists(pidfile) and pid_running(int(open(pidfile).read())):
|
if os.path.exists(pidfile) and pid_running(int(open(pidfile).read())):
|
||||||
abort("synapse.app.homeserver already running")
|
abort("synapse.app.homeserver already running")
|
||||||
start(configfile, bool(options.daemonize))
|
|
||||||
|
if not start(configfile, bool(options.daemonize)):
|
||||||
|
error = True
|
||||||
|
|
||||||
for worker in workers:
|
for worker in workers:
|
||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
|
@ -307,12 +338,16 @@ def main():
|
||||||
for cache_name, factor in iteritems(worker.cache_factors):
|
for cache_name, factor in iteritems(worker.cache_factors):
|
||||||
os.environ["SYNAPSE_CACHE_FACTOR_" + cache_name.upper()] = str(factor)
|
os.environ["SYNAPSE_CACHE_FACTOR_" + cache_name.upper()] = str(factor)
|
||||||
|
|
||||||
start_worker(worker.app, configfile, worker.configfile)
|
if not start_worker(worker.app, configfile, worker.configfile):
|
||||||
|
error = True
|
||||||
|
|
||||||
# Reset env back to the original
|
# Reset env back to the original
|
||||||
os.environ.clear()
|
os.environ.clear()
|
||||||
os.environ.update(env)
|
os.environ.update(env)
|
||||||
|
|
||||||
|
if error:
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
Loading…
Reference in a new issue