summaryrefslogtreecommitdiff
path: root/src/local/rz-mux/rz-mux-tool.py
blob: 54b20cf36aa2fedede10a264188b724b44ca7eb1 (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
"""
 Multiplexed-Rhizi instance configuration generator:
    - generate Apache instance configuration files
    - generate Neo4J instance,  instance configuration files
    - generate Rhizi instance configuration files

 This tool currently does not handle module confdir/rootdir creation, file mode/ownership creation,
 which are handled by the .sh accompanying shell script.
"""
import argparse
from jinja2 import Environment, FileSystemLoader
import os
import pwd
import random
import uuid

class Config(object): pass

class Template_Task():

    def __init__(self, template_path, dst_path, kv_set):
        self.jinja_tmpl = env.get_template(template_path)
        self.dst_path = dst_path
        self.kv_set = kv_set

    def do_exec(self):

        with open(self.dst_path, 'w') as f_out:
            f_out.write(self.jinja_tmpl.render(**self.kv_set))

            print('rz-mux-tool: generated: %s' % (f_out.name))

def gen_dom_config__neo4j(domain_fqdn, cfg):
    """
    Generate domain-specific neo4j configuration file set
    """

    neo4j_template_path_prefix = 'neo4j-conf-template.d'
    target_dir = os.path.join('etc/neo4j/mux-conf.d', args.domain)

    conf_task_set = [Template_Task(os.path.join(neo4j_template_path_prefix, 'neo4j-server.properties.jinja'),
                                   os.path.join(install_prefix, target_dir, 'neo4j-server.properties'),
                                   {'org_neo4j_server_webserver_https_port': cfg.neo4j_port__https,
                                    'org_neo4j_server_webserver_port': cfg.neo4j_port__http}),
                     Template_Task(os.path.join(neo4j_template_path_prefix, 'neo4j.properties.jinja'),
                                   os.path.join(install_prefix, target_dir, 'neo4j.properties'),
                                   {'remote_shell_port': cfg.neo4j_port__shell}),
                     Template_Task(os.path.join(neo4j_template_path_prefix, 'neo4j-service_deomain-init-script.jinja'),
                                   os.path.join(install_prefix, 'etc/init.d/', 'neo4j-service__%s' % (domain_fqdn)),
                                   {'domain_fqdn': domain_fqdn}),
                     ]

    for conf_task_obj in conf_task_set:
        conf_task_obj.do_exec()

def gen_dom_config__apache(domain_fqdn, cfg):
    """
    Generate domain-specific neo4j configuration file set
    """
    apache_template_path_prefix = 'apache-conf-template.d'
    rhizi_top_domain_fqdn = 'rhizi.net'

    conf_task_set = [Template_Task(os.path.join(apache_template_path_prefix, 'x.%s.conf' % (rhizi_top_domain_fqdn)),
                                   os.path.join(install_prefix, 'etc/apache2/sites-available', domain_fqdn + '.conf'),
                                   {'domain_fqdn': domain_fqdn,
                                    'rz_port__http': cfg.rz_port__http}),
                     ]

    for conf_task_obj in conf_task_set:
        conf_task_obj.do_exec()

def gen_dom_config__rhizi(domain_fqdn, cfg):
    rz_template_path_prefix = 'rhizi-conf-template.d'

    rz_server_secret = str(uuid.uuid4()).replace('-', '')
    root_path = os.path.join('/srv/www/rhizi/mux-root.d/', domain_fqdn, 'webapp')
    user_db_path = os.path.join('/srv/www/rhizi/mux-root.d/', domain_fqdn, 'auth', 'user_db.db')

    conf_task_set = [Template_Task(os.path.join(rz_template_path_prefix, 'rhizi-server.conf.jinja'),
                                   os.path.join(install_prefix, 'etc/rhizi/mux-conf.d', domain_fqdn, 'rhizi-server.conf'),
                                   {'access_control': cfg.access_control,
                                    'domain_fqdn': domain_fqdn,
                                    'neo4j_port__http': cfg.neo4j_port__http,
                                    'root_path': root_path,
                                    'rz_port__http': cfg.rz_port__http,
                                    'rz_server_secret': rz_server_secret,
                                    'user_db_path': user_db_path,
                                    }),
                     Template_Task(os.path.join(rz_template_path_prefix, 'rhizi.init.jinja'),
                                   os.path.join(install_prefix, 'etc/init.d/', 'rhizi__%s' % (domain_fqdn)),
                                   {'domain_fqdn': domain_fqdn}),
                     Template_Task(os.path.join(rz_template_path_prefix, 'rhizi-cron-bkp.daily.sh.jinja'),
                                   os.path.join(install_prefix, 'etc/cron.daily/', 'rhizi__%s' % (domain_fqdn)),
                                   {'domain_fqdn': domain_fqdn,
                                    'neo4j_port__shell': cfg.neo4j_port__shell}),
                     ]

    for conf_task_obj in conf_task_set:
        conf_task_obj.do_exec()

if __name__ == '__main__':
    global env
    global install_prefix

    p = argparse.ArgumentParser(description='rz-cli tool')
    p.add_argument('-d', '--domain', required=True, help='target domain name')
    p.add_argument('--install-prefix', default='/', help='install dir path prefix, default=\'/\'')
    p.add_argument('--template-dir', default='.', help='path to template dir')  # default devied from installed pkg layout
    p.add_argument('--rz_config__disable_access_control', action='store_const', const=True, default=False)
    args = p.parse_args()

    env = Environment(loader=FileSystemLoader(args.template_dir))
    install_prefix = args.install_prefix
    domain_fqdn = args.domain

    #
    # generate optimistic-collision-avoiding instance port map
    #
    port_seed = 1000 + random.randint(0, pow(2, 16) - 1000 - 10)
    cfg = Config()
    cfg.neo4j_port__https = port_seed + 0  # REST API port
    cfg.neo4j_port__http = port_seed + 1
    cfg.neo4j_port__shell = port_seed + 2
    cfg.rz_port__http = port_seed + 3
    cfg.access_control = False if args.rz_config__disable_access_control else True

    gen_dom_config__neo4j(domain_fqdn, cfg)
    gen_dom_config__rhizi(domain_fqdn, cfg)
    gen_dom_config__apache(domain_fqdn, cfg)