Compare commits

...

30 Commits

Author SHA1 Message Date
mag37
a9f2433fab Merge pull request #104 from mag37/notify-rewrite
Complete rewrite of notify function, all templates adjusted + more.
2024-10-13 17:36:41 +02:00
mag37
18e467274e edited changenotes 2024-10-13 17:11:10 +02:00
mag37
6db92be627 getting ready for merge 2024-10-12 13:13:11 +02:00
mag37
fc47b1313b finalizing formatting and edits 2024-10-10 10:22:17 +02:00
mag37
76d2921719 fixed MSMTP-typo 2024-10-10 09:48:41 +02:00
mag37
2844e54fbd Merge pull request #102 from thomas-mc-work/patch-1
fix upgly typo which prevents email notifications
2024-10-08 22:05:53 +02:00
Thomas McWork
e0d66cc773 fix upgly typo which prevents email notifications 2024-10-08 21:57:23 +02:00
mag37
071fa4b245 changed regctl verbosity 2024-10-08 09:41:32 +02:00
mag37
cb73025a61 added discord template 2024-10-07 21:31:33 +02:00
mag37
87f1886d28 releasenotes rewritten to array 2024-10-07 21:29:49 +02:00
mag37
ac10a96cc8 all template rewritten, some guesswork 2024-10-07 21:28:31 +02:00
mag37
e5a7a715c6 Merge pull request #99 from lpukatch/release-note-urls
add release note urls
2024-10-05 21:26:31 +02:00
mag37
8a6a1fbec2 Update urls.list 2024-10-05 21:26:07 +02:00
lpukatch
04b0c46366 add release note urls for popular services 2024-10-05 09:36:06 -04:00
mag37
319b43bc1b Added releasenotes-logic to all templates, fix to DSM+smtp 2024-10-05 08:03:33 +02:00
mag37
8b40dce2cd Merge pull request #97 from mag37/releasenotes
Releasenotes addon
2024-10-04 23:24:15 +02:00
mag37
62b52796f2 removed empty lines 2024-10-04 23:19:41 +02:00
mag37
85ee721cd1 typo 2024-10-04 23:09:45 +02:00
mag37
6de00a2b90 removed releasenotes test script 2024-10-04 23:07:58 +02:00
mag37
a550994659 tweaks + version info 2024-10-04 23:07:01 +02:00
mag37
0e3210b561 added urls.list
Added urls.list to be ignored.
2024-10-04 14:55:43 +02:00
mag37
db4431d40a Update dockcheck.sh
changed missing url-message.
2024-10-04 14:48:05 +02:00
mag37
9f8c62ed96 first tweaks for a release-notes addition 2024-10-04 14:39:51 +02:00
mag37
827bb7e14a Update releasenotes.sh
added $ScriptWorkDir prefix to urls.list
2024-10-04 08:05:42 +02:00
mag37
91ff4aaaa7 Added notification release notes url function 2024-10-02 20:44:32 +02:00
mag37
999694985a Added sponsorlist - section. 2024-09-28 14:24:34 +02:00
mag37
640046668c added project url to --help 2024-09-28 14:22:09 +02:00
mag37
a79de24bcc Cleanups + info to readme 2024-09-18 16:44:32 +02:00
mag37
f31a886424 Merge pull request #94 from sudo-kraken/patch-1
Create notify_pushover.sh
2024-09-10 06:32:26 +02:00
Joe Harrison
5b31e68f73 Create notify_pushover.sh 2024-09-09 22:57:11 +01:00
15 changed files with 182 additions and 68 deletions

1
.gitignore vendored
View File

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

View File

@@ -17,17 +17,18 @@
___
## :bell: Changelog
- **v0.5.0**: Rewritten notify logic - all templates are adjusted and should be migrated!
- Copy the custom settings from your current template to the new version of the same template.
- Look into, copy and customize the `urls.list` file if that's of interest.
- Other changes:
- Added Discord notify template.
- Verbosity changed of `regctl`.
- **v0.4.9**: Added a function to enrich the notify-message with release note URLs. See [Release notes addon](https://github.com/mag37/dockcheck#date-release-notes-addon-to-notifications)
- **v0.4.8**: Rewrote prune logic to not prompt with options `-a|-y` or `-n`. Auto prune with `-p`.
- **v0.4.7**: Notification Template changes to gotify(new!), DSM(improved), SMTP(deprecation alternative).
- **v0.4.6**: Compatibility changes to timeout, due to busybox.
- **v0.4.5**: Bugfixes, compatibility changes to timeout and arrays.
- **v0.4.3**: Added timeout option to skip container if registry check takes too long (10s default).
- **v0.4.1**: Syntax and logic cleanups, bugfixes on multi compose and env-files.
- **v0.4.0**: Reworked selfupdate (auto git/curl/wget), general syntax cleanup, added -v for version.
- **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.
___
@@ -103,7 +104,7 @@ Add preferred `notify.sh`-template to the same directory - this will not be touc
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! (notify.sh is added to .gitignore)
Use a `notify_X.sh` template file from the **notify_templates** directory, copy it to `notify.sh` alongside the script, modify it to your needs! (notify.sh is added to .gitignore)
**Current templates:**
- Synology [DSM](https://www.synology.com/en-global/dsm)
- Email with [mSMTP](https://wiki.debian.org/msmtp) (or deprecated alternative [sSMTP](https://wiki.debian.org/sSMTP))
@@ -115,10 +116,24 @@ Use a `notify_X.sh` template file, copy it to `notify.sh`, modify it to your nee
- [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.
- [Pushover](https://pushover.net/) - Simple Notifications (to your phone, wearables, desktops)
Further additions are welcome - suggestions or PR!
<sub><sup>Initiated and first contributed by [yoyoma2](https://github.com/yoyoma2).</sup></sub>
### :date: Release notes addon to Notifications
There's a function to use a lookup-file to add release note URL's to the notification message.
Copy the notify_templates/`urls.list` file to the script directory, it will be used automatically if it's there. Modify it as necessary, the names of interest in the left column needs to match your container names.
The output of the notification will look something like this:
```
Containers on hostname with updates available:
apprise-api -> https://github.com/linuxserver/docker-apprise-api/releases
homer -> https://github.com/bastienwirtz/homer/releases
nginx -> https://github.com/docker-library/official-images/blob/master/library/nginx
...
```
The `urls.list` file is just an example and I'd gladly see that people contribute back when they add their preferred URLs to their lists.
## :bookmark: Labels
Optionally add labels to compose-files. Currently these are the usable labels:
```
@@ -161,21 +176,26 @@ function dchk {
## :hammer: Known issues
- 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.
- Not working well with containers created by **Portainer**.
- **Watchtower** might cause issues due to retagging images when checking for updates (and thereby pulling new 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.
## :wrench: Debugging
If you hit issues, you could check the output of the `extras/errorCheck.sh` script for clues.
Another option is to run the main script with debugging in a subshell `bash -x dockcheck.sh` - if there's a particular container/image that's causing issues you can filter for just that through `bash -x dockcheck.sh nginx`.
## :scroll: 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.
## :heartpulse: Sponsorlist
- [avegy](https://github.com/avegy)
___
### :floppy_disk: The [story](https://mag37.org/posts/project_dockcheck/) behind it. 1 year in retrospect.
## Special Thanks
- :bison: [t0rnis](https://github.com/t0rnis)
- :leopard: [Palleri](https://github.com/Palleri)

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env bash
VERSION="v0.4.8"
### ChangeNotes: Rewrote prune to not prompt (default no) if -a|-y or -n flags are used. -p will still autoprune.
VERSION="v0.5.0"
### ChangeNotes: Rewritten notify logic - all templates adjusted, transfer your current settings to a new template! See README.
Github="https://github.com/mag37/dockcheck"
RawUrl="https://raw.githubusercontent.com/mag37/dockcheck/main/dockcheck.sh"
@@ -13,7 +13,6 @@ ScriptWorkDir="$(dirname "$ScriptPath")"
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")"
### Help Function:
Help() {
echo "Syntax: dockcheck.sh [OPTION] [part of name to filter]"
@@ -34,6 +33,8 @@ Help() {
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."
echo
echo "Project source: $Github"
}
### Colors:
@@ -125,7 +126,7 @@ choosecontainers() {
}
datecheck() {
ImageDate=$($regbin image inspect "$RepoUrl" --format='{{.Created}}' | cut -d" " -f1 )
ImageDate=$($regbin -v error image inspect "$RepoUrl" --format='{{.Created}}' | cut -d" " -f1 )
ImageAge=$(( ( $(date +%s) - $(date -d "$ImageDate" +%s) )/86400 ))
if [ "$ImageAge" -gt "$DaysOld" ] ; then
return 0
@@ -146,6 +147,17 @@ progress_bar() {
[[ "$QueTotal" == "$QueCurrent" ]] && printf "\r[%b%s%b] %s/%s \n" "$c_teal" "$BarComplete" "$c_reset" "$QueCurrent" "$QueTotal"
}
### Function to add user-provided urls to releasenotes
releasenotes() {
for update in ${GotUpdates[@]}; do
found=false
while read -r container url; do
[[ $update == $container ]] && Updates+=("$update -> $url") && found=true
done < "$ScriptWorkDir"/urls.list
[[ $found == false ]] && Updates+=("$update -> url missing") || continue
done
}
### Version check & initiate self update
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"
@@ -237,7 +249,7 @@ for i in $(docker ps $Stopped --filter "name=$SearchName" --format '{{.Names}}')
RepoUrl=$(docker inspect "$i" --format='{{.Config.Image}}')
LocalHash=$(docker image inspect "$RepoUrl" --format '{{.RepoDigests}}')
# Checking for errors while setting the variable:
if RegHash=$(${t_out} $regbin image digest --list "$RepoUrl" 2>&1) ; then
if RegHash=$(${t_out} $regbin -v error image digest --list "$RepoUrl" 2>&1) ; then
if [[ "$LocalHash" = *"$RegHash"* ]] ; then
NoUpdates+=("$i")
else
@@ -259,7 +271,6 @@ NoUpdates=($(sort <<<"${NoUpdates[*]}"))
GotUpdates=($(sort <<<"${GotUpdates[*]}"))
unset IFS
### Define how many updates are available
UpdCount="${#GotUpdates[@]}"

View File

@@ -9,17 +9,17 @@
MSMTP=$(which msmtp)
SSMTP=$(which ssmtp)
if [ -n $MSMPT ] ; then
MAIL=$MSMTP
elif [ -n $SSMTP ] && [ -z $MAIL ] ; then
MAIL=$SSMTP
if [ -n "$MSMTP" ] ; then
MailPkg=$MSMTP
elif [ -n "$SSMTP" ] ; then
MailPkg=$SSMTP
else
echo "No msmtp or ssmtp binary found in PATH: $PATH" ; exit 1
fi
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
[ -s "$ScriptWorkDir"/urls.list ] && releasenotes || Updates=("$@")
UpdToString=$( printf '%s\\n' "${Updates[@]}" )
FromHost=$(hostname)
CfgFile="/usr/syno/etc/synosmtp.conf"
@@ -36,7 +36,9 @@ SenderMail=${SenderMail:-$(grep 'eventmail1' $CfgFile | sed -n 's/.*"\([^"]*\)".
printf "\nSending email notification.\n"
$MAIL $SendMailTo << __EOF
printf -v MessageBody "🐋 Containers on $FromHost with updates available:\n\n$UpdToString"
$MailPkg $SendMailTo << __EOF
From: "$SenderName" <$SenderMail>
date:$(date -R)
To: <$SendMailTo>
@@ -44,10 +46,7 @@ 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
$MessageBody
From $SenderName
__EOF
}

View File

@@ -5,20 +5,15 @@
# Modify to fit your setup - if API, set AppriseURL to your Apprise ip/domain.
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
[ -s "$ScriptWorkDir"/urls.list ] && releasenotes || 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
printf -v MessageBody "🐋 Containers on $FromHost with updates available:\n$UpdToString"
# Modify to fit your setup:
apprise -vv -t "$MessageTitle" -b "$MessageBody" \

View File

@@ -0,0 +1,25 @@
### 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 DiscordWebhookUrl
send_notification() {
[ -s "$ScriptWorkDir"/urls.list ] && releasenotes || Updates=("$@")
UpdToString=$( printf '%s\\n' "${Updates[@]}" )
echo "$UpdToString"
FromHost=$(hostname)
# platform specific notification code would go here
printf "\nSending Discord notification\n"
# Setting the MessageBody variable here.
MessageBody="🐋 Containers on $FromHost with updates available: \n$UpdToString"
# Modify to fit your setup:
DiscordWebhookUrl="PasteYourFullDiscordWebhookURL"
MsgBody="{\"username\":\"$FromHost\",\"content\":\"$MessageBody\"}"
curl -sS -o /dev/null --fail -X POST -H "Content-Type: application/json" -d "$MsgBody" "$DiscordWebhookUrl"

View File

@@ -4,11 +4,13 @@
# generic sample, the "Hello World" of notification addons
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
[ -s "$ScriptWorkDir"/urls.list ] && releasenotes || 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"
printf "\nThe following docker containers on %s need to be updated:\n" "$FromHost"
printf "$UpdToString"
}

View File

@@ -5,8 +5,8 @@
# Modify to fit your setup - set GotifyUrl and GotifyToken.
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
[ -s "$ScriptWorkDir"/urls.list ] && releasenotes || Updates=("$@")
UpdToString=$( printf '%s\\n' "${Updates[@]}" )
FromHost=$(hostname)
# platform specific notification code would go here
@@ -14,7 +14,7 @@ send_notification() {
# Setting the MessageTitle and MessageBody variable here.
MessageTitle="${FromHost} - updates available."
MessageBody="Containers on ${FromHost} with updates available: ${UpdToString}"
printf -v MessageBody "🐋 Containers on $FromHost with updates available:\n$UpdToString"
# Modify to fit your setup:
GotifyToken="Your Gotify token here"

View File

@@ -5,8 +5,8 @@
# Modify to fit your setup - set MatrixServer, Room_id and AccessToken
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
[ -s "$ScriptWorkDir"/urls.list ] && releasenotes || Updates=("$@")
UpdToString=$( printf '%s\\n' "${Updates[@]}" )
FromHost=$(hostname)
# platform specific notification code would go here

View File

@@ -5,20 +5,15 @@
# Use your unique Topic Name in the URL below.
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
[ -s "$ScriptWorkDir"/urls.list ] && releasenotes || 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
printf -v MessageBody "🐋 Containers on $FromHost with updates available:\n$UpdToString"
# Modify to fit your setup:
NtfyUrl="ntfy.sh/YourUniqueTopicName"

View File

@@ -6,8 +6,8 @@
# Modify to fit your setup - set Url and Token.
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
[ -s "$ScriptWorkDir"/urls.list ] && releasenotes || Updates=("$@")
UpdToString=$( printf '%s\\n' "${Updates[@]}" )
FromHost=$(hostname)
# platform specific notification code would go here
@@ -15,7 +15,7 @@ printf "\nSending pushbullet notification\n"
MessageTitle="$FromHost - updates available."
# Setting the MessageBody variable here.
MessageBody="Containers on $FromHost with updates available: $UpdToString"
printf -v MessageBody "🐋 Containers on $FromHost with updates available:\n$UpdToString"
# Modify to fit your setup:
PushUrl="https://api.pushbullet.com/v2/pushes"

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 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() {
[ -s "$ScriptWorkDir"/urls.list ] && releasenotes || Updates=("$@")
UpdToString=$( printf '%s\\n' "${Updates[@]}" )
FromHost=$(hostname)
# platform specific notification code would go here
printf "\nSending pushover notification\n"
MessageTitle="$FromHost - updates available."
# Setting the MessageBody variable here.
printf -v MessageBody "🐋 Containers on $FromHost with updates available:\n$UpdToString"
# Modify to fit your setup:
PushoverUrl="https://api.pushover.net/1/messages.json"
PushoverUserKey="Your Pushover User Key Here"
PushoverToken="Your Pushover API Token Here"
# Sending the notification via Pushover
curl -sS -o /dev/null --show-error --fail -X POST \
-F "token=$PushoverToken" \
-F "user=$PushoverUserKey" \
-F "title=$MessageTitle" \
-F "message=$MessageBody" \
$PushoverUrl
}

View File

@@ -8,17 +8,17 @@
MSMTP=$(which msmtp)
SSMTP=$(which ssmtp)
if [ -n $MSMPT ] ; then
MAIL=$MSMTP
elif [ -n $SSMTP ] && [ -z $MAIL ] ; then
MAIL=$SSMTP
if [ -n "$MSMTP" ] ; then
MailPkg=$MSMTP
elif [ -n "$SSMTP" ] ; then
MailPkg=$SSMTP
else
echo "No msmtp or ssmtp binary found in PATH: $PATH" ; exit 1
fi
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
[ -s "$ScriptWorkDir"/urls.list ] && releasenotes || Updates=("$@")
UpdToString=$( printf '%s\\n' "${Updates[@]}" )
FromHost=$(hostname)
# User variables:
@@ -28,7 +28,9 @@ SubjectTag="dockcheck"
printf "\nSending email notification.\n"
$MAIL $SendMailTo << __EOF
printf -v MessageBody "🐋 Containers on $FromHost with updates available:\n\n$UpdToString"
$MailPkg $SendMailTo << __EOF
From: "$FromHost" <$SendMailFrom>
date:$(date -R)
To: <$SendMailTo>
@@ -36,9 +38,7 @@ 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
$MessageBody
__EOF
}

View File

@@ -5,8 +5,8 @@
# Modify to fit your setup - set TelegramChatId and TelegramToken.
send_notification() {
Updates=("$@")
UpdToString=$( printf "%s\n" "${Updates[@]}" )
[ -s "$ScriptWorkDir"/urls.list ] && releasenotes || Updates=("$@")
UpdToString=$( printf '%s\\n' "${Updates[@]}" )
FromHost=$(hostname)
# platform specific notification code would go here

View File

@@ -0,0 +1,34 @@
# This is a list of container names and releasenote urls, separated by space.
# Modify, add and (if necessary) remove to fit your needs.
# Additions are welcome! Append your list to the git-repo, use generic names and sensible urls.
apprise-api https://github.com/linuxserver/docker-apprise-api/releases
homer https://github.com/bastienwirtz/homer/releases
nginx https://github.com/docker-library/official-images/blob/master/library/nginx
vaultwarden-server https://github.com/dani-garcia/vaultwarden/releases
actual_server https://actualbudget.org/blog
gotify https://github.com/gotify/server/releases
traefik https://github.com/traefik/traefik/releases
caddy https://github.com/caddyserver/caddy/releases
calibre https://github.com/linuxserver/docker-calibre/releases
calibre-web https://github.com/linuxserver/docker-calibre-web/releases
readarr https://github.com/Readarr/Readarr/releases
audiobookshelf https://github.com/advplyr/audiobookshelf/releases
gluetun https://github.com/qdm12/gluetun/releases
bazarr https://github.com/morpheus65535/bazarr/releases
bazarr-ls https://github.com/linuxserver/docker-bazarr/releases
prowlarr https://github.com/Prowlarr/Prowlarr/releases
prowlarr-ls https://github.com/linuxserver/docker-prowlarr/releases
recyclarr https://github.com/recyclarr/recyclarr/releases
sabnzbd https://github.com/linuxserver/docker-sabnzbd/releases
sonarr https://github.com/linuxserver/docker-sonarr/releases
radarr https://github.com/linuxserver/docker-radarr/releases
lidarr https://github.com/linuxserver/docker-lidarr/releases
jellyseerr https://github.com/Fallenbagel/jellyseerr/releases
jellyfin https://github.com/jellyfin/jellyfin/releases
home-assistant https://github.com/home-assistant/docker/releases
zigbee2mqtt https://github.com/Koenkk/zigbee2mqtt/releases
mqtt https://github.com/eclipse/mosquitto/tags