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
137
|
#!/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]
params.extend(["--wsgi-file", "@prefix@/share/taler-bank/%s.wsgi" % token])
os.execlp(*params)
# FIXME Emperor to be called
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]
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)
|