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  | 
