#!/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 # fixme pull out owner, moderator keys, we'll poke them in separately if "owner" in p: del p["owner"] if "moderator" in p: del p["moderator"] # 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) print(result.text) if __name__ == "__main__": sys.exit(main(sys.argv))