add publik-create-databases

This commit is contained in:
Christophe Siraut 2018-09-05 11:35:16 +02:00
parent 5a03f79418
commit 9f44e487ae
4 changed files with 123 additions and 2 deletions

View File

@ -3,7 +3,9 @@
NAME=$(shell basename $(CURDIR))
VERSION=`git describe | sed 's/^debian\///' | sed 's/v//'`
DIST_FILES = Makefile \
publik-create-users
publik-create-users \
publik-create-databases \
publik.conf.example
version:
@(echo $(VERSION))

3
debian/install vendored
View File

@ -1,2 +1,3 @@
publik-create-users /usr/bin
publik-create-databases /usr/bin
publik.conf.example /etc/publik

80
publik-create-databases Executable file
View File

@ -0,0 +1,80 @@
#!/usr/bin/python3
import os
import argparse
import subprocess
import yaml
parser = argparse.ArgumentParser()
parser.add_argument('--config', type=str, default='/etc/publik/publik.conf')
args = parser.parse_args()
def run_pg(connection, cmd):
cmd = cmd.replace('"', '\\"')
if connection.get('host') == 'localhost' and not connection.get('admin'):
subprocess.call('echo "%s" | sudo -u postgres psql' % cmd, shell=True)
else:
admin = connection.get('admin')
subprocess.call("echo '%s' | psql -h -U %s -W" % (cmd, admin), shell=True)
def main():
if not os.path.isfile(args.config):
raise(Exception('Configuration file not found: %s' % args.config))
with open(args.config) as fh:
cfg = yaml.load(fh)
if 'instances' not in cfg.keys():
raise(Exception('No "instances" key found in configuration'))
if 'defaults' in cfg.keys():
defaults = cfg.get('defaults')
else:
print('No "defaults" key found in configuration')
defaults = None
if 'connection' in cfg.keys():
connection = cfg.get('connection')
else:
connection = {'host': 'locahost', 'admin': None, 'password': None}
for instance, data in cfg.get('instances').items():
create_databases(instance, data, defaults, connection)
def create_databases(instance, data, defaults, connection):
count = len(data.keys())
print('instance {} has {} components'.format(instance, count))
cmds = []
if 'databases' not in data.keys():
print('No "databases" key found for %s' % instance)
return
for db, dbdata in data.get('databases').items():
if 'databases' in defaults.keys():
db_defaults = defaults.get('databases')
if db in db_defaults.keys():
db_defaults.get(db).update(dbdata)
dbdata = db_defaults.get(db)
dbdata['database'] = db
cmds.append(gen_cmd(**dbdata))
run_pg(connection, " ".join(cmds))
def gen_cmd(database, role, password):
out = []
out.append("CREATE USER \"{}\" PASSWORD '{}';".format(role, password))
out.append("CREATE DATABASE {} WITH OWNER = \"{}\" TEMPLATE = template0 "
"LC_COLLATE = 'fr_FR.UTF_8' LC_CTYPE = 'fr_FR.UTF-8';".format(database, role))
if database == 'wcs':
out.append("ALTER USER wcs CREATEDB;")
return " ".join(out)
if __name__ == '__main__':
main()

38
publik.conf.example Normal file
View File

@ -0,0 +1,38 @@
connection:
# the following is suitable for a local postgresql service
host: localhost
admin:
password:
defaults:
databases:
authentic2_multitenant:
role: authentic-multitenant
bijoe:
role: bijoe
chrono:
role: chrono
combo:
role: combo
corbo:
role: corbo
fargo:
role: fargo
hobo:
role: hobo
mandayejs:
role: mandayejs
passerelle:
role: passerelle
wcs:
role: wcs
welco:
role: welco
## Example
# instances:
# demo.local.publik:
# databases:
# authentic2_multitenant:
# password: juzi3Uhi