def _get_pg_exe_path()

in ossdbtoolsservice/disaster_recovery/disaster_recovery_service.py [0:0]


def _get_pg_exe_path(exe_name: str, server_version: Tuple[int, int, int]) -> str:
    """
    Find the path to the given PostgreSQL utility executable for the current operating system in a server specific version folder

    :param exe_name: The name of the program to find (without .exe). e.g. 'pg_dump'
    :param server_version: Tuple of the connected server version components (major, minor, ignored)
    :returns: The path to the requested executable
    :raises ValueError: if there is no file corresponding to the given exe_name
    """

    base_location = os.path.join(os.path.dirname(sys.argv[0]), 'pg_exes')
    platform = sys.platform
    if platform == 'win32':
        os_root = os.path.join(base_location, 'win')
        path_suffix = exe_name + '.exe'
    elif platform == 'darwin':
        os_root = os.path.join(base_location, 'mac')
        path_suffix = os.path.join('bin', exe_name)
    else:
        os_root = os.path.join(base_location, 'linux')
        path_suffix = os.path.join('bin', exe_name)

    # Get the list of folders in the os specific root folder
    all_folders: List[str] = [os.path.normpath(x[0]) for x in os.walk(os_root)]
    for folder in all_folders:
        folderName = os.path.basename(folder)
        version = folderName.split('.')
        # Get the major version value
        try:
            major = int(version[0])
        except ValueError:
            major = 0
        minor = 0
        # Set minor version if version length is more than 1 (ex 9.5, 9.6)
        if (len(version) > 1):
            try:
                minor = int(version[1])
            except ValueError:
                minor = 0

        if major == int(server_version[0]) and minor == server_version[1]:
            exe_path = os.path.join(folder, path_suffix)
            if not os.path.exists(exe_path):
                raise ValueError(f'Could not find executable file {exe_path}')
            return exe_path

    version_string = '.'.join(str(ver) for ver in server_version)
    raise ValueError(f'Exe folder {os_root} does not contain {exe_name} for version {version_string}')