from ncclient import manager from ncclient.xml_ import * import lxml.etree as ET import re from typing import Optional, Union from uuid import UUID, uuid4, uuid5 import logging NAMESPACE_TFS = UUID('200e3a1f-2223-534f-a100-758e29c37f40') print (uuid5(NAMESPACE_TFS, '1')) def extract_roadm_ports (xml_data:str): pattern = r'\bMG_ON_OPTICAL_PORT_WAVEBAND\b' xml_bytes = xml_data.encode("utf-8") root = ET.fromstring(xml_bytes) with open('xml.log', 'w') as f: print(xml_bytes, file=f) namespace = {'oc': 'http://openconfig.net/yang/platform'} ports = [] components = root.findall('.//oc:component',namespace) print(f"component {components}") for component in components: properties = component.find(".//oc:properties",namespace) if (properties is not None): for property in properties : value = property.find(".//oc:value",namespace) if (re.search(pattern,value.text)): name_element= component.find(".//oc:name",namespace) print (f"name {name_element.text}") def extract_ports_based_on_type (xml_data:str): pattern = r':\s*PORT\b' xml_bytes = xml_data.encode("utf-8") root = ET.fromstring(xml_bytes) namespace = {'oc': 'http://openconfig.net/yang/platform', 'typex': 'http://openconfig.net/yang/platform-types'} ports = [] components = root.findall(".//oc:state[oc:type]",namespace) for component in components: type_ele = component.find(".//oc:type",namespace) match = re.search(pattern, type_ele.text) if match is not None : name= component.find(".//oc:name",namespace) print(name.text) print("/////////////") device = { 'host': '10.0.2.4', # IP address or hostname of the remote machine 'port': 2025, # SSH port (default: 22) 'username': 'admin', # SSH username 'password': 'admin', # SSH password 'device_params': {'name': 'default'}, 'hostkey_verify':False, "allow_agent":False ,"look_for_keys":False } def extract_value (xml_data): xml_bytes = xml_data.encode("utf-8") root = ET.fromstring(xml_bytes) namespace = {'oc': 'http://openconfig.net/yang/platform', 'td': 'http://openconfig.net/yang/terminal-device'} element = root.find('.//oc:component[oc:name="channel-4"]', namespace) if element is not None: parameter= element.find('.//td:frequency',namespace) if (parameter is not None): print(parameter.text) else : print("parameter is None") else: print(" element not found.") def main () : with manager.connect(**device) as m: # Perform operations on the remote machine using the 'm' object # For example, you can retrieve the running configuration: #result =m.edit_config(target='running',config=edit_config) running_config = m.get_config('running').data_xml #extract_roadm_ports(running_config) x,y= [1,3] print (x)