diff --git a/playbooks/roles/services/setup/system/files/auto_update/pod-service-auto-update b/playbooks/roles/services/setup/system/files/auto_update/pod-service-auto-update index 583ac4c..f7bad8d 100644 --- a/playbooks/roles/services/setup/system/files/auto_update/pod-service-auto-update +++ b/playbooks/roles/services/setup/system/files/auto_update/pod-service-auto-update @@ -4,13 +4,12 @@ pull` may not necessarily pull the image for quite some time. However, `auto-update` will still try every day, but since it doesn't check if the new digest has actually been pulled it will restart the service again and again. This script attempts to solve the problem by explicitly checking the digest -after the pull. However, it assumes that there is only service that needs restarting on updates and -that its called .service so it is not (yet) a drop-in replacement for `podman -auto-update`. +after the pull. """ -import getpass +import collections +import functools import json import subprocess @@ -37,20 +36,25 @@ def podman_pull(image): if __name__ == "__main__": containers = podman_ps() - images = set() + units = collections.defaultdict(list) for container in containers: labels = container.get("Labels", None) if labels is None: continue - autoupdate = labels.get("io.containers.autoupdate", None) - if (autoupdate is None) or (autoupdate == "disabled"): + + autoupdate = labels.get("io.containers.autoupdate", "disabled") + if autoupdate == "disabled": continue if autoupdate != "image": raise ValueError(f"unrecognised autopdate label: {autoupdate}") - images.add(container["Image"]) - updated = [] - for image in images: + if "PODMAN_SYSTEMD_UNIT" not in labels: + raise ValueError( + f"container {container['Names'][0]} does not have \"PODMAN_SYSTEMD_UNIT\" label") + units[container["Image"]].append(labels["PODMAN_SYSTEMD_UNIT"]) + + updated = set() + for image in units.keys(): inspect = podman_image_inspect(image) original_digest = inspect["Digest"] @@ -60,9 +64,11 @@ if __name__ == "__main__": new_digest = inspect["Digest"] if new_digest != original_digest: - updated.append(image) + updated.add(image) if updated: - print(f"The following images have been updated: {updated}") - subprocess.run(["systemctl", "--user", "restart", f"{getpass.getuser()}.service"], - check=True) + print(f"The following images have been updated: {', '.join(updated)}") + restart = functools.reduce(lambda x, y: x + y, [units[image] for image in updated]) + + print(f"The following units will be restarted: {', '.join(restart)}") + subprocess.run(["systemctl", "--user", "restart"] + restart, check=True)