diff options
author | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2020-09-11 14:31:59 -0500 |
---|---|---|
committer | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2020-09-11 14:31:59 -0500 |
commit | 680c3616ae89eeda8cfab104b3b24d9dea89dd4e (patch) | |
tree | 581dab65618f80cd71d986efe36dc94a85bd0ced /ncserver | |
parent | b3def43fe057d7b635ae1ed4e298997e4a27644f (diff) | |
download | netconfapk-680c3616ae89eeda8cfab104b3b24d9dea89dd4e.tar.gz netconfapk-680c3616ae89eeda8cfab104b3b24d9dea89dd4e.tar.bz2 netconfapk-680c3616ae89eeda8cfab104b3b24d9dea89dd4e.tar.xz netconfapk-680c3616ae89eeda8cfab104b3b24d9dea89dd4e.zip |
Server: Handle <edit-config/> RPC
Diffstat (limited to 'ncserver')
-rw-r--r-- | ncserver/server.py | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/ncserver/server.py b/ncserver/server.py index 5d34175..0c56c2a 100644 --- a/ncserver/server.py +++ b/ncserver/server.py @@ -12,13 +12,18 @@ SPDX-License-Identifier: NCSA import logging -from netconf import util +from lxml import etree + +from netconf import error, util from netconf.server import NetconfSSHServer, SSHAuthorizedKeysController from ncserver.base.modman import ModuleManager from ncserver.config import ConfigManager +QName = etree.QName # pylint: disable=I1101 + + class Server: """The NETCONF server component.""" @@ -53,10 +58,16 @@ class Server: def nc_append_capabilities(self, capabilities): """List all capabilities of this NETCONF server.""" + our_capabs = [ + # Write directly to the `running` datastore. + 'urn:ietf:params:netconf:capability:writable-running:1.0', + # Filter with XPath in addition to subtrees. + 'urn:ietf:params:netconf:capability:xpath:1.0' + ] for capab in self.modman.capabilities(): util.subelm(capabilities, 'capability').text = capab - util.subelm(capabilities, 'capability').text = \ - 'urn:ietf:params:netconf:capability:xpath:1.0' + for capab in our_capabs: + util.subelm(capabilities, 'capability').text = capab def rpc_get(self, session, rpc, filter_or_none): # pylint: disable=W0613 """Handle the <get/> RPC.""" @@ -74,6 +85,28 @@ class Server: return util.filter_results(rpc, root, filter_or_none, self.debug) + # pylint: disable=R0913 + def rpc_edit_config(self, session, rpc, target, config, default_or_none): + """Handle the <edit-config/> RPC.""" + if len(target) != 1: + # We must have exactly 1 target. + raise error.BadElementProtoError(rpc, target) + + # strip the xmlns off the tag name. + datastore = QName(target[0].tag).localname + if datastore != "running": + raise error.InvalidValueAppError(rpc) + + if default_or_none is None: + def_op = 'merge' + else: + def_op = default_or_none.text + + self.modman.collect_edit(rpc, config, def_op) + + root = util.elm('nc:ok') + return root + if __name__ == "__main__": s = Server() try: |