Ich nutze quarto unter anderem dafür, meine Briefe als PDF zu rendern. Damit dies auch auf dem Handy oder Tablet funktioniert, baue ich mir einen kleinen Bot, der einen Nextcloud-Ordner per Webdav mountent, nachschaut, ob eine .qmd-Datei im Verzeichnis liegt, und auf diese dann das Kommando quarto render DATEI ausführt. Der Webdav-Mountpunkt sowie der Bot ansich werden mit systemd gestartet.
quarto
ubuntuusers
Autor:in
Joe Slam
Veröffentlichungsdatum
23. September 2022
Mit quarto setze ich unter anderem auch meine (Geschäfts)Briefe als PDF-Datei. Hierfür habe ich mir ein paar Vorlagen gebastelt, siehe z.B. dieses Beispiel.
Das funktioniert soweit auf dem PC sehr gut. Am Handy oder am Tablet ist quarto mit nicht verfügbar, weshalb ich mir einen kleinen Bot programmiert habe, der einen Nextcloud-Ordner “überwacht” und die vorhandenen .qmd-Dateien zu PDFs rendert.
Der Bot
mountet den Nextcloud-Ordner per Webdav
überwacht in einem vorgegebenem Zeitintervall (30 Sek.), ob .qmd-Dateien in diesem Verzeichnis vorhanden sind
führt den Befehl quarto render DATEI.qmd auf jede .qmd-Datei im Verzeichnis aus. Quarto legt die erzeugten PDF-Dateien ins selbe Verzeichnis.
verschiebt die .qmd-Datei nach .qmd-TIMESTAMP. So wird sie nicht erneut gerendert.
wartet 30 Sekunden und fängt wieder von vorne an
wird über systemd gesteuert.
läuft nicht als root, sondern als normaler User, in meinem Falle produnis.
So kann ich “von überall”, z.B. am Handy, eine .qmd-Datei erzeugen, diese ins Nextcloud-Verzeichnis uploaden, 30 Sekunden warten, und die fertige PDF-Datei aus dem Nextcloud-Verzeichnis herunterladen.
Der Bot kann an jedem beliebigen Linux-PC mit Internetanschluss betrieben werden. Du musst “lediglich” sicherstellen, dass der Befehl
# muss fehlerfrei durchlaufenquarto render Datei.qmd
korrekt auf dem Server ausgeführt wird. Der Bot führt ja letztendlich auch “nur” diesen Befehl aus.
Nextcloud
In Nextcloud habe ich in meinem Homeverzeichnis den Ornder quarto, und darunter den Ordner renderbot erstellt. In letzterem wird der Bot lauschen. Letztendlich ist es aber egal, welcher Ordner genau verwendet werden soll.
Mountpunkt
Auf dem Bot-PC erstelle ich mir das Verzeichis /media/Nextcloudquartobot.
Wir mounten dieses Verzeichnis per systemd, daher müssen wir alles so einstellen, dass keine Passwortabfrage beim mounten erfolgt. Hierzu hinterlegen wir unsere Userdaten in der Datei /etc/davfs2/secrets :
In Zeile 4 habe ich bereits auf den noch zu erstellenden Bot-Service verwiesen. Die Mount-Unit soll immer vor dem Bot-Service starten.
In Zeile 8 müsst ihr eure Userdaten ergänzen
In Zeile 10 wird festgelegt, dass der User produnis den Mount durchführen soll, und nicht root. Hierdurch wird sichergestellt, dass ich auch alle Lese- und Schreibrechte erhalte.
Wir können das Verzeichnis nun per systemd mounten:
#!/bin/bashwhile [[ true ]]; doif ls /media/Nextcloudquartobot/*.qmd 1>/dev/null 2>&1; then cd /media/Nextcloudquartobotfor i in*.qmd; do echo "Found file $i" timestamp=$(date "+%Y-%m-%d--%H-%M-%S") echo "Trying to run 'quarto render $i'..."/sbin/quarto render "$i"; echo "Moving .qmd-file..." mv "$i""$i-$timestamp" doneelse echo "Nothing to do..." fi echo "Sleeping for 30 seconds." sleep 30done
Dieses Script soll nun mit systemd gesteuert werden. Hierfür erstellen wir die Datei /etc/systemd/system/quarto-nextcloud-bot.service und geben ihr folgenden Inhalt:
In Zeile 3 legen wir fest, dass vor unserem Bot das Mountscript “media-Nextcloudquartobot.mount” ausgeführt werden soll. Sonst wäre ja der Nextcloudordner nicht da.
In Zeile 9 führen wir das Script aus und übergeben dabei den aktuellen $PATH.
In Zeile 10 sagen wir, dass das Script als User produnis ausgeführt werden soll.
So sehe ich, dass das Script läuft und sich langweilt:
Sep 23 17:40:19 SERVER bash[9086]: Sleeping for 30 seconds.Sep 23 17:40:50 SERVER bash[9086]: Nothing to do...Sep 23 17:40:50 SERVER bash[9086]: Sleeping for 30 seconds.Sep 23 17:41:20 SERVER bash[9086]: Nothing to do...Sep 23 17:41:20 SERVER bash[9086]: Sleeping for 30 seconds.
Sobald ich eine .qmd-Datei in das Nextcloudverzeichnis lege, fängt er an zu arbeiten:
Sep 23 17:42:52 SERVER bash[9086]: Found file Hinweise-zur-Klausuraufsicht.qmdSep 23 17:42:52 SERVER bash[9086]: Trying to run 'quarto render Hinweise-zur-Klausuraufsicht.qmd'...Sep 23 17:42:55 SERVER bash[9360]: pandoc Sep 23 17:42:55 SERVER bash[9360]: to: latexSep 23 17:42:55 SERVER bash[9360]: output-file: Hinweise-zur-Klausuraufsicht.texSep 23 17:42:55 SERVER bash[9360]: running xelatex - 1Sep 23 17:42:58 SERVER bash[9360]: running xelatex - 2Sep 23 17:43:01 SERVER bash[9360]: This is XeTeX, Version 3.141592653-2.6-0.999994 (TeX Live 2022) (preloaded format=xelatex)Sep 23 17:43:04 SERVER bash[9360]: Output created: Hinweise-zur-Klausuraufsicht.pdfSep 23 17:43:04 SERVER bash[9086]: Moving .qmd-file...Sep 23 17:43:05 SERVER bash[9086]: Sleeping for 30 seconds.
Und die fertig gerenderte PDF-Datei ist im Nextcloudverzeichnis verfügbar.
Nutzung
Ich schmeiss also einfach eine qmd-Datei in den Nextcloudordner, und hole mir die PDF-Datei von dort zurück. Sollte ich Bilder einbinden (z.B. meine Unterschrift bei Briefen), oder Templates, müssen diese ebenfalls im Nextcloud-Ordner vorhanden sein, damit Quarto sie finden kann.
Nachtrag: matrix-Bot
Es gibt einen Bot für matrix, der ebenfalls .qmd-Dateien rendert und das PDF zurück in den matrix-Raum sendet, siehe https://github.com/rgomez90/matrix-bot.