Пример #1
0
def GetAllContainersIDs(docker_root_directory):
    """Gets a list of containers IDs.

   Args:
     docker_root_directory(str): the path to the Docker root directory.
       ie: '/var/lib/docker'.

   Returns:
     list(str): the list of containers ID.

   Raises:
     errors.BadStorageException: If required files or directories are not found
       in the provided Docker directory.
  """
    if not os.path.isdir(docker_root_directory):
        raise errors.BadStorageException(
            'Provided path is not a directory "{0}"'.format(
                docker_root_directory))
    containers_directory = os.path.join(docker_root_directory, 'containers')

    if not os.path.isdir(containers_directory):
        raise errors.BadStorageException(
            'Containers directory {0} does not exist'.format(
                containers_directory))
    container_ids_list = os.listdir(containers_directory)

    return container_ids_list
Пример #2
0
    def DetectDockerStorageVersion(self):
        """Detects Docker storage version (v1 or v2).

    Raises:
      errors.BadStorageException: when we couldn't detect the Docker storage
        version.
      errors.DockerExplorerError: when no container is detected in the storage.
    """
        if not os.path.isdir(self.containers_directory):
            raise errors.BadStorageException(
                f'Containers directory {self.containers_directory} does not exist.'
            )
        container_ids_list = os.listdir(self.containers_directory)
        if not container_ids_list:
            raise errors.DockerExplorerError(
                f'Could not find any container in {self.containers_directory}.\n'
                f'Make sure the docker directory ({self.docker_directory}) is '
                'correct.\nIf it is correct, you might want to run this script '
                'with higher privileges.')
        path_to_a_container = os.path.join(self.containers_directory,
                                           container_ids_list[0])
        if os.path.isfile(os.path.join(path_to_a_container, 'config.v2.json')):
            self.docker_version = 2
        elif os.path.isfile(os.path.join(path_to_a_container, 'config.json')):
            self.docker_version = 1
        else:
            raise errors.BadStorageException(
                'Could not find any container configuration file:\n'
                'Neither config.json nor config.v2.json found in '
                f'{path_to_a_container}')
Пример #3
0
    def _DetectDockerStorageVersion(self):
        """Detects Docker storage version (v1 or v2).

    Raises:
      errors.BadStorageException: when we couldn't detect the Docker storage
        version.
    """
        if not os.path.isdir(self.containers_directory):
            raise errors.BadStorageException(
                'Containers directory {0} does not exist'.format(
                    self.containers_directory))
        container_ids_list = os.listdir(self.containers_directory)
        if not container_ids_list:
            print('Could not find container directoried in {0:s}.\n'
                  'Make sure the docker directory ({1:s}) is correct.\n'
                  'If it is correct, you might want to run this script'
                  ' with higher privileges.'.format(self.containers_directory,
                                                    self.docker_directory))
        path_to_a_container = os.path.join(self.containers_directory,
                                           container_ids_list[0])
        if os.path.isfile(os.path.join(path_to_a_container, 'config.v2.json')):
            self.docker_version = 2
        elif os.path.isfile(os.path.join(path_to_a_container, 'config.json')):
            self.docker_version = 1
        else:
            raise errors.BadStorageException(
                'Could not find any container configuration file:\n'
                'Neither config.json nor config.v2.json found in {0:s}'.format(
                    path_to_a_container))
Пример #4
0
    def GetRepositoriesString(self):
        """Returns information about images in the local Docker repositories.

    Returns:
      str: human readable list of images in local Docker repositories.

    Raises:
      errors.BadStorageException: If required files or directories are not found
        in the provided Docker directory.
    """
        repositories = []
        if self.docker_version == 1:
            repositories = [
                os.path.join(self.docker_directory, 'repositories-aufs')
            ]
        else:
            image_path = os.path.join(self.docker_directory, 'image')
            if not os.path.isdir(image_path):
                raise errors.BadStorageException(
                    f'Expected image directory {image_path} does not exist.')
            for storage_method in os.listdir(image_path):
                repositories_file_path = os.path.join(image_path,
                                                      storage_method,
                                                      'repositories.json')
                if os.path.isfile(repositories_file_path):
                    repositories.append(repositories_file_path)

        result = []
        for repositories_file_path in sorted(repositories):
            with open(repositories_file_path, encoding='utf-8') as rf:
                repo_obj = json.loads(rf.read())
                repo_obj['path'] = repositories_file_path
                result.append(repo_obj)

        return utils.PrettyPrintJSON(result)
Пример #5
0
    def __init__(self,
                 docker_directory=docker_explorer.DEFAULT_DOCKER_DIRECTORY,
                 docker_version=2):
        """Initializes a BaseStorage object.

    Args:
      docker_directory (str): Path to the Docker root directory.
      docker_version (int): Docker storage version.
    """
        if docker_version not in [1, 2]:
            error_message = 'Unsupported Docker version number {0:d}'.format(
                docker_version)
            raise errors.BadStorageException(error_message)

        self.docker_version = docker_version
        self.storage_name = None
        self.root_directory = os.path.abspath(
            os.path.join(docker_directory, '..'))
        self.docker_directory = docker_directory

        self.containers_directory = os.path.join(docker_directory,
                                                 'containers')
        self.container_config_filename = 'config.v2.json'
        if self.docker_version == 1:
            self.container_config_filename = 'config.json'
Пример #6
0
  def _SetDockerDirectory(self, docker_path):
    """Sets the Docker main directory.

    Args:
      docker_path(str): the absolute path to the docker directory.

    Raises:
      errors.BadStorageException: If the storage backend couldn't be detected.
    """
    self.docker_directory = docker_path
    if not os.path.isdir(self.docker_directory):
      err_message = (
          '{0:s} is not a Docker directory\n'
          'Please specify the Docker\'s directory path.\n'
          'hint: de.py -r /var/lib/docker').format(self.docker_directory)
      raise errors.BadStorageException(err_message)

    self.containers_directory = os.path.join(
        self.docker_directory, 'containers')

    if os.path.isfile(
        os.path.join(self.docker_directory, 'repositories-aufs')):
      # TODO: check this agains other storages in version 1.9 and below
      self.docker_version = 1
      self.storage_object = aufs.AufsStorage(
          docker_directory=self.docker_directory, docker_version=1)
    elif os.path.isdir(os.path.join(self.docker_directory, 'overlay2')):
      self.storage_object = overlay.Overlay2Storage(
          docker_directory=self.docker_directory)
    elif os.path.isdir(os.path.join(self.docker_directory, 'overlay')):
      self.storage_object = overlay.OverlayStorage(
          docker_directory=self.docker_directory)
    elif os.path.isdir(os.path.join(self.docker_directory, 'aufs')):
      self.storage_object = aufs.AufsStorage(
          docker_directory=self.docker_directory)
    if self.storage_object is None:
      err_message = (
          'Could not detect storage system. '
          'Make sure the docker directory ({0:s}) is correct. '
          'If it is correct, you might want to run this script'
          ' with higher privileges.'.format(self.docker_directory))
      raise errors.BadStorageException(err_message)
Пример #7
0
  def _SetDockerDirectory(self, docker_path):
    """Sets the Docker main directory.

    Args:
      docker_path(str): the absolute path to the docker directory.
    """
    self.docker_directory = docker_path
    if not os.path.isdir(self.docker_directory):
      msg = '{0:s} is not a Docker directory'.format(self.docker_directory)
      raise errors.BadStorageException(msg)

    self.containers_directory = os.path.join(
        self.docker_directory, 'containers')
Пример #8
0
    def SetDockerDirectory(self, docker_path):
        """Sets the Docker main directory.

    Args:
      docker_path(str): the absolute path to the docker directory.
    Raises:
      errors.BadStorageException: if the path doesn't point to a Docker
        directory.
    """
        self.docker_directory = docker_path
        if not os.path.isdir(self.docker_directory):
            msg = f'{self.docker_directory} is not a Docker directory'
            raise errors.BadStorageException(msg)

        self.containers_directory = os.path.join(self.docker_directory,
                                                 'containers')
Пример #9
0
    def GetAllContainers(self):
        """Gets a list containing information about all containers.

    Returns:
      list(Container): the list of Container objects.

    Raises:
      errors.BadStorageException: If required files or directories are not found
        in the provided Docker directory.
    """
        if not os.path.isdir(self.containers_directory):
            raise errors.BadStorageException(
                'Containers directory {0} does not exist'.format(
                    self.containers_directory))
        container_ids_list = os.listdir(self.containers_directory)
        if not container_ids_list:
            print('Could not find container directory in {0:s}.\n'
                  'Make sure the docker directory ({1:s}) is correct.\n'
                  'If it is correct, you might want to run this script'
                  ' with higher privileges.'.format(self.containers_directory,
                                                    self.docker_directory))
        return [self.GetContainer(cid) for cid in container_ids_list]