Compare commits

..

94 Commits

Author SHA1 Message Date
mag37
730dba5c3d version bump - bugfix 2024-06-08 19:44:14 +02:00
mag37
f8455d3787 bugfix for non amd64/arm64 arch.
added --foreground to timeout.
2024-06-08 19:43:12 +02:00
mag37
bbe9164554 versionbump 2024-06-03 22:53:10 +02:00
mag37
5d86c79710 Update dockcheck.sh
versionbump for fix
2024-06-03 22:50:07 +02:00
mag37
b0f8431dbf Update dockcheck.sh
timeout default fix
2024-06-03 22:49:14 +02:00
mag37
331d2cc5a7 Merge pull request #79 from mag37/timeout
Timeout @ registry check
2024-06-03 22:24:57 +02:00
mag37
35f460ed61 timeout info 2024-06-03 22:19:07 +02:00
mag37
aab63901d0 Added registry check timeout 2024-06-03 22:15:08 +02:00
mag37
5e53fabbf6 Merge pull request #76 from silverbios/HTTP-Method-Synapse
Update HTTP method in notify_matrix.sh
2024-04-29 13:18:28 +02:00
Alireza
8b3926fd5d Update notify_matrix.sh
Change the HTTP method from PUT to POST because in recent versions, only POST allowed from synapse server.
2024-04-29 13:32:30 +03:30
mag37
049413cf5a quickfix
Omitting error during git dir check.
2024-04-29 11:18:21 +02:00
mag37
b1b7f048a3 Update README.md 2024-04-24 19:46:49 +02:00
mag37
361e98c378 versionbump 2024-04-24 19:45:14 +02:00
mag37
d1ad0c68f6 Merge pull request #74 from mag37/cleanwork
cleanups, bugfixes
2024-04-24 19:42:27 +02:00
mag37
76697bc281 Re-formatted compose and env file checks.
Clearing bug for multi-env-container which would break.
Accounted for rare compose-path formatting which would break.
2024-04-22 21:12:00 +02:00
mag37
86649fb0fe re-written sorting of arrays 2024-04-22 21:08:02 +02:00
mag37
80f7dd9b82 removed unused var, cleaned prints 2024-04-22 21:02:13 +02:00
mag37
959f636152 Update README.md 2024-03-31 20:41:38 +02:00
mag37
d1bf9256fa added topic
Added topic variable, set to 0 if not used.
2024-03-27 21:52:02 +01:00
mag37
5513e13109 Update README.md 2024-03-27 21:49:23 +01:00
mag37
f0b2f7eab7 added matrix. 2024-02-11 16:13:23 +01:00
mag37
44a90d5e62 Merge pull request #69 from silverbios/main
Added Matrix-Synapse notification Template
2024-02-10 18:36:23 +01:00
Alireza
c63643dde8 Update Example URL 2024-02-10 21:01:42 +03:30
Alireza
b2767864ab update comments 2024-02-10 20:55:32 +03:30
Alireza
c09e813aad Update notify_matrix.sh
Fix Msgbody variable syntax
2024-02-10 20:47:36 +03:30
Alireza
0b52dd50b6 Create notify_matrix.sh
add notification template for matrix-synapse
2024-02-10 03:03:07 +03:30
mag37
b86df76fb6 tidying some
Rephrased and reordered readme.

Removed "coded by human" - I cant know what contributors use :)
2024-02-04 21:15:21 +01:00
mag37
b8450aa774 added telegram 2024-02-02 21:39:00 +01:00
mag37
aa9421adda Merge pull request #68 from mag37/selfup_cleanup
selfupdate rework, -v option, syntax cleanup
2024-02-02 21:27:43 +01:00
mag37
f853bfd318 typos 2024-02-02 21:21:56 +01:00
mag37
292b3e1a32 Version bump + readme 2024-02-02 21:18:19 +01:00
mag37
4c26768374 Added -v option, prints version 2024-02-02 20:52:01 +01:00
mag37
b7f8b67232 Merge pull request #65 from Nionor/main
Added Telegram template.
2024-02-02 20:47:42 +01:00
Nionor
a63a509bd2 Add files via upload
Added Telegram template.
2024-02-02 16:00:04 +01:00
mag37
5ed3b90ca4 syntax cleanup 2024-02-01 20:19:04 +01:00
mag37
78d11d1b37 Self update rework
Now just y/n and checking if it's the right git directory, else
curl/wget.
2024-01-31 21:33:14 +01:00
mag37
dfe6cf3e08 arithmetic formatting 2024-01-28 20:08:17 +01:00
mag37
3bc7352b54 Bugfix zerodivision -s option 2024-01-28 15:43:33 +01:00
mag37
1470055329 Merge pull request #62 from mag37/env-rework
Reworked --env-file logic.
2024-01-27 09:41:41 +01:00
mag37
904cd508d1 --env-file version bump 2024-01-27 09:39:37 +01:00
mag37
8ee1366505 typo 2024-01-26 21:53:15 +01:00
mag37
c063b09003 reworked --env-file logic 2024-01-26 20:45:32 +01:00
mag37
ea096b5dbc Merge pull request #58 from thomas-mc-work/patch-1
modified update notification
2024-01-24 22:17:37 +01:00
Thomas McWork
038a30b628 add colors to version update notice 2024-01-24 21:28:53 +01:00
Thomas McWork
24d82d74b3 modified update notification
Slightly changed the notation of the local/latest version to simplify the visual impression. But it's a matter of taste.
2024-01-24 21:22:49 +01:00
mag37
8ecc354663 Update README.md
link formatting
2024-01-24 19:49:41 +01:00
mag37
4a2daa9899 Merge pull request #57 from mag37/new_labels-force
Labels support and -f force option.
2024-01-24 19:44:57 +01:00
mag37
ae8a232a1a Merge branch 'main' into new_labels-force 2024-01-24 19:44:29 +01:00
mag37
abbb924867 labels and -f option 2024-01-24 19:37:15 +01:00
mag37
05d21a707a added readme about labels 2024-01-21 20:30:05 +01:00
mag37
4817d75d94 pushbullet template version bump. 2024-01-21 20:30:05 +01:00
mag37
32f6d428d3 pushbullet info 2024-01-21 20:30:05 +01:00
mag37
4a8afde790 Added pushbullet template.
Suggested and contributed by [@arpanghosh8453](https://github.com/arpanghosh8453)
2024-01-21 20:30:05 +01:00
mag37
ae53fe2cc7 pushbullet template version bump. 2024-01-20 10:38:11 +01:00
mag37
722fb90ce2 pushbullet info 2024-01-20 10:36:41 +01:00
mag37
18947a462d Added pushbullet template.
Suggested and contributed by [@arpanghosh8453](https://github.com/arpanghosh8453)
2024-01-20 10:33:32 +01:00
mag37
0887025412 Added functionality for labels and force restarts. 2024-01-18 20:59:55 +01:00
mag37
e331dda080 Added a simple progress bar 2024-01-17 20:26:18 +01:00
mag37
5b87072b11 version bump, ntfy.sh and errors on registry fail 2024-01-15 20:53:51 +01:00
mag37
6b2af36841 Added ntfy.sh template 2024-01-15 20:47:51 +01:00
mag37
bad7bfdf86 Added ntfy.sh template 2024-01-15 20:47:04 +01:00
mag37
2a604ff8bd Added error messages on registry fail. 2024-01-15 20:27:45 +01:00
mag37
e1b26fb772 cleanup.md 2024-01-14 20:32:46 +01:00
mag37
9e4b445c50 Added url 2024-01-13 20:34:34 +01:00
mag37
55323b7562 added apprise quickstart 2024-01-13 19:53:50 +01:00
mag37
51c8a7a05d added apprise quickstart + images 2024-01-13 19:45:03 +01:00
mag37
6a3c78d907 cleanup 2024-01-07 14:26:35 +01:00
mag37
4b6173683b Merge pull request #55 from freekngdom/main
ignore the auto-installed regctl
2024-01-07 08:28:06 +01:00
Eric
fb4e9fd521 ignore the auto-installed regctl 2024-01-06 16:17:37 -08:00
mag37
e00bfb1d21 typo 2024-01-06 20:52:03 +01:00
mag37
77d7340e5b Apprise & New option -i
Added new option -i, inform - to send notifications.
2024-01-06 20:45:34 +01:00
mag37
82f6442933 modified apprise-notify 2024-01-06 20:33:21 +01:00
mag37
6c37e255fb formatting 2024-01-06 17:30:00 +01:00
mag37
61e247f0ea formatting 2024-01-06 17:29:35 +01:00
mag37
b540ffa119 fixed link 2024-01-06 08:44:07 +01:00
mag37
edf6d5bd72 added architecture workaround 2024-01-06 08:40:26 +01:00
mag37
92ba4a184e edits 2024-01-06 07:47:41 +01:00
mag37
47ebb75691 Added option -i 2024-01-06 00:11:33 +01:00
mag37
3053304356 fixes 2024-01-05 21:51:43 +01:00
mag37
63b35ab2c3 formatting 2024-01-05 21:49:36 +01:00
mag37
45dbe65c28 typos 2024-01-05 21:47:14 +01:00
mag37
ae5cd4d86e Updated README 2024-01-05 21:45:13 +01:00
mag37
58bb55c79a added .gitignore to safeguard users custom notify.sh 2024-01-05 21:17:30 +01:00
mag37
fe31aed33c Edited generic template 2024-01-05 20:55:08 +01:00
mag37
5485a3b2cf Added apprise notify template. 2024-01-05 20:42:53 +01:00
mag37
94fd34478b Added ssmtp notify template. 2024-01-05 20:42:25 +01:00
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
16 changed files with 576 additions and 100 deletions

4
.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
# ignore users custom notify.sh
/notify.sh
# ignore the auto-installed regctl
regctl

163
README.md
View File

@@ -2,7 +2,6 @@
<img src="extras/dockcheck_logo_by_booYah187.png" width="160" title="dockcheck"> <img src="extras/dockcheck_logo_by_booYah187.png" width="160" title="dockcheck">
</p> </p>
<p align="center"> <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"> <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> <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"> <img src="https://img.shields.io/github/v/tag/mag37/dockcheck?style=flat-square&label=release" alt="release">
@@ -11,51 +10,50 @@
<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> <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> </p>
<h3 align="center">A script checking updates for docker images <b>without pulling</b><br>Then selectively auto-update containers.</h3> <h3 align="center">CLI tool to automate docker image updates. <br>No <b>pre-pull</b>, selective, optional notifications and prune when done.</h3>
<h4 align="center">With features like excluding specific containers, filter by name, auto-prune dangling images and more.</h4</h3> <h2 align="center">Now with simple notification integrations!</h2>
<h4 align="center">With features like excluding specific containers, custom container labels, auto-prune when done and more.</h4>
### :bell: Recent changes
- **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.
___ ___
## :bell: Changelog
## Dependencies - **v0.4.3**: Added timeout option to skip container if registry check takes too long (10s default).
Running docker (duh) and compose, either standalone or plugin. - **v0.4.1**: Syntax and logic cleanups, bugfixes on multi compose and env-files.
[`regclient/regctl`](https://github.com/regclient/regclient) (Licensed under [Apache-2.0 License](http://www.apache.org/licenses/LICENSE-2.0)) - **v0.4.0**: Reworked selfupdate (auto git/curl/wget), general syntax cleanup, added -v for version.
User will be prompted to download `regctl` if not in `PATH` or `PWD` - **v0.3.8**: Fixed `--env-file` logic to work with multiple env-files.
- **v0.3.7**: Added support for [labels](#bookmark-labels), added the `-f` option (force restart stack).
- **v0.3.6**: Added pushbullet template.
- **v0.3.5**: Added a simple progress bar for the registry checkup.
___ ___
![](extras/example.gif) ![](extras/example.gif)
## `dockcheck.sh` ## :mag_right: `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 -y -d 10 -e nextcloud,heimdall Example: dockcheck.sh -y -d 10 -e nextcloud,heimdall
Options: Options:"
-h Print this Help. -a|y Automatic updates, without interaction.
-a|y Automatic updates, without interaction. -d N Only update to new images that are N+ days old. Lists too recent with +prefix and age. 2xSlower.
-n No updates, only checking availability. -e X Exclude containers, separated by comma.
-e X Exclude containers, separated by comma. -f Force stack restart after update. Caution: restarts once for every updated container within stack.
-d N Only update to new images that are N+ days old. Lists too recent with +prefix. 2xSlower. -h Print this Help.
-p Auto-Prune dangling images after update. -i Inform - send a preconfigured notification.
-r Allow updating images for docker run, wont update the container. -l Only update if label is set. See readme.
-s Include stopped containers in the check. (Logic: docker ps -a). -m Monochrome mode, no printf color codes.
-n No updates, only checking availability.
-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).
-t Set a timeout (in seconds) per container for registry checkups, 10 is default.
-v Prints current version.
``` ```
Basic example:
### Basic example:
``` ```
$ ./dockcheck.sh $ ./dockcheck.sh
. . . . . .
@@ -74,24 +72,103 @@ 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.
### :warning: `-r flag` disclaimer and warning ___
**Wont auto-update the containers, only their images. (compose is recommended)**
`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.
### :hammer: Known issues ## :nut_and_bolt: Dependencies
- 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))
- User will be prompted to download `regctl` if not in `PATH` or `PWD`.
- regctl requires `amd64/arm64` - see [workaround](#roller_coaster-workaround-for-non-amd64--arm64) if other architecture is used.
## :tent: Install Instructions
Download the script to a directory in **PATH**, I'd suggest using `~/.local/bin` as that's usually in **PATH**.
```sh
# basic example with curl:
curl -L https://raw.githubusercontent.com/mag37/dockcheck/main/dockcheck.sh -o ~/.local/bin/dockcheck.sh
chmod +x ~/.local/bin/dockcheck.sh
# or oneliner with wget:
wget -O ~/.local/bin/dockcheck.sh "https://raw.githubusercontent.com/mag37/dockcheck/main/dockcheck.sh" && chmod +x ~/.local/bin/dockcheck.sh
```
Then call the script anywhere with just `dockcheck.sh`.
Add preferred `notify.sh`-template to the same directory - this will not be touched by the scripts self-update function.
## :loudspeaker: Notifications
Trigger with the `-i` flag.
Run it scheduled with `-ni` to only get notified when there's updates available!
Use a `notify_X.sh` template file, copy it to `notify.sh`, modify it to your needs!
Current templates:
- Synology [DSM](https://www.synology.com/en-global/dsm)
- Email with [sSMTP](https://wiki.debian.org/sSMTP)
- Apprise (with it's [multitude](https://github.com/caronc/apprise#supported-notifications) of notifications)
- both native [caronc/apprise](https://github.com/caronc/apprise) and the standalone [linuxserver/docker-apprise-api](https://github.com/linuxserver/docker-apprise-api)
- Read the [QuickStart](extras/apprise_quickstart.md)
- [ntfy.sh](https://ntfy.sh/) - HTTP-based pub-sub notifications.
- [Pushbullet](https://www.pushbullet.com/) - connecting different devices with cross-platform features.
- [Telegram](https://telegram.org/) - Telegram chat API.
- [Matrix-Synapse](https://github.com/element-hq/synapse) - [Matrix](https://matrix.org/), open, secure, decentralised communication.
Further additions are welcome - suggestions or PR!
<sub><sup>Initiated and first contributed by [yoyoma2](https://github.com/yoyoma2).</sup></sub>
## :bookmark: Labels
Optionally add labels to compose-files. Currently these are the usable labels:
```
labels:
mag37.dockcheck.restart-stack: true
mag37.dockcheck.update: true
```
- `mag37.dockcheck.restart-stack: true` works instead of the `-f` option, forcing stop+restart on the whole compose-stack (Caution: Will restart on every updated container within stack).
- `mag37.dockcheck.update: true` will when used with the `-l` option only update containers with this label and skip the rest. Will still list updates as usual.
## :roller_coaster: Workaround for non **amd64** / **arm64**
`regctl` provides binaries for amd64/arm64, to use on other architecture you could try this workaround.
Run regctl in a container wrapped in a shell script. Copied from [regclient/docs/install.md](https://github.com/regclient/regclient/blob/main/docs/install.md):
```sh
cat >regctl <<EOF
#!/bin/sh
opts=""
case "\$*" in
"registry login"*) opts="-t";;
esac
docker container run \$opts -i --rm --net host \\
-u "\$(id -u):\$(id -g)" -e HOME -v \$HOME:\$HOME \\
-v /etc/docker/certs.d:/etc/docker/certs.d:ro \\
ghcr.io/regclient/regctl:latest "\$@"
EOF
chmod 755 regctl
```
Test it with `./regctl --help` and then either add the file to the same path as *dockcheck.sh* or in your path (eg. `~/.local/bin/regctl`).
## :guardsman: Function to auth with docker hub before running
**Example** - Change names, paths, and remove cat+password flag if you rather get prompted:
```sh
function dchk {
cat ~/pwd.txt | docker login --username YourUser --password-stdin
~/dockcheck.sh "$@"
}
```
## :hammer: Known issues
- 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 respecting `--profile` options when re-creating the container.
- Not working well with containers created by Portainer. - Not working well with containers created by Portainer.
## `dc_brief.sh` ## :warning: `-r flag` disclaimer and warning
Just a brief, slimmed down version of the script to only print what containers got updates, no updates or errors. **Wont auto-update the containers, only their images. (compose is recommended)**
`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.
# License ## :scroll: License
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.
### :floppy_disk: The [story](https://mag37.org/posts/project_dockcheck/) behind it. 1 year in retrospect.
___ ___
### Check out a spinoff project: [Palleri/DCW](https://github.com/Palleri/DCW) for a WebUI-front with exporters and notifications.
## Special Thanks ## Special Thanks
- :bison: [t0rnis](https://github.com/t0rnis) - :bison: [t0rnis](https://github.com/t0rnis)

View File

@@ -1,19 +1,19 @@
#!/usr/bin/env bash #!/usr/bin/env bash
VERSION="v0.3.1" VERSION="v0.4.4"
### ChangeNotes: Added feature (-m) Monochrome Mode, no printf color codes. ### ChangeNotes: Bugfix for non amd64/arm64 arch with new timeout function.
Github="https://github.com/mag37/dockcheck" Github="https://github.com/mag37/dockcheck"
RawUrl="https://raw.githubusercontent.com/mag37/dockcheck/main/dockcheck.sh" RawUrl="https://raw.githubusercontent.com/mag37/dockcheck/main/dockcheck.sh"
### Variables for self updating ### Variables for self updating
ScriptArgs=( "$@" ) ScriptArgs=( "$@" )
ScriptPath="$(readlink -f "$0")" ScriptPath="$(readlink -f "$0")"
ScriptName="$(basename "$ScriptPath")"
ScriptWorkDir="$(dirname "$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 $RawUrl | sed -n "/VERSION/s/VERSION=//p" | tr -d '"')" LatestRelease="$(curl -s -r 0-50 $RawUrl | sed -n "/VERSION/s/VERSION=//p" | tr -d '"')"
LatestChanges="$(curl -s -r 0-200 $RawUrl | sed -n "/ChangeNotes/s/### ChangeNotes: //p")" LatestChanges="$(curl -s -r 0-200 $RawUrl | sed -n "/ChangeNotes/s/### ChangeNotes: //p")"
### 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]"
@@ -23,12 +23,17 @@ 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 "-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 "-e X Exclude containers, separated by comma."
echo "-f Force stack restart after update. Caution: restarts once for every updated container within stack."
echo "-h Print this Help." echo "-h Print this Help."
echo "-i Inform - send a preconfigured notification."
echo "-l Only update if label is set. See readme."
echo "-m Monochrome mode, no printf color codes." 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)" echo "-s Include stopped containers in the check. (Logic: docker ps -a)."
echo "-t Set a timeout (in seconds) per container for registry checkups, 10 is default."
echo "-v Prints current version."
} }
### Colors: ### Colors:
@@ -39,17 +44,22 @@ c_blue="\033[0;34m"
c_teal="\033[0;36m" c_teal="\033[0;36m"
c_reset="\033[0m" c_reset="\033[0m"
Timeout=10
Stopped="" Stopped=""
while getopts "aynprhsme:d:" options; do while getopts "aynpfrhlisvme:d:t:" options; do
case "${options}" in case "${options}" in
a|y) AutoUp="yes" ;; a|y) AutoUp="yes" ;;
n) AutoUp="no" ;; n) AutoUp="no" ;;
r) DRunUp="yes" ;; r) DRunUp="yes" ;;
p) AutoPrune="yes" ;; p) AutoPrune="yes" ;;
l) OnlyLabel=true ;;
f) ForceRestartStacks=true ;;
i) [ -s "$ScriptWorkDir"/notify.sh ] && { source "$ScriptWorkDir"/notify.sh ; Notify="yes" ; } ;;
e) Exclude=${OPTARG} ;; e) Exclude=${OPTARG} ;;
m) declare c_{red,green,yellow,blue,teal,reset}="" ;; m) declare c_{red,green,yellow,blue,teal,reset}="" ;;
s) Stopped="-a" ;; s) Stopped="-a" ;;
t) Timeout="${OPTARG}" ;;
v) printf "%s\n" "$VERSION" ; exit 0 ;;
d) DaysOld=${OPTARG} d) DaysOld=${OPTARG}
if ! [[ $DaysOld =~ ^[0-9]+$ ]] ; then { printf "Days -d argument given (%s) is not a number.\n" "${DaysOld}" ; exit 2 ; } ; fi ;; if ! [[ $DaysOld =~ ^[0-9]+$ ]] ; then { printf "Days -d argument given (%s) is not a number.\n" "${DaysOld}" ; exit 2 ; } ; fi ;;
h|*) Help ; exit 2 ;; h|*) Help ; exit 2 ;;
@@ -57,37 +67,35 @@ while getopts "aynprhsme:d:" options; do
done done
shift "$((OPTIND-1))" shift "$((OPTIND-1))"
self_update_git() {
cd "$ScriptWorkDir" || { printf "Path error, skipping update.\n" ; return ; }
[[ $(builtin type -P git) ]] || { printf "Git not installed, skipping update.\n" ; return ; }
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 ; }
git fetch
[ -n "$(git diff --name-only "$ScriptUpstream" "$ScriptName")" ] && {
printf "%s\n" "Pulling the latest version."
git pull --force
printf "%s\n" "--- starting over with the updated version ---"
cd - || { printf "Path error.\n" ; return ; }
exec "$ScriptPath" "${ScriptArgs[@]}" # run the new script with old arguments
exit 1 # exit the old instance
}
echo "Local is already latest."
}
self_update_curl() { self_update_curl() {
cp "$ScriptPath" "$ScriptPath".bak cp "$ScriptPath" "$ScriptPath".bak
if [[ $(builtin type -P curl) ]]; then if [[ $(builtin type -P curl) ]]; then
curl -L $RawUrl > "$ScriptPath" ; chmod +x "$ScriptPath" curl -L $RawUrl > "$ScriptPath" ; chmod +x "$ScriptPath"
printf "%s\n" "--- starting over with the updated version ---" printf "\n%s\n" "--- starting over with the updated version ---"
exec "$ScriptPath" "${ScriptArgs[@]}" # run the new script with old arguments
exit 1 # exit the old instance
elif [[ $(builtin type -P wget) ]]; then
wget $RawUrl -O "$ScriptPath" ; chmod +x "$ScriptPath"
printf "\n%s\n" "--- starting over with the updated version ---"
exec "$ScriptPath" "${ScriptArgs[@]}" # run the new script with old arguments exec "$ScriptPath" "${ScriptArgs[@]}" # run the new script with old arguments
exit 1 # exit the old instance exit 1 # exit the old instance
else else
printf "curl not available - download the update manually: %s \n" "$RawUrl" printf "curl/wget not available - download the update manually: %s \n" "$Github"
fi fi
} }
self_update_select() {
read -r -p "Choose update procedure (or do it manually) - git/curl/[no]: " SelfUpQ self_update() {
if [[ "$SelfUpQ" == "git" ]]; then self_update_git ; cd "$ScriptWorkDir" || { printf "Path error, skipping update.\n" ; return ; }
elif [[ "$SelfUpQ" == "curl" ]]; then self_update_curl ; if [[ $(builtin type -P git) ]] && [[ "$(git ls-remote --get-url 2>/dev/null)" =~ .*"mag37/dockcheck".* ]] ; then
else printf "Download it manually from the repo: %s \n\n" "$Github" printf "\n%s\n" "Pulling the latest version."
git pull --force || { printf "Git error, manually pull/clone.\n" ; return ; }
printf "\n%s\n" "--- starting over with the updated version ---"
cd - || { printf "Path error.\n" ; return ; }
exec "$ScriptPath" "${ScriptArgs[@]}" # run the new script with old arguments
exit 1 # exit the old instance
else
cd - || { printf "Path error.\n" ; return ; }
self_update_curl
fi fi
} }
@@ -118,17 +126,34 @@ choosecontainers() {
datecheck() { datecheck() {
ImageDate=$($regbin image inspect "$RepoUrl" --format='{{.Created}}' | cut -d" " -f1 ) ImageDate=$($regbin image inspect "$RepoUrl" --format='{{.Created}}' | cut -d" " -f1 )
ImageAge=$((($(date +%s) - $(date -d "$ImageDate" +%s))/86400)) ImageAge=$(( ( $(date +%s) - $(date -d "$ImageDate" +%s) )/86400 ))
if [ $ImageAge -gt $DaysOld ] ; then if [ "$ImageAge" -gt "$DaysOld" ] ; then
return 0 return 0
else else
return 1 return 1
fi fi
} }
progress_bar() {
QueCurrent="$1"
QueTotal="$2"
((Percent=100*QueCurrent/QueTotal))
((Complete=50*Percent/100)) # change first number for width (50)
((Left=50-Complete)) # change first number for width (50)
BarComplete=$(printf "%${Complete}s" | tr " " "#")
BarLeft=$(printf "%${Left}s" | tr " " "-")
[[ "$QueTotal" == "$QueCurrent" ]] || printf "\r[%s%s] %s/%s " "$BarComplete" "$BarLeft" "$QueCurrent" "$QueTotal"
[[ "$QueTotal" == "$QueCurrent" ]] && printf "\r[%b%s%b] %s/%s \n" "$c_teal" "$BarComplete" "$c_reset" "$QueCurrent" "$QueTotal"
}
### Version check & initiate self update ### 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 ; } 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"
if [[ -z "$AutoUp" ]] ; then
read -r -p "Would you like to update? y/[n]: " SelfUpdate
[[ "$SelfUpdate" =~ [yY] ]] && self_update
fi
fi
### Set $1 to a variable for name filtering later. ### Set $1 to a variable for name filtering later.
SearchName="$1" SearchName="$1"
@@ -183,20 +208,25 @@ done
### Listing typed exclusions: ### Listing typed exclusions:
if [[ -n ${Excludes[*]} ]] ; then if [[ -n ${Excludes[*]} ]] ; then
printf "\n%bExcluding these names:%b\n" $c_blue $c_reset printf "\n%bExcluding these names:%b\n" "$c_blue" "$c_reset"
printf "%s\n" "${Excludes[@]}" printf "%s\n" "${Excludes[@]}"
printf "\n" printf "\n"
fi fi
# Variables for progress_bar function
DocCount=$(docker ps $Stopped --filter "name=$SearchName" --format '{{.Names}}' | wc -l)
RegCheckQue=0
### 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 $Stopped --filter "name=$SearchName" --format '{{.Names}}') ; do for i in $(docker ps $Stopped --filter "name=$SearchName" --format '{{.Names}}') ; do
((RegCheckQue+=1))
progress_bar "$RegCheckQue" "$DocCount"
### Looping every item over the list of excluded names and skipping: ### Looping every item over the list of excluded names and skipping:
for e in "${Excludes[@]}" ; do [[ "$i" == "$e" ]] && continue 2 ; done for e in "${Excludes[@]}" ; do [[ "$i" == "$e" ]] && continue 2 ; done
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=$(timeout --foreground ${Timeout} $regbin image digest --list "$RepoUrl" 2>&1) ; then
if [[ "$LocalHash" = *"$RegHash"* ]] ; then if [[ "$LocalHash" = *"$RegHash"* ]] ; then
NoUpdates+=("$i") NoUpdates+=("$i")
else else
@@ -207,16 +237,16 @@ for i in $(docker ps $Stopped --filter "name=$SearchName" --format '{{.Names}}')
fi fi
fi fi
else else
GotErrors+=("$i") # Here the RegHash is the result of an error code.
GotErrors+=("$i - ${RegHash}")
fi fi
done done
### Sort arrays alphabetically ### Sort arrays alphabetically
IFS=$'\n' readarray -td '' NoUpdates < <(printf '%s\0' "${NoUpdates[@]}" | sort -z -n)
NoUpdates=($(sort <<<"${NoUpdates[*]}")) readarray -td '' GotUpdates < <(printf '%s\0' "${GotUpdates[@]}" | sort -z -n)
GotUpdates=($(sort <<<"${GotUpdates[*]}")) readarray -td '' GotErrors < <(printf '%s\0' "${GotErrors[@]}" | sort -z -n)
GotErrors=($(sort <<<"${GotErrors[*]}"))
unset IFS
### Define how many updates are available ### Define how many updates are available
UpdCount="${#GotUpdates[@]}" UpdCount="${#GotUpdates[@]}"
@@ -228,10 +258,12 @@ fi
if [[ -n ${GotErrors[*]} ]] ; then if [[ -n ${GotErrors[*]} ]] ; then
printf "\n%bContainers with errors, wont get updated:%b\n" "$c_red" "$c_reset" printf "\n%bContainers with errors, wont get updated:%b\n" "$c_red" "$c_reset"
printf "%s\n" "${GotErrors[@]}" printf "%s\n" "${GotErrors[@]}"
printf "%binfo:%b 'unauthorized' often means not found in a public registry.\n" "$c_blue" "$c_reset"
fi fi
if [[ -n ${GotUpdates[*]} ]] ; then if [[ -n ${GotUpdates[*]} ]] ; then
printf "\n%bContainers with updates available:%b\n" "$c_yellow" "$c_reset" printf "\n%bContainers with updates available:%b\n" "$c_yellow" "$c_reset"
[[ -z "$AutoUp" ]] && options || printf "%s\n" "${GotUpdates[@]}" [[ -z "$AutoUp" ]] && options || printf "%s\n" "${GotUpdates[@]}"
[[ -n "$Notify" ]] && { [[ $(type -t send_notification) == function ]] && send_notification "${GotUpdates[@]}" || printf "Could not source notification function.\n" ; }
fi fi
### Optionally get updates if there's any ### Optionally get updates if there's any
@@ -254,6 +286,8 @@ if [ -n "$GotUpdates" ] ; then
ContName=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.service" }}') 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" }}') ContEnv=$(docker inspect "$i" --format '{{index .Config.Labels "com.docker.compose.project.environment_file" }}')
ContImage=$(docker inspect "$i" --format='{{.Config.Image}}') ContImage=$(docker inspect "$i" --format='{{.Config.Image}}')
ContUpdateLabel=$(docker inspect "$i" --format '{{ index .Config.Labels "mag37.dockcheck.update" }}')
ContRestartStack=$(docker inspect "$i" --format '{{ index .Config.Labels "mag37.dockcheck.restart-stack" }}')
### 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" == "yes" ] ; then if [ "$DRunUp" == "yes" ] ; then
@@ -264,25 +298,25 @@ if [ -n "$GotUpdates" ] ; then
fi fi
continue continue
fi fi
### Checking if "com.docker.compose.project.config_files" returns the full path to the config file or just the file name
if [[ $ContConfigFile = '/'* ]] ; then
ComposeFile="$ContConfigFile"
else
ComposeFile="$ContPath/$ContConfigFile"
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 "$ContPath" || { 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" ## Reformatting path + multi compose
docker pull "$ContImage" if [[ $ContConfigFile = '/'* ]] ; then
### Reformat for multi-compose: CompleteConfs=$(for conf in ${ContConfigFile//,/ } ; do printf -- "-f %s " "$conf"; done)
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:
if [ -n "$ContEnv" ]; then
$DockerBin ${CompleteConfs[@]} --env-file "$ContEnv" up -d "$ContName" # unquoted array to allow split - rework?
else else
$DockerBin ${CompleteConfs[@]} up -d "$ContName" # unquoted array to allow split - rework? CompleteConfs=$(for conf in ${ContConfigFile//,/ } ; do printf -- "-f %s/%s " "$ContPath" "$conf"; done)
fi
printf "\n%bNow updating (%s/%s): %b%s%b\n" "$c_teal" "$CurrentQue" "$NumberofUpdates" "$c_blue" "$i" "$c_reset"
### Checking if Label Only -option is set, and if container got the label
[[ "$OnlyLabel" == true ]] && { [[ "$ContUpdateLabel" != true ]] && { echo "No update label, skipping." ; continue ; } }
docker pull "$ContImage"
### Check if the container got an environment file set and reformat it
if [ -n "$ContEnv" ]; then ContEnvs=$(for env in ${ContEnv//,/ } ; do printf -- "--env-file %s " "$env"; done) ; fi
### Check if the whole stack should be restarted
if [[ "$ContRestartStack" == true ]] || [[ "$ForceRestartStacks" == true ]] ; then
$DockerBin ${CompleteConfs} stop ; $DockerBin ${CompleteConfs} ${ContEnvs} up -d
else
$DockerBin ${CompleteConfs} ${ContEnvs} up -d ${ContName}
fi fi
done done
printf "\n%bAll done!%b\n" "$c_green" "$c_reset" printf "\n%bAll done!%b\n" "$c_green" "$c_reset"
@@ -296,3 +330,4 @@ else
fi fi
exit 0 exit 0

BIN
extras/apprise-ex1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

BIN
extras/apprise-ex2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

View File

@@ -0,0 +1,130 @@
# A small guide on getting started with Apprise notifications.
## Standalone docker container: [linuxserver/apprise-api](https://hub.docker.com/r/linuxserver/apprise-api)
Set up the docker compose as preferred:
```yaml
---
version: "2.1"
services:
apprise-api:
image: lscr.io/linuxserver/apprise-api:latest
container_name: apprise-api
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
volumes:
- /path/to/apprise-api/config:/config
ports:
- 8000:8000
restart: unless-stopped
```
Then browse to the webui.
![](apprise-ex1.png)
Here you'll click **Configuration Manager**, read the overview and then click on **Configuration**.
Under **Configuration** you'll craft/paste your notification config.
![](apprise-ex2.png)
The simplest way is just paste the url's as is (like in the example above).
There are many ways to customize with tags, groups, json and more. Read [caronc/apprise-api](https://github.com/caronc/apprise-api) for more info!
Look at the [apprise wiki: Notification Services](https://github.com/caronc/apprise/wiki) for more info about how the url syntax for different services works.
You can also use the [caronc/apprise-api](https://github.com/caronc/apprise-api) to host the api as a frontend to an already existing **Apprise**-setup on the host.
### Customize the **notify.sh** file.
After you're done with the setup of the container and tried your notifications, you can copy the `notify_apprise.sh` file to `notify.sh` and start editing it.
Comment out/remove the bare metal apprise-command (starting with `apprise -vv -t...`).
Uncomment and edit the `AppriseURL` variable and *curl* line
It should look something like this when curling the API:
```bash
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
FromHost=$(hostname)
printf "\nSending Apprise notification\n"
MessageTitle="$FromHost - updates available."
# Setting the MessageBody variable here.
read -d '\n' MessageBody << __EOF
Containers on $FromHost with updates available:
$UpdToString
__EOF
AppriseURL="http://IP.or.mydomain.tld:8000/notify/apprise"
curl -X POST -F "title=$MessageTitle" -F "body=$MessageBody" -F "tags=all" $AppriseURL
}
```
That's all!
___
___
## On host installed **Apprise**
Follow the official guide on [caronc/apprise](https://github.com/caronc/apprise)!
### A brief, basic "get started"
- Install **apprise**
- python package `pip install apprise`
- packaged in EPEL/Fedora `dnf install apprise`
- packaged in AUR `[yay/pikaur/paru/other] apprise`
- Create a config file with your notification credentials (source of notifications):
```ini
mailto://user:password@yahoo.com
slack://token_a/token_b/token_c
kodi://example.com
```
Then either source the notifications with `-c=/path/to/config/apprise` or store them in *PATH* to skip referencing (`~/.apprise` or `~/.config/apprise`).
- Test apprise with a single notification:
- `apprise -vv -t 'test title' -b 'test notification body' 'mailto://myemail:mypass@gmail.com'`
- Set up your notification URL's and test them.
- Look at the [apprise wiki: Notification Services](https://github.com/caronc/apprise/wiki) for more info about how the url syntax for different services works.
### When done, customize the **notify.sh** file.
After you're done with the setup of the container and tried your notifications, you can copy the `notify_apprise.sh` file to `notify.sh` and start editing it.
Replace the url's corresponding to the services you've configured.
```bash
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
FromHost=$(hostname)
printf "\nSending Apprise notification\n"
MessageTitle="$FromHost - updates available."
# Setting the MessageBody variable here.
read -d '\n' MessageBody << __EOF
Containers on $FromHost with updates available:
$UpdToString
__EOF
# Modify to fit your setup:
apprise -vv -t "$MessageTitle" -b "$MessageBody" \
mailto://myemail:mypass@gmail.com \
mastodons://{token}@{host} \
pbul://o.gn5kj6nfhv736I7jC3cj3QLRiyhgl98b \
tgram://{bot_token}/{chat_id}/
}
```
That's all!
___
___

34
notify_DSM.sh Normal file
View File

@@ -0,0 +1,34 @@
### 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
# DSM Notification Email has to be configured manually.
# Modify to your liking - changing SendMailTo and Subject and content.
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
FromHost=$(hostname)
# User variables:
# change this to your usual destination for synology DSM notification emails
SendMailTo="me@mydomain.com"
SubjectTag="diskstation"
printf "\nSending email notification.\n"
ssmtp $SendMailTo << __EOF
From: "$FromHost" <$SendMailTo>
date:$(date -R)
To: <$SendMailTo>
Subject: [$SubjectTag] Updates available on $FromHost
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
The following containers on $FromHost have updates available:
$UpdToString
From $FromHost
__EOF
}

37
notify_apprise.sh Normal file
View File

@@ -0,0 +1,37 @@
### DISCLAIMER: This is a third party addition to dockcheck - best effort testing.
#
# Copy/rename this file to notify.sh to enable the notification snippet.
# Required receiving services must already be set up.
# Modify to fit your setup - if API, set AppriseURL to your Apprise ip/domain.
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
FromHost=$(hostname)
printf "\nSending Apprise notification\n"
MessageTitle="$FromHost - updates available."
# Setting the MessageBody variable here.
read -d '\n' MessageBody << __EOF
Containers on $FromHost with updates available:
$UpdToString
__EOF
# Modify to fit your setup:
apprise -vv -t "$MessageTitle" -b "$MessageBody" \
mailto://myemail:mypass@gmail.com \
mastodons://{token}@{host} \
pbul://o.gn5kj6nfhv736I7jC3cj3QLRiyhgl98b \
tgram://{bot_token}/{chat_id}/
### If you use the Apprise-API - Comment out the apprise command above.
### Uncomment the AppriseURL and the curl-line below:
# AppriseURL="http://apprise.mydomain.tld:1234/notify/apprise"
# curl -X POST -F "title=$MessageTitle" -F "body=$MessageBody" -F "tags=all" $AppriseURL
}

14
notify_generic.sh Normal file
View File

@@ -0,0 +1,14 @@
### DISCLAIMER: This is a third party addition to dockcheck - best effort testing.
#
# Copy/rename this file to notify.sh to enable the notification snippet.
# 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"
}

28
notify_matrix.sh Normal file
View File

@@ -0,0 +1,28 @@
### DISCLAIMER: This is a third party addition to dockcheck - best effort testing.
#
# Copy/rename this file to notify.sh to enable the notification snippet.
# Required receiving services must already be set up.
# Modify to fit your setup - set MatrixServer, Room_id and AccessToken
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
FromHost=$(hostname)
# platform specific notification code would go here
printf "\nSending Matrix notification\n"
# Setting the MessageBody variable here.
MessageBody="🐋 Containers on $FromHost with updates available: \n$UpdToString"
# Modify to fit your setup:
AccessToken="Your Matrix token here"
Room_id="Enter Room_id here"
MatrixServer="Enter Your HomeServer URL"
MsgBody="{\"msgtype\":\"m.text\",\"body\":\"$MessageBody\"}"
# URL Example: https://matrix.org/_matrix/client/r0/rooms/!xxxxxx:example.com/send/m.room.message?access_token=xxxxxxxx
curl -sS -o /dev/null --fail -X POST "$MatrixServer/_matrix/client/r0/rooms/$Room_id/send/m.room.message?access_token=$AccessToken" -H 'Content-Type: application/json' -d "$MsgBody"
}

31
notify_ntfy-sh.sh Normal file
View File

@@ -0,0 +1,31 @@
### DISCLAIMER: This is a third party addition to dockcheck - best effort testing.
#
# Copy/rename this file to notify.sh to enable the notification snippet.
# Setup app and subscription at https://ntfy.sh
# Use your unique Topic Name in the URL below.
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
FromHost=$(hostname)
printf "\nSending ntfy.sh notification\n"
MessageTitle="$FromHost - updates available."
# Setting the MessageBody variable here.
read -d '\n' MessageBody << __EOF
Containers on $FromHost with updates available:
$UpdToString
__EOF
# Modify to fit your setup:
NtfyUrl="ntfy.sh/YourUniqueTopicName"
curl -sS -o /dev/null --show-error --fail \
-H "Title: $MessageTitle" \
-d "$MessageBody" \
$NtfyUrl
}

27
notify_pushbullet.sh Normal file
View File

@@ -0,0 +1,27 @@
### DISCLAIMER: This is a third party addition to dockcheck - best effort testing.
#
# Copy/rename this file to notify.sh to enable the notification snippet.
# Required receiving services must already be set up.
# Requires jq installed and in PATH.
# Modify to fit your setup - set Url and Token.
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
FromHost=$(hostname)
# platform specific notification code would go here
printf "\nSending pushbullet notification\n"
MessageTitle="$FromHost - updates available."
# Setting the MessageBody variable here.
MessageBody="Containers on $FromHost with updates available: $UpdToString"
# Modify to fit your setup:
PushUrl="https://api.pushbullet.com/v2/pushes"
PushToken="Your Pushbullet token here"
# Requires jq to process json data
jq -n --arg title "$MessageTitle" --arg body "$MessageBody" '{body: $body, title: $title, type: "note"}' | curl -sS -o /dev/null --show-error --fail -X POST -H "Access-Token: $PushToken" -H "Content-type: application/json" $PushUrl -d @-
}

32
notify_ssmtp.sh Normal file
View File

@@ -0,0 +1,32 @@
### DISCLAIMER: This is a third party addition to dockcheck - best effort testing.
#
# Copy/rename this file to notify.sh to enable the notification snipppet.
# sSMTP has to be installed and configured manually.
# Modify to fit your setup - changing SendMailFrom, SendMailTo, SubjectTag
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
FromHost=$(hostname)
# User variables:
SendMailFrom="me@mydomain.tld"
SendMailTo="me@mydomain.tld"
SubjectTag="dockcheck"
printf "\nSending email notification.\n"
ssmtp $SendMailTo << __EOF
From: "$FromHost" <$SendMailFrom>
date:$(date -R)
To: <$SendMailTo>
Subject: [$SubjectTag] Updates available on $FromHost
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
The following containers on $FromHost have updates available:
$UpdToString
__EOF
}

27
notify_telegram.sh Normal file
View File

@@ -0,0 +1,27 @@
### DISCLAIMER: This is a third party addition to dockcheck - best effort testing.
#
# Copy/rename this file to notify.sh to enable the notification snippet.
# Required receiving services must already be set up.
# Modify to fit your setup - set TelegramChatId and TelegramToken.
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
FromHost=$(hostname)
# platform specific notification code would go here
printf "\nSending Telegram notification\n"
# Setting the MessageBody variable here.
MessageBody="🐋 Containers on $FromHost with updates available: \n$UpdToString"
# Modify to fit your setup:
TelegramToken="Your Telegram token here"
TelegramChatId="Your Telegram ChatId here"
TelegramUrl="https://api.telegram.org/bot$TelegramToken"
TelegramTopicID=12345678 ## Set to 0 if not using specific topic within chat
TelegramData="{\"chat_id\":\"$TelegramChatId\",\"text\":\"$MessageBody\",\"message_thread_id\":\"$TelegramTopicID\",\"disable_notification\": false}"
curl -sS -o /dev/null --fail -X POST "$TelegramUrl/sendMessage" -H 'Content-Type: application/json' -d "$TelegramData"
}