BookStack-Autoupdate per Shellscript
Backup der MySQL DB tut dieses Script hier nicht! Müsst ihr noch reineditieren. No risk no fun.
BookStack hat ein Problem. Es gibt kein Autoupdate. Autoupdate ist essenziell um einigermaßen Sicherheit gewährleisten zu können.
Also müssen wir das Autoupdate selbst machen.
Die Grundlage hierzu ist natürlich ein Uberspace. Dort können wir kein sudo nutzen, also muss alles im Userspace laufen:
"Tu irgendwas aufgrund von Feed-Änderungen" Script
#!/bin/bash
bookstack_url=# Path to the last known version file
VERSION_FILE="https:/home/$USER/bookstack-latest-version.txt"
LOG_FILE="/wiki.notizlo.ch"home/$USER/bookstack-update.log"
# 💾Feed-LinkFetch speichernthe feed_url="latest release from GitHub Atom feed
# Take only the first line, which is the most recent version
LATEST_RELEASE=$(curl -s https://github.com/BookStackApp/BookStack/releases.atom"atom | xmllint --format - | grep -oP '(?<=<title>BookStack ).*(?=</title>)' | head -n 1)
echo "Debug: Latest release detected: $LATEST_RELEASE" >> "$LOG_FILE"
# 💾TemporäreCheck Dateiif speichernversion temp_file="/tmp/feed.txt"file #exists 🔍Prüfenand obhas temporäre Datei bereits existiertcontent
if [ ! -fs "$temp_file"VERSION_FILE" ]; then
#echo 💾Erstellen"Debug: wennVersion nichtfile vorhandenis curlempty or doesn't exist" >> "$feed_url"LOG_FILE"
echo "$LATEST_RELEASE" > "$temp_file"VERSION_FILE"
echo "Debug: Created version file with: $LATEST_RELEASE" >> "$LOG_FILE"
exit 0
fi
# 🔍Feed-InhaltCompare vergleichencurrent diffstored <version with latest release
STORED_VERSION=$(curlcat "$feed_url"VERSION_FILE")
echo "Debug: Stored version: $STORED_VERSION" >> "$temp_file"LOG_FILE"
echo "Debug: Latest release: $LATEST_RELEASE" >> /dev/null
# 🔍Überprüfung des Vergleichsergebnisses"$LOG_FILE"
if [ "$?LATEST_RELEASE" -ne!= 0"$STORED_VERSION" ]; then
#echo ⏰Warte"New einversion wenig
sleepdetected: $((LATEST_RELEASE" (>> RANDOM % 30 + 1 ) * 60 ))"$LOG_FILE"
# 💻BookstackPerform Updateupdate steps
cd "/var/www/virtual/$USER/BookStack"BookStack
git fetch origin
git pull origin release
composer install --no-dev
# 💻php
php artisan migrate --no-interaction --force
php artisan cache:clear
php artisan view:clear
curl# Update the version file
echo "$bookstack_url" > /dev/null
# 💾Speichern aktuellen Feed-Inhalts
curl "$feed_url"LATEST_RELEASE" > "$temp_file"VERSION_FILE"
echo "$(date): Updated to $LATEST_RELEASE" >> "$LOG_FILE"
else
echo "$(date): No new version available" >> "$LOG_FILE"
fi
(Mit gewisser Hilfe von ChatGPT)Claude Haiku)
$USERphp artisan migrate --force ist hier Platzhalter. Das muss bei euch der Ortkritischste seinPunkt. woDie BookstackAbfrage ebenfür aucheine liegt.
Abwandlung:nicht cmpohne stattGrund diff
Damitmanuell. müssenWenn wiretwas nixirgendwann wegwerfen.Nacharbeit Wirerfordert, müssendann ja auch noch auf den Umweltschutz achten 😊
cmp <(curl "$feed_url") "$temp_file"
Abwandlung: Zeitstempel der Beiträge prüfen
das...
Daschmod ist+x nur~/bookstack-update.sh dannnicht 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.vergessen
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_timestampauf den aktuellen Zeitstempel in UTC gesetzt und die Differenz zwischen
current_timestampund
last_entry_timestampwird berechnet. Die Differenz wird in Sekunden berechnet und gegen 1800 (30 Minuten in Sekunden) verglichen. Wenn sich
last_entry_timestamplänger als 30 Minuten in der Vergangenheit befindet und unterschiedlich zu
last_saved_timestampist, wird Ihr Code zum Speichern und Senden von Benachrichtigungen ausgeführt.
Dieser Code nutzt
awkum 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
agespeichert, indem es mithilfe von
split($2, a, /[-:]/)anhand von
-oder
:in die einzelnen Bestandteile Stunde, Minute, Sekunde geteilt wird.
Das gleiche wird mit dem Datum in einem Array
bgemacht.
Mit
mktimewird 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 dwird 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.
Scriptanalyse
So, jetzt müssen wir das Ganze verstehen können, wasimmerhin jahats aneine sichLLM-KI nichtgeschrieben.
Was sonutzen schwerwir ist:dafür? Klar, auch LLM-KI's:
WennHere's
a/tmp/feed.txtnichtconcisevorhanden,breakdowndannofDownloadthedesupdateFeedsscript's functionality:1. Version Detection
- Retrieves the latest BookStack release from GitHub's Atom feed
- Uses xmllint to parse the XML and extract the most recent version number2. Version Tracking
- Maintains a version tracking file (`bookstack-latest-version.txt`)
- Stores the last known version of BookStack
- Compares the current stored version with the latest available version3. Update Process (if a new version is detected)
- Changes to the BookStack directory
- Fetches the latest changes from the git repository
- Pulls the latest release branch
- Runs Composer to update dependencies
- Executes Laravel migrations
- Clears application cache
- Clears view cache
- Updates the version tracking file4. Logging
- Logs all actions and decisions in `bookstack-update.log`
- Records when updates are available or not
- Timestamps each log entry5. Automation
- Automatically checks for and applies updates without manual interventionThe script provides a lightweight, self-contained mechanism for keeping BookStack up-to-date with minimal manual oversight.
Test-run
/
tmp/feed.txtbin/bash ~/bookstack-update.sh cat ~/bookstack-update.log. Script ende.Wenn/tmp/feed.txtvorhanden, dann Feed herunterladen und Inhalt mit/tmp/feed.txtvergleichenWenndiffÄnderungen erkannt hat, dann schläft das Script erst einmal bis zu 30 Minuten.Dann Update-Zauberei aus demBookstack-Wiki.Aktueller Feed in die/tmp/feed.txtrein.
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.bin/bash /home/$USER/bookstack-update.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.