summaryrefslogtreecommitdiff
path: root/ncserver/server.py
diff options
context:
space:
mode:
Diffstat (limited to 'ncserver/server.py')
-rw-r--r--ncserver/server.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/ncserver/server.py b/ncserver/server.py
new file mode 100644
index 0000000..a0eed8e
--- /dev/null
+++ b/ncserver/server.py
@@ -0,0 +1,80 @@
+"""
+NETCONF for APK Distributions server:
+ Server module
+
+Copyright © 2020 Adélie Software in the Public Benefit, Inc.
+
+Released under the terms of the NCSA license. See the LICENSE file included
+with this source distribution for more information.
+
+SPDX-License-Identifier: NCSA
+"""
+
+import logging
+
+from netconf import util
+from netconf.server import NetconfSSHServer, SSHAuthorizedKeysController
+
+from ncserver.base.modman import ModuleManager
+from ncserver.config import ConfigManager
+
+
+class Server:
+ """The NETCONF server component."""
+
+ def __init__(self, port=830):
+ """Create the NETCONF server.
+
+ :param int port:
+ The port number to listen on. Typically 830.
+ """
+ self.config = ConfigManager()
+ self.auth = SSHAuthorizedKeysController(
+ users=self.config.get_list('server', 'users')
+ )
+
+ self.debug = self.config.get('server', 'debug')
+ if self.debug:
+ logging.basicConfig(level=logging.DEBUG)
+ else:
+ logging.basicConfig(level=logging.INFO)
+
+ self.server = NetconfSSHServer(
+ self.auth, self, port, self.config.get('server', 'host_key'),
+ self.debug
+ )
+ self.modman = ModuleManager()
+ for module in self.config.get_list('server', 'modules'):
+ self.modman.load_module(module)
+
+ def close(self):
+ """Close all connections."""
+ self.server.close()
+
+ def nc_append_capabilities(self, capabilities):
+ """List all capabilities of this NETCONF server."""
+ for module in self.modman.modules.values():
+ util.subelm(capabilities, 'capability').text = module.M_NS
+
+ def rpc_get(self, session, rpc, filter_or_none): # pylint: disable=W0613
+ """Handle the <get/> RPC."""
+ root = util.elm('nc:data')
+ self.modman.collect_running(root)
+ self.modman.collect_operational(root)
+
+ return util.filter_results(rpc, root, filter_or_none, self.debug)
+
+ # pylint: disable=W0613
+ def rpc_get_config(self, session, rpc, source, filter_or_none):
+ """Handle the <get-config/> RPC."""
+ root = util.elm('nc:data')
+ self.modman.collect_running(root)
+
+ return util.filter_results(rpc, root, filter_or_none, self.debug)
+
+if __name__ == "__main__":
+ s = Server()
+ try:
+ s.server.join()
+ except KeyboardInterrupt:
+ s.close()