webapp-tools/Inject Files/inject-files.py

134 lines
4.6 KiB
Python
Raw Normal View History

2016-10-24 12:53:03 +02:00
#!/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):
2016-10-24 14:29:01 +02:00
proc = subprocess.Popen(["php", "deencode.php", "encode", value], stdout=subprocess.PIPE)
return proc.communicate()[0]
2016-10-24 12:53:03 +02:00
def opt_args():
2019-02-04 11:46:02 +01:00
parser = kopano.parser('skpcfmUP')
2016-10-24 12:53:03 +02:00
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 ',' ")
2019-02-04 11:46:02 +01:00
parser.add_option("--overwrite", dest="overwrite", action="store_true", help="overwrite files settings")
2016-10-24 12:53:03 +02:00
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:
2019-02-04 11:46:02 +01:00
print('User \'{}\' not found ({})'.format(options.user, e))
sys.exit(1)
2016-10-24 12:53:03 +02:00
2019-02-04 11:46:02 +01:00
if not user.store:
print('User \'{}\' has no user store ({})'.format(options.user, e))
sys.exit(1)
2016-10-24 12:53:03 +02:00
2019-02-04 11:46:02 +01:00
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": {}}}}}}'
2016-10-24 12:53:03 +02:00
def write_settings(data, options):
user = kopano.Server(options).user(options.user)
2019-02-04 11:46:02 +01:00
user.store.create_prop(PR_EC_WEBACCESS_SETTINGS_JSON, data.encode('utf-8'))
print('Writing settings for user \'{}\''.format(user.fullname))
2016-10-24 12:53:03 +02:00
def files(options):
2019-02-04 11:46:02 +01:00
filesjson = '{'
if options.overwrite:
filesjson = '{"accounts": {'
2016-10-24 12:53:03 +02:00
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,
2016-10-24 12:53:03 +02:00
"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']),
2016-10-24 14:29:01 +02:00
encode(configfile['setting']['server_port']), configfile['setting']['name'], id, configfile['setting']['type'])
2016-10-24 12:53:03 +02:00
num += 1
2019-02-04 11:46:02 +01:00
if options.overwrite:
filesjson += '}}'
else:
filesjson += '}'
2016-10-24 12:53:03 +02:00
return filesjson
def main():
options, args = opt_args()
data = read_settings(options)
webappsettings = json.loads(data)
2019-02-04 11:46:02 +01:00
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'] = {}
2019-02-04 11:50:31 +01:00
webappsettings['settings']['zarafa']['v1']['plugins']['files']['accounts'].update(json.loads(files(options)))
2016-10-24 12:53:03 +02:00
write_settings(json.dumps(webappsettings), options)
if __name__ == '__main__':
main()
2019-02-04 11:46:02 +01:00