Fix hybrid backups to run full backup when triggered manually

PROBLEM:
- User configured hybrid backup mode (files + block device)
- Manual "Run backup now" only did file backup, not block device
- Block device backups only ran on Sunday (day 7)
- User couldn't test full backup without waiting until Sunday

SOLUTION:
- Modified backup.sh to accept optional "yes" argument to force full backup
- Created new systemd service: pbs-backup-manual.service
  - Calls backup.sh with "yes" argument
  - Forces both file AND block device backup regardless of day
- Updated backup script logic:
  - If FORCE_FULL="yes" -> always do block device backup
  - Else if Sunday -> do block device backup
  - Else -> skip block device backup
- Updated both manual backup triggers:
  - Post-install "Run backup now" prompt
  - Menu option 4 "Run backup now"
  - Both now use pbs-backup-manual.service

BEHAVIOR:
- Scheduled backups (via timer): Files daily, block device weekly on Sunday
- Manual backups (via menu): Files + block device ALWAYS (full backup)

FILES CHANGED:
- Added FORCE_FULL parameter to backup.sh
- Modified "both" case to check FORCE_FULL first
- Created pbs-backup-manual.service systemd unit
- Updated run_backup_now() to use manual service
- Updated menu option 4 handler to use manual service

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
zaphod-black 2025-11-01 19:13:08 -05:00
parent 801b8649ba
commit f88cba76bb

View file

@ -784,6 +784,9 @@ EOF
#!/bin/bash #!/bin/bash
set -e set -e
# Check if forcing full backup (for manual runs)
FORCE_FULL="${1:-no}"
# Load configuration # Load configuration
source /etc/proxmox-backup-client/config source /etc/proxmox-backup-client/config
@ -884,13 +887,16 @@ case "$BACKUP_TYPE" in
both) both)
# Do file backup first (faster, more frequent) # Do file backup first (faster, more frequent)
backup_files || BACKUP_SUCCESS=false backup_files || BACKUP_SUCCESS=false
# Only do block device backup on Sunday (weekly) # Do block device backup on Sunday OR if manually forced
if [ "$(date +%u)" -eq 7 ]; then if [ "$FORCE_FULL" = "yes" ]; then
log "Manual full backup - including block device"
backup_block_device || BACKUP_SUCCESS=false
elif [ "$(date +%u)" -eq 7 ]; then
log "Weekly block device backup day (Sunday)" log "Weekly block device backup day (Sunday)"
backup_block_device || BACKUP_SUCCESS=false backup_block_device || BACKUP_SUCCESS=false
else else
log "Skipping block device backup (runs weekly on Sunday)" log "Skipping block device backup (runs weekly on Sunday, or use 'Run backup now' for immediate full backup)"
fi fi
;; ;;
*) *)
@ -917,7 +923,7 @@ EOFSCRIPT
chmod 700 "$CONFIG_DIR/backup.sh" chmod 700 "$CONFIG_DIR/backup.sh"
# Create systemd service file # Create systemd service file (for scheduled backups)
cat > /etc/systemd/system/pbs-backup.service <<EOF cat > /etc/systemd/system/pbs-backup.service <<EOF
[Unit] [Unit]
Description=Proxmox Backup Client Backup Description=Proxmox Backup Client Backup
@ -934,7 +940,25 @@ SyslogIdentifier=pbs-backup
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
# Create systemd service file for manual full backups
cat > /etc/systemd/system/pbs-backup-manual.service <<EOF
[Unit]
Description=Proxmox Backup Client Manual Full Backup
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=$CONFIG_DIR/backup.sh yes
StandardOutput=journal
StandardError=journal
SyslogIdentifier=pbs-backup
[Install]
WantedBy=multi-user.target
EOF
# Create systemd timer file # Create systemd timer file
cat > /etc/systemd/system/pbs-backup.timer <<EOF cat > /etc/systemd/system/pbs-backup.timer <<EOF
[Unit] [Unit]
@ -967,11 +991,11 @@ run_backup_now() {
RUN_NOW=$(prompt "Do you want to run a backup now? (yes/no)" "no") RUN_NOW=$(prompt "Do you want to run a backup now? (yes/no)" "no")
if [[ "$RUN_NOW" == "yes" ]]; then if [[ "$RUN_NOW" == "yes" ]]; then
log "Starting immediate backup..." log "Starting immediate FULL backup (files + block device)..."
echo echo
# Start the backup # Start the manual backup (forces full backup)
systemctl start pbs-backup.service systemctl start pbs-backup-manual.service
# Wait a moment for service to start # Wait a moment for service to start
sleep 1 sleep 1
@ -985,7 +1009,7 @@ run_backup_now() {
# Monitor backup in background and kill journalctl when done # Monitor backup in background and kill journalctl when done
( (
while systemctl is-active --quiet pbs-backup.service; do while systemctl is-active --quiet pbs-backup-manual.service; do
sleep 2 sleep 2
done done
# Service finished, kill the journal follow # Service finished, kill the journal follow
@ -1004,7 +1028,7 @@ run_backup_now() {
echo "════════════════════════════════════════════════════════════" echo "════════════════════════════════════════════════════════════"
# Check final status # Check final status
if systemctl status pbs-backup.service | grep -q "Active: failed"; then if systemctl status pbs-backup-manual.service | grep -q "Active: failed"; then
echo echo
error "Backup failed!" error "Backup failed!"
else else
@ -1122,11 +1146,11 @@ main() {
# Continue to interactive_config below # Continue to interactive_config below
;; ;;
4) 4)
info "Running backup now..." info "Running FULL backup now (files + block device)..."
echo echo
# Start the backup # Start the manual backup (forces full backup)
systemctl start pbs-backup.service systemctl start pbs-backup-manual.service
# Wait a moment for service to start # Wait a moment for service to start
sleep 1 sleep 1
@ -1140,7 +1164,7 @@ main() {
# Monitor backup in background and kill journalctl when done # Monitor backup in background and kill journalctl when done
( (
while systemctl is-active --quiet pbs-backup.service; do while systemctl is-active --quiet pbs-backup-manual.service; do
sleep 2 sleep 2
done done
# Service finished, kill the journal follow # Service finished, kill the journal follow
@ -1159,7 +1183,7 @@ main() {
echo "════════════════════════════════════════════════════════════" echo "════════════════════════════════════════════════════════════"
# Check final status # Check final status
if systemctl status pbs-backup.service | grep -q "Active: failed"; then if systemctl status pbs-backup-manual.service | grep -q "Active: failed"; then
echo echo
error "Backup failed!" error "Backup failed!"
echo echo