add publik-create-databases
This commit is contained in:
parent
5a03f79418
commit
9f44e487ae
4
Makefile
4
Makefile
|
@ -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))
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
publik-create-users /usr/bin
|
||||
|
||||
publik-create-databases /usr/bin
|
||||
publik.conf.example /etc/publik
|
||||
|
|
|
@ -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()
|
|
@ -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
|
Loading…
Reference in New Issue