Autoupdate per Shellscript
Backup der MySQL DB tut dieses Script hier nicht! Müsst ihr noch reineditieren. No risk no fun.
"Tu irgendwas aufgrund von Feed-Änderungen" Script
#!/bin/bash
# Speichern Sie den Feed-Link in einer Variablen
feed_url="https://github.com/BookStackApp/BookStack/releases.atom"
# Speichern Sie den Pfad zu einer temporären Datei, die den aktuellen Stand des Feeds speichert
temp_file="/tmp/feed.txt"
# Überprüfen Sie, ob die temporäre Datei bereits existiert
if [ ! -f "$temp_file" ]; then
# Wenn die Datei nicht existiert, erstellen Sie sie und speichern Sie den aktuellen Feed-Inhalt
curl "$feed_url" > "$temp_file"
fi
# Vergleichen Sie den aktuellen Feed-Inhalt mit dem Inhalt in der temporären Datei
diff <(curl "$feed_url") "$temp_file" > /dev/null
# Überprüfen Sie den Rückgabewert des letzten Befehls
if [ $? -ne 0 ]; then
# Wenn der Rückgabewert nicht 0 ist, wurde ein neuer Eintrag hinzugefügt
# Falls wir einen Moment kurz nach Release treffen
sleep $(( ( RANDOM % 30 + 1 ) * 60 ))
# Bookstack Update
cd "/var/www/virtual/$USER/BookStack"
git pull origin release
composer install --no-dev
# php
php artisan migrate --no-interaction --force #Das ist ungeil, wer was besseres hat, her damit...
php artisan cache:clear
php artisan view:clear
# Aktualisieren Sie die temporäre Datei mit dem aktuellen Feed-Inhalt
curl "$feed_url" > "$temp_file"
fi
(Mit gewisser Hilfe von ChatGPT)
$USER ist hier Platzhalter. Das muss bei euch der Ort sein wo Bookstack eben auch liegt.
Abwandlung: cmp statt diff
Damit müssen wir nix wegwerfen. Wir müssen ja auch noch auf den Umweltschutz achten 😊
cmp <(curl "$feed_url") "$temp_file"
Abwandlung: Zeitstempel der Beiträge prüfen
Das ist nur dann nötig, wenn sich atom Feeds in Ihrer Struktur ändern, z.B. wenn es einen neuen Standard gibt, aber auch dann wäre faktisch zu vernachlässigen, weil sich niemand ernsthaft für dynamische Metadaten in Atom-Feeds entscheiden würde.
Statt Zeile 14 - 16:
last_entry_timestamp=$(grep -o '<updated>[^<]*' <(curl "$feed_url") | head -1 | sed 's/<updated>//')
last_saved_timestamp=$(grep -o '<updated>[^<]*' "$temp_file" | head -1 | sed 's/<updated>//')
if [ "$last_entry_timestamp" != "$last_saved_timestamp" ]; then
Roher ChatGPT output: Prüfung ob letzter Beitrag lange genug in Vergangenheit
current_timestamp=$(date -u +"%Y-%m-%dT%TZ")
timestamp_diff=$(echo "$current_timestamp $last_entry_timestamp" | awk -F "T|Z" '{
split($2, a, /[-:]/);
split($1, b, /[-:]/);
d = mktime(b[1] " " b[2] " " b[3] " " b[4] " " b[5] " " b[6]) - mktime(a[1] " " a[2] " " a[3] " " a[4] " " a[5] " " a[6]);
print d;
}')
if [ "$last_entry_timestamp" != "$last_saved_timestamp" ] && [ $timestamp_diff -gt 1800 ]; then
In diesem Beispiel wird
current_timestamp
auf den aktuellen Zeitstempel in UTC gesetzt und die Differenz zwischencurrent_timestamp
undlast_entry_timestamp
wird berechnet. Die Differenz wird in Sekunden berechnet und gegen 1800 (30 Minuten in Sekunden) verglichen. Wenn sichlast_entry_timestamp
länger als 30 Minuten in der Vergangenheit befindet und unterschiedlich zulast_saved_timestamp
ist, wird Ihr Code zum Speichern und Senden von Benachrichtigungen ausgeführt.Dieser Code nutzt
awk
um die Zeitdifferenz zwischen zwei Datumsangaben zu berechnen.
awk -F "T|Z"
teilt die Eingabe anhand des Trenners "T" oder "Z" in zwei Teile auf. Der erste Teil enthält das Datum, der zweite Teil die Uhrzeit.Die Uhrzeit wird in einem Array
a
gespeichert, indem es mithilfe vonsplit($2, a, /[-:]/)
anhand von-
oder:
in die einzelnen Bestandteile Stunde, Minute, Sekunde geteilt wird.Das gleiche wird mit dem Datum in einem Array
b
gemacht.Mit
mktime
wird aus dem Datum und der Uhrzeit eine Unixzeit berechnet. Diese wird für das Datum und die Uhrzeit des ersten Teils und des zweiten Teils berechnet und anschließend subtrahiert. Das Ergebnis ist die Zeitdifferenz in Sekunden.Mit
print d
wird das Ergebnis ausgegeben.a und b sind hier Arrays und keine Variablen. Der Grund dafür ist, dass sie über die split-Funktion aus einem String aufgeteilt werden. Hierbei werden die Teile des Strings basierend auf einem separierenden Zeichen in ein Array eingetragen. So können die einzelnen Teile eines Datums einfacher verarbeitet werden.
So, jetzt müssen wir das Ganze verstehen können, was ja an sich nicht so schwer ist:
- Wenn
/tmp/feed.txt
nicht vorhanden, dann Download des Feeds in/tmp/feed.txt
. Script ende. - Wenn
/tmp/feed.txt
vorhanden, dann Feed herunterladen und Inhalt mit/tmp/feed.txt
vergleichen - Wenn
diff
Änderungen erkannt hat, dann schläft das Script erst einmal bis zu 30 Minuten. - Dann Update-Zauberei aus dem Bookstack-Wiki.
- Aktueller Feed in die
/tmp/feed.txt
rein.
ChatGPT hat hier kurios wie sie ist eine TXT-Datei gemacht. Linux braucht keine Dateiendungen, es ist also ziemlich egal wie ihr die Feed-Datei nennt. Vielleicht solltet ihr treffend auch .atom verwenden, damit klar ist, was das für ein Feed ist.
Script schreiben und Cronjob
cat > scriptdatei.sh <<'EOM'
#SCRIPT PASTEN
EOM
chmod +x scriptdatei.sh
Ist das getan, müssen wir das Script einmal ausführen und dann testen wir, ob /tmp/feed.txt
existiert mit test -f /tmp/feed.txt && echo "exists"
. Hier brauchen wir echo
, weil der Test-Befehl sonst nichts ausgeben würde.
Nun ab in den Cronjob damit.
crontab -e
MAILTO=""
0 */2 * * * /scriptdatei.sh
Das Script erzeugt Output von den curl
Befehlen, den würden wir im Falle von Uberspaces per Mail gespammt bekommen, wenn das MAILTO dort nicht wäre.
Denkt dran: :wq
falls ihr in VI oder VIM gelandet seid. Crontab-Guru für andere Zeitintervalle.