Loading utils/oids/oid.md +76 −11 Original line number Diff line number Diff line # OID list | Spec | Module name | Version | OID relative to {itu-t(0) identified-organization(4) etsi(0)} | | ---- | ----------- | ------- | -------- | |[TS 102 232-1](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1)|[HI1NotificationOperations](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1/HI1NotificationOperations.asn?ref_type=heads)|7|securityDomain(2) lawfulIntercept(2) hi1(0) notificationOperations(1) version7(7)| |[TS 102 232-1](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1)|[HI2Operations](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1/HI2Operations.asn?ref_type=heads)|18|securityDomain(2) lawfulIntercept(2) hi2(1) version17(18)| |[TS 102 232-1](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1)|[LI-PS-PDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1/LI-PS-PDU.asn?ref_type=heads)|40|securityDomain(2) lawfulIntercept(2) li-ps(5) genHeader(1) version40(40)| |[TS 102 232-2](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-2)|[EmailPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-2/EmailPDU.asn?ref_type=heads)|20|securityDomain(2) lawfulIntercept(2) li-ps(5) email(2) version20(20)| |[TS 102 232-3](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-3)|[IPAccessPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-3/IPAccessPDU.asn?ref_type=heads)|20|securityDomain(2) lawfulIntercept(2) li-ps(5) iPAccess(3) version20(20)| |[TS 102 232-4](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-4)|[L2AccessPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-4/L2AccessPDU.asn?ref_type=heads)|10|securityDomain(2) lawfulIntercept(2)li-ps(5) l2Access(4) version10(10)| |[TS 102 232-5](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-5)|[IPMultimediaPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-5/IPMultimediaPDU.asn?ref_type=heads)|17|securityDomain(2) lawfulIntercept(2) li-ps(5) iPMultimedia(5) version17(17)| |[TS 102 232-6](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-6)|[PstnIsdnPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-6/PstnIsdnPDU.asn?ref_type=heads)|6|securityDomain(2) lawfulIntercept(2) li-ps(5) pstnIsdn(6) version6(6)| |[TS 102 657](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102657)|[RDMessage](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102657/RDMessage.asn?ref_type=heads)|33|securityDomain(2) retainedData(3) rdHeader(0) version33(33)| |[TS 103 462](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103462)|[ILHIPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103462/ILHIPDU.asn?ref_type=heads)|2|securityDomain(2) informationHandover(4) ilhi(0) ilhiPdu(0) version2(2)| |[TS 103 280](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103280)|[Common-Parameters](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103280/TS_103_280.asn1?ref_type=heads)|261|common-parameters(3280) version261(261)| |[TS 102 232-1](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1)|[HI1NotificationOperations](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1/HI1NotificationOperations.asn?ref_type=heads)|7|securityDomain(2) lawfulIntercept(2) hi1(0) notificationOperations(1)| |[TS 102 232-1](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1)|[HI2Operations](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1/HI2Operations.asn?ref_type=heads)|18|securityDomain(2) lawfulIntercept(2) hi2(1)| |[TS 102 232-1](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1)|[LI-PS-PDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1/LI-PS-PDU.asn?ref_type=heads)|40|securityDomain(2) lawfulIntercept(2) li-ps(5) genHeader(1)| |[TS 102 232-2](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-2)|[EmailPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-2/EmailPDU.asn?ref_type=heads)|20|securityDomain(2) lawfulIntercept(2) li-ps(5) email(2)| |[TS 102 232-3](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-3)|[IPAccessPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-3/IPAccessPDU.asn?ref_type=heads)|20|securityDomain(2) lawfulIntercept(2) li-ps(5) iPAccess(3)| |[TS 102 232-4](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-4)|[L2AccessPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-4/L2AccessPDU.asn?ref_type=heads)|10|securityDomain(2) lawfulIntercept(2) l2Access(4)| |[TS 102 232-5](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-5)|[IPMultimediaPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-5/IPMultimediaPDU.asn?ref_type=heads)|17|securityDomain(2) lawfulIntercept(2) li-ps(5) iPMultimedia(5)| |[TS 102 232-6](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-6)|[PstnIsdnPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-6/PstnIsdnPDU.asn?ref_type=heads)|6|securityDomain(2) lawfulIntercept(2) li-ps(5) pstnIsdn(6)| |[TS 102 657](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102657)|[RDMessage](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102657/RDMessage.asn?ref_type=heads)|33|securityDomain(2) retainedData(3) rdHeader(0)| |[TS 103 462](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103462)|[ILHIPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103462/ILHIPDU.asn?ref_type=heads)|2|securityDomain(2) informationHandover(4) ilhi(0) ilhiPdu(0)| |[TS 103 280](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103280)|[Common-Parameters](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103280/TS_103_280.asn1?ref_type=heads)|261|common-parameters(3280)| ```mermaid graph TD; 0.4[identified-organization] itu-t-->identified-organization 0.4.0[etsi] identified-organization-->etsi 0.4.0.2[securityDomain] etsi-->securityDomain 0.4.0.2.2[lawfulIntercept] securityDomain-->lawfulIntercept 0.4.0.2.2.0[hi1] lawfulIntercept-->hi1 0.4.0.2.2.0.1[notificationOperations] hi1-->notificationOperations 0.4.0.2.2.0.1.7[version7] notificationOperations-->version7 0.4.0.2.2.1[hi2] lawfulIntercept-->hi2 0.4.0.2.2.1.18[version17] hi2-->version17 0.4.0.2.2.5[li-ps] lawfulIntercept-->li-ps 0.4.0.2.2.5.1[genHeader] li-ps-->genHeader 0.4.0.2.2.5.1.40[version40] genHeader-->version40 0.4.0.2.2.5.2[email] li-ps-->email 0.4.0.2.2.5.2.20[version20] email-->version20 0.4.0.2.2.5.3[iPAccess] li-ps-->iPAccess 0.4.0.2.2.5.3.20[version20] iPAccess-->version20 0.4.0.2.2.5.5[iPMultimedia] li-ps-->iPMultimedia 0.4.0.2.2.5.5.17[version17] iPMultimedia-->version17 0.4.0.2.2.5.6[pstnIsdn] li-ps-->pstnIsdn 0.4.0.2.2.5.6.6[version6] pstnIsdn-->version6 0.4.0.2.2.4[l2Access] lawfulIntercept-->l2Access 0.4.0.2.2.4.10[version10] l2Access-->version10 0.4.0.2.3[retainedData] securityDomain-->retainedData 0.4.0.2.3.0[rdHeader] retainedData-->rdHeader 0.4.0.2.3.0.33[version33] rdHeader-->version33 0.4.0.2.4[informationHandover] securityDomain-->informationHandover 0.4.0.2.4.0[ilhi] informationHandover-->ilhi 0.4.0.2.4.0.0[ilhiPdu] ilhi-->ilhiPdu 0.4.0.2.4.0.0.2[version2] ilhiPdu-->version2 0.4.0.3280[common-parameters] etsi-->common-parameters 0.4.0.3280.261[version261] common-parameters-->version261 ``` No newline at end of file utils/oids/oid.py +114 −6 Original line number Diff line number Diff line from pathlib import Path import re class OIDArc: ARC_REGEX = re.compile(r"(.+?)\(([0-9]+?)\)") def __init__(self, s: str): m = OIDArc.ARC_REGEX.match(s) if m is None: raise ValueError(f"Could not parse OID arc from {s}") self.label = m[1] self.value = int(m[2]) self.parent = None self.children = [] def __repr__(self): return f"<OIDArc {self.as_numerical()}>" def as_numerical(self): return ".".join(str(p.value) for p in self.parents()) + "." + str(self.value) def as_canonical(self): return " ".join([f"{p.label}({p.value})" for p in self.parents()]) + f"{self.label}({self.value})" def as_relative(self, starting_depth: int): parents = self.parents()[starting_depth:] return " ".join([f"{p.label}({p.value})" for p in parents]) def get_child_by_value(self, index): for c in self.children: if c.value == index: return c return None def parents(self) -> list: r = [] p = self.parent while p is not None: r.append(p) p = p.parent r.reverse() return r def root(self): if self.parent is None: return self return self.parents()[0] def merge(self, other): if self.root().value != other.root().value: raise ValueError (f"Cannot merge OIDs with different roots ({self.root()} and {other.root()})") this_arc = self.root() other_arc = other.root() while len(other_arc.children) > 0: if len(other_arc.children) > 1: print(other_arc.children) raise ValueError(f"Can't merge with {other} as it has too many children ({len(other_arc.children)})") other_next_arc = other_arc.children[0] this_next_arc = this_arc.get_child_by_value(other_next_arc.value) if this_next_arc is None: other_next_arc.parent = this_arc this_arc.children.append(other_next_arc) return this_arc = this_next_arc other_arc = other_next_arc raise ValueError(f"OIDs {self} and {other} do not intersect") def parse_oid_string(s: str): oids = s.replace("\n","").replace("\r","").strip() print(oids) oids = [x.strip() for x in oids.split(" ") if x != ""] print(oids) arc_list = [OIDArc(oid) for oid in oids] print(arc_list) for i, arc in enumerate(arc_list): if i > 0: arc.parent = arc_list[i - 1] if i < len(arc_list) - 1: arc.children.append(arc_list[i + 1]) return arc_list[-1] regex = re.compile(r"^(.+?){(.*?)}", re.DOTALL) arc_regex = re.compile(r"(.+?)\(([0-9]+?)\)") root = Path("./") Loading @@ -11,6 +91,8 @@ markdown_string = "# OID list\n" markdown_string += "| Spec | Module name | Version | OID relative to {itu-t(0) identified-organization(4) etsi(0)} |\n" markdown_string += "| ---- | ----------- | ------- | -------- |\n" oid_tree = None for asn_file in asn_files: if asn_file.parts[0] == "testing": continue Loading @@ -21,12 +103,38 @@ for asn_file in asn_files: for match in matches: module_name = match[0].strip() link = f"[{module_name}]({url})" oid_string = match[1].replace("\n","").replace("\r","").strip() oids = [x.strip() for x in oid_string.split(" ")] relative_oids = " ".join(oids[3:]) last_arc = oids[-1] arc_parts = arc_regex.match(last_arc) markdown_string += f"|[{spec}](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/{'/'.join(asn_file.parts[:-1])})|{link}|{arc_parts.group(2)}|{relative_oids}|\n" oid = parse_oid_string(match[1]) print(oid) relative_oids = oid.as_relative(3) if oid_tree is None: oid_tree = oid.root() else: oid_tree.merge(oid) # last_arc = None # last_tree = oid_tree # oid_str = "" # for arc in oids: # arc_parts = arc_regex.match(arc) # label = arc_parts[1] # index = arc_parts[2] # if arc in last_tree: # last_tree = last_tree[arc] # else: # last_tree[arc] = {} # last_tree = last_tree[arc] # last_arc = arc_parts markdown_string += f"|[{spec}](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/{'/'.join(asn_file.parts[:-1])})|{link}|{oid.value}|{relative_oids}|\n" def draw_tree(d : OIDArc): global markdown_string for child in d.children: markdown_string += f"{child.as_numerical()}[{child.label}]\n" markdown_string += f" {d.label}-->{child.label}\n" draw_tree(child) markdown_string += '```mermaid\ngraph TD;\n' draw_tree(oid_tree) markdown_string += "```" out_file = Path("./utils/oids/oid.md") out_file.write_text(markdown_string) No newline at end of file Loading
utils/oids/oid.md +76 −11 Original line number Diff line number Diff line # OID list | Spec | Module name | Version | OID relative to {itu-t(0) identified-organization(4) etsi(0)} | | ---- | ----------- | ------- | -------- | |[TS 102 232-1](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1)|[HI1NotificationOperations](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1/HI1NotificationOperations.asn?ref_type=heads)|7|securityDomain(2) lawfulIntercept(2) hi1(0) notificationOperations(1) version7(7)| |[TS 102 232-1](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1)|[HI2Operations](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1/HI2Operations.asn?ref_type=heads)|18|securityDomain(2) lawfulIntercept(2) hi2(1) version17(18)| |[TS 102 232-1](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1)|[LI-PS-PDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1/LI-PS-PDU.asn?ref_type=heads)|40|securityDomain(2) lawfulIntercept(2) li-ps(5) genHeader(1) version40(40)| |[TS 102 232-2](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-2)|[EmailPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-2/EmailPDU.asn?ref_type=heads)|20|securityDomain(2) lawfulIntercept(2) li-ps(5) email(2) version20(20)| |[TS 102 232-3](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-3)|[IPAccessPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-3/IPAccessPDU.asn?ref_type=heads)|20|securityDomain(2) lawfulIntercept(2) li-ps(5) iPAccess(3) version20(20)| |[TS 102 232-4](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-4)|[L2AccessPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-4/L2AccessPDU.asn?ref_type=heads)|10|securityDomain(2) lawfulIntercept(2)li-ps(5) l2Access(4) version10(10)| |[TS 102 232-5](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-5)|[IPMultimediaPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-5/IPMultimediaPDU.asn?ref_type=heads)|17|securityDomain(2) lawfulIntercept(2) li-ps(5) iPMultimedia(5) version17(17)| |[TS 102 232-6](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-6)|[PstnIsdnPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-6/PstnIsdnPDU.asn?ref_type=heads)|6|securityDomain(2) lawfulIntercept(2) li-ps(5) pstnIsdn(6) version6(6)| |[TS 102 657](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102657)|[RDMessage](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102657/RDMessage.asn?ref_type=heads)|33|securityDomain(2) retainedData(3) rdHeader(0) version33(33)| |[TS 103 462](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103462)|[ILHIPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103462/ILHIPDU.asn?ref_type=heads)|2|securityDomain(2) informationHandover(4) ilhi(0) ilhiPdu(0) version2(2)| |[TS 103 280](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103280)|[Common-Parameters](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103280/TS_103_280.asn1?ref_type=heads)|261|common-parameters(3280) version261(261)| |[TS 102 232-1](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1)|[HI1NotificationOperations](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1/HI1NotificationOperations.asn?ref_type=heads)|7|securityDomain(2) lawfulIntercept(2) hi1(0) notificationOperations(1)| |[TS 102 232-1](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1)|[HI2Operations](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1/HI2Operations.asn?ref_type=heads)|18|securityDomain(2) lawfulIntercept(2) hi2(1)| |[TS 102 232-1](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1)|[LI-PS-PDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-1/LI-PS-PDU.asn?ref_type=heads)|40|securityDomain(2) lawfulIntercept(2) li-ps(5) genHeader(1)| |[TS 102 232-2](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-2)|[EmailPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-2/EmailPDU.asn?ref_type=heads)|20|securityDomain(2) lawfulIntercept(2) li-ps(5) email(2)| |[TS 102 232-3](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-3)|[IPAccessPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-3/IPAccessPDU.asn?ref_type=heads)|20|securityDomain(2) lawfulIntercept(2) li-ps(5) iPAccess(3)| |[TS 102 232-4](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-4)|[L2AccessPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-4/L2AccessPDU.asn?ref_type=heads)|10|securityDomain(2) lawfulIntercept(2) l2Access(4)| |[TS 102 232-5](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-5)|[IPMultimediaPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-5/IPMultimediaPDU.asn?ref_type=heads)|17|securityDomain(2) lawfulIntercept(2) li-ps(5) iPMultimedia(5)| |[TS 102 232-6](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-6)|[PstnIsdnPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102232-6/PstnIsdnPDU.asn?ref_type=heads)|6|securityDomain(2) lawfulIntercept(2) li-ps(5) pstnIsdn(6)| |[TS 102 657](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102657)|[RDMessage](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/102657/RDMessage.asn?ref_type=heads)|33|securityDomain(2) retainedData(3) rdHeader(0)| |[TS 103 462](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103462)|[ILHIPDU](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103462/ILHIPDU.asn?ref_type=heads)|2|securityDomain(2) informationHandover(4) ilhi(0) ilhiPdu(0)| |[TS 103 280](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103280)|[Common-Parameters](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/103280/TS_103_280.asn1?ref_type=heads)|261|common-parameters(3280)| ```mermaid graph TD; 0.4[identified-organization] itu-t-->identified-organization 0.4.0[etsi] identified-organization-->etsi 0.4.0.2[securityDomain] etsi-->securityDomain 0.4.0.2.2[lawfulIntercept] securityDomain-->lawfulIntercept 0.4.0.2.2.0[hi1] lawfulIntercept-->hi1 0.4.0.2.2.0.1[notificationOperations] hi1-->notificationOperations 0.4.0.2.2.0.1.7[version7] notificationOperations-->version7 0.4.0.2.2.1[hi2] lawfulIntercept-->hi2 0.4.0.2.2.1.18[version17] hi2-->version17 0.4.0.2.2.5[li-ps] lawfulIntercept-->li-ps 0.4.0.2.2.5.1[genHeader] li-ps-->genHeader 0.4.0.2.2.5.1.40[version40] genHeader-->version40 0.4.0.2.2.5.2[email] li-ps-->email 0.4.0.2.2.5.2.20[version20] email-->version20 0.4.0.2.2.5.3[iPAccess] li-ps-->iPAccess 0.4.0.2.2.5.3.20[version20] iPAccess-->version20 0.4.0.2.2.5.5[iPMultimedia] li-ps-->iPMultimedia 0.4.0.2.2.5.5.17[version17] iPMultimedia-->version17 0.4.0.2.2.5.6[pstnIsdn] li-ps-->pstnIsdn 0.4.0.2.2.5.6.6[version6] pstnIsdn-->version6 0.4.0.2.2.4[l2Access] lawfulIntercept-->l2Access 0.4.0.2.2.4.10[version10] l2Access-->version10 0.4.0.2.3[retainedData] securityDomain-->retainedData 0.4.0.2.3.0[rdHeader] retainedData-->rdHeader 0.4.0.2.3.0.33[version33] rdHeader-->version33 0.4.0.2.4[informationHandover] securityDomain-->informationHandover 0.4.0.2.4.0[ilhi] informationHandover-->ilhi 0.4.0.2.4.0.0[ilhiPdu] ilhi-->ilhiPdu 0.4.0.2.4.0.0.2[version2] ilhiPdu-->version2 0.4.0.3280[common-parameters] etsi-->common-parameters 0.4.0.3280.261[version261] common-parameters-->version261 ``` No newline at end of file
utils/oids/oid.py +114 −6 Original line number Diff line number Diff line from pathlib import Path import re class OIDArc: ARC_REGEX = re.compile(r"(.+?)\(([0-9]+?)\)") def __init__(self, s: str): m = OIDArc.ARC_REGEX.match(s) if m is None: raise ValueError(f"Could not parse OID arc from {s}") self.label = m[1] self.value = int(m[2]) self.parent = None self.children = [] def __repr__(self): return f"<OIDArc {self.as_numerical()}>" def as_numerical(self): return ".".join(str(p.value) for p in self.parents()) + "." + str(self.value) def as_canonical(self): return " ".join([f"{p.label}({p.value})" for p in self.parents()]) + f"{self.label}({self.value})" def as_relative(self, starting_depth: int): parents = self.parents()[starting_depth:] return " ".join([f"{p.label}({p.value})" for p in parents]) def get_child_by_value(self, index): for c in self.children: if c.value == index: return c return None def parents(self) -> list: r = [] p = self.parent while p is not None: r.append(p) p = p.parent r.reverse() return r def root(self): if self.parent is None: return self return self.parents()[0] def merge(self, other): if self.root().value != other.root().value: raise ValueError (f"Cannot merge OIDs with different roots ({self.root()} and {other.root()})") this_arc = self.root() other_arc = other.root() while len(other_arc.children) > 0: if len(other_arc.children) > 1: print(other_arc.children) raise ValueError(f"Can't merge with {other} as it has too many children ({len(other_arc.children)})") other_next_arc = other_arc.children[0] this_next_arc = this_arc.get_child_by_value(other_next_arc.value) if this_next_arc is None: other_next_arc.parent = this_arc this_arc.children.append(other_next_arc) return this_arc = this_next_arc other_arc = other_next_arc raise ValueError(f"OIDs {self} and {other} do not intersect") def parse_oid_string(s: str): oids = s.replace("\n","").replace("\r","").strip() print(oids) oids = [x.strip() for x in oids.split(" ") if x != ""] print(oids) arc_list = [OIDArc(oid) for oid in oids] print(arc_list) for i, arc in enumerate(arc_list): if i > 0: arc.parent = arc_list[i - 1] if i < len(arc_list) - 1: arc.children.append(arc_list[i + 1]) return arc_list[-1] regex = re.compile(r"^(.+?){(.*?)}", re.DOTALL) arc_regex = re.compile(r"(.+?)\(([0-9]+?)\)") root = Path("./") Loading @@ -11,6 +91,8 @@ markdown_string = "# OID list\n" markdown_string += "| Spec | Module name | Version | OID relative to {itu-t(0) identified-organization(4) etsi(0)} |\n" markdown_string += "| ---- | ----------- | ------- | -------- |\n" oid_tree = None for asn_file in asn_files: if asn_file.parts[0] == "testing": continue Loading @@ -21,12 +103,38 @@ for asn_file in asn_files: for match in matches: module_name = match[0].strip() link = f"[{module_name}]({url})" oid_string = match[1].replace("\n","").replace("\r","").strip() oids = [x.strip() for x in oid_string.split(" ")] relative_oids = " ".join(oids[3:]) last_arc = oids[-1] arc_parts = arc_regex.match(last_arc) markdown_string += f"|[{spec}](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/{'/'.join(asn_file.parts[:-1])})|{link}|{arc_parts.group(2)}|{relative_oids}|\n" oid = parse_oid_string(match[1]) print(oid) relative_oids = oid.as_relative(3) if oid_tree is None: oid_tree = oid.root() else: oid_tree.merge(oid) # last_arc = None # last_tree = oid_tree # oid_str = "" # for arc in oids: # arc_parts = arc_regex.match(arc) # label = arc_parts[1] # index = arc_parts[2] # if arc in last_tree: # last_tree = last_tree[arc] # else: # last_tree[arc] = {} # last_tree = last_tree[arc] # last_arc = arc_parts markdown_string += f"|[{spec}](https://forge.etsi.org/rep/li/schemas-definitions/-/blob/main/{'/'.join(asn_file.parts[:-1])})|{link}|{oid.value}|{relative_oids}|\n" def draw_tree(d : OIDArc): global markdown_string for child in d.children: markdown_string += f"{child.as_numerical()}[{child.label}]\n" markdown_string += f" {d.label}-->{child.label}\n" draw_tree(child) markdown_string += '```mermaid\ngraph TD;\n' draw_tree(oid_tree) markdown_string += "```" out_file = Path("./utils/oids/oid.md") out_file.write_text(markdown_string) No newline at end of file