Skip to content

Instantly share code, notes, and snippets.

@kebyn
Last active December 20, 2023 03:22
Show Gist options
  • Select an option

  • Save kebyn/bf9f3d6ce11d86bf3dd82b13cf4290e3 to your computer and use it in GitHub Desktop.

Select an option

Save kebyn/bf9f3d6ce11d86bf3dd82b13cf4290e3 to your computer and use it in GitHub Desktop.

Revisions

  1. kebyn revised this gist Dec 20, 2023. 1 changed file with 49 additions and 31 deletions.
    80 changes: 49 additions & 31 deletions list-tags.py
    Original file line number Diff line number Diff line change
    @@ -1,58 +1,76 @@
    import argparse
    import json
    import logging
    from os.path import join
    from argparse import ArgumentParser, Namespace
    from json import dumps, load
    from logging import DEBUG, Formatter, StreamHandler, getLogger
    from pathlib import Path
    from urllib import parse, request

    log = logging.getLogger(name=__name__)
    log.setLevel(logging.INFO)
    # pylint: disable=missing-class-docstring
    # pylint: disable=missing-function-docstring

    log = getLogger(name=__name__)
    log.setLevel(DEBUG)

    console = logging.StreamHandler()
    console.setLevel(logging.DEBUG)
    formatter = logging.Formatter(
    fmt='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S')
    console = StreamHandler()
    console.setLevel(DEBUG)
    formatter = Formatter(
    fmt="%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s",
    datefmt="%a, %d %b %Y %H:%M:%S",
    )
    console.setFormatter(formatter)
    log.addHandler(console)

    # pylint: disable=missing-class-docstring
    # pylint: disable=missing-function-docstring


    class ListTags(object):
    def __init__(self, images) -> None:
    self.images = images

    def auth(self, image) -> str:
    params = parse.urlencode(
    {'service': 'registry.docker.io', 'scope': f'repository:{image}:pull'})
    req = request.Request(
    url=f'https://auth.docker.io/token?{params}')
    {"service": "registry.docker.io", "scope": f"repository:{image}:pull"}
    )
    req = request.Request(url=f"https://auth.docker.io/token?{params}")
    with request.urlopen(req) as _rep:
    return json.load(_rep).get('token')
    return load(_rep).get("token")

    def _list_tags(self, image):
    if len(image.split('/')) < 2:
    image = join('library', image)
    if len(image.split("/")) < 2:
    image = Path("library").joinpath(image)
    req = request.Request(
    url=f'https://registry-1.docker.io/v2/{image}/tags/list', headers={'Content-Type': 'application/json; charset=utf-8', 'Authorization': f'Bearer {self.auth(image)}'})
    url=f"https://registry-1.docker.io/v2/{image}/tags/list",
    headers={
    "Content-Type": "application/json; charset=utf-8",
    "Authorization": f"Bearer {self.auth(image)}",
    },
    )
    with request.urlopen(req) as _rep:
    return json.load(_rep)
    return load(_rep)

    def list_tags(self) -> tuple:
    if isinstance(self.images, str):
    return self._list_tags(self.images),
    return (self._list_tags(self.images),)
    return tuple(self._list_tags(image) for image in self.images)


    if __name__ == '__main__':
    arg = argparse.ArgumentParser(description='list docker tags.')
    arg.add_argument('images', nargs='+', type=str)
    parses: argparse.Namespace = arg.parse_args()
    if __name__ == "__main__":
    arg = ArgumentParser(description="list docker tags.")
    arg.add_argument(
    "-i",
    "--indent",
    action="store_true",
    help="indent or not.",
    )
    arg.add_argument("images", nargs="+", type=str)
    parses: Namespace = arg.parse_args()

    tags = ListTags(parses.images).list_tags()
    for image in parses.images:
    log.info("%s", [
    [f'{image}:{tag}' for tag in version.get('tags')]
    for version in tags
    ]
    indent = None
    if parses.indent:
    indent = 2
    for img in parses.images:
    log.info(
    "%s",
    dumps(
    [f"{img}:{tag}" for version in tags for tag in version.get("tags")],
    indent=indent,
    ),
    )
  2. kebyn created this gist Apr 8, 2022.
    58 changes: 58 additions & 0 deletions list-tags.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,58 @@
    import argparse
    import json
    import logging
    from os.path import join
    from urllib import parse, request

    log = logging.getLogger(name=__name__)
    log.setLevel(logging.INFO)

    console = logging.StreamHandler()
    console.setLevel(logging.DEBUG)
    formatter = logging.Formatter(
    fmt='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S')
    console.setFormatter(formatter)
    log.addHandler(console)

    # pylint: disable=missing-class-docstring
    # pylint: disable=missing-function-docstring


    class ListTags(object):
    def __init__(self, images) -> None:
    self.images = images

    def auth(self, image) -> str:
    params = parse.urlencode(
    {'service': 'registry.docker.io', 'scope': f'repository:{image}:pull'})
    req = request.Request(
    url=f'https://auth.docker.io/token?{params}')
    with request.urlopen(req) as _rep:
    return json.load(_rep).get('token')

    def _list_tags(self, image):
    if len(image.split('/')) < 2:
    image = join('library', image)
    req = request.Request(
    url=f'https://registry-1.docker.io/v2/{image}/tags/list', headers={'Content-Type': 'application/json; charset=utf-8', 'Authorization': f'Bearer {self.auth(image)}'})
    with request.urlopen(req) as _rep:
    return json.load(_rep)

    def list_tags(self) -> tuple:
    if isinstance(self.images, str):
    return self._list_tags(self.images),
    return tuple(self._list_tags(image) for image in self.images)


    if __name__ == '__main__':
    arg = argparse.ArgumentParser(description='list docker tags.')
    arg.add_argument('images', nargs='+', type=str)
    parses: argparse.Namespace = arg.parse_args()

    tags = ListTags(parses.images).list_tags()
    for image in parses.images:
    log.info("%s", [
    [f'{image}:{tag}' for tag in version.get('tags')]
    for version in tags
    ]
    )