Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # hack on XML element creation and create a subclass to override HelloHandler's
- # build() method to format the XML in a way that the brocades actually like
- from ncclient.xml_ import *
- from ncclient.transport.session import HelloHandler
- from ncclient.operations.rpc import RPC, RaiseMode
- from ncclient.operations import util
- # register brocade namespace and create functions to create proper xml for
- # hello/capabilities exchange
- BROCADE_1_0 = "http://brocade.com/ns/netconf/config/netiron-config/"
- register_namespace('brcd', BROCADE_1_0)
- brocade_new_ele = lambda tag, ns, attrs={}, **extra: ET.Element(qualify(tag, ns), attrs, **extra)
- brocade_sub_ele = lambda parent, tag, ns, attrs={}, **extra: ET.SubElement(parent, qualify(tag, ns), attrs, **extra)
- # subclass RPC to override self._id to change uuid-generated message-id's;
- # Brocades seem to not be able to handle the really long id's
- class BrcdRPC(RPC):
- def __init__(self, session, async=False, timeout=30, raise_mode=RaiseMode.NONE):
- self._id = "1"
- return super(BrcdRPC, self).self._id
- class BrcdHelloHandler(HelloHandler):
- def __init__(self):
- return super(BrcdHelloHandler, self).__init__()
- @staticmethod
- def build(capabilities):
- hello = brocade_new_ele("hello", None, {'xmlns':"urn:ietf:params:xml:ns:netconf:base:1.0"})
- caps = brocade_sub_ele(hello, "capabilities", None)
- def fun(uri): brocade_sub_ele(caps, "capability", None).text = uri
- map(fun, capabilities)
- return to_xml(hello)
- #return super(BrcdHelloHandler, self).build() ???
- # since there's no classes I'm assuming I can just override the function itself
- # in ncclient.operations.util?
- def build_filter(spec, capcheck=None):
- type = None
- if isinstance(spec, tuple):
- type, criteria = spec
- # brocades want the netconf prefix on subtree filter attribute
- rep = new_ele("filter", {'nc:type':type})
- if type == "xpath":
- rep.attrib["select"] = criteria
- elif type == "subtree":
- rep.append(to_ele(criteria))
- else:
- raise OperationError("Invalid filter type")
- else:
- rep = validated_element(spec, ("filter", qualify("filter")),
- attrs=("type",))
- # TODO set type var here, check if select attr present in case of xpath..
- if type == "xpath" and capcheck is not None:
- capcheck(":xpath")
- return rep
- #!/usr/bin/env python
- from ncclient import manager
- from brcd_ncclient import *
- manager.logging.basicConfig(filename='ncclient.log', level=manager.logging.DEBUG)
- # brocade server capabilities advertising as 1.1 compliant when they're really not
- # this will stop ncclient from attempting 1.1 chunked netconf message transactions
- manager.CAPABILITIES = ['urn:ietf:params:netconf:capability:writeable-running:1.0', 'urn:ietf:params:netconf:base:1.0']
- # BROCADE_1_0 is the namespace defined for netiron configs in brcd_ncclient
- # this maps to the 'brcd' prefix used in xml elements, ie subtree filter criteria
- with manager.connect(host='hostname_or_ip', username='username', password='password') as m:
- # 'get' request with no filter - for brocades just shows 'show version' data
- c = m.get()
- print c
- # 'get-config' request with 'mpls-config' filter - if no filter is
- # supplied with 'get-config', brocade returns nothing
- netironcfg = brocade_new_ele('netiron-config', BROCADE_1_0)
- mplsconfig = brocade_sub_ele(netironcfg, 'mpls-config', BROCADE_1_0)
- filterstr = to_xml(netironcfg)
- c2 = m.get_config(source='running', filter=('subtree', filterstr))
- print c2
- # so far it only looks like the supported filters for 'get-config'
- # operations are: 'interface-config', 'vlan-config' and 'mpls-config'
- <?xml version='1.0' encoding='UTF-8'?>
- <nc:hello xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
- <nc:capabilities>
- <nc:capability>urn:ietf:params:netconf:base:1.0</nc:capability>
- <nc:capability>urn:ietf:params:netconf:capability:writeable-running:1.0</nc:capability>
- </nc:capabilities>
- </nc:hello>
- <?xml version="1.0" encoding="UTF-8"?>
- <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
- <capabilities>
- <capability>urn:ietf:params:netconf:base:1.0</capability>
- <capability>urn:ietf:params:netconf:capability:writeable-running:1.0</capability>
- </capabilities>
- </hello>
- #!/usr/bin/env python
- from ncclient import manager
- from ncclient.xml_ import *
- brcd_new_ele = lambda tag, ns, attrs={}, **extra: ET.Element(qualify(tag, ns), attrs, **extra)
- brcd_sub_ele = lambda parent, tag, ns, attrs={}, **extra: ET.SubElement(parent, qualify(tag, ns), attrs, **extra)
- BROCADE_1_0 = "http://brocade.com/ns/netconf/config/netiron-config/"
- register_namespace('brcd', BROCADE_1_0)
- @staticmethod
- def brcd_build(capabilities):
- hello = brcd_new_ele("hello", None, {'xmlns':"urn:ietf:params:xml:ns:netconf:base:1.0"})
- caps = brcd_sub_ele(hello, "capabilities", None)
- def fun(uri): brcd_sub_ele(caps, "capability", None).text = uri
- map(fun, capabilities)
- return to_xml(hello)
- def brcd_build_filter(spec, capcheck=None):
- type = None
- if isinstance(spec, tuple):
- type, criteria = spec
- # brocades want the netconf prefix on subtree filter attribute
- rep = new_ele("filter", {'nc:type':type})
- if type == "xpath":
- rep.attrib["select"] = criteria
- elif type == "subtree":
- rep.append(to_ele(criteria))
- else:
- raise OperationError("Invalid filter type")
- else:
- rep = validated_element(spec, ("filter", qualify("filter")),
- attrs=("type",))
- if type == "xpath" and capcheck is not None:
- capcheck(":xpath")
- return rep
- manager.transport.session.HelloHandler.build = brcd_build
- manager.operations.util.build_filter = brcd_build_filter
- #!/usr/bin/env python
- from brcd_ncclient import *
- manager.logging.basicConfig(filename='ncclient.log', level=manager.logging.DEBUG)
- manager.CAPABILITIES = ['urn:ietf:params:netconf:capability:writeable-running:1.0', 'urn:ietf:params:netconf:base:1.0']
- with manager.connect(host='host', username='user', password='password') as m:
- netironcfg = brcd_new_ele('netiron-config', BROCADE_1_0)
- mplsconfig = brcd_sub_ele(netironcfg, 'mpls-config', BROCADE_1_0)
- filterstr = to_xml(netironcfg)
- c2 = m.get_config(source='running', filter=('subtree', filterstr))
- print c2
- class RPC(object):
- DEPENDS = []
- REPLY_CLS = RPCReply
- def __init__(self, session, async=False, timeout=30, raise_mode=RaiseMode.NONE):
- self._session = session
- try:
- for cap in self.DEPENDS:
- self._assert(cap)
- except AttributeError:
- pass
- self._async = async
- self._timeout = timeout
- self._raise_mode = raise_mode
- self._id = uuid1().urn # Keeps things simple instead of having a class attr with running ID that has to be locked
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement