#!/usr/bin/python3 import argparse import os import random import string import subprocess import sys publik = { "authentic2-multitenant": { "database": "authentic2_multitenant", "user": "authentic-multitenant", "extensions": ["unaccent", "pg_trgm"], }, "bijoe": {}, "chrono": {}, "combo": {"extensions": ["unaccent"]}, "fargo": {}, "hobo": {}, "passerelle": {}, "wcs": {}, "welco": {}, } def run(command, database="postgres", fake=False): cmd = 'sudo -u postgres psql -c "%s" %s' % (command.replace('"', '\\"'), database) if fake: print(cmd) else: subprocess.run(cmd, shell=True, check=True) def write_setting(brique, host, port, password): if brique == "wcs": print("warning: setting w.c.s. connection password is not implemented") return settings_d = "/etc/%s/settings.d" % brique settings = "%s/database.py" % settings_d if not os.path.isdir(settings_d): os.system('mkdir -p %s' % settings_d) with open(settings, "w") as fh: fh.write( "DATABASES['default']['HOST'] = '{host}'\n" "DATABASES['default']['PORT'] = {port}\n" "DATABASES['default']['PASSWORD'] = '{password}'".format(host=host, port=port, password=password) ) def main(args): for brique, data in publik.items(): database = data.get("database", brique) user = data.get("user", brique) extensions = data.get("extensions") run('CREATE USER "%s";' % user, fake=args.fake) if user == "wcs": run("ALTER USER wcs CREATEDB;", fake=args.fake) if args.password: password = "".join(random.choice(string.ascii_letters + string.digits) for _ in range(16)) run("ALTER USER \"%s\" with password '%s';" % (user, password), fake=args.fake) run( "CREATE DATABASE {} WITH OWNER = \"{}\" TEMPLATE = template0 " "LC_COLLATE = 'fr_FR.UTF-8' LC_CTYPE = 'fr_FR.UTF-8';".format(database, user), fake=args.fake, ) if extensions: for e in extensions: run("CREATE EXTENSION %s;" % e, database=database, fake=args.fake) if not args.fake and args.password: write_setting(brique, args.host, args.port, password) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--password", action="store_true", help="generate password") parser.add_argument("--fake", action="store_true", help="dry-run") parser.add_argument("--host", default="localhost") parser.add_argument("--port", default="5432") args = parser.parse_args() if not args.fake and os.geteuid() != 0: sys.exit("You need to have privileges to run this script, please try again with sudo.") main(args)