#!/usr/bin/env python import subprocess from configobj import ConfigObj import uuid from MAPI.Util import * import kopano # Try simplejson if json is not available try: import json except ImportError: import simplejson as json def encode(value): proc = subprocess.Popen(["php", "deencode.php", "encode", value], stdout=subprocess.PIPE) return proc.communicate()[0] def opt_args(): parser = kopano.parser('skpcfmUP') parser.add_option("--user", dest="user", action="store", help="username") parser.add_option("--file", dest="file", default=[], action="store", help="config file(s) separate by ',' ") parser.add_option("--overwrite", dest="overwrite", action="store_true", help="overwrite files settings") parser.add_option("--default", dest="default", action="store_true", help="use default user and password in the configfile") return parser.parse_args() def read_settings(options): try: user = kopano.Server(options).user(options.user) except MAPIErrorLogonFailed as e: print('User \'{}\' not found ({})'.format(options.user, e)) sys.exit(1) if not user.store: print('User \'{}\' has no user store ({})'.format(options.user, e)) sys.exit(1) try: mapisettings = user.store.prop(PR_EC_WEBACCESS_SETTINGS_JSON).value return mapisettings except Exception: print('{}: Has no or no valid WebApp settings creating empty config tree'.format(user.name)) return '{"settings": {"zarafa": {"v1": {"contexts": {"mail": {}}}}}}' def write_settings(data, options): user = kopano.Server(options).user(options.user) user.store.create_prop(PR_EC_WEBACCESS_SETTINGS_JSON, data.encode('utf-8')) print('Writing settings for user \'{}\''.format(user.fullname)) def files(options): filesjson = '{' if options.overwrite: filesjson = '{"accounts": {' num = 0 files = options.file.split(',') for file in files: configfile = ConfigObj(file) if options.default: username = configfile['setting']['default_user'] else: username = options.user if num != 0: filesjson += ',' id = uuid.uuid4() filesjson += ''' "%s": { "status": "ok", "backend_config": { "server_path": "%s", "workgroup": "%s", "server_address": "%s", "server_ssl": %s, "current_account_id": "%s", "use_zarafa_credentials": %s, "user": "%s", "password": "%s", "server_port": "%s" }, "cannot_change": false, "name": "%s", "status_description": "Account is ready to use.", "id": "%s", "backend_features": { "Sharing": true, "VersionInfo": true, "Quota": true }, "backend": "%s" }''' % (id, encode(configfile['setting']['server_path']), encode(configfile['setting']['workgroup']), encode(configfile['setting']['server_address']), configfile['setting']['server_ssl'], encode('d4cacda458a2a26c301f2b7d75ada530'), configfile['setting']['use_zarafa_credentials'], encode(username), encode(configfile['setting']['default_password']), encode(configfile['setting']['server_port']), configfile['setting']['name'], id, configfile['setting']['type']) num += 1 if options.overwrite: filesjson += '}}' else: filesjson += '}' return filesjson def main(): options, args = opt_args() data = read_settings(options) webappsettings = json.loads(data) if not webappsettings['settings']['zarafa']['v1'].get('plugins'): webappsettings['settings']['zarafa']['v1']['plugins'] = {} if options.overwrite: webappsettings['settings']['zarafa']['v1']['plugins']['files'] = json.loads(files(options)) else: if not webappsettings['settings']['zarafa']['v1']['plugins'].get('files'): webappsettings['settings']['zarafa']['v1']['plugins']['files'] = {} if not webappsettings['settings']['zarafa']['v1']['plugins']['files'].get('accounts'): webappsettings['settings']['zarafa']['v1']['plugins']['files']['accounts'] = {} webappsettings['settings']['zarafa']['v1']['plugins']['files']['accounts'].update(json.loads(files(options))) write_settings(json.dumps(webappsettings), options) if __name__ == '__main__': main()