aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mpm/python/usrp_mpm/rpc_server.py15
-rwxr-xr-xmpm/tools/mpm_shell.py34
2 files changed, 32 insertions, 17 deletions
diff --git a/mpm/python/usrp_mpm/rpc_server.py b/mpm/python/usrp_mpm/rpc_server.py
index 2f21edbee..d2635c7c2 100644
--- a/mpm/python/usrp_mpm/rpc_server.py
+++ b/mpm/python/usrp_mpm/rpc_server.py
@@ -51,18 +51,16 @@ class MPMServer(RPCServer):
"""
Main MPM RPC class which holds the periph_manager object and translates
RPC calls to appropiate calls in the periph_manager and dboard_managers.
-
- Claiming and unclaiming is implemented in python only
"""
- _db_methods = []
- _mb_methods = []
-
def __init__(self, state, mgr, *args, **kwargs):
self.log = get_main_logger().getChild('RPCServer')
self._state = state
self._timer = Greenlet()
self.session_id = None
self.periph_manager = mgr
+ self._db_methods = []
+ self._mb_methods = []
+ self.claimed_methods = ['init', 'reclaim', 'unclaim', 'allocate_sid']
# add public mboard methods without namespace
self._update_component_commands(mgr, '', '_mb_methods')
# add public dboard methods in `db_<slot>_` namespace
@@ -101,6 +99,7 @@ class MPMServer(RPCServer):
self._add_safe_command(new_rpc_method, command_name)
else:
self._add_claimed_command(new_rpc_method, command_name)
+ self.claimed_methods.append(command_name)
getattr(self, storage).append(command_name)
@@ -139,9 +138,11 @@ class MPMServer(RPCServer):
Returns a tuple of public methods and
corresponding docs of this RPC server
"""
- return [(met, getattr(self, met).__doc__)
+ return [(met, getattr(self, met).__doc__, met in self.claimed_methods)
for met in dir(self)
- if not met.startswith('_') and callable(getattr(self, met))]
+ if not met.startswith('_') \
+ and callable(getattr(self, met))
+ ] # TODO _notok is missing from the list of checks
def ping(self, data=None):
"""
diff --git a/mpm/tools/mpm_shell.py b/mpm/tools/mpm_shell.py
index 704cfbcf5..bf44ff49a 100755
--- a/mpm/tools/mpm_shell.py
+++ b/mpm/tools/mpm_shell.py
@@ -93,10 +93,14 @@ class MPMClaimer(object):
"""
client = RPCClient(host, port, pack_params={'use_bin_type': True})
self.token = client.call('claim', 'MPM Shell')
- while not self._exit_loop:
- client.call('reclaim', self.token)
- time.sleep(1)
- client.call('unclaim', self.token)
+ try:
+ while not self._exit_loop:
+ client.call('reclaim', self.token)
+ time.sleep(1)
+ client.call('unclaim', self.token)
+ except RPCError as ex:
+ print("Unexpected RPC error in claimer loop!")
+ print(str(ex))
disc_callback()
self.token = None
@@ -128,24 +132,32 @@ class MPMShell(cmd.Cmd):
self.claim()
self.update_prompt()
- def _add_command(self, command, docs):
+ def _add_command(self, command, docs, requires_token=False):
"""
Add a command to the current session
"""
cmd_name = 'do_' + command
if not hasattr(self, cmd_name):
- new_command = lambda args: self.rpc_template(str(command), args)
+ new_command = lambda args: self.rpc_template(
+ str(command), requires_token, args
+ )
new_command.__doc__ = docs
setattr(self, cmd_name, new_command)
self.remote_methods.append(command)
- def rpc_template(self, command, args=None):
+ def rpc_template(self, command, requires_token, args=None):
"""
Template function to create new RPC shell commands
"""
+ if requires_token and \
+ (self._claimer is None or self._claimer.token is None):
+ print("Cannot execute `{}' -- no claim available!")
+ return
try:
- if args:
+ if args or requires_token:
expanded_args = self.expand_args(args)
+ if requires_token:
+ expanded_args.insert(0, self._claimer.token)
response = self.client.call(command, *expanded_args)
else:
response = self.client.call(command)
@@ -281,7 +293,6 @@ class MPMShell(cmd.Cmd):
args = args.replace('$T', str(self._claimer.token))
eval_preamble = '='
args = args.strip()
- print('args ' + str(args))
if args.startswith(eval_preamble):
parsed_args = eval(args.lstrip(eval_preamble))
if not isinstance(parsed_args, list):
@@ -346,7 +357,10 @@ def main():
my_shell = MPMShell()
try:
return my_shell.run()
- except (KeyboardInterrupt, Exception):
+ except KeyboardInterrupt:
+ my_shell.disconnect()
+ except Exception as ex:
+ print("Uncaught exception: " + str(ex))
my_shell.disconnect()
return True