Compare commits

...

88 Commits

Author SHA1 Message Date
mag37
8e92a3a4cb New updates to readme 2024-01-03 21:56:07 +01:00
mag37
9ead0feb9f Merge pull request #51 from yoyoma2/main
add a generic sample notification and a DSM notification addon
2024-01-03 21:42:57 +01:00
yoyoma2
2e620cd2c0 final tweaks to notification addons 2024-01-03 12:41:18 -05:00
mag37
fc7b2888f1 Update notify_generic.sh
Added disclaimer.
2024-01-03 11:07:08 +01:00
mag37
e15a8e9dbf Update notify_DSM.sh
Added disclaimer + some more info
2024-01-03 11:06:37 +01:00
mag37
342ff271ca Update notify_DSM.sh
Added the passed array to a variable.
Created printable string with newlines.
2024-01-03 11:01:41 +01:00
mag37
3f56af0c8a Update notify_generic.sh
Set the passed in array to a variable.
Made a printable string with newlines.
Edited formatting some.
2024-01-03 10:57:00 +01:00
yoyoma2
ab3aaf1140 add a sample a DSM notification addon 2024-01-01 13:46:09 -05:00
mag37
80a81f59d6 Merge pull request #50 from mag37/printf_rework
Added option -m, monochrome mode + cleaning.
2023-12-23 20:54:45 +01:00
mag37
ba3f436ac9 Added -m option, monochrome mode. 2023-12-23 20:52:04 +01:00
mag37
24438124eb cleaned up some variable names and help-section 2023-12-23 20:47:23 +01:00
mag37
e39ea0748f Update dockcheck.sh
Added -m, Monochrome Mode.
2023-12-19 22:52:11 +01:00
mag37
ab30f22343 rework of the printf's color escape codes 2023-12-19 20:24:34 +01:00
mag37
d39badea36 Upd README.md 2023-12-14 20:55:55 +01:00
mag37
9a1f2aa7c7 Upd README.md 2023-12-14 20:44:53 +01:00
mag37
15d3a96b2c Merge pull request #47 from mag37/agecheck
datecheck merge.
2023-12-14 13:28:39 +01:00
mag37
fbd27d6e37 Changed datecheck logic.
Printing how old in days a skipped "too new" image is.
2023-12-14 09:06:19 +01:00
mag37
7bd5f87ed1 Upd README 2023-12-13 20:16:20 +01:00
mag37
e24cba0078 upd readme 3.0 2023-12-13 19:59:58 +01:00
mag37
886379dc7d v3.0 big commit, added date-check function 2023-12-13 19:50:58 +01:00
mag37
488669b99a Update README.md
added recent change info.
2023-12-09 10:59:27 +01:00
mag37
e20fdd9e85 regctl logic changes, check and download will match the scripts workdir. 2023-12-09 10:56:22 +01:00
mag37
3d1c424d23 Update dockcheck.sh
added a regctl-check for when regctl is within the pwd.
(as suggested by @yoyoma2 )
2023-11-19 20:20:05 +01:00
mag37
132fda3388 Update README.md 2023-08-29 20:42:00 +02:00
mag37
cc9b3b0828 Update README.md 2023-08-28 21:31:18 +02:00
mag37
29c2c5e961 Merge pull request #41 from elchanly/elchanly-patch-1
Update dockcheck.sh to include stopped containers
2023-08-28 21:26:12 +02:00
mag37
5dc9af9874 Update dockcheck.sh
Did some changes to the logic, cleaned some whitespace.
2023-08-28 21:24:23 +02:00
elchanly
f91ca08d54 Update dockcheck.sh to include stopped containers
as suggested in reddit, this is proposed to include stopped containers
take into account im not skilled in this programming language but i wanted to contribute.
2023-08-21 23:56:03 +02:00
mag37
9a246b52c4 Merge pull request #39 from mag37/fixing
Fixes `dc_brief.sh` to only exclude exact matches.
2023-07-11 23:33:02 +02:00
mag37
0c33f581f7 Removed old exclude-logic 2023-07-11 23:30:46 +02:00
mag37
b492aacf0f minor edits 2023-07-11 23:11:14 +02:00
mag37
f498138d4b Added recent "exclude containers"-bugfix to the dc_brief.sh 2023-07-11 23:05:34 +02:00
mag37
6a3198eb08 Update dockcheck.sh
patched the self_update logic to respect (and skip interaction) if `-y|a` flag is passed.
2023-06-28 18:03:56 +02:00
mag37
48bfea9fbf Merge pull request #36 from mag37/dev1
Fixes the Exclude-option to only exclude exact matches. 
Formatting: Added counter and info message on current update.
2023-06-27 20:45:12 +02:00
mag37
f2fc5a4d34 Updated: 2.4 info 2023-06-27 19:45:21 +02:00
mag37
f0940e81ec Fixes to the Exclude-option to only exclude exact matches, instead of
wildcarding and excluding by mistake.

Added a counter + message about which container updating.
2023-06-27 19:34:20 +02:00
mag37
a25e648557 Changes to the Exclude-option to only exclude exact matches. 2023-06-21 20:09:31 +02:00
mag37
0e2bdc94ad Update README.md 2023-03-08 12:48:36 +01:00
mag37
19eb57077f selfupd-edit
Changed to if git fails, it'll return to ask for curl/manual.
2023-03-05 21:59:08 +01:00
mag37
1f28c9c144 Update README.md 2023-03-05 21:41:08 +01:00
mag37
0d6da201b7 Update dockcheck.sh
changed url
2023-03-05 21:25:22 +01:00
mag37
ecb1256fbb Merge pull request #32 from mag37/selfupdate
selfupdate func
2023-03-05 21:24:03 +01:00
mag37
afe97c9de5 rdy for main
All in all: 
- Added a self update function, calling either a curl or a git function to update the script.
- Added a dirty changenote-message, will look into improvements later to not curl twice.
2023-03-05 21:19:54 +01:00
mag37
9b6396f6de cleaning
quoting, added env-file check.
2023-03-05 21:13:23 +01:00
mag37
5e58abd8e9 Update dockcheck.sh 2023-03-05 20:45:43 +01:00
mag37
3d7340c91c added changenotes
Addded a dirty way to write out latest changes.
Will try to improve on this later.
2023-03-05 20:44:05 +01:00
mag37
1decbd77b5 cleaning
Just minor cleaning, rearranging
2023-03-05 14:18:57 +01:00
mag37
bcc0c63413 rearranged functions
Moved up choosecontainer-function to the rest of the functions.
Cleaning.
2023-03-05 14:08:56 +01:00
mag37
4a2bc2dded Cleaning
Quoted a variable, reformatted a message
2023-03-05 13:50:28 +01:00
mag37
fd67e0dff1 Update dockcheck.sh 2023-03-04 21:35:47 +01:00
mag37
0fb95ea616 Update dockcheck.sh 2023-03-04 21:28:25 +01:00
mag37
e4cf54c166 Update dockcheck.sh 2023-03-04 21:27:18 +01:00
mag37
e677d8513b Update dockcheck.sh 2023-03-04 21:25:32 +01:00
mag37
d366d4680c Update dockcheck.sh 2023-03-04 20:31:38 +01:00
mag37
76337ee326 Update dockcheck.sh 2023-03-04 20:31:20 +01:00
mag37
6cd90e4597 Update dockcheck.sh 2023-03-04 20:27:13 +01:00
mag37
08ae7a8d23 Update dockcheck.sh 2023-03-04 20:21:31 +01:00
mag37
062c62d071 Update dockcheck.sh 2023-03-04 20:06:41 +01:00
mag37
13549c2018 Update dockcheck.sh 2023-03-04 20:06:08 +01:00
mag37
9094bedfd3 Update dockcheck.sh 2023-03-04 20:05:27 +01:00
mag37
0d4eb4365c Update dockcheck.sh 2023-03-04 20:02:30 +01:00
mag37
ac77470dee Update dockcheck.sh 2023-03-04 20:00:20 +01:00
mag37
ea7a1cd171 Added selfupdating
Added a selfupdating function.
Fixed a forgotten variable (compose-array).
2023-03-04 19:56:26 +01:00
mag37
40910d83b6 Delete example.gif 2023-03-04 09:58:55 +01:00
mag37
d7cc363931 Update README.md 2023-03-04 09:57:31 +01:00
mag37
4f8d6289c2 Update README.md
added donation buttons
added logo by [booYah187](https://github.com/booYah187)
2023-03-04 09:56:16 +01:00
mag37
79febc7356 moved examples.gif 2023-03-04 09:52:46 +01:00
mag37
8acff25f0d added logo
created by https://github.com/booYah187
2023-03-04 09:50:29 +01:00
mag37
2391d6916b Create temp 2023-03-04 09:47:53 +01:00
mag37
e864edc40e Update README.md 2023-03-01 21:02:55 +01:00
mag37
aac065022c urgent
Should not edit on production! Too stressful. Another mistake corrected.
2023-03-01 20:52:17 +01:00
mag37
3e60468d47 urgent
and another fix.
2023-03-01 20:43:06 +01:00
mag37
09c1b769ca urgent fix
too stressed.. typo
2023-03-01 20:39:02 +01:00
mag37
5392c48a57 URGENT
Added info about breakage.
2023-03-01 20:34:29 +01:00
mag37
cc72411de4 troubleshooting
Created for troubleshooting, use if you suspect dockcheck screwed up with errors to easily review your running configs. 
Restart the faulty contianer manually from the compose-file!
2023-03-01 20:27:47 +01:00
mag37
026d5296f8 urgent fix
Screwed up the array with compose-files! It just continued filling up on each loop, should be reset at each loop reset.
Will add info to readme.
2023-03-01 19:52:30 +01:00
mag37
f6e2d50949 +Recent Changes
Added a "Recent Changes" - section up top to make it easier to see what's new with versions.
2023-02-26 23:11:40 +01:00
mag37
432edbfa75 Merge pull request #30 from mag37/testing
multi-compose + exclude
2023-02-26 13:19:37 +01:00
mag37
f233cf3b41 Added info 2023-02-26 13:16:54 +01:00
mag37
7630a95442 Merge pull request #29 from Palleri/patch-2
Added visual "new line" after update check.
2023-02-26 11:58:09 +01:00
Palleri
c7304093bd Added visual "new line" after update check. 2023-02-26 11:24:46 +01:00
mag37
d877a86292 Added exclude-opt
Added options to allow for exclude option to be used
2023-02-26 08:03:15 +01:00
mag37
191d27097d Added exclude-option
Added option to exclude specific containers, full names separated by
comma. `dockcheck.sh -e heimdall,glances`
2023-02-26 07:49:57 +01:00
mag37
4ddb54770e multi-compose fix
Added a hacky fix for multi-compose containers, for example using overrides in
custom directories or multiple override.yml
2023-02-25 10:32:22 +01:00
mag37
c50312dc83 known: profile and multicompose
Added info about known issues related to profiles and multi-compose environments.
2023-02-25 07:56:58 +01:00
mag37
c47c703ce9 added shebang
Forgot about the shebang..
2023-02-23 19:00:35 +01:00
mag37
372e79a12c bugsquash
Added info about pull not respecting image-tags.
2023-02-23 13:18:37 +01:00
mag37
5c2cf75b21 vers.bump - fix breakage
Fixed a breaking error - pulling new images did not use the actual image:tag, but only defaulted to latest.
Hence bumping the version to alert new users to pull the latest.
2023-02-23 13:17:07 +01:00
10 changed files with 319 additions and 114 deletions

View File

@@ -1,28 +1,59 @@
# dockcheck <p align="center">
### A script checking updates for docker images **without pulling** - then selectively auto-update some/all containers. <img src="extras/dockcheck_logo_by_booYah187.png" width="160" title="dockcheck">
</p>
<p align="center">
<img src="https://img.shields.io/badge/coded%20by%20Human-100%25-yellow?style=flat-square" alt="No AI!">
<img src="https://img.shields.io/badge/bash-4.3-green?style=flat-square&logo=gnubash" alt="bash">
<a href="https://www.gnu.org/licenses/gpl-3.0.html"><img src="https://img.shields.io/badge/license-GPLv3-red?style=flat-square" alt="GPLv3"></a>
<img src="https://img.shields.io/github/v/tag/mag37/dockcheck?style=flat-square&label=release" alt="release">
<a href="https://ko-fi.com/mag37"><img src="https://img.shields.io/badge/-Ko--fi-grey?style=flat-square&logo=Ko-fi" alt="Buy me a Coffee"></a>
<a href="https://liberapay.com/user-bin-rob/donate"><img src="https://img.shields.io/badge/-LiberaPay-grey?style=flat-square&logo=liberapay" alt="LiberaPay"></a>
<a href="https://github.com/sponsors/mag37"><img src="https://img.shields.io/badge/-Sponsor-grey?style=flat-square&logo=github" alt="Github Sponsor"></a>
</p>
<h3 align="center">A script checking updates for docker images <b>without pulling</b><br>Then selectively auto-update containers.</h3>
<h4 align="center">With features like excluding specific containers, filter by name, auto-prune dangling images and more.</h4</h3>
### :bell: Recent changes
- **v0.3.2**: Added a notify function to wrap a notify-script, currently DSM/Ssmtp + template script.
- **v0.3.1**: Addded option `-m` , monochrome mode - no printf color codes.
- **v0.3.0**: Added option `-d N`, age (days) new images have to be before being pulled and updated.
- **v0.2.6**: regctl check / download logic changed. Now using the scripts directory as primary location.
- **v0.2.5**: Added a new option `-s` to include stopped containers in the check for updates.
- **v0.2.4**: Fixed a bug with the Exclude-logic to only exclude exact matches. Added a counter.
- **v0.2.3**: Added a self updating function (curl/git) and a ugly changenote-message for updates.
- **v0.2.2**: Fixed breaking errors with multi-compose, odd breakage and working dir error.
- **v0.2.1**: Added option to exclude a list of containers.
- **v0.2.1**: Added multi-compose support (eg. override).
- **v0.2.0**: Fixed error with container:tag definition.
- **v0.1.9:** Fixed custom env-support.
___ ___
## Dependencies: ## Dependencies
Running docker (duh) and compose, either standalone or plugin. Running docker (duh) and compose, either standalone or plugin.
[`regclient/regctl`](https://github.com/regclient/regclient) (Licensed under [Apache-2.0 License](http://www.apache.org/licenses/LICENSE-2.0)) [`regclient/regctl`](https://github.com/regclient/regclient) (Licensed under [Apache-2.0 License](http://www.apache.org/licenses/LICENSE-2.0))
User will be prompted to download `regctl` if not in `PATH` or `PWD` User will be prompted to download `regctl` if not in `PATH` or `PWD`
___ ___
![](https://github.com/mag37/dockcheck/blob/main/example.gif) ![](extras/example.gif)
## `dockcheck.sh` ## `dockcheck.sh`
``` ```
$ ./dockcheck.sh -h $ ./dockcheck.sh -h
Syntax: dockcheck.sh [OPTION] [part of name to filter] Syntax: dockcheck.sh [OPTION] [part of name to filter]
Example: dockcheck.sh -a ng Example: dockcheck.sh -y -d 10 -e nextcloud,heimdall
Options: Options:
-h Print this Help. -h Print this Help.
-a|y Automatic updates, without interaction. -a|y Automatic updates, without interaction.
-n No updates, only checking availability. -n No updates, only checking availability.
-p Auto-Prune dangling images after update. -e X Exclude containers, separated by comma.
-r Allow updating images for docker run, wont update the container. -d N Only update to new images that are N+ days old. Lists too recent with +prefix. 2xSlower.
-p Auto-Prune dangling images after update.
-r Allow updating images for docker run, wont update the container.
-s Include stopped containers in the check. (Logic: docker ps -a).
``` ```
Basic example: Basic example:
@@ -38,39 +69,25 @@ Containers with updates available:
2) syncthing 2) syncthing
3) whoogle-search 3) whoogle-search
Choose what containers to update: Choose what containers to update:
Enter number(s) separated by comma, [a] for all - [q] to quit: Enter number(s) separated by comma, [a] for all - [q] to quit:
``` ```
Then it proceedes to run `pull` and `up -d` on every container with updates. Then it proceedes to run `pull` and `up -d` on every container with updates.
After the updates are complete, you'll get prompted if you'd like to prune dangling images. After the updates are complete, you'll get prompted if you'd like to prune dangling images.
### `-r flag` :warning: disclaimer and warning: ### Notifications:
A simple email notification function is added, with a generic example and DSM/Ssmtp script by [yoyoma2](https://github.com/yoyoma2). Further addons are welcome, suggestions or PR!
### :warning: `-r flag` disclaimer and warning
**Wont auto-update the containers, only their images. (compose is recommended)** **Wont auto-update the containers, only their images. (compose is recommended)**
`docker run` dont support using new images just by restarting a container. `docker run` dont support using new images just by restarting a container.
Containers need to be manually stopped, removed and created again to run on the new image. Containers need to be manually stopped, removed and created again to run on the new image.
### :beetle: Squashed Bugs:
- ~~No options for running without updates or auto update.~~
- ~~No filter to check only specific containers.~~
- ~~Faulty registry checkups stopped the updates completely.~~
- ~~No clear checks to skip containers producing errors.~~
- ~~Multi-digest images didn't correctly check with registry, giving false positives on updates.~~
- ~~Not working with filenames other than `docker-compose.yml`~~
- ~~Lists are not alphabetically sorted (due to stacks and other parameters)~~
- ~~Old `docker-compose` binary-check sometimes returned false error~~
- ~~Stacks gets updated as whole, even if only one service is chosen.~~
- ~~Path broken occationally (from inspect) - probably due to old docker-compose binary.~~
- ~~Script breaks if one of the chosen containers are a `docker run` container.~~
- ~~Using relative paths for volumes eg. `${PWD}/data:data` will create the volumes where you stand.~~
- ~~Having no curl/wget leads to corrupt `regctl` without alerting.~~
- ~~Using custom `.env` files does not work.~~
### :hammer: Known issues ### :hammer: Known issues
- ~~No granular choice of what to update (except initial name filter).~~ - No detailed error feedback (just skip + list what's skipped).
- No detailed error feedback (just skip + list what's skipped) . - Not respecting `--profile` options when re-creating the container.
- Not working well with containers created by Portainer.
## `dc_brief.sh` ## `dc_brief.sh`
Just a brief, slimmed down version of the script to only print what containers got updates, no updates or errors. Just a brief, slimmed down version of the script to only print what containers got updates, no updates or errors.
@@ -79,9 +96,8 @@ Just a brief, slimmed down version of the script to only print what containers g
dockcheck is created and released under the [GNU GPL v3.0](https://www.gnu.org/licenses/gpl-3.0-standalone.html) license. dockcheck is created and released under the [GNU GPL v3.0](https://www.gnu.org/licenses/gpl-3.0-standalone.html) license.
___ ___
## Check out a spinoff brother-project: ### Check out a spinoff project: [Palleri/DCW](https://github.com/Palleri/DCW) for a WebUI-front with exporters and notifications.
### [Palleri/dockcheck-web](https://github.com/Palleri/dockcheck-web) for a WebUI-front!
## Special Thanks: ## Special Thanks
- :bison: [t0rnis](https://github.com/t0rnis) - :bison: [t0rnis](https://github.com/t0rnis)
- :leopard: [Palleri](https://github.com/Palleri) - :leopard: [Palleri](https://github.com/Palleri)

15
dc_brief.sh Normal file → Executable file
View File

@@ -1,8 +1,22 @@
#!/usr/bin/env bash
### If not in PATH, set full path. Else just "regctl" ### If not in PATH, set full path. Else just "regctl"
regbin="regctl" regbin="regctl"
### options to allow exclude:
while getopts "e:" options; do
case "${options}" in
e) Exclude=${OPTARG} ;;
*) exit 0 ;;
esac
done
shift "$((OPTIND-1))"
### Create array of excludes
IFS=',' read -r -a Excludes <<< "$Exclude" ; unset IFS
SearchName="$1" SearchName="$1"
for i in $(docker ps --filter "name=$SearchName" --format '{{.Names}}') ; do for i in $(docker ps --filter "name=$SearchName" --format '{{.Names}}') ; do
for e in "${Excludes[@]}" ; do [[ "$i" == "$e" ]] && continue 2 ; done
printf ". " printf ". "
RepoUrl=$(docker inspect "$i" --format='{{.Config.Image}}') RepoUrl=$(docker inspect "$i" --format='{{.Config.Image}}')
LocalHash=$(docker image inspect "$RepoUrl" --format '{{.RepoDigests}}') LocalHash=$(docker image inspect "$RepoUrl" --format '{{.RepoDigests}}')
@@ -34,3 +48,4 @@ if [[ -n ${GotUpdates[*]} ]] ; then
printf "\n\033[0;33mContainers with updates available:\033[0m\n" printf "\n\033[0;33mContainers with updates available:\033[0m\n"
printf "%s\n" "${GotUpdates[@]}" printf "%s\n" "${GotUpdates[@]}"
fi fi
printf "\n\n"

View File

@@ -1,84 +1,96 @@
#!/usr/bin/env bash #!/usr/bin/env bash
VERSION="v0.1.9" VERSION="v0.3.2"
### ChangeNotes: Added a notify function - template and email script (DSM etc)
Github="https://github.com/mag37/dockcheck" Github="https://github.com/mag37/dockcheck"
RawUrl="https://raw.githubusercontent.com/mag37/dockcheck/main/dockcheck.sh"
### Variables for self updating
ScriptArgs=( "$@" )
ScriptPath="$(readlink -f "$0")"
ScriptName="$(basename "$ScriptPath")"
ScriptWorkDir="$(dirname "$ScriptPath")"
### Check if there's a new release of the script: ### Check if there's a new release of the script:
LatestRelease="$(curl -s -r 0-50 https://raw.githubusercontent.com/mag37/dockcheck/main/dockcheck.sh | sed -n "/VERSION/s/VERSION=//p" | tr -d '"')" LatestRelease="$(curl -s -r 0-50 $RawUrl | sed -n "/VERSION/s/VERSION=//p" | tr -d '"')"
[ "$VERSION" != "$LatestRelease" ] && printf "New version available! Latest: %s - Local: %s \nGrab it here: %s \n\n" "$LatestRelease" "$VERSION" "$Github" LatestChanges="$(curl -s -r 0-200 $RawUrl | sed -n "/ChangeNotes/s/### ChangeNotes: //p")"
[ -s $ScriptWorkDir/notify.sh ] && source $ScriptWorkDir/notify.sh
### Help Function: ### Help Function:
Help() { Help() {
echo "Syntax: dockcheck.sh [OPTION] [part of name to filter]" echo "Syntax: dockcheck.sh [OPTION] [part of name to filter]"
echo "Example: dockcheck.sh -a ng" echo "Example: dockcheck.sh -y -d 10 -e nextcloud,heimdall"
echo echo
echo "Options:" echo "Options:"
echo "-h Print this Help."
echo "-a|y Automatic updates, without interaction." echo "-a|y Automatic updates, without interaction."
echo "-d N Only update to new images that are N+ days old. Lists too recent with +prefix and age. 2xSlower."
echo "-e X Exclude containers, separated by comma."
echo "-h Print this Help."
echo "-m Monochrome mode, no printf color codes."
echo "-n No updates, only checking availability." echo "-n No updates, only checking availability."
echo "-p Auto-Prune dangling images after update." echo "-p Auto-Prune dangling images after update."
echo "-r Allow updating images for docker run, wont update the container" echo "-r Allow updating images for docker run, wont update the container"
echo "-s Include stopped containers in the check. (Logic: docker ps -a)"
} }
while getopts "aynprh" options; do ### Colors:
c_red="\033[0;31m"
c_green="\033[0;32m"
c_yellow="\033[0;33m"
c_blue="\033[0;34m"
c_teal="\033[0;36m"
c_reset="\033[0m"
Stopped=""
while getopts "aynprhsme:d:" options; do
case "${options}" in case "${options}" in
a|y) UpdYes="yes" ;; a|y) AutoUp="yes" ;;
n) UpdYes="no" ;; n) AutoUp="no" ;;
r) DrUp="yes" ;; r) DRunUp="yes" ;;
p) PruneQ="yes" ;; p) AutoPrune="yes" ;;
h|*) Help ; exit 0 ;; e) Exclude=${OPTARG} ;;
m) declare c_{red,green,yellow,blue,teal,reset}="" ;;
s) Stopped="-a" ;;
d) DaysOld=${OPTARG}
if ! [[ $DaysOld =~ ^[0-9]+$ ]] ; then { printf "Days -d argument given (%s) is not a number.\n" "${DaysOld}" ; exit 2 ; } ; fi ;;
h|*) Help ; exit 2 ;;
esac esac
done done
shift "$((OPTIND-1))" shift "$((OPTIND-1))"
### Set $1 to a variable for name filtering later. self_update_git() {
SearchName="$1" cd "$ScriptWorkDir" || { printf "Path error, skipping update.\n" ; return ; }
[[ $(builtin type -P git) ]] || { printf "Git not installed, skipping update.\n" ; return ; }
### Check if required binary exists in PATH or directory: ScriptUpstream=$(git rev-parse --abbrev-ref --symbolic-full-name "@{upstream}") || { printf "Script not in git directory, choose a different method.\n" ; self_update_select ; return ; }
if [[ $(builtin type -P "regctl") ]]; then regbin="regctl" ; git fetch
elif [[ -f "./regctl" ]]; then regbin="./regctl" ; [ -n "$(git diff --name-only "$ScriptUpstream" "$ScriptName")" ] && {
else printf "%s\n" "Pulling the latest version."
read -r -p "Required dependency 'regctl' missing, do you want it downloaded? y/[n] " GetDep git pull --force
if [[ "$GetDep" =~ [yY] ]] ; then printf "%s\n" "--- starting over with the updated version ---"
### Check arch: cd - || { printf "Path error.\n" ; return ; }
case "$(uname --machine)" in exec "$ScriptPath" "${ScriptArgs[@]}" # run the new script with old arguments
x86_64|amd64) architecture="amd64" ;; exit 1 # exit the old instance
arm64|aarch64) architecture="arm64";; }
*) echo "Architecture not supported, exiting." ; exit 1;; echo "Local is already latest."
esac }
RegUrl="https://github.com/regclient/regclient/releases/latest/download/regctl-linux-$architecture" self_update_curl() {
if [[ $(builtin type -P curl) ]]; then curl -L $RegUrl > ./regctl ; chmod +x ./regctl ; regbin="./regctl" ; cp "$ScriptPath" "$ScriptPath".bak
elif [[ $(builtin type -P wget) ]]; then wget $RegUrl -O ./regctl ; chmod +x ./regctl ; regbin="./regctl" ; if [[ $(builtin type -P curl) ]]; then
curl -L $RawUrl > "$ScriptPath" ; chmod +x "$ScriptPath"
printf "%s\n" "--- starting over with the updated version ---"
exec "$ScriptPath" "${ScriptArgs[@]}" # run the new script with old arguments
exit 1 # exit the old instance
else else
printf "%s\n" "curl/wget not available - get regctl manually from the repo link, quitting." printf "curl not available - download the update manually: %s \n" "$RawUrl"
fi fi
else }
printf "%s\n" "Dependency missing, quitting." self_update_select() {
exit 1 read -r -p "Choose update procedure (or do it manually) - git/curl/[no]: " SelfUpQ
if [[ "$SelfUpQ" == "git" ]]; then self_update_git ;
elif [[ "$SelfUpQ" == "curl" ]]; then self_update_curl ;
else printf "Download it manually from the repo: %s \n\n" "$Github"
fi fi
fi
### final check if binary is correct
$regbin version &> /dev/null || { printf "%s\n" "regctl is not working - try to remove it and re-download it, exiting."; exit 1; }
### Check docker compose binary:
if docker compose version &> /dev/null ; then
DockerBin="docker compose"
elif docker-compose -v &> /dev/null; then
DockerBin="docker-compose"
elif docker -v &> /dev/null; then
printf "%s\n" "No docker compose binary available, using plain docker (Not recommended!)"
printf "%s\n" "'docker run' will ONLY update images, not the container itself."
else
printf "%s\n" "No docker binaries available, exiting."
exit 1
fi
### Numbered List -function:
options() {
num=1
for i in "${GotUpdates[@]}"; do
echo "$num) $i"
((num++))
done
} }
### Choose from list -function: ### Choose from list -function:
@@ -106,14 +118,96 @@ choosecontainers() {
printf "\n" printf "\n"
} }
datecheck() {
ImageDate=$($regbin image inspect "$RepoUrl" --format='{{.Created}}' | cut -d" " -f1 )
ImageAge=$((($(date +%s) - $(date -d "$ImageDate" +%s))/86400))
if [ $ImageAge -gt $DaysOld ] ; then
return 0
else
return 1
fi
}
### Version check & initiate self update
[[ "$VERSION" != "$LatestRelease" ]] && { printf "New version available! Local: %s - Latest: %s \n Change Notes: %s \n" "$VERSION" "$LatestRelease" "$LatestChanges" ; [[ -z "$AutoUp" ]] && self_update_select ; }
### Set $1 to a variable for name filtering later.
SearchName="$1"
### Create array of excludes
IFS=',' read -r -a Excludes <<< "$Exclude" ; unset IFS
### Check if required binary exists in PATH or directory:
if [[ $(builtin type -P "regctl") ]]; then regbin="regctl" ;
elif [[ -f "$ScriptWorkDir/regctl" ]]; then regbin="$ScriptWorkDir/regctl" ;
else
read -r -p "Required dependency 'regctl' missing, do you want it downloaded? y/[n] " GetDep
if [[ "$GetDep" =~ [yY] ]] ; then
### Check arch:
case "$(uname --machine)" in
x86_64|amd64) architecture="amd64" ;;
arm64|aarch64) architecture="arm64";;
*) echo "Architecture not supported, exiting." ; exit 1;;
esac
RegUrl="https://github.com/regclient/regclient/releases/latest/download/regctl-linux-$architecture"
if [[ $(builtin type -P curl) ]]; then curl -L $RegUrl > "$ScriptWorkDir/regctl" ; chmod +x "$ScriptWorkDir/regctl" ; regbin="$ScriptWorkDir/regctl" ;
elif [[ $(builtin type -P wget) ]]; then wget $RegUrl -O "$ScriptWorkDir/regctl" ; chmod +x "$ScriptWorkDir/regctl" ; regbin="$ScriptWorkDir/regctl" ;
else
printf "%s\n" "curl/wget not available - get regctl manually from the repo link, quitting."
fi
else
printf "%s\n" "Dependency missing, quitting."
exit 1
fi
fi
### final check if binary is correct
$regbin version &> /dev/null || { printf "%s\n" "regctl is not working - try to remove it and re-download it, exiting."; exit 1; }
### Check docker compose binary:
if docker compose version &> /dev/null ; then DockerBin="docker compose" ;
elif docker-compose -v &> /dev/null; then DockerBin="docker-compose" ;
elif docker -v &> /dev/null; then
printf "%s\n" "No docker compose binary available, using plain docker (Not recommended!)"
printf "%s\n" "'docker run' will ONLY update images, not the container itself."
else
printf "%s\n" "No docker binaries available, exiting."
exit 1
fi
### Numbered List -function:
options() {
num=1
for i in "${GotUpdates[@]}"; do
echo "$num) $i"
((num++))
done
}
### Listing typed exclusions:
if [[ -n ${Excludes[*]} ]] ; then
printf "\n%bExcluding these names:%b\n" $c_blue $c_reset
printf "%s\n" "${Excludes[@]}"
printf "\n"
fi
### Check the image-hash of every running container VS the registry ### Check the image-hash of every running container VS the registry
for i in $(docker ps --filter "name=$SearchName" --format '{{.Names}}') ; do for i in $(docker ps $Stopped --filter "name=$SearchName" --format '{{.Names}}') ; do
### Looping every item over the list of excluded names and skipping:
for e in "${Excludes[@]}" ; do [[ "$i" == "$e" ]] && continue 2 ; done
printf ". " printf ". "
RepoUrl=$(docker inspect "$i" --format='{{.Config.Image}}') RepoUrl=$(docker inspect "$i" --format='{{.Config.Image}}')
LocalHash=$(docker image inspect "$RepoUrl" --format '{{.RepoDigests}}') LocalHash=$(docker image inspect "$RepoUrl" --format '{{.RepoDigests}}')
### Checking for errors while setting the variable: ### Checking for errors while setting the variable:
if RegHash=$($regbin image digest --list "$RepoUrl" 2>/dev/null) ; then if RegHash=$($regbin image digest --list "$RepoUrl" 2>/dev/null) ; then
if [[ "$LocalHash" = *"$RegHash"* ]] ; then NoUpdates+=("$i"); else GotUpdates+=("$i"); fi if [[ "$LocalHash" = *"$RegHash"* ]] ; then
NoUpdates+=("$i")
else
if [[ -n "$DaysOld" ]] && ! datecheck ; then
NoUpdates+=("+$i ${ImageAge}d")
else
GotUpdates+=("$i")
fi
fi
else else
GotErrors+=("$i") GotErrors+=("$i")
fi fi
@@ -130,29 +224,34 @@ UpdCount="${#GotUpdates[@]}"
### List what containers got updates or not ### List what containers got updates or not
if [[ -n ${NoUpdates[*]} ]] ; then if [[ -n ${NoUpdates[*]} ]] ; then
printf "\n\033[0;32mContainers on latest version:\033[0m\n" printf "\n%bContainers on latest version:%b\n" "$c_green" "$c_reset"
printf "%s\n" "${NoUpdates[@]}" printf "%s\n" "${NoUpdates[@]}"
fi fi
if [[ -n ${GotErrors[*]} ]] ; then if [[ -n ${GotErrors[*]} ]] ; then
printf "\n\033[0;31mContainers with errors, wont get updated:\033[0m\n" printf "\n%bContainers with errors, wont get updated:%b\n" "$c_red" "$c_reset"
printf "%s\n" "${GotErrors[@]}" printf "%s\n" "${GotErrors[@]}"
fi fi
if [[ -n ${GotUpdates[*]} ]] ; then if [[ -n ${GotUpdates[*]} ]] ; then
printf "\n\033[0;33mContainers with updates available:\033[0m\n" printf "\n%bContainers with updates available:%b\n" "$c_yellow" "$c_reset"
[[ -z "$UpdYes" ]] && options || printf "%s\n" "${GotUpdates[@]}" [[ -z "$AutoUp" ]] && options || printf "%s\n" "${GotUpdates[@]}"
[[ $(type -t send_notification) == function ]] && send_notification "${GotUpdates[@]}"
fi fi
### Optionally get updates if there's any ### Optionally get updates if there's any
if [ -n "$GotUpdates" ] ; then if [ -n "$GotUpdates" ] ; then
if [ -z "$UpdYes" ] ; then if [ -z "$AutoUp" ] ; then
printf "\n\033[0;36mChoose what containers to update.\033[0m\n" printf "\n%bChoose what containers to update.%b\n" "$c_teal" "$c_reset"
choosecontainers choosecontainers
else else
SelectedUpdates=( "${GotUpdates[@]}" ) SelectedUpdates=( "${GotUpdates[@]}" )
fi fi
if [ "$UpdYes" == "${UpdYes#[Nn]}" ] ; then if [ "$AutoUp" == "${AutoUp#[Nn]}" ] ; then
NumberofUpdates="${#SelectedUpdates[@]}"
CurrentQue=0
for i in "${SelectedUpdates[@]}" for i in "${SelectedUpdates[@]}"
do do
((CurrentQue+=1))
unset CompleteConfs
ContPath=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.project.working_dir" }}') ContPath=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.project.working_dir" }}')
ContConfigFile=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.project.config_files" }}') ContConfigFile=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.project.config_files" }}')
ContName=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.service" }}') ContName=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.service" }}')
@@ -160,11 +259,11 @@ if [ -n "$GotUpdates" ] ; then
ContImage=$(docker inspect "$i" --format='{{.Config.Image}}') ContImage=$(docker inspect "$i" --format='{{.Config.Image}}')
### 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 [ "$DrUp" == "yes" ] ; then if [ "$DRunUp" == "yes" ] ; then
docker pull "$ContImage" docker pull "$ContImage"
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\033[33;1m%s\033[0m has no compose labels, probably started with docker run - \033[33;1mskipping\033[0m\n\n" "$i" 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"
fi fi
continue continue
fi fi
@@ -175,18 +274,23 @@ if [ -n "$GotUpdates" ] ; then
ComposeFile="$ContPath/$ContConfigFile" ComposeFile="$ContPath/$ContConfigFile"
fi fi
### cd to the compose-file directory to account for people who use relative volumes, eg - ${PWD}/data:data ### cd to the compose-file directory to account for people who use relative volumes, eg - ${PWD}/data:data
cd "$(dirname "${ComposeFile}")" || { echo "Path error - skipping $i" ; continue ; } cd "$ContPath" || { echo "Path error - skipping $i" ; continue ; }
printf "\n%bNow updating (%s/%s): %b%s%b\n" "$c_teal" "$CurrentQue" "$NumberofUpdates" "$c_blue" "$i" "$c_reset"
docker pull "$ContImage" docker pull "$ContImage"
### Reformat for multi-compose:
IFS=',' read -r -a Confs <<< "$ComposeFile" ; unset IFS
for conf in "${Confs[@]}"; do CompleteConfs+="-f $conf " ; done
### Check if the container got an environment file set, use it if so: ### Check if the container got an environment file set, use it if so:
if [ -n "$ContEnv" ]; then if [ -n "$ContEnv" ]; then
$DockerBin -f "$ComposeFile" --env-file "$ContEnv" up -d "$ContName" $DockerBin ${CompleteConfs[@]} --env-file "$ContEnv" up -d "$ContName" # unquoted array to allow split - rework?
else else
$DockerBin -f "$ComposeFile" up -d "$ContName" $DockerBin ${CompleteConfs[@]} up -d "$ContName" # unquoted array to allow split - rework?
fi fi
done done
printf "\033[0;32mAll done!\033[0m\n" printf "\n%bAll done!%b\n" "$c_green" "$c_reset"
[[ -z "$PruneQ" ]] && read -r -p "Would you like to prune dangling images? y/[n]: " PruneQ [[ -z "$AutoPrune" ]] && read -r -p "Would you like to prune dangling images? y/[n]: " AutoPrune
[[ "$PruneQ" =~ [yY] ]] && docker image prune -f [[ "$AutoPrune" =~ [yY] ]] && docker image prune -f
else else
printf "\nNo updates installed, exiting.\n" printf "\nNo updates installed, exiting.\n"
fi fi

27
errorCheck.sh Executable file
View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
SearchName="$1"
for i in $(docker ps --filter "name=$SearchName" --format '{{.Names}}') ; do
echo "------------ $i ------------"
ContPath=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.project.working_dir" }}')
[ -z "$ContPath" ] && { "$i has no compose labels - skipping" ; continue ; }
ContConfigFile=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.project.config_files" }}')
ContName=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.service" }}')
ContEnv=$(docker inspect "$i" --format '{{index .Config.Labels "com.docker.compose.project.environment_file" }}')
ContImage=$(docker inspect "$i" --format='{{.Config.Image}}')
if [[ $ContConfigFile = '/'* ]] ; then
ComposeFile="$ContConfigFile"
else
ComposeFile="$ContPath/$ContConfigFile"
fi
echo -e "Service name:\t\t$ContName"
echo -e "Project working dir:\t$ContPath"
echo -e "Compose files:\t\t$ComposeFile"
echo -e "Environment files:\t$ContEnv"
echo -e "Container image:\t$ContImage"
echo
echo "Mounts:"
docker inspect -f '{{ range .Mounts }}{{ .Source }}:{{ .Destination }}{{ printf "\n" }}{{ end }}' "$i"
echo
done

Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
extras/example.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

1
extras/temp Normal file
View File

@@ -0,0 +1 @@
temp

29
notify_DSM.sh Normal file
View File

@@ -0,0 +1,29 @@
### DISCLAIMER: This is a third party addition to dockcheck - best effort testing.
# Copy/rename this file to notify.sh to enable email notifications on synology DSM
# Modify to your liking - changing SendMailTo and Subject and content.
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
# change this to your usual destination for synology DSM notification emails
SendMailTo=me@mydomain.com
FromHost=$(hostname)
printf "\nSending email notification\n"
ssmtp $SendMailTo << __EOF
From: "$FromHost" <$SendMailTo>
date:$(date -R)
To: <$SendMailTo>
Subject: [diskstation] Some docker containers need to be updated
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
The following docker containers on $FromHost need to be updated:
$UpdToString
From $FromHost
__EOF
}

13
notify_generic.sh Normal file
View File

@@ -0,0 +1,13 @@
### DISCLAIMER: This is a third party addition to dockcheck - best effort testing.
# Copy/rename this file to notify.sh to enable email/text notifications
# generic sample, the "Hello World" of notification addons
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
FromHost=$(hostname)
# platform specific notification code would go here
printf "\n%bGeneric notification addon:%b" "$c_green" "$c_reset"
printf "\nThe following docker containers on %s need to be updated:\n%s\n" "$FromHost" "$UpdToString"
}