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
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}')
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))
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)
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'
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)
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')
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')
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]