forked from zentralopensource/zentral
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdocker-entrypoint.py
executable file
·99 lines (83 loc) · 2.88 KB
/
docker-entrypoint.py
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
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import random
import socket
import subprocess
import sys
import time
import warnings
try:
random = random.SystemRandom()
except NotImplementedError:
warnings.warn('No secure pseudo random number generator available.')
def check_db_connection(connection):
try:
socket.create_connection(connection).close()
except socket.error:
return False
else:
return True
def wait_for_db():
connection = (os.environ.get('POSTGRES_HOST', 'localhost'),
os.environ.get('POSTGRES_PORT', '5432'))
while not check_db_connection(connection):
reconnect_delay = 1000 / random.randint(500, 3000)
warnings.warn("Can't connect to DB! Sleep {:.2f}s…".format(reconnect_delay))
time.sleep(reconnect_delay)
print("DB connection OK")
def django_migrate_db():
try:
subprocess.check_call(['python', 'server/manage.py', 'migrate', '--noinput'])
except subprocess.CalledProcessError:
return False
else:
return True
def wait_for_db_migration():
wait_for_db()
i = 0
while not django_migrate_db():
retry_delay = (i + 1) * random.uniform(0.8, 1.2)
warnings.warn("Can't migrate DB! Sleep {:.2f}s…".format(retry_delay))
time.sleep(retry_delay)
i += 1
print("DB migration OK")
def django_collectstatic():
subprocess.check_call(['python', 'server/manage.py', 'collectstatic', '-v0', '--noinput'])
KNOWN_COMMANDS = {
"runserver": ["python", 'server/manage.py', 'runserver', '0.0.0.0:8000'],
"gunicorn": ["gunicorn", "--chdir", "/zentral/server",
"-b", "0.0.0.0:8000",
"-w", "4",
"--access-logfile", "-",
"--error-logfile", "-",
"server.wsgi"],
"runworkers": ["python", 'server/manage.py', 'runworkers'],
# extras
"shell": ["python", 'server/manage.py', 'shell'],
"tests": ["python", 'server/manage.py', 'test', 'tests/'],
"createuser": ["python", 'server/manage.py', 'create_zentral_user'],
}
KNOWN_COMMANDS_EXTRA_ENV = {
"tests": {"ZENTRAL_PROBES_SYNC": "0"}
}
KNOWN_COMMANDS_TRIGGERING_COLLECTSTATIC = {'runserver', 'gunicorn'}
if __name__ == '__main__':
if len(sys.argv) < 2:
warnings.warn("Not enough arguments.")
sys.exit(2)
cmd = sys.argv[1]
env = os.environ.copy()
args = KNOWN_COMMANDS.get(cmd, None)
if args:
filename = args[0]
args.extend(sys.argv[2:])
wait_for_db_migration()
if cmd in KNOWN_COMMANDS_TRIGGERING_COLLECTSTATIC:
django_collectstatic()
env.update(KNOWN_COMMANDS_EXTRA_ENV.get(cmd, {}))
print('Launch known command "{}"'.format(cmd))
else:
filename = cmd
args = sys.argv[1:]
os.execvpe(filename, args, env)