diff --git a/bundles/mailserver/items.py b/bundles/mailserver/items.py index f7c6598..f56867c 100644 --- a/bundles/mailserver/items.py +++ b/bundles/mailserver/items.py @@ -3,9 +3,12 @@ assert node.has_bundle('dovecot') assert node.has_bundle('letsencrypt') assert node.has_bundle('roundcube') +from hashlib import md5 from shlex import quote -setup = ''' +db_data = node.metadata.get('mailserver/database') +test_password = str(node.metadata.get('mailserver/test_password')) +setup = f""" CREATE TABLE domains ( "id" BIGSERIAL PRIMARY KEY, "name" varchar(255) UNIQUE NOT NULL @@ -20,25 +23,54 @@ setup = ''' "redirect" varchar(255) DEFAULT NULL ); CREATE UNIQUE INDEX ON users ("name", "domain_id") WHERE "redirect" IS NULL; -''' + + -- OWNERSHIPS + + ALTER TABLE domains OWNER TO {db_data['user']}; + ALTER TABLE users OWNER TO {db_data['user']}; + + -- TEST DATA + + INSERT INTO domains (name) VALUES ('example.com'); + + INSERT INTO users (name, domain_id, password) + SELECT 'bw_test_user', domains.id, MD5('{test_password}') + FROM domains + WHERE domains.name = 'example.com'; + + INSERT INTO users (name, domain_id, redirect) + SELECT 'bw_test_alias', domains.id, 'irgendweo@gmail.com' + FROM domains + WHERE domains.name = 'example.com'; +""" actions['initialize_mailserver_db'] = { - 'command': f'psql -d mailserver -c {quote(setup)}', - 'unless': f'psql -At -d mailserver -c "SELECT to_regclass(\'public.users\')" | grep -q \'^users$\'', + 'command': f"psql -d {db_data['name']} -c {quote(setup)}", + 'unless': f"psql -At -d {db_data['name']} -c \"SELECT to_regclass(\'public.users\')\" | grep -q '^users$'", 'needs': [ 'postgres_db:mailserver', ], } +# testuser -# TEST -''' -DROP TABLE users; DROP TABLE domains; - -INSERT INTO domains (id, name) -VALUES (1, 'mails2.sublimity.de'); -INSERT INTO users (id, name, domain_id, password) -VALUES (1, 'ckn', 1, MD5('test123')); -INSERT INTO users (id, name, domain_id, redirect) -VALUES (2, 'weg', 1, 'irgendweo@gmail.com'); -''' +test_password_md5 = md5(str(test_password).encode()).hexdigest() +check_query = """ + SELECT password + FROM users + WHERE name = 'bw_test_user' + AND domain_id = (SELECT id FROM domains WHERE name = 'example.com') +""" +update_query = f""" + UPDATE users + SET password = MD5('{test_password}') + WHERE name = 'bw_test_user' + AND domain_id = (SELECT id FROM domains WHERE name = 'example.com') +""" +actions['mailserver_update_test_pw'] = { + 'command': f"psql -d {db_data['name']} -c {quote(update_query)}", + 'unless': f"psql -At -d {db_data['name']} -c {quote(check_query)} | grep -q '^{test_password_md5}$\'", + 'needs': [ + 'action:initialize_mailserver_db', + ], +} diff --git a/bundles/mailserver/metadata.py b/bundles/mailserver/metadata.py index cf23fab..b338f73 100644 --- a/bundles/mailserver/metadata.py +++ b/bundles/mailserver/metadata.py @@ -4,11 +4,12 @@ defaults = { 'mailserver': { 'maildir': '/var/vmail', 'database': { - 'host': '127.0.0.1', + 'host': 'localhost', 'name': 'mailserver', 'user': 'mailserver', 'password': database_password, }, + 'test_password': repo.vault.password_for(f'{node.name} test_pw mailserver'), }, 'postgresql': { 'roles': { diff --git a/bundles/postgresql/items.py b/bundles/postgresql/items.py index 0bffd51..3589587 100644 --- a/bundles/postgresql/items.py +++ b/bundles/postgresql/items.py @@ -1,14 +1,22 @@ +from bundlewrap.utils.dicts import merge_dict + + +svc_systemd['postgresql'] = { + 'needs': [ + 'pkg_apt:postgresql', + ], +} + for user, config in node.metadata.get('postgresql/roles').items(): - postgres_roles[user] = { - 'password': config['password'], - 'needs': { + postgres_roles[user] = merge_dict(config, { + 'needs': [ 'svc_systemd:postgresql', - }, - } + ], + }) for database, config in node.metadata.get('postgresql/databases').items(): - postgres_dbs[database] = config - -svc_systemd = { - 'postgresql': {}, -} + postgres_dbs[database] = merge_dict(config, { + 'needs': [ + 'svc_systemd:postgresql', + ], + }) diff --git a/bundles/postgresql/metadata.py b/bundles/postgresql/metadata.py index 44c2cb7..46dc13d 100644 --- a/bundles/postgresql/metadata.py +++ b/bundles/postgresql/metadata.py @@ -4,9 +4,6 @@ defaults = { 'root': { 'password': repo.vault.password_for(f'{node.name} postgresql root'), 'superuser': True, - 'needs': { - 'svc_systemd:postgresql', - }, }, }, 'databases': {}, diff --git a/requirements.txt b/requirements.txt index 83c0c34..0aa2c10 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -bundlewrap>=4.4.2 +bundlewrap>=4.8.0