Monatlich Shaarli

Alle Links eines Monat auf einer Seite.

December, 2023

Bildupload für Shaarli

Wie unschwer zu erkennen ist, läuft dieser Blog (wenn man ihn so nennen mag) auf der Software Shaarli. Hauptsächlich für Bookmarks gedacht, ist das trotzdem für mich der fast perfekte Micro-Blog. Das liegt daran, dass er unkompliziert, schnell und arm an Features ist. Das hilft mir beim Fokussieren auf das Wesentliche: den Inhalt.

Was mir jedoch fehlte, war die Möglichkeit, auch mal ein Bild oder einen Screenshot hochzuladen. Zum Glück bietet Shaarli die Möglichkeit, Funktionalitäten per Plugin nachzureichen. Also habe ich einfach einen Upload-Button beim Erstellen eines Beitrags hinzugefügt und beim Speichern das Bild passend abgelegt und einen Markdown-Link eingefügt. PHP und das Plugin-System von Shaarli sind nicht schwierig. Da ich jedoch nur gelegentlich etwas mit PHP mache und das Plugin-System gar nicht kenne, habe ich mir von Chat-GPT helfen lassen. Wie zu erwarten nimmt einem die KI natürlich nicht alles ab und manches ist Quatsch, aber sie hat sich auch vielfach hilfreich verhalten und mir so geholfen, an einem Nachmittag eine brauchbare Lösung zusammenzubekommen. Das fertige Plugin habe ich bei Github abgelegt.

Shaarli-image-upload.png
Neuen Beitrag in Shaarli erstellen mit Button zum Bild hochladen

Links

Shaarli The personal, minimalist, super fast, database-free, bookmarking service.

Verschlüsseltes Backup auf Onlinespeicher von Bitrix24.de

Neulich gab es als Promo 50 Gigabyte kostenlosen Onlinespeicher bei Bitrix24.de. Eine sehr gute Gelegenheit die wichtigsten Daten aus dem Home-Server ins Internet zu kippen. Leider funktioniert das Mounten per Webdav wegen veralteter Cipher, die von Bitrix24 Verwendung finden und bei davfs2 schon entfernt wurden, nicht. Ein einfacher Upload mit curl geht aber auch so.

tar -czvf - -C path/to/important/files . | openssl aes-256-cbc -salt -k 'enc_passwd123!' -pbkdf2 | curl -T - -u [email protected]:bitrix_password https://b24-w0e67a.bitrix24.de/company/personal/user/1/disk/path/backup.tar.enc

Wir packen also alles aus dem lokalen Verzeichnis path/to/important/files zusammen, verschlüsseln es mir einem ordentlichen Passwort und laden die Datei bei Bitrix24.de hoch.

Die Backup-Datei kann man testweise wieder herunterladen und mit der folgenden Zeile entschlüsseln und z.B. nach /tmp/restore entpacken.

cat backup.tar.enc | openssl aes-256-cbc -d -salt -k 'enc_passwd123!' | tar -xzvf - -C /tmp/restore

Wenn man das ganze automatisieren will, will man vielleicht die alte, hochgeladene Datei vor dem nächsten Upload löschen.

 curl -X DELETE -u [email protected]:bitrix_password https://b24-w0e67a.bitrix24.de/company/personal/user/1/disk/path/backup.tar.enc

Die Datei wandert bei Bitrix24.de leider nur in den Papierkorb und nimmt auch weiterhin Platz ein, bis sie entweder automatisch nach 30 Tagen gelöscht oder der Papierkorb von Hand geleert wird.

Um das ganze zu automatisieren und außerdem einen Mechanismus zum Chunken zu haben, habe ich aus dem ganzen ein Python-Script zusammengebastelt, das regelmäßig per Cron ausgeführt wird. Wichtig war mir hierbei, daß keine Daten auf die SSD zwischengespeichert werden, um diese zu schonen und außerdem den RAM-Verbrauch nicht explodieren zu lassen. Es wird also alles per Pipe durchgereicht, so dass die Chunksize maßgeblich für den RAM-Verbrauch ist.

import os
import subprocess
import sys

def create_backup(directory):
    # Archiv erstellen und verschlüsseln
    tar_process = subprocess.Popen(["tar", "-zcf", "-", directory], stdout=subprocess.PIPE)
    encrypt_process = subprocess.Popen(["openssl", "aes-256-cbc", "-salt", "-k", "enc_passwd123!", "-pbkdf2"], stdin=tar_process.stdout, stdout=subprocess.PIPE)    

    # Chunk-Größe festlegen 100MB (in bytes)
    chunk_size = 100 * 1024 * 1024

    # Verzeichnisname des Backup-Verzeichnisses extrahieren
    backup_directory, backup_dirname = os.path.split(os.path.normpath(directory))    
    print( f"backup_dirname={backup_dirname}" )

    # Chunks erstellen und hochladen
    chunk_number = 1
    while True:
        chunk = encrypt_process.stdout.read(chunk_size)
        if not chunk:
            break

        # Chunk hochladen
        upload_chunk(chunk, chunk_number, backup_dirname)

        chunk_number += 1

    # Aufräumen
    encrypt_process.stdout.close()
    encrypt_process.wait()

def upload_chunk(chunk, chunk_number, backup_dirname):
    filename = f"backup_{backup_dirname}_{str(chunk_number).zfill(3)}"

    delete_command = f"curl -X DELETE -u [email protected]:passwd123! 'https://b24-w0e67a.bitrix24.de/company/personal/user/1/disk/path/{filename}'"
    subprocess.run(delete_command, shell=True)    

    upload_command = f"curl -i -X PUT -u [email protected]:passwd123! --data-binary @- 'https://b24-w0e67a.bitrix24.de/company/personal/user/1/disk/path/{filename}'"    
    subprocess.run(upload_command, input=chunk, shell=True)    

# Kommandozeilenparameter überprüfen
if len(sys.argv) < 2:
    print("Verzeichnis als Parameter angeben.")
    sys.exit(1)

# Verzeichnis aus Kommandozeilenparameter extrahieren
directory = sys.argv[1]

# Beispielaufruf des Skripts
create_backup(directory)

Aufgerufen werden kann das Script einfach mit python3 <scriptname> path/to/important/files.