forked from ietf-tools/datatracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathaliases-from-json.py
More file actions
104 lines (91 loc) · 3.2 KB
/
Copy pathaliases-from-json.py
File metadata and controls
104 lines (91 loc) · 3.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# Copyright The IETF Trust 2024, All Rights Reserved
#
# Uses only Python standard lib
#
import argparse
import datetime
import json
import shutil
import stat
import sys
from pathlib import Path
from tempfile import TemporaryDirectory
# Default options
POSTCONFIRM_PATH = "/a/postconfirm/wrapper"
VDOMAIN = "virtual.ietf.org"
# Map from domain label to dns domain
ADOMAINS = {
"ietf": "ietf.org",
"irtf": "irtf.org",
"iab": "iab.org",
}
def generate_files(records, adest, vdest, postconfirm, vdomain):
"""Generate files from an iterable of records
If adest or vdest exists as a file, it will be overwritten. If it is a directory, files
with the default names (draft-aliases and draft-virtual) will be created, but existing
files _will not_ be overwritten!
"""
with TemporaryDirectory() as tmpdir:
tmppath = Path(tmpdir)
apath = tmppath / "aliases"
vpath = tmppath / "virtual"
with apath.open("w") as afile, vpath.open("w") as vfile:
date = datetime.datetime.now(datetime.UTC)
signature = f"# Generated by {Path(__file__).absolute()} at {date}\n"
afile.write(signature)
vfile.write(signature)
vfile.write(f"{vdomain} anything\n")
for item in records:
alias = item["alias"]
domains = item["domains"]
address_list = item["addresses"]
filtername = f"xfilter-{alias}"
afile.write(f'{filtername + ":":64s} "|{postconfirm} filter expand-{alias} {vdomain}"\n')
for dom in domains:
vfile.write(f"{f'{alias}@{ADOMAINS[dom]}':64s} {filtername}\n")
vfile.write(f"{f'expand-{alias}@{vdomain}':64s} {', '.join(sorted(address_list))}\n")
perms = stat.S_IWUSR | stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH
apath.chmod(perms)
vpath.chmod(perms)
shutil.move(apath, adest)
shutil.move(vpath, vdest)
def directory_path(val):
p = Path(val)
if p.is_dir():
return p
else:
raise argparse.ArgumentTypeError(f"{p} is not a directory")
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Convert a JSON stream of draft alias definitions into alias / virtual alias files."
)
parser.add_argument(
"--prefix",
required=True,
help="Prefix for output files. Files will be named <prefix>-aliases and <prefix>-virtual."
)
parser.add_argument(
"--output-dir",
default="./",
type=directory_path,
help="Destination for output files.",
)
parser.add_argument(
"--postconfirm",
default=POSTCONFIRM_PATH,
help=f"Full path to postconfirm executable (defaults to {POSTCONFIRM_PATH}",
)
parser.add_argument(
"--vdomain",
default=VDOMAIN,
help=f"Virtual domain (defaults to {VDOMAIN}_",
)
args = parser.parse_args()
data = json.load(sys.stdin)
generate_files(
data["aliases"],
adest=args.output_dir / f"{args.prefix}-aliases",
vdest=args.output_dir / f"{args.prefix}-virtual",
postconfirm=args.postconfirm,
vdomain=args.vdomain,
)