fix: Backup-Snapshots werden jetzt mit sudo erstellt fuer korrekte Berechtigungen

Problem:
  Backups wurden ohne Root-Rechte erstellt. Dadurch wurden Datei-
  berechtigungen (UID/GID, rwx, ACLs, xattrs) nicht korrekt uebernommen.
  Root-Dateien konnten nicht gelesen werden. Backups waren unvollstaendig.

Loesung:
  - rsync_manager: create_snapshot() nutzt jetzt sudo fuer rsync
  - rsync_manager: --numeric-ids Flag hinzugefuegt fuer korrekte UID/GID
  - snapshot_manager: mkdir mit sudo fuer Root-Besitz der Snapshots
  - snapshot_manager: delete_snapshot mit sudo (Snapshots sind Root-owned)
  - main_window: Sudo-Passwort-Dialog vor jedem Backup
  - main_window: Dialog-Text erweitert (Backup erfordert sudo)
  - main.cpp: --sudo-password Argument fuer CLI/Cron-Modus
  - main.cpp: Interaktive Passwort-Eingabe im CLI-Modus
  - README.md: Build-Abhaengigkeiten fuer alle Distros hinzugefuegt
  - README.md: Rechte-Tabelle aktualisiert
  - README.md: Cronjob-Beispiel mit Passwort-Speicherung aktualisiert

Betroffene Dateien:
  src/rsync_manager.h, src/rsync_manager.cpp
  src/snapshot_manager.h, src/snapshot_manager.cpp
  src/main_window.h, src/main_window.cpp
  src/main.cpp
  README.md
This commit is contained in:
x3
2026-09-08 08:17:39 +00:00
parent f95a634655
commit 240071166e
8 changed files with 137 additions and 39 deletions
+32 -6
View File
@@ -77,6 +77,7 @@ int main(int argc, char* argv[]) {
bool backup_now = false;
bool show_help = false;
bool cli_mode = false;
std::string sudo_password;
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "--system-backup") == 0) {
@@ -90,6 +91,8 @@ int main(int argc, char* argv[]) {
show_help = true;
} else if (strcmp(argv[i], "--log") == 0) {
log_to_stdout = true;
} else if (strcmp(argv[i], "--sudo-password") == 0 && i + 1 < argc) {
sudo_password = argv[++i];
}
}
@@ -99,11 +102,14 @@ int main(int argc, char* argv[]) {
g_print("x3-Backup - GTK3 Backup/Snapshot Tool\n\n");
g_print("Usage: x3-backup [OPTIONS]\n\n");
g_print("Options:\n");
g_print(" --backup Create a backup immediately and exit\n");
g_print(" --system-backup Create a full system backup and exit\n");
g_print(" --log Print log to stdout\n");
g_print(" --help, -h Show this help\n\n");
g_print(" --backup Create a backup immediately and exit\n");
g_print(" --system-backup Create a full system backup and exit\n");
g_print(" --sudo-password PW Provide sudo password for backup (required for root permissions)\n");
g_print(" --log Print log to stdout\n");
g_print(" --help, -h Show this help\n\n");
g_print("Without options, x3-backup starts in GUI mode with system tray.\n\n");
g_print("Note: Backups require sudo to preserve file ownership and permissions.\n");
g_print(" Use --sudo-password or run interactively for password prompt.\n\n");
g_print("Log file: ~/.config/x3-backup/x3-backup.log\n");
return 0;
}
@@ -118,12 +124,32 @@ int main(int argc, char* argv[]) {
g_message("System backup mode: backing up entire system");
}
/* Prompt for sudo password if not provided */
if (sudo_password.empty()) {
g_print("Sudo password required for backup (to preserve file permissions):\n");
g_print("Password: ");
fflush(stdout);
char* pw = nullptr;
size_t len = 0;
ssize_t nread = getline(&pw, &len, stdin);
if (nread > 0 && pw[nread - 1] == '\n') pw[nread - 1] = '\0';
if (pw && *pw) {
sudo_password = std::string(pw);
}
free(pw);
if (sudo_password.empty()) {
g_warning("No password provided, backup may have incorrect permissions");
}
}
RsyncManager rsync(config);
SnapshotManager snapshots(config, rsync);
g_message("Starting backup...");
g_message("Starting backup with sudo...");
snapshots.cleanup_old_snapshots();
std::string ts = snapshots.create_snapshot(system_mode ? "System backup" : "Manual backup");
std::string ts = snapshots.create_snapshot(
system_mode ? "System backup" : "Manual backup",
sudo_password);
if (!ts.empty()) {
g_message("Backup completed: %s", ts.c_str());
} else {