#!/usr/bin/python3
# Create links on Publik clustered installations
# 2018 Entr'ouvert
import argparse
import shutil
import os


briques = [
    'authentic2-multitenant',
    'bijoe',
    'chrono',
    'combo',
    'fargo',
    'hobo',
    'lingo',
    'passerelle',
    'wcs',
    'welco',
]


def link(application, basepath):
    if application == 'authentic2-multitenant':
        user = 'authentic-multitenant'
    else:
        user = application

    etc = os.path.join(basepath, 'etc')
    lib = os.path.join(basepath, 'lib')
    nginx = os.path.join(basepath, 'etc', 'nginx')
    hobo_agent = os.path.join(basepath, 'etc', 'hobo_agent')
    app_etc = os.path.join(etc, application)
    app_lib = os.path.join(lib, application)
    app_nginx = os.path.join(nginx, application)
    app_hobo_agent = os.path.join(hobo_agent, application)

    for p in [etc, lib, nginx, app_etc, app_lib, app_nginx, hobo_agent, app_hobo_agent]:
        if not os.path.isdir(p):
            os.mkdir(p)
            if p in [app_etc, app_lib]:
                os.system('chown %s %s' % (user, p))

    def move_and_link(src, dst):

        if not os.path.islink(src):
            if os.path.isdir(src):
                os.system('mv -n %s/* %s' % (src, dst))
                shutil.rmtree(src, ignore_errors=True)

            if not os.path.exists(src):
                os.symlink(dst, src)

    move_and_link('/etc/%s' % application, app_etc)
    move_and_link('/var/lib/%s' % application, app_lib)
    move_and_link('/etc/nginx', app_nginx)
    move_and_link('/etc/hobo-agent', app_hobo_agent)


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('application')
    parser.add_argument('basepath')
    args = parser.parse_args()
    application = args.application
    basepath = args.basepath

    if not os.path.isdir(basepath):
        raise (Exception('path not found: %s' % basepath))

    if application == 'all':
        for app in briques:
            link(app, basepath)
    else:
        if application in briques:
            link(application, basepath)
        else:
            raise (Exception('application unknown: %s' % application))
