104 lines
3.0 KiB
Python
Executable File
104 lines
3.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
from pathlib import Path
|
|
import requests
|
|
|
|
|
|
def parse_freeradius_dictionary(text, freeradius4=False):
|
|
vendors = {}
|
|
current_vendor = None
|
|
avs = {}
|
|
|
|
for line in text.splitlines():
|
|
if line.startswith("VENDOR"):
|
|
elements = line.split("#")[0].split()
|
|
vendors[elements[1]] = int(elements[2])
|
|
|
|
elif line.startswith("BEGIN-VENDOR"):
|
|
elements = line.split("#")[0].split()
|
|
if elements[1] in vendors:
|
|
current_vendor = elements[1]
|
|
else:
|
|
raise Exception(f"Vendor {elements[1]} not declared")
|
|
|
|
elif line.startswith("END-VENDOR"):
|
|
current_vendor = None
|
|
|
|
elif line.startswith("ATTRIBUTE"):
|
|
elements = line.split("#")[0].split()
|
|
|
|
avs[f"26.{vendors[current_vendor]}.{int(elements[2])}"] = elements[1] if not freeradius4 else f"Vendor-Specific.{current_vendor}.{elements[1]}"
|
|
|
|
return avs
|
|
|
|
def merge_avs(av_dicts):
|
|
merged_avs = {}
|
|
|
|
for source, d in av_dicts.items():
|
|
for attr, name in d.items():
|
|
if attr not in merged_avs:
|
|
merged_avs[attr] = {}
|
|
|
|
merged_avs[attr][source] = name
|
|
|
|
|
|
return merged_avs
|
|
|
|
def sort_attribute_key(key):
|
|
a,b,c = key.split(".")
|
|
return f"{int(a):04d}.{int(b):08d}.{int(c):08d}"
|
|
|
|
def to_dokuwiki(merged_avs):
|
|
out = ""
|
|
|
|
cols = list(next(iter(merged_avs.items()))[1].keys())
|
|
|
|
out +="^ " + " ^ ".join( ["id"] + cols) + " ^\n"
|
|
|
|
avs = sorted(list(merged_avs.keys()), key=sort_attribute_key)
|
|
|
|
for av in avs:
|
|
line = []
|
|
line.append(av)
|
|
|
|
for col in cols:
|
|
if col in merged_avs[av]:
|
|
line.append(merged_avs[av][col])
|
|
else:
|
|
line.append("")
|
|
|
|
out += "| " + " | ".join(line) + " |\n"
|
|
|
|
return out
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
av_dicts = {}
|
|
|
|
# Official Juniper VSAs
|
|
text = Path("dictionary.juniper").read_text()
|
|
av_dicts["juniper"] = parse_freeradius_dictionary(text)
|
|
|
|
# v2.x.x
|
|
r = requests.get("https://raw.githubusercontent.com/FreeRADIUS/freeradius-server/v2.x.x/share/dictionary.erx")
|
|
r.raise_for_status()
|
|
av_dicts["freeradius_2.x.x"] = parse_freeradius_dictionary(r.text)
|
|
|
|
# v3.0.x
|
|
r = requests.get("https://raw.githubusercontent.com/FreeRADIUS/freeradius-server/v3.0.x/share/dictionary.erx")
|
|
r.raise_for_status()
|
|
av_dicts["freeradius_3.0.x"] = parse_freeradius_dictionary(r.text)
|
|
|
|
# v3.2.x
|
|
r = requests.get("https://raw.githubusercontent.com/FreeRADIUS/freeradius-server/v3.2.x/share/dictionary.erx")
|
|
r.raise_for_status()
|
|
av_dicts["freeradius_3.2.x"] = parse_freeradius_dictionary(r.text)
|
|
|
|
# v4.0-alpha1
|
|
r = requests.get("https://raw.githubusercontent.com/FreeRADIUS/freeradius-server/release_4_0_alpha1/share/dictionary/radius/dictionary.unisphere")
|
|
r.raise_for_status()
|
|
av_dicts["freeradius_4.0-alpha1"] = parse_freeradius_dictionary(r.text, freeradius4=True)
|
|
|
|
print(to_dokuwiki(merge_avs(av_dicts)))
|