Commit 5bcf19f6 authored by Mark Canterbury's avatar Mark Canterbury
Browse files

Now with diagram

parent 42836ab0
Loading
Loading
Loading
Loading
Loading
+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
+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("./")
@@ -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
@@ -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