diff options
author | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2020-10-22 14:26:20 -0500 |
---|---|---|
committer | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2020-10-22 14:26:20 -0500 |
commit | 47ed12959dc1ac3d65b211f467ce23408fe36c48 (patch) | |
tree | 477eea756170953539fc95d000658c13a544f622 /ncserver/server.py | |
parent | 9eafe63c60759d9da25bfb10b927fb0699e3fd7c (diff) | |
download | netconfapk-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.py | 36 |
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) |