docs: def list_plugins(self):
          '''
          Obtain a list of all user and system plugin modules.
  
          Returns a dictionary of:
  
              {
                  'user'      : {
                              'modules'       : [list, of, module, names],
                              'descriptions'  : {'module_name' : 'module pydoc string'},
                              'enabled'       : {'module_name' : True},
                              'path'          : "path/to/module/plugin/directory"
                  },
                  'system'    : {
                              'modules'       : [list, of, module, names],
                              'descriptions'  : {'module_name' : 'module pydoc string'},
                              'enabled'       : {'module_name' : True},
                              'path'          : "path/to/module/plugin/directory"
                  }
              }
          '''
  
          plugins = {
              'user': {
                  'modules': [],
                  'descriptions': {},
                  'enabled': {},
                  'path': None,
              },
              'system': {
                  'modules': [],
                  'descriptions': {},
                  'enabled': {},
                  'path': None,
              }
          }
  
          for key in plugins.keys():
              if key == 'user':
                  plugins[key]['path'] = self.settings.user.plugins
              else:
                  plugins[key]['path'] = self.settings.system.plugins
  
              if plugins[key]['path']:
                  for file_name in os.listdir(plugins[key]['path']):
                      if file_name.endswith(self.MODULE_EXTENSION):
                          module = file_name[:-len(self.MODULE_EXTENSION)]
  
                          try:
                              plugin = imp.load_source(module, os.path.join(plugins[key]['path'], file_name))
                              plugin_class = self._find_plugin_class(plugin)
  
                              plugins[key]['enabled'][module] = True
                              plugins[key]['modules'].append(module)
                          except KeyboardInterrupt as e:
                              raise e
                          # Python files in the plugins directory that are not
                          # actually binwalk plugins will generate a TypeError
                          # about converting an object to a string implicitly.
                          # Don't need to warn about these.
                          except TypeError:
                              pass
                          except Exception as e:
                              binwalk.core.common.warning("Error loading plugin '%s': %s" % (file_name, str(e)))
                              plugins[key]['enabled'][module] = False
  
                          try:
                              plugins[key]['descriptions'][
                                  module] = plugin_class.__doc__.strip().split('\n')[0]
                          except KeyboardInterrupt as e:
                              raise e
                          except Exception as e:
                              plugins[key]['descriptions'][
                                  module] = 'No description'
          return plugins