From daebe1981a0df80187660d5aeda497fe43bf3531 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 29 Aug 2019 23:08:07 +0200 Subject: missing files --- bin/taler-merchant-survey | 111 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100755 bin/taler-merchant-survey (limited to 'bin/taler-merchant-survey') diff --git a/bin/taler-merchant-survey b/bin/taler-merchant-survey new file mode 100755 index 0000000..418cd78 --- /dev/null +++ b/bin/taler-merchant-survey @@ -0,0 +1,111 @@ +#!/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 talersurvey.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") + + +## +# 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"] + 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) -- cgit v1.2.3 From 141e949fa9f09e5f54acdfa90f609895236a8ac0 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 29 Aug 2019 23:08:26 +0200 Subject: make pretty --- .style.yapf | 5 ++ bin/taler-merchant-survey | 48 ++++++++++--------- setup.py | 58 +++++++++++----------- talersurvey/survey/survey.py | 102 ++++++++++++++++++++++++++------------- talersurvey/talerconfig.py | 112 ++++++++++++++++++++++++++++++------------- talersurvey/tests.py | 1 + 6 files changed, 210 insertions(+), 116 deletions(-) create mode 100644 .style.yapf (limited to 'bin/taler-merchant-survey') diff --git a/.style.yapf b/.style.yapf new file mode 100644 index 0000000..3b39780 --- /dev/null +++ b/.style.yapf @@ -0,0 +1,5 @@ +[style] +based_on_style = pep8 +coalesce_brackets=True +column_limit=80 +dedent_closing_brackets=True diff --git a/bin/taler-merchant-survey b/bin/taler-merchant-survey index 418cd78..2da6fde 100755 --- a/bin/taler-merchant-survey +++ b/bin/taler-merchant-survey @@ -28,7 +28,6 @@ import site import logging from talersurvey.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)" @@ -43,13 +42,11 @@ 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") + spec = ":%d" % (port, ) + os.execlp( + "uwsgi", "uwsgi", "--master", "--die-on-term", "--log-format", + UWSGI_LOGFMT, "--http", spec, "--module", "talersurvey" + ) ## @@ -60,22 +57,22 @@ def handle_serve_http(args): # # @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"] + 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" + ] if serve_uwsgi == "tcp": port = TC["survey"]["uwsgi_port"].value_int(required=True) - spec = ":%d" % (port,) + 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]) + 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) @@ -84,14 +81,21 @@ def handle_serve_uwsgi(args): ## @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) +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.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") diff --git a/setup.py b/setup.py index cf6f1ca..fa132d6 100755 --- a/setup.py +++ b/setup.py @@ -1,30 +1,32 @@ from setuptools import setup, find_packages -setup(name='talersurvey', - version='0.6.0pre1', - description='Example survey site for GNU Taler', - url='git://taler.net/survey', - author='Marcello Stanisci', - author_email='stanisci.m@gmail.com', - license='GPL', - packages=find_packages(), - install_requires=["Flask>=0.10", "jsmin"], - test_suite="nose.collector", - tests_require=["mock", "nose", "requests", "uwsgi"], - package_data={ - '':[ - "survey/templates/*.html", - "survey/static/favicon.ico", - "survey/static/*.svg", - "survey/static/*.css", - "survey/static/*.js", - "survey/static/*.js.tar.gz", - "survey/static/web-common/*.png", - "survey/static/web-common/*.css", - "survey/static/web-common/*.js", - "survey/static/web-common/*.js.tar.gz", - "survey/static/web-common/*.html", - ] - }, - scripts=['./bin/taler-merchant-survey'], - zip_safe=False) +setup( + name='talersurvey', + version='0.6.0pre1', + description='Example survey site for GNU Taler', + url='git://taler.net/survey', + author='Marcello Stanisci', + author_email='stanisci.m@gmail.com', + license='GPL', + packages=find_packages(), + install_requires=["Flask>=0.10", "jsmin"], + test_suite="nose.collector", + tests_require=["mock", "nose", "requests", "uwsgi"], + package_data={ + '': [ + "survey/templates/*.html", + "survey/static/favicon.ico", + "survey/static/*.svg", + "survey/static/*.css", + "survey/static/*.js", + "survey/static/*.js.tar.gz", + "survey/static/web-common/*.png", + "survey/static/web-common/*.css", + "survey/static/web-common/*.js", + "survey/static/web-common/*.js.tar.gz", + "survey/static/web-common/*.html", + ] + }, + scripts=['./bin/taler-merchant-survey'], + zip_safe=False +) diff --git a/talersurvey/survey/survey.py b/talersurvey/survey/survey.py index 79d0f16..1c6b8aa 100644 --- a/talersurvey/survey/survey.py +++ b/talersurvey/survey/survey.py @@ -48,14 +48,21 @@ LOGGER = logging.getLogger(__name__) # the merchant backend. # @return a flask-native response object. def backend_error(requests_response): - LOGGER.error("Backend error: status code: " - + str(requests_response.status_code)) + LOGGER.error( + "Backend error: status code: " + str(requests_response.status_code) + ) try: - return flask.jsonify(requests_response.json()), requests_response.status_code + return flask.jsonify( + requests_response.json() + ), requests_response.status_code except json.decoder.JSONDecodeError: - LOGGER.error("Backend error (NO JSON returned): status code: " - + str(requests_response.status_code)) - return flask.jsonify(dict(error="Backend died, no JSON got from it")), 502 + LOGGER.error( + "Backend error (NO JSON returned): status code: " + + str(requests_response.status_code) + ) + return flask.jsonify( + dict(error="Backend died, no JSON got from it") + ), 502 ## @@ -66,14 +73,15 @@ def backend_error(requests_response): def utility_processor(): def env(name, default=None): return os.environ.get(name, default) + def prettydate(talerdate): - parsed_time = re.search(r"/Date\(([0-9]+)\)/", talerdate) - if not parsed_time: - return "malformed date given" - parsed_time = int(parsed_time.group(1)) - timestamp = datetime.datetime.fromtimestamp(parsed_time) - # returns the YYYY-MM-DD date format. - return timestamp.strftime("%Y-%b-%d") + parsed_time = re.search(r"/Date\(([0-9]+)\)/", talerdate) + if not parsed_time: + return "malformed date given" + parsed_time = int(parsed_time.group(1)) + timestamp = datetime.datetime.fromtimestamp(parsed_time) + # returns the YYYY-MM-DD date format. + return timestamp.strftime("%Y-%b-%d") return dict(env=env, prettydate=prettydate) @@ -99,17 +107,26 @@ def err_abort(abort_status_code, **params): def backend_post(endpoint, json): headers = {"Authorization": "ApiKey " + APIKEY} try: - resp = requests.post(urljoin(BACKEND_URL, endpoint), json=json, headers=headers) + resp = requests.post( + urljoin(BACKEND_URL, endpoint), json=json, headers=headers + ) except requests.ConnectionError: err_abort(500, message="Could not establish connection to backend") try: response_json = resp.json() except ValueError: - err_abort(500, message="Could not parse response from backend", - status_code=resp.status_code) + err_abort( + 500, + message="Could not parse response from backend", + status_code=resp.status_code + ) if resp.status_code != 200: - err_abort(500, message="Backend returned error status", - json=response_json, status_code=resp.status_code) + err_abort( + 500, + message="Backend returned error status", + json=response_json, + status_code=resp.status_code + ) return response_json @@ -123,7 +140,9 @@ def backend_post(endpoint, json): def backend_get(endpoint, params): headers = {"Authorization": "ApiKey " + APIKEY} try: - resp = requests.get(urljoin(BACKEND_URL, endpoint), params=params, headers=headers) + resp = requests.get( + urljoin(BACKEND_URL, endpoint), params=params, headers=headers + ) except requests.ConnectionError: err_abort(500, message="Could not establish connection to backend") try: @@ -131,8 +150,12 @@ def backend_get(endpoint, params): except ValueError: err_abort(500, message="Could not parse response from backend") if resp.status_code != 200: - err_abort(500, message="Backend returned error status", - json=response_json, status_code=resp.status_code) + err_abort( + 500, + message="Backend returned error status", + json=response_json, + status_code=resp.status_code + ) return response_json @@ -144,9 +167,11 @@ def backend_get(endpoint, params): # (and execution stack!). @app.errorhandler(Exception) def internal_error(e): - return flask.render_template("templates/error.html", - message="Internal error", - stack=traceback.format_exc()) + return flask.render_template( + "templates/error.html", + message="Internal error", + stack=traceback.format_exc() + ) ## @@ -156,8 +181,12 @@ def internal_error(e): @app.route("/favicon.ico") def favicon(): print("will look into: " + os.path.join(app.root_path, 'static')) - return flask.send_from_directory(os.path.join(app.root_path, 'static'), - "favicon.ico", mimetype="image/vnd.microsoft.ico") + return flask.send_from_directory( + os.path.join(app.root_path, 'static'), + "favicon.ico", + mimetype="image/vnd.microsoft.ico" + ) + ## # Give information about the tip reserve status. @@ -169,6 +198,7 @@ def survey_stats(): stats = backend_get("tip-query", dict(instance="default")) return flask.render_template("templates/survey_stats.html", stats=stats) + ## # Tell the backend to 'authorize' a tip; this means that # the backend will allocate a certain amount to be later @@ -179,17 +209,21 @@ def survey_stats(): # otherwise. @app.route("/submit-survey", methods=["POST"]) def submit_survey(): - tip_spec = dict(amount=CURRENCY + ":1.0", - next_url=os.environ.get("TALER_ENV_URL_INTRO", "https://taler.net/"), - instance="default", - justification="Payment methods survey") + tip_spec = dict( + amount=CURRENCY + ":1.0", + next_url=os.environ.get("TALER_ENV_URL_INTRO", "https://taler.net/"), + instance="default", + justification="Payment methods survey" + ) resp = backend_post("tip-authorize", tip_spec) if resp.get("tip_redirect_url"): return flask.redirect(resp["tip_redirect_url"]) - err_abort(500, message="Tipping failed, unexpected backend response", - json=resp) + err_abort( + 500, message="Tipping failed, unexpected backend response", json=resp + ) + ## # Serve the main index page. @@ -197,4 +231,6 @@ def submit_survey(): # @return response object of the index page. @app.route("/", methods=["GET"]) def index(): - return flask.render_template("templates/index.html", merchant_currency=CURRENCY) + return flask.render_template( + "templates/index.html", merchant_currency=CURRENCY + ) diff --git a/talersurvey/talerconfig.py b/talersurvey/talerconfig.py index 4a44c97..1a33294 100644 --- a/talersurvey/talerconfig.py +++ b/talersurvey/talerconfig.py @@ -38,17 +38,20 @@ try: except ImportError: pass + ## # Exception class for a any configuration error. class ConfigurationError(Exception): pass + ## # Exception class for malformed strings having with parameter # expansion. class ExpansionSyntaxError(Exception): pass + ## # Do shell-style parameter expansion. # Supported syntax: @@ -80,7 +83,7 @@ def expand(var: str, getter: Callable[[str], str]) -> str: end += 1 if balance != 0: raise ExpansionSyntaxError("unbalanced parentheses") - piece = var[start+2:end-1] + piece = var[start + 2:end - 1] if piece.find(":-") > 0: varname, alt = piece.split(":-", 1) replace = getter(varname) @@ -93,9 +96,9 @@ def expand(var: str, getter: Callable[[str], str]) -> str: replace = var[start:end] else: end = start + 2 - while end < len(var) and var[start+1:end+1].isalnum(): + while end < len(var) and var[start + 1:end + 1].isalnum(): end += 1 - varname = var[start+1:end] + varname = var[start + 1:end] replace = getter(varname) if replace is None: replace = var[start:end] @@ -104,6 +107,7 @@ def expand(var: str, getter: Callable[[str], str]) -> str: return result + var[pos:] + ## # A configuration entry. class Entry: @@ -164,11 +168,16 @@ class Entry: if self.value is None: if warn: if default is not None: - LOGGER.warning("Configuration is missing option '%s' in section '%s',\ - falling back to '%s'", self.option, self.section, default) + LOGGER.warning( + "Configuration is missing option '%s' in section '%s',\ + falling back to '%s'", self.option, + self.section, default + ) else: - LOGGER.warning("Configuration ** is missing option '%s' in section '%s'", - self.option.upper(), self.section.upper()) + LOGGER.warning( + "Configuration ** is missing option '%s' in section '%s'", + self.option.upper(), self.section.upper() + ) return default return self.value @@ -190,6 +199,7 @@ class Entry: except ValueError: raise ConfigurationError("Expected number for option '%s' in section '%s'" \ % (self.option.upper(), self.section.upper())) + ## # Fetch value to substitute to expansion variables. # @@ -231,6 +241,7 @@ class Entry: return "" return "%s:%s" % (self.filename, self.lineno) + ## # Represent a section by inheriting from 'defaultdict'. class OptionDict(collections.defaultdict): @@ -280,6 +291,7 @@ class OptionDict(collections.defaultdict): def __setitem__(self, chunk: str, value: Entry) -> None: super().__setitem__(chunk.lower(), value) + ## # Collection of all the (@a OptionDict) sections. class SectionDict(collections.defaultdict): @@ -313,6 +325,7 @@ class SectionDict(collections.defaultdict): def __setitem__(self, chunk: str, value: OptionDict) -> None: super().__setitem__(chunk.lower(), value) + ## # One loaded taler configuration, including base configuration # files and included files. @@ -323,7 +336,7 @@ class TalerConfig: # # @param self the object itself. def __init__(self) -> None: - self.sections = SectionDict() # just plain dict + self.sections = SectionDict() # just plain dict ## # Load a configuration file, instantiating a config object. @@ -362,7 +375,8 @@ class TalerConfig: # a error occurs). def value_string(self, section, option, **kwargs) -> str: return self.sections[section][option].value_string( - kwargs.get("default"), kwargs.get("required"), kwargs.get("warn")) + kwargs.get("default"), kwargs.get("required"), kwargs.get("warn") + ) ## # Get a value from the config that should be a filename. @@ -377,7 +391,8 @@ class TalerConfig: # a error occurs). def value_filename(self, section, option, **kwargs) -> str: return self.sections[section][option].value_filename( - kwargs.get("default"), kwargs.get("required"), kwargs.get("warn")) + kwargs.get("default"), kwargs.get("required"), kwargs.get("warn") + ) ## # Get a integer value from the config. @@ -391,7 +406,8 @@ class TalerConfig: # a error occurs). def value_int(self, section, option, **kwargs) -> int: return self.sections[section][option].value_int( - kwargs.get("default"), kwargs.get("required"), kwargs.get("warn")) + kwargs.get("default"), kwargs.get("required"), kwargs.get("warn") + ) ## # Load default values from canonical locations. @@ -465,36 +481,59 @@ class TalerConfig: if line.startswith("@INLINE@"): pair = line.split() if 2 != len(pair): - LOGGER.error("invalid inlined config filename given ('%s')" % line) - continue + LOGGER.error( + "invalid inlined config filename given ('%s')" % + line + ) + continue if pair[1].startswith("/"): self.load_file(pair[1]) else: - self.load_file(os.path.join(os.path.dirname(filename), pair[1])) + self.load_file( + os.path.join( + os.path.dirname(filename), pair[1] + ) + ) continue if line.startswith("["): if not line.endswith("]"): - LOGGER.error("invalid section header in line %s: %s", - lineno, repr(line)) + LOGGER.error( + "invalid section header in line %s: %s", lineno, + repr(line) + ) section_name = line.strip("[]").strip().strip('"') current_section = section_name continue if current_section is None: - LOGGER.error("option outside of section in line %s: %s", lineno, repr(line)) + LOGGER.error( + "option outside of section in line %s: %s", lineno, + repr(line) + ) continue pair = line.split("=", 1) if len(pair) != 2: - LOGGER.error("invalid option in line %s: %s", lineno, repr(line)) + LOGGER.error( + "invalid option in line %s: %s", lineno, repr(line) + ) key = pair[0].strip() value = pair[1].strip() if value.startswith('"'): value = value[1:] if not value.endswith('"'): - LOGGER.error("mismatched quotes in line %s: %s", lineno, repr(line)) + LOGGER.error( + "mismatched quotes in line %s: %s", lineno, + repr(line) + ) else: value = value[:-1] - entry = Entry(self.sections, current_section, key, - value=value, filename=filename, lineno=lineno) + entry = Entry( + self.sections, + current_section, + key, + value=value, + filename=filename, + lineno=lineno + ) sections[current_section][key] = entry except FileNotFoundError: # not logging here, as this interests the final user mostly. @@ -503,23 +542,22 @@ class TalerConfig: ## # Dump the textual representation of a config object. - # + # # Format: - # + # # [section] # option = value # FIXME (what is location?) # # @param self the object itself, that will be dumped. def dump(self) -> None: for kv_section in self.sections.items(): - print("[%s]" % (kv_section[1].section_name,)) + print("[%s]" % (kv_section[1].section_name, )) for kv_option in kv_section[1].items(): print("%s = %s # %s" % \ (kv_option[1].option, kv_option[1].value, kv_option[1].location())) - ## # Return a whole section from this object. # @@ -538,14 +576,22 @@ if __name__ == "__main__": import argparse PARSER = argparse.ArgumentParser() - PARSER.add_argument("--section", "-s", dest="section", - default=None, metavar="SECTION") - PARSER.add_argument("--option", "-o", dest="option", - default=None, metavar="OPTION") - PARSER.add_argument("--config", "-c", dest="config", - default=None, metavar="FILE") - PARSER.add_argument("--filename", "-f", dest="expand_filename", - default=False, action='store_true') + PARSER.add_argument( + "--section", "-s", dest="section", default=None, metavar="SECTION" + ) + PARSER.add_argument( + "--option", "-o", dest="option", default=None, metavar="OPTION" + ) + PARSER.add_argument( + "--config", "-c", dest="config", default=None, metavar="FILE" + ) + PARSER.add_argument( + "--filename", + "-f", + dest="expand_filename", + default=False, + action='store_true' + ) ARGS = PARSER.parse_args() TC = TalerConfig.from_file(ARGS.config) diff --git a/talersurvey/tests.py b/talersurvey/tests.py index d25da48..d13e2f1 100644 --- a/talersurvey/tests.py +++ b/talersurvey/tests.py @@ -35,5 +35,6 @@ class SurveyTestCase(unittest.TestCase): survey.app.testing = True self.app = survey.app.test_client() + if __name__ == "__main__": unittest.main() -- cgit v1.2.3 From 498b14392f7f828af1a239d680da27b859f85033 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Sat, 31 Aug 2019 17:00:27 +0200 Subject: use correct WSGI module --- bin/taler-merchant-survey | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'bin/taler-merchant-survey') diff --git a/bin/taler-merchant-survey b/bin/taler-merchant-survey index 2da6fde..41e6637 100755 --- a/bin/taler-merchant-survey +++ b/bin/taler-merchant-survey @@ -45,7 +45,7 @@ def handle_serve_http(args): spec = ":%d" % (port, ) os.execlp( "uwsgi", "uwsgi", "--master", "--die-on-term", "--log-format", - UWSGI_LOGFMT, "--http", spec, "--module", "talersurvey" + UWSGI_LOGFMT, "--http", spec, "--module", "talersurvey.survey:app" ) @@ -62,7 +62,7 @@ def handle_serve_uwsgi(args): ).lower() params = [ "uwsgi", "uwsgi", "--master", "--die-on-term", "--log-format", - UWSGI_LOGFMT, "--module", "talersurvey" + UWSGI_LOGFMT, "--module", "talersurvey.survey:app" ] if serve_uwsgi == "tcp": port = TC["survey"]["uwsgi_port"].value_int(required=True) -- cgit v1.2.3