adversarial-mailman2to3/import_mailman3_list_config.py

81 lines
2.2 KiB
Python
Raw Normal View History

2024-02-15 22:54:35 +00:00
#!/bin/env python3
import sys
import requests
import argparse
import json
from pathlib import Path
from requests.auth import HTTPBasicAuth
REST_USER="restadmin"
REST_PATH="http://127.0.0.1:8001/3.0/lists"
BANNER="""
_) | __ / _|_)
` \ _` | | | ` \ _` | \ _ \ _| _ \ \ _| | _` |
_|_|_|\__,_|_|_|_|_|_|\__,_|_| _|___/\__|\___/_| _|_| _|\__, |
____/
"""
def parse_args(args):
parser = argparse.ArgumentParser("load a json config into local mailman configuration")
parser.add_argument("list", help="list name (eg `test`)")
parser.add_argument("patch", help="config to push to list", type=Path)
return parser.parse_args(args)
def main(args):
print(BANNER)
pargs = parse_args(args[1:])
if (not pargs.patch.exists()):
print("need input patchfile (json)")
return 1
with pargs.patch.open() as inf:
p = json.load(inf)
rest_pass = Path("/run/secrets/mailman_rest_password").read_text().strip()
rest_auth = HTTPBasicAuth(REST_USER, rest_pass)
# determine if list exists, if not create with defaults
result = requests.get(REST_PATH, auth=rest_auth)
if result.ok:
if (not (pargs.list in [x['fqdn_listname'] for x in result.json()['entries']])):
# create list
print("list not found: creating")
result = requests.post(f"{REST_PATH}", auth=rest_auth, json={"fqdn_listname": pargs.list})
if (result.ok):
print("success")
print(result)
print(result.text)
else:
print("failed")
print(result)
print(result.reason)
return 1
# list exists
else:
print("cannot get list of lists")
print(result)
print(result.reason)
return 1
# patch config
result = requests.patch(f"{REST_PATH}/{pargs.list}/config", auth=rest_auth, json=p)
if result.ok:
print("success")
print(result)
print(result.text)
else:
print("failed")
print(result)
print(result.reason)
if __name__ == "__main__":
sys.exit(main(sys.argv))