Kaldenhoven Wiki

Een script om bij mislukte backups een bericht via Telegram te versturen.
In het script bij de TO_FILL vermeldingen de bot id / api key en chatroom invullen.
Bij SERVICE_NAME kan je eventueel een eigen waarde invullen als je meerdere duplicati instances hebt en deze herkenbaar wil kunnen terugzien. (Servernaam bijv.)
Zie hieronder, bovenste melding standaard, die eronder met SERVICE_NAME="VPS"
duplicati-telegram-notificatie.png

Script

#!/bin/bash
#
# Script Configuration.
DEBUG_MODE="0"
SCRIPT_FULLFN="$(basename "${0}")"
LOGFILE="/var/log/${SCRIPT_FULLFN%.*}.log"
LOG_MAX_LINES="1000"
SERVICE_NAME="Duplicati"
#
#
# -----------------
# --- Functions ---
# -----------------
logAdd ()
{
	TMP_DATETIME="$(date '+%Y-%m-%d [%H-%M-%S]')"
	TMP_LOGSTREAM="$(tail -n ${LOG_MAX_LINES} ${LOGFILE} 2>/dev/null)"
	echo "${TMP_LOGSTREAM}" > "$LOGFILE"
	if [ "$1" == "-q" ]; then
		#
		# Quiet mode.
		#
		echo "${TMP_DATETIME} ${@:2}" >> "${LOGFILE}"
	else
		#
		# Loud mode.
		#
		echo "${TMP_DATETIME} $*" | tee -a "${LOGFILE}"
	fi
	return
}
sendTelegramNotification ()
{
	#
	# Usage:			sendTelegramNotification "<PN_TEXT>"
	# Example:			sendTelegramNotification "Test push message"
	#
	# Returns:
	#
	# - "0" on FAILURE.
	# - "1" on SUCCESS.
	#
	# Consts.
	CURL_BIN="curl"
	CURL_TIMEOUT="3"
	# 
	# Telegram Bot
	STN_TELEGRAM_BOT_ID="TO_FILL"
	STN_TELEGRAM_BOT_APIKEY="TO_FILL"
	# 
	# 	cf
	STN_TELEGRAM_CHAT_ID="TO_FILL"
	#
	# Variables.
	#
	STN_TEXT="$1"
	STN_TEXT="${STN_TEXT//\"/\\\"}"
	#
	# Log message.
	#
	if [ "${DEBUG_MODE}" == "1" ]; then
		logAdd -q "${MY_SERVICE_NAME}::sendTelegramNotification() fired."
	fi
	#
	# Send push message to Telegram Bot Chat.
	if ( eval ${CURL_BIN} -q \
			--insecure \
			--max-time \""${CURL_TIMEOUT}\"" \
			 "\"https://api.telegram.org/bot${STN_TELEGRAM_BOT_ID}:${STN_TELEGRAM_BOT_APIKEY}/sendMessage?chat_id=${STN_TELEGRAM_CHAT_ID}&text=${STN_TEXT}\"" \
			 2> /dev/null \| grep -Fiq "\"ok\\\":true\"" ); then
		#
		# Log message.
		logAdd -q "${MY_SERVICE_NAME}::sendTelegramNotification: ... SUCCESS."
		# Return SUCCESS.
		#
		echo -n "1"
	else
		#
		# Log message.
		logAdd -q "${MY_SERVICE_NAME}::sendTelegramNotification: ... FAILED."
		#
		# Return FAILURE.
		echo -n "0"
	fi
	#
	return
}
# -----------------------------------------------------
# --------------- END OF FUNCTION BLOCK ---------------
# -----------------------------------------------------
#
# Script Main.
#
# Validate env vars we got from Duplicati.
if  [ -z "${DUPLICATI__backup_name}" ]; then
	export DUPLICATI__backup_name="API_ERR"
fi
#
if  [ -z "${DUPLICATI__PARSED_RESULT}" ]; then
	export DUPLICATI__PARSED_RESULT="API_ERR"
fi
#
if  [ -z "${DUPLICATI__EVENTNAME}" ]; then
	export DUPLICATI__EVENTNAME="API_ERR"
fi
#
if  [ -z "${DUPLICATI__OPERATIONNAME}" ]; then
	export DUPLICATI__OPERATIONNAME="API_ERR"
fi
#
if [ "${DEBUG_MODE}" == "1" ]; then
	env | grep "DUPLICATI__"
fi
#
# Prepare chat message.
CHAT_MESSAGE="${SERVICE_NAME}: \"${DUPLICATI__backup_name}\" ${DUPLICATI__PARSED_RESULT} ${DUPLICATI__EVENTNAME} ${DUPLICATI__OPERATIONNAME}"
#
# Do not send chat message on SUCCESS.
if [ "${DUPLICATI__PARSED_RESULT}" == "Success" ]; then
	logAdd "[INFO] Suppressed sending chat message [${CHAT_MESSAGE}]."
	exit 0
fi
logAdd "[INFO] Sending chat message [${CHAT_MESSAGE}] ..."
#
# Send chat message.
SEND_RESULT="$(sendTelegramNotification "${CHAT_MESSAGE}")"
if [ "${SEND_RESULT}" == "0" ]; then
	logAdd "[ERROR] Failed to send telegram notification."
	exit 99
fi
#
logAdd "[INFO] Successfully sent telegram notification."
exit 0

Implementatie

Duplicati direct als linux service

Plaats bovenstaande script op een locatie op je server. In dit geval heb ik deze als
/opt/duplicati-notify/sendTelegramNotification geplaatst.
Dan is het het handigste als je dit systeembreed instelt. Mocht je het alleen voor 1 bepaalde taak willen dan kan dat ook. Dan plaats je hem onder het kopje options bij de taak configuratie en dan Advanced options.
Voor systeembrede configuratie ga je naar Settings en dan helemaal naar onderen scrollen naar de sectie default options.
Add advanced option en selecteer run-script-after. Vul hierna het pad in van het script en klik op OK.
duplicati-telegram-config.png

Duplicati als docker container

Onder de docker container moet het script bereikbaar zijn vanuit de container. Dit kan je eventueel doen door bij aanmaken container het script direct 1-op-1 te mappen naar de host en dan het pad in te vullen zoals bij de voorgaande stap.

Voeg dus een optie als de volgende toe

-v /pad/op/host/sendTelegramNotification:/opt/duplicati-notify/sendTelegramNotification

Testen

Dit script stuurt alleen een bericht als een backup een error of warning geeft. Om te testen of het uberhaupt werkt zonder je backups kapot te maken moet je de volgende 3 regels uitcommenten door er een hekje voor te plaatsen.

if [ "${DUPLICATI__PARSED_RESULT}" == "Success" ]; then
	logAdd "[INFO] Suppressed sending chat message [${CHAT_MESSAGE}]."
	exit 0
fi

dit wordt dan

#if [ "${DUPLICATI__PARSED_RESULT}" == "Success" ]; then
#	logAdd "[INFO] Suppressed sending chat message [${CHAT_MESSAGE}]."
#	exit 0
#fi

Vergeet niet om na afloop weer de hekjes weg te halen anders krijg je elke keer een melding.

Bron: duplicati forum