diff options
-rw-r--r-- | mpm/python/usrp_mpm/rpc_server.py | 15 | ||||
-rwxr-xr-x | mpm/tools/mpm_shell.py | 34 |
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 |