Compare commits

..

No commits in common. "1b9c2936a37432f2beac2312a4fdd3bc89263835" and "51439a54c282b1714d7edf4b5a113536a4356959" have entirely different histories.

2 changed files with 15 additions and 86 deletions

View File

@ -16,11 +16,10 @@ Update Mailman 3 lists via a json API of the form:
}
"""
import json
import argparse
import os
import email.utils
import configargparse
import mailmanclient
import requests
@ -121,56 +120,12 @@ def sync_moderators(
list.remove_moderator(member.address)
def update_cloudflare_lists(
dry_run: bool,
auth_token: str,
account_id: str,
script_name: str,
binding_name: str,
expected: list[str],
):
settings_api_url = f"https://api.cloudflare.com/client/v4/accounts/{account_id}/workers/scripts/{script_name}/settings"
r = requests.get(
settings_api_url,
headers={"Authorization": auth_token},
)
data = r.json()
# TODO: more error handling
if not data["success"]:
print("Failed to fetch Cloudflare email worker settings")
bindings_dict = {b["name"]: b for b in data["result"]["bindings"]}
if set(bindings_dict.get(binding_name, {}).get("json", [])) != set(expected):
print("Cloudflare email worker list out of date, updating")
bindings_dict[binding_name] = {
"name": binding_name,
"json": expected,
"type": "json",
}
if not dry_run:
r = requests.patch(
settings_api_url,
headers={"Authorization": auth_token},
files={
"settings": json.dumps({"bindings": list(bindings_dict.values())}),
},
)
else:
print("Cloudflare email worker list already up to date")
def main(
api: str,
api_auth: str,
mailman_client: mailmanclient.Client,
dry_run: bool,
mail_host: str,
cf_auth_token: str,
cf_account_id: str,
cf_script_name: str,
cf_binding_name: str,
):
r = requests.get(api, headers={"Authorization": api_auth})
if not r.ok:
@ -200,21 +155,10 @@ def main(
sync_moderators(list, dry_run, props["moderators"])
sync_members(list, dry_run, props["members"])
lists = [list.list_name.lower() for list in domain.get_lists()]
update_cloudflare_lists(
dry_run, cf_auth_token, cf_account_id, cf_script_name, cf_binding_name, lists
)
def parse_arguments():
argp = configargparse.ArgumentParser(description=__doc__)
argp.add("-c", "--config", is_config_file=True, help="Config file path")
argp = argparse.ArgumentParser(description=__doc__)
argp.add_argument("--api", required=True, help="API endpoint to retrieve JSON from")
argp.add_argument(
"--api-auth", required=True, help="API Authorization header token"
)
argp.add_argument("--mail-host", help="Base domain for all lists", required=True)
argp.add_argument(
"--mailman-url",
@ -224,27 +168,6 @@ def parse_arguments():
argp.add_argument(
"--mailman-user", help="Username for Mailman3 REST API", default="restadmin"
)
argp.add_argument(
"--mailman-pass", help="Password for Mailman3 REST API", required=True
)
argp.add_argument(
"--cf-auth-token", help="Auth token for CloudFlare API", required=True
)
argp.add_argument(
"--cf-account-id",
help="Account ID of CloudFlare email worker script",
required=True,
)
argp.add_argument(
"--cf-script-name", help="Name of CloudFlare email worker script", required=True
)
argp.add_argument(
"--cf-binding-name",
help="Name of environment variable in email worker script",
default="MAILMAN_LISTS",
)
argp.add_argument(
"-n",
"--dry-run",
@ -257,20 +180,21 @@ def parse_arguments():
if __name__ == "__main__":
args = parse_arguments()
for env_var in ("API_AUTH", "MAILMAN_PASS"):
if env_var not in os.environ:
print(f"Missing {env_var} environment variable")
exit(-1)
mailman_client = mailmanclient.Client(
args.mailman_url + "/3.1",
args.mailman_user,
args.mailman_pass,
os.environ["MAILMAN_PASS"],
)
main(
args.api,
args.api_auth,
os.environ["API_AUTH"],
mailman_client,
args.dry_run,
args.mail_host,
args.cf_auth_token,
args.cf_account_id,
args.cf_script_name,
args.cf_binding_name,
)

View File

@ -6,4 +6,9 @@ User=mailman
Group=mailman
Type=oneshot
TimeoutStartSec=600
ExecStart=/usr/bin/python3 /opt/mailman-sync/mailman_sync.py --config /opt/mailman-sync/config.yml
EnvironmentFile=/opt/mailman-sync/env
ExecStart=/usr/bin/python3 /opt/mailman-sync/mailman_sync.py \
--api https://paperwork.claremontmakerspace.org/api/v1/paperwork/department/mailing_lists.json \
--mail-host claremontmakerspace.org \
--mailman-url http://localhost:8001 \
--mailman-user restadmin