From 3ac23af4200ad1d28fd67eae1b13f37f01eaed47 Mon Sep 17 00:00:00 2001 From: --global <--global> Date: Thu, 15 Dec 2022 09:56:06 -0600 Subject: [PATCH] Probably finished --- docker_parser.py => docker_wrapper.py | 86 +++++++++++++++++++++------ 1 file changed, 69 insertions(+), 17 deletions(-) rename docker_parser.py => docker_wrapper.py (54%) diff --git a/docker_parser.py b/docker_wrapper.py similarity index 54% rename from docker_parser.py rename to docker_wrapper.py index 469b06c..e092874 100644 --- a/docker_parser.py +++ b/docker_wrapper.py @@ -1,10 +1,11 @@ -from subprocess import getoutput +from subprocess import getoutput, getstatusoutput import pprint +import os class NoContainersError(Exception): pass -class DockerParser: +class Docker: def ps(raw_info=getoutput('docker ps')): """ Gets info about all running Docker containers from docker ps @@ -43,7 +44,7 @@ class DockerParser: return info - def containers_info(raw_info=getoutput('docker container list')): + def container_list(raw_info=getoutput('docker container list')): """ Gets info about all the Docker containers :return: Nested dict of containers info @@ -53,34 +54,85 @@ class DockerParser: raw_info = getoutput('docker container list') # Header: "CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES" (with way more spaces) header = raw_info[:raw_info.find('\n')+1] - header_temp = header - header_indices = {} - while ' ' in header_temp: # Split header - temp = header_temp[header_temp.rfind(' ')+2:].strip() - header_indices[temp] = header.find(temp) - header_temp = header_temp[:header_temp.rfind(' ')].strip() - header_indices[header[:header.find(' ')]] = 0 + header_indices = {'CONTAINER ID': header.find('CONTAINER ID'), 'IMAGE': header.find('IMAGE'), + 'COMMAND': header.find('COMMAND'), 'CREATED': header.find('CREATED'), 'STATUS': header.find('STATUS'), + 'PORTS': header.find('PORTS'), 'NAMES': header.find('NAMES')} - raw_info = raw_info[raw_info.find('\n')+1:] # Remove header (example above) + # Remove header (example above) + raw_info = raw_info[raw_info.find('\n')+1:] info = {} - + # Find container names containers = [] for line in raw_info.split('\n'): containers.append(line.strip()[line.strip().rfind(' ')+1:]) - + # Fill in info for i in range(len(containers)): info[containers[i]] = {} - for column in header_indices: - end_i = header_indices[column] + len(column) - info[containers[i]][column] = raw_info[i][header_indices[column]:end_i] + header_indices_keys = list(header_indices) + for j in range(len(header_indices_keys)): # TODO: Fix + start_i = header_indices[header_indices_keys[j]] + if j+1 != len(header_indices): + end_i = header_indices[header_indices_keys[j+1]] + else: + end_i = len(header) + info[containers[i]][header_indices_keys[j]] = \ + raw_info.split('\n')[i][start_i:end_i].strip() return info + + def compose(dir): + """ + Composes whatever is in dir + :parameters: + dir: The directory of a container; must contain docker-compose.yml file + + :returns: + tuple: (exit_code, compose_output) + """ + cwd = os.getcwd() + os.chdir(dir) + status = getstatusoutput('docker ps') + os.chdir(cwd) + return status + + def start(container): + """ + Starts a container + :parameters: + container: The name of the container to start + + :returns: + int: The exit code of docker start + """ + return getstatusoutput(f'docker start {container}')[0] + + def stop(container): + """ + Stops a container + :parameters: + container: The name of the container to stop + + :returns: + int: The exit code of docker stop + """ + return getstatusoutput(f'docker stop {container}')[0] + + def rm(container): + """ + Deletes a container + :parameters: + container: The name of the container to remove + + :returns: + int: The exit code of docker rm + """ + return getstatusoutput(f'docker rm {container}')[0] if __name__ == '__main__': try: - pprint.pprint(DockerParser.containers_info()) + pprint.pprint(Docker.containers_info()) except NoContainersError as e: print(e)