You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nu-scripts/podman-update-check

73 lines
1.8 KiB
Plaintext

#!/bin/env nu
use ./lib/cntfy.nu
use ./lib/dockerhub.nu
def main [
--ntfy: bool
] {
let images = ( get_images )
let image_count = ( $images | length )
if $image_count == 0 {
print "No images found"
return
}
print $"($image_count) local image[s] found"
( $images
| where { |$it| $it.Names? != null }
| insert Name {|$it| $it.Names | first }
| where {|| needs_update }
| each {|| print_needs_update $ntfy }
)
}
def get_images [] {
podman images --no-trunc --format json | from json
}
export def needs_update [] {
let data = $in
let name_parts = ( $data.Name | split row "/" --number 2 )
let registry = ( $name_parts | first )
let img_parts = ( $name_parts | last | split row ":" )
let image = ( $img_parts | get 0 )
let tag = ( $img_parts | get 1 )
let digest = $data.Id
print $"Checking if ($image):($tag) has updates on ($registry)"
if $registry == "docker.io" {
try {
( dockerhub get_image_digest $image $tag ) != $digest
} catch {
false
}
} else {
print $"Host ($registry) is not supported"
false
}
}
def print_needs_update [ntfy: bool] {
let data = $in
let containers = ( containers_for_image $data.Name )
print $"Image `($data.Name)` needs to be updated. Used by ($containers | str join ', ')"
if $ntfy {
(
cntfy publish
--tags [ podman $data.Name ]
--priority 4
--title $"($data.Name) outdated"
"updates" $"Container ($data.Name) needs to be updated. Used by ($data.Containers) containers. Used by: ( $containers | str join '\n' )"
)
}
}
def containers_for_image [image: string] {
( podman container ls --all --format json
| from json
| where Image == $image
| insert Name {|$it| $it.Names? | get 0 }
| get Name
)
}