#!/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)))