Compare commits

...

6 Commits

Author SHA1 Message Date
mag37 42d35b7a03 enclosing some variables in braces due to strings messing up 2025-11-13 20:27:31 +01:00
mag37 fc58962f79 added forgotten variables, corrected some variables 2025-11-13 20:18:25 +01:00
mag37 ff2006437f final logic to get image backups to work for testing 2025-11-13 17:49:52 +01:00
mag37 ac98e81172 datecheck function rewrite 2025-11-13 17:29:53 +01:00
mag37 6fefcbc3dd added new variables, options and setup 2025-11-13 16:30:46 +01:00
Oleh Astappiev c33c9f4387 Fix version check condition (#239) 2025-11-13 06:17:25 +01:00
+55 -11
View File
@@ -42,6 +42,7 @@ Help() {
echo "-h Print this Help." echo "-h Print this Help."
echo "-i Inform - send a preconfigured notification." echo "-i Inform - send a preconfigured notification."
echo "-I Prints custom releasenote urls alongside each container with updates in CLI output (requires urls.list)." echo "-I Prints custom releasenote urls alongside each container with updates in CLI output (requires urls.list)."
echo "-k N Number of days to store image backups before pruning - this also enables the backup function."
echo "-l Only include containers with label set. See readme." echo "-l Only include containers with label set. See readme."
echo "-m Monochrome mode, no printf colour codes and hides progress bar." echo "-m Monochrome mode, no printf colour codes and hides progress bar."
echo "-M Prints custom releasenote urls as markdown (requires template support)." echo "-M Prints custom releasenote urls as markdown (requires template support)."
@@ -77,6 +78,7 @@ Stopped=${Stopped:-""}
CollectorTextFileDirectory=${CollectorTextFileDirectory:-} CollectorTextFileDirectory=${CollectorTextFileDirectory:-}
Exclude=${Exclude:-} Exclude=${Exclude:-}
DaysOld=${DaysOld:-} DaysOld=${DaysOld:-}
DaysKept=${DaysKept:-}
OnlySpecific=${OnlySpecific:-false} OnlySpecific=${OnlySpecific:-false}
SpecificContainer=${SpecificContainer:-""} SpecificContainer=${SpecificContainer:-""}
SkipRecreate=${SkipRecreate:-false} SkipRecreate=${SkipRecreate:-false}
@@ -97,7 +99,11 @@ c_blue="\033[0;34m"
c_teal="\033[0;36m" c_teal="\033[0;36m"
c_reset="\033[0m" c_reset="\033[0m"
while getopts "ayfFhiIlmMnprsuvc:e:d:t:x:R" options; do # Timestamps
RunTimestamp=$(date +'%Y-%m-%d_%H%M')
RunEpoch=$(date +'%s')
while getopts "ayfFhiIlmMnprsuvc:e:d:k:t:x:R" options; do
case "${options}" in case "${options}" in
a|y) AutoMode=true ;; a|y) AutoMode=true ;;
c) CollectorTextFileDirectory="${OPTARG}" ;; c) CollectorTextFileDirectory="${OPTARG}" ;;
@@ -107,6 +113,7 @@ while getopts "ayfFhiIlmMnprsuvc:e:d:t:x:R" options; do
F) OnlySpecific=true ;; F) OnlySpecific=true ;;
i) Notify=true ;; i) Notify=true ;;
I) PrintReleaseURL=true ;; I) PrintReleaseURL=true ;;
k) DaysKept="${OPTARG}" ;;
l) OnlyLabel=true ;; l) OnlyLabel=true ;;
m) MonoMode=true ;; m) MonoMode=true ;;
M) PrintMarkdownURL=true ;; M) PrintMarkdownURL=true ;;
@@ -156,6 +163,12 @@ if [[ -n "$DaysOld" ]]; then
exit 2 exit 2
fi fi
fi fi
if [[ -n "$DaysKept" ]]; then
if ! [[ $DaysKept =~ ^[0-9]+$ ]]; then
printf "-k argument given (%s) is not a number.\n" "$DaysKept"
exit 2
fi
fi
if [[ -n "$CollectorTextFileDirectory" ]]; then if [[ -n "$CollectorTextFileDirectory" ]]; then
if ! [[ -d $CollectorTextFileDirectory ]]; then if ! [[ -d $CollectorTextFileDirectory ]]; then
printf "The directory (%s) does not exist.\n" "$CollectorTextFileDirectory" printf "The directory (%s) does not exist.\n" "$CollectorTextFileDirectory"
@@ -228,10 +241,11 @@ choosecontainers() {
} }
datecheck() { datecheck() {
ImageDate=$("$regbin" -v error image inspect "$RepoUrl" --format='{{.Created}}' | cut -d" " -f1) ImageDate="$1"
DaysMax="$2"
ImageEpoch=$(date -d "$ImageDate" +%s 2>/dev/null) || ImageEpoch=$(date -f "%Y-%m-%d" -j "$ImageDate" +%s) ImageEpoch=$(date -d "$ImageDate" +%s 2>/dev/null) || ImageEpoch=$(date -f "%Y-%m-%d" -j "$ImageDate" +%s)
ImageAge=$(( ( $(date +%s) - ImageEpoch )/86400 )) ImageAge=$(( ( RunEpoch - ImageEpoch )/86400 ))
if [[ "$ImageAge" -gt "$DaysOld" ]]; then if [[ "$ImageAge" -gt "$DaysMax" ]]; then
return 0 return 0
else else
return 1 return 1
@@ -358,7 +372,7 @@ list_options() {
} }
# Version check & initiate self update # Version check & initiate self update
if [[ "$LatestRelease" != "undefined" ]]; then if [[ "$LatestSnippet" != "undefined" ]]; then
if [[ "$VERSION" != "$LatestRelease" ]]; then if [[ "$VERSION" != "$LatestRelease" ]]; then
printf "New version available! %b%s%b ⇒ %b%s%b \n Change Notes: %s \n" "$c_yellow" "$VERSION" "$c_reset" "$c_green" "$LatestRelease" "$c_reset" "$LatestChanges" printf "New version available! %b%s%b ⇒ %b%s%b \n Change Notes: %s \n" "$c_yellow" "$VERSION" "$c_reset" "$c_green" "$LatestRelease" "$c_reset" "$LatestChanges"
if [[ "$AutoMode" == false ]]; then if [[ "$AutoMode" == false ]]; then
@@ -443,7 +457,7 @@ check_image() {
if [[ "$LocalHash" == *"$RegHash"* ]]; then if [[ "$LocalHash" == *"$RegHash"* ]]; then
printf "%s\n" "NoUpdates $i" printf "%s\n" "NoUpdates $i"
else else
if [[ -n "${DaysOld:-}" ]] && ! datecheck; then if [[ -n "${DaysOld:-}" ]] && ! datecheck $("$regbin" -v error image inspect "$RepoUrl" --format='{{.Created}}' | cut -d" " -f1) "$DaysOld" ; then
printf "%s\n" "NoUpdates +$i ${ImageAge}d" printf "%s\n" "NoUpdates +$i ${ImageAge}d"
else else
printf "%s\n" "GotUpdates $i" printf "%s\n" "GotUpdates $i"
@@ -540,15 +554,30 @@ if [[ -n "${GotUpdates:-}" ]]; then
for i in "${SelectedUpdates[@]}"; do for i in "${SelectedUpdates[@]}"; do
((CurrentQue+=1)) ((CurrentQue+=1))
printf "\n%bNow updating (%s/%s): %b%s%b\n" "$c_teal" "$CurrentQue" "$NumberofUpdates" "$c_blue" "$i" "$c_reset" printf "\n%bNow updating (%s/%s): %b%s%b\n" "$c_teal" "$CurrentQue" "$NumberofUpdates" "$c_blue" "$i" "$c_reset"
ContLabels=$(docker inspect "$i" --format '{{json .Config.Labels}}') # ContLabels=$(docker inspect "$i" --format '{{json .Config.Labels}}')
ContImage=$(docker inspect "$i" --format='{{.Config.Image}}') # ContImage=$(docker inspect "$i" --format='{{.Config.Image}}')
ContPath=$($jqbin -r '."com.docker.compose.project.working_dir"' <<< "$ContLabels") # ContPath=$($jqbin -r '."com.docker.compose.project.working_dir"' <<< "$ContLabels")
ContConfig=$(docker inspect "$i" --format '{{json .}}')
ContImage=$($jqbin -r '."Config"."Image"' <<< "$ContConfig") # OLD? Remove if replaced with ContFull
ImageId=$($jqbin -r '."Image"' <<< "$ContConfig")
ContFull=$(docker image inspect "$ImageId" --format "{{index .RepoTags 0}}")
ContPath=$($jqbin -r '."Config"."Labels"."com.docker.compose.project.working_dir"' <<< "$ContConfig")
[[ "$ContPath" == "null" ]] && ContPath="" [[ "$ContPath" == "null" ]] && ContPath=""
# Add new backup tag prior to pulling if option is set
if [[ -n "${DaysKept:-}" ]]; then
ContRepo=${ContFull%:*}
ContApp=${ContRepo#*/}
ContTag=${ContFull#*:}
BackupName="dockcheck/${ContApp}:${RunTimestamp}_${ContTag}"
docker tag "$ImageId" "$BackupName"
printf "%b%s backed up as %s%b\n" "$c_teal" "$i" "$BackupName" "$c_reset"
fi
# Checking if compose-values are empty - hence started with docker run # Checking if compose-values are empty - hence started with docker run
if [[ -z "$ContPath" ]]; then if [[ -z "$ContPath" ]]; then
if [[ "$DRunUp" == true ]]; then if [[ "$DRunUp" == true ]]; then
docker pull "$ContImage" docker pull "$ContFull"
printf "%s\n" "$i got a new image downloaded, rebuild manually with preferred 'docker run'-parameters" printf "%s\n" "$i got a new image downloaded, rebuild manually with preferred 'docker run'-parameters"
else else
printf "\n%b%s%b has no compose labels, probably started with docker run - %bskipping%b\n\n" "$c_yellow" "$i" "$c_reset" "$c_yellow" "$c_reset" printf "\n%b%s%b has no compose labels, probably started with docker run - %bskipping%b\n\n" "$c_yellow" "$i" "$c_reset" "$c_yellow" "$c_reset"
@@ -556,7 +585,7 @@ if [[ -n "${GotUpdates:-}" ]]; then
continue continue
fi fi
docker pull "$ContImage" || { printf "\n%bDocker error, exiting!%b\n" "$c_red" "$c_reset" ; exit 1; } docker pull "$ContFull" || { printf "\n%bDocker error, exiting!%b\n" "$c_red" "$c_reset" ; exit 1; }
done done
printf "\n%bDone pulling updates.%b\n" "$c_green" "$c_reset" printf "\n%bDone pulling updates.%b\n" "$c_green" "$c_reset"
@@ -609,6 +638,21 @@ if [[ -n "${GotUpdates:-}" ]]; then
${DockerBin} ${CompleteConfs} ${ContEnvs} up -d ${SpecificContainer} || { printf "\n%bDocker error, exiting!%b\n" "$c_red" "$c_reset" ; exit 1; } ${DockerBin} ${CompleteConfs} ${ContEnvs} up -d ${SpecificContainer} || { printf "\n%bDocker error, exiting!%b\n" "$c_red" "$c_reset" ; exit 1; }
fi fi
done done
# Clean up old backup image tags if -k is used
if [[ -n "${DaysKept:-}" ]]; then
IFS=$'\n'
for backup_img in $(docker images --format "{{.Repository}} {{.Tag}}" dockcheck/\*); do
repo_name=${backup_img% *}
backup_tag=${backup_img#* }
backup_date=${backup_tag%%_*}
# UNTAGGING HERE
if datecheck "$backup_date" "$DaysKept"; then
docker rmi "${repo_name}:${backup_tag}"
fi
done
unset IFS
fi
fi fi
if [[ "$AutoPrune" == false ]] && [[ "$AutoMode" == false ]]; then printf "\n"; read -rep "Would you like to prune all dangling images? y/[n]: " AutoPrune; fi if [[ "$AutoPrune" == false ]] && [[ "$AutoMode" == false ]]; then printf "\n"; read -rep "Would you like to prune all dangling images? y/[n]: " AutoPrune; fi
if [[ "$AutoPrune" == true ]] || [[ "$AutoPrune" =~ [yY] ]]; then printf "\nAuto pruning.."; docker image prune -f; fi if [[ "$AutoPrune" == true ]] || [[ "$AutoPrune" =~ [yY] ]]; then printf "\nAuto pruning.."; docker image prune -f; fi