-
Notifications
You must be signed in to change notification settings - Fork 23
/
generator.py
77 lines (62 loc) · 1.86 KB
/
generator.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
import logging
_log = logging.getLogger(__name__)
import sys, os, errno
from .conf import getconf
def which(file):
for path in os.environ["PATH"].split(os.pathsep):
if os.path.exists(os.path.join(path, file)):
return os.path.join(path, file)
return None
def write_service(F, conf, sect, user=False):
opts = {
'name':sect,
'user':conf.get(sect, 'user'),
'group':conf.get(sect, 'group'),
'chdir':conf.get(sect, 'chdir'),
'userarg':'--user' if user else '--system',
'launcher':which('procServ-launcher'),
}
F.write("""
[Unit]
Description=procServ for %(name)s
After=network.target remote-fs.target
ConditionPathIsDirectory=%(chdir)s
"""%opts)
if conf.has_option(sect, 'host'):
F.write('ConditionHost=%s\n'%conf.get(sect, 'host'))
F.write("""
[Service]
Type=simple
"""%opts)
if conf.has_option(sect, 'env_file'):
F.write('EnvironmentFile=%s\n'%conf.get(sect, 'env_file'))
if conf.has_option(sect, 'environment'):
F.write('Environment=%s\n'%conf.get(sect, 'environment'))
F.write("""\
ExecStart=%(launcher)s %(userarg)s %(name)s
RuntimeDirectory=procserv-%(name)s
StandardOutput=syslog
StandardError=inherit
SyslogIdentifier=procserv-%(name)s
"""%opts)
if not user:
F.write("""
User=%(user)s
Group=%(group)s
"""%opts)
F.write("""
[Install]
WantedBy=multi-user.target
"""%opts)
def run(outdir, user=False):
conf = getconf(user=user)
for sect in conf.sections():
_log.debug('Consider %s', sect)
if not conf.getboolean(sect, 'instance'):
continue
service = 'procserv-%s.service'%sect
ofile = os.path.join(outdir, service)
_log.debug('Write %s', service)
with open(ofile+'.tmp', 'w') as F:
write_service(F, conf, sect, user=user)
os.rename(ofile+'.tmp', ofile)