summaryrefslogtreecommitdiff
path: root/ncserver
diff options
context:
space:
mode:
authorA. Wilcox <AWilcox@Wilcox-Tech.com>2020-09-11 14:31:59 -0500
committerA. Wilcox <AWilcox@Wilcox-Tech.com>2020-09-11 14:31:59 -0500
commit680c3616ae89eeda8cfab104b3b24d9dea89dd4e (patch)
tree581dab65618f80cd71d986efe36dc94a85bd0ced /ncserver
parentb3def43fe057d7b635ae1ed4e298997e4a27644f (diff)
downloadnetconfapk-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.py39
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: