Last active
December 20, 2023 03:22
-
-
Save kebyn/bf9f3d6ce11d86bf3dd82b13cf4290e3 to your computer and use it in GitHub Desktop.
Revisions
-
kebyn revised this gist
Dec 20, 2023 . 1 changed file with 49 additions and 31 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,58 +1,76 @@ 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 # pylint: disable=missing-class-docstring # pylint: disable=missing-function-docstring log = getLogger(name=__name__) log.setLevel(DEBUG) 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) 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 load(_rep).get("token") def _list_tags(self, 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)}", }, ) with request.urlopen(req) as _rep: return 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 = 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() 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, ), ) -
kebyn created this gist
Apr 8, 2022 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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 ] )