55 lines
2.3 KiB
Python
55 lines
2.3 KiB
Python
"""Add the managed administrator plugin after the installed password plugin."""
|
|
import argparse
|
|
import ast
|
|
import configparser
|
|
import json
|
|
from pathlib import Path
|
|
|
|
p = argparse.ArgumentParser()
|
|
p.add_argument('default_module')
|
|
p.add_argument('config')
|
|
p.add_argument('proof')
|
|
args = p.parse_args()
|
|
config_path = Path(args.config)
|
|
text = config_path.read_text(encoding='utf-8-sig')
|
|
parser = configparser.RawConfigParser()
|
|
parser.read_string(text)
|
|
plugins = parser.defaults().get('plugins')
|
|
if plugins:
|
|
plugins = [part.strip() for part in plugins.split(',') if part.strip()]
|
|
else:
|
|
tree = ast.parse(Path(args.default_module).read_text(encoding='utf-8-sig'))
|
|
plugins = None
|
|
for node in ast.walk(tree):
|
|
if isinstance(node, ast.Call) and isinstance(node.func, ast.Attribute) and node.func.attr == 'ListOpt' and node.args and isinstance(node.args[0], ast.Constant) and node.args[0].value == 'plugins':
|
|
plugins = ast.literal_eval(next(k.value for k in node.keywords if k.arg == 'default'))
|
|
break
|
|
if not plugins:
|
|
raise RuntimeError('Installed plugin order could not be determined')
|
|
managed = 'cloudbaseinit.plugins.common.managedadmin.EnableManagedAdministratorPlugin'
|
|
plugins = [value for value in plugins if value != managed]
|
|
password = 'cloudbaseinit.plugins.common.setuserpassword.SetUserPasswordPlugin'
|
|
if password not in plugins:
|
|
raise RuntimeError('Password injection plugin is not configured')
|
|
plugins.insert(plugins.index(password) + 1, managed)
|
|
lines = text.splitlines()
|
|
section = ''
|
|
result = []
|
|
inserted = False
|
|
for line in lines:
|
|
if line.strip().startswith('['):
|
|
section = line.strip().lower()
|
|
result.append(line)
|
|
if section == '[default]':
|
|
result.append('plugins=' + ','.join(plugins))
|
|
inserted = True
|
|
elif section == '[default]' and line.strip().lower().startswith('plugins='):
|
|
continue
|
|
else:
|
|
result.append(line)
|
|
if not inserted:
|
|
raise RuntimeError('DEFAULT config section is missing')
|
|
config_path.write_text('\r\n'.join(result) + '\r\n', encoding='utf-8')
|
|
Path(args.proof).write_text(json.dumps({'Plugins': plugins, 'ManagedPluginAfterPassword': plugins.index(managed) == plugins.index(password) + 1}, indent=2), encoding='utf-8')
|
|
print('Installed plugin order preserved; managed administrator follows password injection.')
|