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

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

import argparse
import sys
import os
import site

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "talerbank.settings")
os.environ.setdefault("TALER_PREFIX", "@prefix@")
site.addsitedir("%s/lib/python%d.%d/site-packages" % (
    "@prefix@",
    sys.version_info.major,
    sys.version_info.minor))

from talerbank.talerconfig import TalerConfig
import logging
logger = logging.getLogger(__name__)


# 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 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')
    tc = TalerConfig.from_file(os.environ.get("TALER_CONFIG_FILE"))
    port = args.port
    if port is None:
        port = tc[token]["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/%s.wsgi" % token]
    os.execlp(*params)


def handle_serve_uwsgi(args):
    import django
    django.setup()
    from django.core.management import call_command
    call_command('migrate')
    call_command('provide_accounts')
    call_command('check')
    tc = TalerConfig.from_file(os.environ.get("TALER_CONFIG_FILE"))
    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/%s.wsgi" % token]
    if "tcp" == serve_uwsgi:
        port = tc[token]["uwsgi_port"].value_int(required=True)
        spec = ":%d" % (port,)
        params.extend(["--socket", spec])
    else:
        spec = tc[token]["uwsgi_unixpath"].value_filename(required=True)
        mode = tc[token]["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(args):
    import django
    django.setup()
    from django.core.management import call_command
    call_command('sample_donations')

def handle_config(args):
    from talerbank.talerconfig import TalerConfig
    tc = TalerConfig.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', help="use ALTERNATE_DB", type=str, metavar="ALTERNATE_DB", dest="altdb")
parser.add_argument("--admin", "-a", dest="admin", action="store_true", help="Only run the \"admin\" interface")
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('sampledata', help="Put sample data into the db")
p.set_defaults(func=handle_sampledata)

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()

token = "bank%s" % ("-admin" if args.admin else "")
logger.info("Setting token to %s" % token)

if args.altdb:
    os.environ.setdefault("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)