summaryrefslogtreecommitdiff
path: root/ncserver/server.py
diff options
context:
space:
mode:
authorA. Wilcox <AWilcox@Wilcox-Tech.com>2020-10-22 14:26:20 -0500
committerA. Wilcox <AWilcox@Wilcox-Tech.com>2020-10-22 14:26:20 -0500
commit47ed12959dc1ac3d65b211f467ce23408fe36c48 (patch)
tree477eea756170953539fc95d000658c13a544f622 /ncserver/server.py
parent9eafe63c60759d9da25bfb10b927fb0699e3fd7c (diff)
downloadnetconfapk-47ed12959dc1ac3d65b211f467ce23408fe36c48.tar.gz
netconfapk-47ed12959dc1ac3d65b211f467ce23408fe36c48.tar.bz2
netconfapk-47ed12959dc1ac3d65b211f467ce23408fe36c48.tar.xz
netconfapk-47ed12959dc1ac3d65b211f467ce23408fe36c48.zip
Implement module RPCs and RPC logging
Diffstat (limited to 'ncserver/server.py')
-rw-r--r--ncserver/server.py36
1 files changed, 35 insertions, 1 deletions
diff --git a/ncserver/server.py b/ncserver/server.py
index f081217..796e85d 100644
--- a/ncserver/server.py
+++ b/ncserver/server.py
@@ -20,7 +20,8 @@ import paramiko
from netconf import error, util
from netconf.server import NetconfSSHServer, SSHAuthorizedKeysController
-from ncserver.base.log import configure_logging, LOG_AUTH, LOG_CONFIG
+from ncserver.base.log import configure_logging, LOG_AUTH, LOG_CONFIG, \
+ LOG_OPERATIONAL
from ncserver.base.modman import ModuleManager
from ncserver.base.util import user_for_session
from ncserver.config import ConfigManager
@@ -100,6 +101,12 @@ class Server:
for module in self.config.get_list('server', 'modules'):
self.modman.load_module(module)
+ def __getattr__(self, attr):
+ """Maybe pass RPC calls on."""
+ if attr.startswith("rpc_"):
+ return self._rpc_wrapper
+ raise AttributeError("'Server' object has no attribute '" + attr + "'")
+
def close(self):
"""Close all connections."""
self.server.close()
@@ -117,6 +124,33 @@ class Server:
for capab in our_capabs:
util.subelm(capabilities, 'capability').text = capab
+ def _rpc_wrapper(self, session, rpc, *params):
+ """Handle module RPCs."""
+ name = QName(rpc[0].tag).localname
+ LOG_OPERATIONAL.info('RPC %s invoked by %s on session %d',
+ name, user_for_session(session), session.session_id)
+ if self.modman.has_rpc(name):
+ try:
+ result = self.modman.rpc(name)(session, rpc, *params)
+ LOG_OPERATIONAL.info(
+ 'RPC %s invoked by %s on session %d completed',
+ name, user_for_session(session), session.session_id
+ )
+ return result
+ except error.RPCServerError as rpc_error:
+ LOG_OPERATIONAL.error(
+ 'RPC %s invoked by %s on session %d encountered error %s',
+ name, user_for_session(session), session.session_id,
+ rpc_error
+ )
+ raise
+ else:
+ LOG_OPERATIONAL.warning(
+ 'RPC %s invoked by %s on session %d is unknown',
+ name, user_for_session(session), session.session_id
+ )
+ raise error.OperationNotSupportedProtoError(rpc)
+
def rpc_get(self, session, rpc, filter_or_none): # pylint: disable=W0613
"""Handle the <get/> RPC."""
log_read(session, rpc)