[[Vorlage(Getestet,general)]]

{{{#!vorlage Wissen
[:Terminal: Ein Terminal öffnen] 
[:Editor: Einen Editor öffnen] 
[:Rechte: Rechte für Dateien und Ordner ändern] 
}}}

[[Inhaltsverzeichnis(1)]]

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 Links]

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

{{{#!vorlage Tabelle
<-2 tablestyle="width: 97%;" rowclass="titel"> Telegram
+++
<rowclass="kopf"> `Name`
Beispiel
+++
`Bot-Token`
123456:abcde1234ABCDE
+++
`Chat-ID`
268963852
}}}
 {{{#!vorlage Tabelle
<-2 tablestyle="width: 97%;" rowclass="titel"> LINE
+++
<rowclass="kopf"> `Name`
Beispiel
+++
`Access-Token`
eyJhbGciOiJIUzI1NiJ9.UnQ_o-GP0VtnwDjbK0C8E_NvK
}}}

=Quellcode=
Folgenden Quellcode in eine neu erstellte Datei einfügen (z.B. '''updatecheck.sh''').
{{{#!code bash
#!/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].

[[Vorlage(Bildunterschrift, ./telegram_bsp.jpg, 250, "Beispiel für eine Benachrichtigung per Telegram", right)]]

=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 [:Cron:Cronjob] gestartet werden. Im Terminal crontab mittels `crontab -e` öffnen und in der Crontab den gewünschten Eintrag vornehmen:

{{{#!vorlage Tabelle
<-2 tablestyle="width: 97%;" rowclass="titel"> Cronjob Beispiele
+++
<rowclass="kopf"> 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:

{{{#!vorlage Tabelle
<-2 tablestyle="width: 97%;" rowclass="titel"> Erstellte Dateien
+++
<rowclass="kopf"> 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
}}}

= Links =
 * [https://homematic.simdorn.net/telegram-bot-einrichten/ Telegram-Bot einrichten] {de}
 * [https://support.messagebird.com/hc/en-us/articles/209600005-How-to-add-a-LINE-Bot-to-the-Chat-API LINE-Bot einrichten] {en}

#tag: System, Shell, Paketverwaltung