juniper-radius-vsas/parse_freeradius_dictionary.py

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)))