summaryrefslogtreecommitdiff
path: root/taler-bank-manage.in
blob: 935c8d5439c59c17cf65dd0cb4ae5622e676ef15 (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
#!/usr/bin/env python3

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

import argparse
import django
import sys
import os
import site
import logging
from talerbank.talerconfig import TalerConfig
from django.core.management import call_command

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):
    django.setup()
    # 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()
    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
    django.setup()
    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():
    django.setup()
    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

try:
    ARGS.func(ARGS)
except django.db.utils.OperationalError:
    LOGGER.error("Your database has serious problems. Does it exist?")
    sys.exit(4)