#!/usr/bin/env python3 """ Stand-alone script to manage the GNU Taler backoffice. """ import logging import argparse import sys import os import site from talerbackoffice.talerconfig import TalerConfig os.environ.setdefault("TALER_PREFIX", "@prefix@") site.addsitedir("%s/lib/python%d.%d/site-packages" % ( "@prefix@", sys.version_info.major, sys.version_info.minor)) LOGGER = logging.getLogger(__name__) # No perfect match to our logging format, but good enough ... UWSGI_LOGFMT = "%(ltime) %(proto) %(method) %(uri) %(proto) => %(status)" def handle_serve_http(args): TC = TalerConfig.from_file(os.environ.get("TALER_CONFIG_FILE")) port = args.port if port is None: port = TC["backoffice-%s" % args.frontend]["http_port"].value_int(required=True) spec = ":%d" % (port) os.execlp("uwsgi", "uwsgi", "--master", "--die-on-term", "--log-format", UWSGI_LOGFMT, "--http", spec, "--wsgi-file", "@prefix@/share/taler/backoffice.wsgi", "--env", "BACKOFFICE_BACKEND=%s" % TC["backoffice-%s" % args.frontend]["backend"].value_string(required=True), "--env", "BACKOFFICE_INSTANCES=%s" % TC["backoffice-%s" % args.frontend]["instances"].value_string(required=True)) def handle_serve_uwsgi(args): TC = TalerConfig.from_file(os.environ.get("TALER_CONFIG_FILE")) serve_uwsgi = TC["backoffice-%s" % args.frontend]["uwsgi_serve"].value_string(required=True).lower() params = ["uwsgi", "uwsgi", "--master", "--die-on-term", "--log-format", UWSGI_LOGFMT, "--wsgi-file", "@prefix@/share/taler/backoffice.wsgi", "--env", "BACKOFFICE_BACKEND=%s" % TC["backoffice-%s" % args.frontend]["backend"].value_string(required=True), "--env", "BACKOFFICE_INSTANCES=%s" % TC["backoffice-%s" % args.frontend]["instances"].value_string(required=True)] if serve_uwsgi == "tcp": port = TC["backoffice-%s" % args.frontend]["uwsgi_port"].value_int(required=True) spec = ":%d" % (port,) params.extend(["--socket", spec]) elif serve_uwsgi == "unix": spec = TC["backoffice-%s" % args.frontend]["uwsgi_unixpath"].value_filename(required=True) mode = TC["backoffice-%s" % args.frontend]["uwsgi_unixpath_mode"].value_filename(required=True) params.extend(["--socket", spec]) params.extend(["--chmod-socket="+mode]) os.makedirs(os.path.dirname(spec), exist_ok=True) logging.info("launching uwsgi with argv %s", params[1:]) os.execlp(*params) PARSER = argparse.ArgumentParser() PARSER.set_defaults(func=None) PARSER.add_argument('--config', '-c', help="configuration file to use", metavar="CONFIG", type=str, dest="config", default=None) PARSER.add_argument('--frontend', '-f', help="fetch config values from [backoffice-] section", metavar="FRONTEND", type=str, dest="frontend", required=True) SUB = PARSER.add_subparsers() P = SUB.add_parser('serve-http', help="Serve over HTTP") P.add_argument("--port", "-p", dest="port", type=int, default=None, metavar="PORT") P.set_defaults(func=handle_serve_http) P = SUB.add_parser('serve-uwsgi', help="Serve over UWSGI") P.set_defaults(func=handle_serve_uwsgi) ARGS = PARSER.parse_args() if getattr(ARGS, 'func', None) is None: PARSER.print_help() sys.exit(1) if ARGS.config is not None: os.environ["TALER_CONFIG_FILE"] = ARGS.config ARGS.func(ARGS)