nixos-kubernetes/gethashes.py

67 lines
2.1 KiB
Python

import base64
import hashlib
import json
import pathlib
import re
import subprocess
import requests
url = "https://storage.googleapis.com/kubernetes-release/release/v{version}/bin/linux/{arch}/{pname}" # noqa E501
hashes = {}
hashes_file = pathlib.Path("hashes.json")
if hashes_file.exists():
hashes = json.loads(hashes_file.read_bytes())
stable = {}
tags = subprocess.run(
["git", "ls-remote", "--tags", "https://github.com/kubernetes/kubernetes"],
capture_output=True,
)
tag_re = re.compile(rb"refs/tags/v(\d+)\.(\d+)\.(\d+)$", re.MULTILINE)
start = 0
while start < len(tags.stdout):
if match := tag_re.search(tags.stdout, pos=start):
start = match.end()
major = int(match.group(1))
minor = int(match.group(2))
if minor < 22:
continue
patch = int(match.group(3))
key = (major, minor)
if key in stable:
stable[key] = max(patch, stable[key])
else:
stable[key] = patch
else:
break
for pname in ["kubeadm", "kubectl", "kubelet"]:
if pname not in hashes:
hashes[pname] = {}
for arch in ["amd64", "arm64"]:
if arch not in hashes[pname]:
hashes[pname][arch] = {}
for major, minor in stable.keys():
patch_max = stable[(major, minor)]
for patch in range(0, patch_max + 1):
version = f"{major}.{minor}.{patch}"
if version in hashes[pname][arch]:
continue
url = f"https://dl.k8s.io/release/v{version}/bin/linux/{arch}/{pname}" # noqa E501
try:
r = requests.get(url)
hash = "sha256-" + base64.b64encode(
hashlib.sha256(r.content).digest()
).decode("ascii")
hashes[pname][arch][version] = hash
print(pname, arch, version, hash)
hashes_file.write_text(
json.dumps(hashes, indent=2, sort_keys=True), encoding="utf-8"
)
except Exception as e:
print(e)