From 59bc07cde515cdf9104d21c5cde99db462e9343e Mon Sep 17 00:00:00 2001 From: Dmytro Makovey Date: Fri, 25 Aug 2017 12:44:05 -0700 Subject: [PATCH] add config sync for bulk operations on users and aliases driven by config management systems etc. --- admin/manage.py | 48 ++++++++++++++++++++++++++++++++++++++++++ admin/requirements.txt | 1 + 2 files changed, 49 insertions(+) diff --git a/admin/manage.py b/admin/manage.py index 8ec6ade8..bb3c4a5e 100644 --- a/admin/manage.py +++ b/admin/manage.py @@ -72,6 +72,54 @@ def user_import(localpart, domain_name, password_hash, hash_scheme='SHA512-CRYPT db.session.add(user) db.session.commit() +@manager.command +def config_update(): + """sync configuration with data from stdin""" + import yaml, sys + new_config=yaml.load(sys.stdin) + # print new_config + users=new_config['users'] + for user_config in users: + localpart=user_config['localpart'] + domain_name=user_config['domain'] + password_hash=user_config['password_hash'] + hash_scheme=user_config['hash_scheme'] + domain = models.Domain.query.get(domain_name) + if not domain: + domain = models.Domain(name=domain_name) + db.session.add(domain) + user = models.User.query.get('{0}@{1}'.format(localpart,domain_name)) + if not user: + user = models.User( + localpart=localpart, + domain=domain, + global_admin=False + ) + user.set_password(password_hash, hash_scheme=hash_scheme, raw=True) + db.session.add(user) + + aliases=new_config['aliases'] + for alias_config in aliases: + localpart=alias_config['localpart'] + domain_name=alias_config['domain'] + destination=alias_config['destination'] + domain = models.Domain.query.get(domain_name) + if not domain: + domain = models.Domain(name=domain_name) + db.session.add(domain) + alias = models.Alias.query.get('{0}@{1}'.format(localpart, domain_name)) + if not alias: + alias = models.Alias( + localpart=localpart, + domain=domain, + destination=destination.split(','), + email="%s@%s" % (localpart, domain_name) + ) + else: + alias.destination = destination.split(',') + db.session.add(alias) + + db.session.commit() @manager.command def alias(localpart, domain_name, destination): diff --git a/admin/requirements.txt b/admin/requirements.txt index f5337d48..3d0ce119 100644 --- a/admin/requirements.txt +++ b/admin/requirements.txt @@ -14,3 +14,4 @@ docker-py tabulate apscheduler certbot +PyYAML