summaryrefslogtreecommitdiff
path: root/taler-bank-manage.in
blob: df8304269b8addb601d07a18917e9a5084491f36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/env python3

"""
Stand-alone script to manage
the GNU Taler bank.
"""

import argparse
import sys
import os
import site
import logging
from talerbank.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__)
TC = TalerConfig.from_file(os.environ.get("TALER_CONFIG_FILE"))

# No perfect match to our logging format, but good enough ...
UWSGI_LOGFMT = "%(ltime) %(proto) %(method) %(uri) %(proto) => %(status)"

def handle_django(args):
    import django
    django.setup()
    from django.core.management import call_command
    # always run 'migrate' first, in case a virgin db is being used.
    call_command('migrate')
    from django.core.management import execute_from_command_line
    execute_from_command_line([sys.argv[0] + " django"] + args.command)


def handle_serve_http(args):
    import django
    django.setup()
    from django.core.management import call_command
    call_command('migrate')
    call_command('provide_accounts')
    call_command('check')
    port = args.port
    if port is None:
        port = TC["bank"]["http_port"].value_int(required=True)

    httpspec = ":%d" % (port,)
    params = ["uwsgi", "uwsgi",
              "--master",
              "--die-on-term",
              "--http", httpspec,
              "--log-format", UWSGI_LOGFMT,
              "--wsgi-file", "@prefix@/share/taler-bank/bank.wsgi"]
    os.execlp(*params)


def handle_serve_uwsgi(args):
    del args # pacify PEP checkers
    import django
    django.setup()
    from django.core.management import call_command
    call_command('migrate')
    call_command('provide_accounts')
    call_command('check')
    serve_uwsgi = TC["bank"]["uwsgi_serve"].value_string(required=True).lower()
    params = ["uwsgi", "uwsgi",
              "--master",
              "--die-on-term",
              "--log-format", UWSGI_LOGFMT,
              "--wsgi-file", "@prefix@/share/taler-bank/bank.wsgi"]
    if serve_uwsgi == "tcp":
        port = TC["bank"]["uwsgi_port"].value_int(required=True)
        spec = ":%d" % (port,)
        params.extend(["--socket", spec])
    else:
        spec = TC["bank"]["uwsgi_unixpath"].value_filename(required=True)
        mode = TC["bank"]["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)

def handle_sampledata():
    import django
    django.setup()
    from django.core.management import call_command
    call_command('sample_donations')

def handle_config(args):
    TC.from_file(args.config)
    TC.dump()


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('--with-db', type=str, metavar="dbtype:///dbname", dest="altdb",
                    help="use 'dbname' (currently only 'dbtype'=='postgres' is supported)")
SUB = PARSER.add_subparsers()

P = SUB.add_parser('django', help="Run django-admin command")
P.add_argument("command", nargs=argparse.REMAINDER)
P.set_defaults(func=handle_django)

P = SUB.add_parser('serve-http', help="Serve bank 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 bank over UWSGI")
P.set_defaults(func=handle_serve_uwsgi)

P = SUB.add_parser('config', help="show config")
P.set_defaults(func=handle_config)


ARGS = PARSER.parse_args()

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "talerbank.settings")

if ARGS.altdb:
    LOGGER.info("Setting alternate db: %s" % ARGS.altdb)
    os.environ.setdefault("TALER_BANK_ALTDB", ARGS.altdb)

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)