Skripte/Updatebenachrichtigung per Messenger

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. ⚓︎ Ein Terminal öffnen

  2. ⚓︎ Einen Editor öffnen

  3. ⚓︎ Rechte für Dateien und Ordner ändern

Inhaltsverzeichnis
  1. Vorbereitung
  2. Quellcode
  3. Anpassung des Quellcodes
  4. Automatisches Ausführen
  5. Informationen
  6. Links

Dieses Skript sucht nach vorhandenen Updates und vergleicht diese ggf. mit einer Referenzliste. Sollten welche vorhanden sein wird per Telegram- oder LINE-Messenger eine Nachricht versendet. Stimmt ein gefundenes Update mit der Referenzliste überein wird dies in der Nachricht gesondert angezeigt.

Das Senden der Nachricht wird nur ausgelöst wenn im Vergleich zum letzten Lauf neue Updates hinzugekommen sind.

Vorbereitung

Zur Vorbereitung muss erst ein Telegram- oder LINE-Bot eingerichtet werden, siehe Abschnitt Links

Folgendes muss notiert oder anderweitig zwischengespeichert werden für spätere Schritte:

Telegram
Name Beispiel
Bot-Token 123456:abcde1234ABCDE
Chat-ID 268963852

LINE
Name Beispiel
Access-Token eyJhbGciOiJIUzI1NiJ9.UnQ_o-GP0VtnwDjbK0C8E_NvK

Quellcode

Folgenden Quellcode in eine neu erstellte Datei einfügen (z.B. updatecheck.sh).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/bin/bash

#Messenger festlegen ( leer = Telegram / 1 = LINE )
readonly SELECT=

#Bot-ID's und Token hier eintragen
readonly BOT_TOKEN=''			#Für Benachrichtigung mit Telegram
readonly CHAT_ID=''			#Für Benachrichtigung mit Telegram
readonly ACCESS_TOKEN=''  	        #Für Benachrichtigung mit LINE

#Zu sendende Nachricht
function msg_create {
    if [ "$flagname" == "" ]; then
        flagname=N/A
    fi
    MESSAGE="Es sind $anzahl Updates verfügbar! Flags: $flags - [$flagname]"
}

#Setze Konstanten
readonly UDLIST=/var/tmp/udlist.tmp
readonly UDLAST=/var/tmp/udlast.tmp
readonly REFLIST=$(xdg-user-dir DOCUMENTS)/reflist.txt
readonly LOGFILE=$HOME/update.log
readonly MAXLINES=19
readonly TELEURL='https://api.telegram.org/bot'
readonly LINEURL='https://notify-api.line.me/api/notify'

# Falls nicht vorhanden, erstelle benötigte Dateien.
touch $UDLAST $LOGFILE $REFLIST

#Logfilefunktion mit Zeilenbeschränkung
function logsetup {
    TMP=$(tail -n $MAXLINES $LOGFILE 2>/dev/null) && echo "${TMP}" > $LOGFILE
    exec > >(tee -a $LOGFILE)
    exec 2>&1
}

function log {
    echo "$(date +"%d.%m.%Y - %H:%M:%S"): $*"
}

# Vergleiche verfügbare Updates mit Referenzliste und gleiche mit letztem Run ab. 
anzahl=$(apt-get -q -y --ignore-hold --allow-unauthenticated -s upgrade | grep ^Inst | cut -d\  -f2 | wc -l)
if (( $anzahl != 0 )); then
    apt-get -q -y --ignore-hold --allow-unauthenticated -s upgrade | grep ^Inst | cut -d\  -f2 >> $UDLIST
    newupdates=$(grep -Fxv -f $UDLAST $UDLIST | wc -l)
    if (( $newupdates != 0 )); then
       flags=$(grep -f $REFLIST $UDLIST | wc -l)
       flagname=$(grep -f $REFLIST $UDLIST)
       msg_create
       if [ "$SELECT" == "" ]; then
           curl -s -k "$TELEURL$BOT_TOKEN/sendMessage" -d text="$MESSAGE" -d chat_id=$CHAT_ID
       else
	   curl -X POST -H 'Authorization: Bearer $ACCESS_TOKEN' -F 'message=$MESSAGE' $LINEURL
       fi
       logsetup
       log Updates: $anzahl Flags: $flags - [$flagname]
    fi
fi

# Ersetze Log des letzten Runs mit dem aktuellen Log.
rm $UDLAST
mv $UDLIST $UDLAST

exit 0

Danach muss das Skript noch ausführbar gemacht werden[3].

./telegram_bsp.jpg
Beispiel für eine Benachrichtigung per Telegram

Anpassung des Quellcodes

Anpassungen für Telegram

Bei der Verwendung von Telegram muss bei BOT_TOKEN in der 7. Zeile das entsprechende Token eingefügt werden. In der 8. Zeile muss die Chat-ID eingetragen werden. Beispiel:

readonly BOT_TOKEN='123456:abcde1234ABCDE'
readonly CHAT_ID='268963852'

Anpassungen für LINE

Bei der Verwendung des LINE-Messenger muss in der 4.Zeile bei SELECT= eine 1 eingetragen werden außerdem muss der Access-Token in der 9.Zeile eingetragen werden:

readonly SELECT=1

readonly ACCESS_TOKEN='eyJhbGciOiJIUzI1NiJ9.UnQ_o-GP0VtnwDjbK0C8E_NvK'

Automatisches Ausführen

Das Skript kann in regelmäßigen Intervallen mittels Cronjob gestartet werden. Im Terminal crontab mittels crontab -e öffnen und in der Crontab den gewünschten Eintrag vornehmen:

Cronjob Beispiele
Wann Eintrag
Mittags um 12Uhr 0 12 * * * /bin/sh /Pfad/zum/Script.sh &
Bei Neustart @reboot /bin/sh /Pfad/zum/Script.sh &
Alle 8 Stunden * */8 * * * /bin/sh /Pfad/zum/Script.sh &

Informationen

Erstellte Dateien

Das Skript erstellt selbstständig mehrere Dateien welche verschiedene Funktionen erfüllen:

Erstellte Dateien
Pfad und Name Bedeutung
/var/tmp/udlist.tmp In dieser Datei werden die aktuell verfügbaren Updates als Liste eingetragen. Diese Datei wird nach erfolgreichem Lauf wieder gelöscht.
/var/tmp/udlast.tmp Diese Datei enthält die Liste der Updates des letzten Laufs.
$HOME/Dokumente/reflist.txt In der Referenzliste können manuell Pakete eingetragen werden welche in der zu übermittelnden Nachricht gesondert durch Flags hervorgehoben werden sollen.
$HOME/update.log Hier wird jeweils ein Logeintrag erstellt wenn neue Updates verfügbar sind. Log wird auf 20 Einträge beschränkt. (Kann in Zeile 24 verändert werden / Log deaktivieren durch auskommentieren oder löschen der Zeilen 56+57)

Beispiel reflist.txt

pure-ftpd
build-essential
tcpdump
dnsutils
libsodium-dev
locate
libsystemd-dev
pkg-config