#!/usr/bin/env python3 """ Stand-alone script to manage the GNU Taler survey frontend. """ import argparse import sys import os import site import logging from talersurvey.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)) TC = TalerConfig.from_file(os.environ.get("TALER_CONFIG_FILE")) 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): port = args.port if port is None: port = TC["survey"]["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/frontend-survey.wsgi") def handle_serve_uwsgi(args): del args # pacify PEP checkers serve_uwsgi = TC["survey"]["uwsgi_serve"].value_string(required=True).lower() params = ["uwsgi", "uwsgi", "--master", "--die-on-term", "--log-format", UWSGI_LOGFMT, "--wsgi-file", "@prefix@/share/taler/frontend-survey.wsgi"] if serve_uwsgi == "tcp": port = TC["survey"]["uwsgi_port"].value_int(required=True) spec = ":%d" % (port,) params.extend(["--socket", spec]) elif serve_uwsgi == "unix": spec = TC["survey"]["uwsgi_unixpath"].value_filename(required=True) mode = TC["survey"]["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) 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)