#
# Annahmen:
# - Allgemein
#   + Für den RemotePC liegt ein ssh preshared key vor und ist eingerichtet
#   + Werden zwingende Voraussetzungen nicht erfüllt, wird das Skript abgebrochen.
#   + Systemsicherungen und -restore erfordern root-Rechte für das Skript
#   + "//" im Pfad ist unschädlich für den Aufruf
#   + Beim restore sind QUELLE und ZIEL in der Bedeutung gegenüber vertauscht
#   + Berechtigung zum Anlegen des Restore-Verzeichnisses besteht
#   + Die generierte Fileliste liegt unter ${LOG_DIR}/file_list
#   + Die generierte Archivliste liegt unter ${LOG_DIR}/archive_list
#   + std. Port für ssh = 22 wird für remote verwendet. Falls nicht gewünscht => Generierung von BORG_REPO ändern
#   + <doverify = remote> darf nur bei <target = remote> verwendet werden
#   + Der mount-Punkt für fuse muß vom ausführenden User zugänglich und rw sein.
#     => kann durch das normale Systemkommando umount wieder gelöst werden (auch als user).
#   + /etc/borg_default muß vorhanden sein
#   + borg extract only supports restoring into an empty destination
#   + LOG_DIR sollte ein eindeutiger Name sein, damit mehrere Instanzen gestartet werden können.
#   + LOG_DIR muß vom ausführende User beschreibbar sein. Es kann zu Problemen kommen, wenn von vorherigen
#     Durchläufen andere Berechtigung gesetzt wurden.
#     Dies gilt auch für das remote-verify-Skript!
#
# - BTRFS snapshot
#   + (btrfs)-Snapshots liegen unter ${QUELL_PFAD}
#   + mount points sind nur ohne Inhalt zu sehen
#   + Snapshots are not recursive. Every nested subvolume will be an empty directory inside the snapshot.
#
# - cmdline Parameter
#   + deffile muß als erster Parameter auftauchen
#   + Keine Dubletten von widerstrebenden Parametern!
#   + Alle Parameter in Kleinbuchstaben (Ausnahme: ggf. Pfadangaben)
#   + fehlende <string>-Angaben werden nicht geprüft => vollständige cmdline erforderlich!
#
# - Vbox-Bereich
#   + /data/virtualbox/* wird getrennt vom System gesichert
#     Bei mir liegen alle VMs unter /data => kein Problem bei System-Sicherung, da auf eigener Partition.
#   + Alle laufenden VBoxen werden vom Backup ausgeschlossen (all_exclude)
#   + Start des Skripts als Eigentümer der Vboxen
#   + Die Verzeichnisse und Dateinamen enthalten keine Leerzeichen.
#   + vbox-name = Verzeichnisname der VBox
#
# - Skriptlisten
#   + do not allow backslashes to escape any characters (read-Parameter -r)
#   + Das Delimiterzeichen ist ","
#
# - pre_create_data
#   + Nicht durch den ausführenden User lesbare Files landen in der dynamischen Exclude-Liste.
#   + Links zu nicht erreichbaren Files werden ausgeschlossen
#--------------------------------------------------
# History (last entry on op)
#
# 03.09.2020 hk    RESULTFILE => LOG_FILE
#                  `id -g` => $(id -g)
# 02.09.2020 hk    alle Hinweise auf hkwork raus
#                  "];" durch "] ;" ersetzt (Hinweis DH)
#                  .txt => .log für log-Files (Hinweis DH)
#                  KEYPOS remote => repo
#                  `date` durch $(date)<space> ersetzt
# 25.08.2020 hk    FraLUG Version
#
# ToDo:
# - DH-Anmerkungen
#   + Der Inhalt der Variablenzuweisungen mit " werden von der bash interpretiert. Übergaben mit ' läßt die
#     bash unverändert. => ' weitestgehend verwenden.
#   + KEYPOS remote durch repo ersetzen, damit der Begriff nicht verwirrt.
#   + Für den Start über crontab muß beachtet werden, daß nicht alle Environments verfügbar sind => klären
#   + Verlagerung von /etc/borgbackup ins USER-Verzeichnis
#     Damit wäre es dann möglich, daß auch mehrere normale User borg verwenden können.
#     Alternativ: Die borg-user in einer gemeinsame Gruppe zusammenzufassen.
#   + `date` durch $(date)<space> ersetzen
#   + Konstrukt in Zeile 57 erklären => ggf. [[ weg
#   + bash 5.0.3 unter Buster untersuchen, da bei DH das Skript nicht läuft.
#     - "{now}" in borg create (Zeile 176) macht Ärger, da die bash versucht zu substituieren.
#       => Kommando nícht gefunden
#     - ähnliche Sustitutionsprobleme in Zeile 200, 219, 312, 320 mit den format-Anweisungen an borg.
#       Ich habe dies genauso aus der Borg-Doku abgeschrieben.
#     - Bei der Generierung von remote_verify klappt die Variablensubstitution nicht.
# - do_mail aktivieren
# - Datenbanksicherungen (dump_essential_files_and_databases) auskodieren (teilweise von PM bereits geschehen)
#   => kann leicht in eigenes Skript umgewandelt werden
# - Datenbanksicherungen (restore_essential_files_and_databases) auskodieren (teilweise von PM bereits geschehen)
#   => kann leicht in eigenes Skript umgewandelt werden
# - Umstellen von push- auf pull-Betrieb, damit gekaperte Quellen den Zielrechner nicht infizieren.
#   + Hier Beispiel aus der Borg-Doku mit sshfs verwenden
#
# - dryrun einführen
# - delete einführen
# - rename einführen
#
# Fragen:
# - Sollen die durch CACHEDIR.TAG gekennzeichneten Verzeichnisse separat gemerkt werden? z.B. für ein extract archiv
#
# Info:
# - lvm, zfs, qcow2 und btrfs können snapshots.
#   + Für etx4 ist dies experimentell.
#   + stratis soll dies auch für xfs bringen (Red Hat / Okt. 2018).
# - Nach create muß beim btrfs-Snapshot das aktuelle Verzeichnis auf eine Position außerhalb des Snapshots gestellt werden,
#   ansonsten crashed das anschließende prune
# - Bei relativen Pfaden muß "brog create" vom Basisverzeichis aus gestartet werden!
# - Bei absoluten Pfaden löscht "borg_create" das führende "/" und macht damit die abgespeicherten Pfade zu relativen Pfaden.
# - Die Option --progress für "borg *" ist gut für die Ausführung im Terminal, aber nicht für die Ausgabeumleitung in ein File.
# - CACHEDIR.TAG-File (http://bford.info/cachedir/spec.html) verhindert die Sicherung des Verzeichnisses mit borg.
#   Der Inhalt muß "Signature: 8a477f597d28d172789f06886806bc55" enthalten
#   Debian verwendet dies auch für einige "~/.cache/*"-Einträge
#   Es können nur ganze Verzeichnisse ausgeblendet werden! Dabei wird auch das Verzeichnis nicht ins Archiv aufgenommen.
# - exclude-Listen
#   + dir/* => Das Verzeichnis wird übernommen, der Inhalt nicht.
#   + borg extract: <exclude-list> hat Vorrang vor <path>
# - Auswahl der Files für Backup prüfen => nur ctime ändern
#   + ls -lt (modification time) vs. ls -lc (ctime) vs. ls -lu (accesstime)
#   + touch -a ändert access time
#   + touch -m ändert modification time
#   + chmod ändert ctime
#   + ctime is the time the file's inode was last changed. mtime is the last time the file's CONTENTS were changed. To
#     modify ctime, you'll have to do something to the inode, such as doing a chmod or chown on the file.
#     Changing the file's contents will necessarily also update ctime, as the atime/mtime/ctime values are stored in the inode.
#     Modifying mtime means ctime also gets updated.
#     Es besteht KEINE Mögichkeit ctime gezielt zu ändern! Es wird immer die Zeit der letzten inode-Änderung verwendet!
# - Die borg-Kompression zstd,15 entspricht ungefähr der von bzip2.
# - REPO_SELECT erwartet immer den vollständigen Pfad: "Zentrale/lenny-kde" und nicht nur "lenny-kde"
