diff env/lib/python3.7/site-packages/cwltool/docker_id.py @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.7/site-packages/cwltool/docker_id.py	Sat May 02 07:14:21 2020 -0400
@@ -0,0 +1,132 @@
+"""Helper functions for docker."""
+from __future__ import absolute_import, print_function
+
+from typing import List, Optional, Tuple, cast  # pylint: disable=unused-import
+
+from typing_extensions import Text  # pylint: disable=unused-import
+# move to a regular typing import when Python 3.3-3.6 is no longer supported
+
+from .utils import subprocess
+
+
+def docker_vm_id():  # type: () -> Tuple[Optional[int], Optional[int]]
+    """
+    Return the User ID and Group ID of the default docker user inside the VM.
+
+    When a host is using boot2docker or docker-machine to run docker with
+    boot2docker.iso (As on Mac OS X), the UID that mounts the shared filesystem
+    inside the VirtualBox VM is likely different than the user's UID on the host.
+    :return: A tuple containing numeric User ID and Group ID of the docker account inside
+    the boot2docker VM
+    """
+    if boot2docker_running():
+        return boot2docker_id()
+    if docker_machine_running():
+        return docker_machine_id()
+    return (None, None)
+
+
+def check_output_and_strip(cmd):  # type: (List[Text]) -> Optional[Text]
+    """
+    Pass a command list to subprocess.check_output.
+
+    Returning None if an expected exception is raised
+    :param cmd: The command to execute
+    :return: Stripped string output of the command, or None if error
+    """
+    try:
+        result = subprocess.check_output(cmd, stderr=subprocess.STDOUT, universal_newlines=True)
+        return cast(str, result).strip()
+    except (OSError, subprocess.CalledProcessError, TypeError, AttributeError):
+        # OSError is raised if command doesn't exist
+        # CalledProcessError is raised if command returns nonzero
+        # AttributeError is raised if result cannot be strip()ped
+        return None
+
+
+def docker_machine_name():  # type: () -> Optional[Text]
+    """
+    Get the machine name of the active docker-machine machine.
+
+    :return: Name of the active machine or None if error
+    """
+    return check_output_and_strip(['docker-machine', 'active'])
+
+
+def cmd_output_matches(check_cmd, expected_status):
+    # type: (List[Text], Text) -> bool
+    """
+    Run a command and compares output to expected.
+
+    :param check_cmd: Command list to execute
+    :param expected_status: Expected output, e.g. "Running" or "poweroff"
+    :return: Boolean value, indicating whether or not command result matched
+    """
+    return check_output_and_strip(check_cmd) == expected_status
+
+
+def boot2docker_running():  # type: () -> bool
+    """
+    Check if boot2docker CLI reports that boot2docker vm is running.
+
+    :return: True if vm is running, False otherwise
+    """
+    return cmd_output_matches(['boot2docker', 'status'], 'running')
+
+
+def docker_machine_running():  # type: () -> bool
+    """
+    Ask docker-machine for the active machine and checks if its VM is running.
+
+    :return: True if vm is running, False otherwise
+    """
+    machine_name = docker_machine_name()
+    if not machine_name:
+        return False
+    return cmd_output_matches(['docker-machine', 'status', machine_name], 'Running')
+
+
+def cmd_output_to_int(cmd):  # type: (List[Text]) -> Optional[int]
+    """
+    Run the provided command and returns the integer value of the result.
+
+    :param cmd: The command to run
+    :return: Integer value of result, or None if an error occurred
+    """
+    result = check_output_and_strip(cmd)  # may return None
+    if result is not None:
+        try:
+            return int(result)
+        except ValueError:
+            # ValueError is raised if int conversion fails
+            return None
+    return None
+
+
+def boot2docker_id():  # type: () -> Tuple[Optional[int], Optional[int]]
+    """
+    Get the UID and GID of the docker user inside a running boot2docker vm.
+
+    :return: Tuple (UID, GID), or (None, None) if error (e.g. boot2docker not present or stopped)
+    """
+    uid = cmd_output_to_int(['boot2docker', 'ssh', 'id', '-u'])
+    gid = cmd_output_to_int(['boot2docker', 'ssh', 'id', '-g'])
+    return (uid, gid)
+
+def docker_machine_id():  # type: () -> Tuple[Optional[int], Optional[int]]
+    """
+    Ask docker-machine for active machine and gets the UID of the docker user.
+
+    inside the vm
+    :return: tuple (UID, GID), or (None, None) if error (e.g. docker-machine not present or stopped)
+    """
+    machine_name = docker_machine_name()
+    if not machine_name:
+        return (None, None)
+    uid = cmd_output_to_int(['docker-machine', 'ssh', machine_name, "id -u"])
+    gid = cmd_output_to_int(['docker-machine', 'ssh', machine_name, "id -g"])
+    return (uid, gid)
+
+
+if __name__ == '__main__':
+    print(docker_vm_id())