#!/usr/bin/env python3 ## # This file is part of TALER # (C) 2017 INRIA # # TALER is free software; you can redistribute it and/or # modify it under the terms of the GNU Affero General Public # License as published by the Free Software Foundation; either # version 3, or (at your option) any later version. # # TALER is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public # License along with TALER; see the file COPYING. If not, # see # # @author Florian Dold # @file Standalone script to launch the Survey site. import argparse import sys import os import site import logging from taler.util.talerconfig import TalerConfig LOGGER = logging.getLogger(__name__) # No perfect match to our logging format, but good enough ... UWSGI_LOGFMT = "%(ltime) %(proto) %(method) %(uri) %(proto) => %(status)" ## # This function interprets the 'serve-http' subcommand. # The effect it to launch the Survey site as a HTTP service. # # @param args command line options. 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, "--module", "talersurvey.survey:app" ) ## # This function interprets the 'serve-uwsgi' subcommand. # The effect is to launch the Survey UWSGI service. This # type of service is usually used when the HTTP Survey interface # is accessed via a reverse proxy (like Nginx, for example). # # @param command line options. 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, "--module", "talersurvey.survey:app" ] 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) ## @cond 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() ## @endcond 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 TC = TalerConfig.from_file(os.environ.get("TALER_CONFIG_FILE")) ARGS.func(ARGS)