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
set -e
# Check if forcing full backup (for manual runs)
FORCE_FULL="${1:-no}"
# Load configuration
source /etc/proxmox-backup-client/config
@ -884,13 +887,16 @@ case "$BACKUP_TYPE" in
both)
# Do file backup first (faster, more frequent)
backup_files || BACKUP_SUCCESS=false
# Only do block device backup on Sunday (weekly)
if [ "$(date +%u)" -eq 7 ]; then
# Do block device backup on Sunday OR if manually forced
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)"
backup_block_device || BACKUP_SUCCESS=false
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
;;
*)
@ -917,7 +923,7 @@ EOFSCRIPT
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
[Unit]
Description=Proxmox Backup Client Backup
@ -934,7 +940,25 @@ SyslogIdentifier=pbs-backup
[Install]
WantedBy=multi-user.target
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
cat > /etc/systemd/system/pbs-backup.timer <<EOF
[Unit]
@ -967,11 +991,11 @@ run_backup_now() {
RUN_NOW=$(prompt "Do you want to run a backup now? (yes/no)" "no")
if [[ "$RUN_NOW" == "yes" ]]; then
log "Starting immediate backup..."
log "Starting immediate FULL backup (files + block device)..."
echo
# Start the backup
systemctl start pbs-backup.service
# Start the manual backup (forces full backup)
systemctl start pbs-backup-manual.service
# Wait a moment for service to start
sleep 1
@ -985,7 +1009,7 @@ run_backup_now() {
# 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
done
# Service finished, kill the journal follow
@ -1004,7 +1028,7 @@ run_backup_now() {
echo "════════════════════════════════════════════════════════════"
# 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
error "Backup failed!"
else
@ -1122,11 +1146,11 @@ main() {
# Continue to interactive_config below
;;
4)
info "Running backup now..."
info "Running FULL backup now (files + block device)..."
echo
# Start the backup
systemctl start pbs-backup.service
# Start the manual backup (forces full backup)
systemctl start pbs-backup-manual.service
# Wait a moment for service to start
sleep 1
@ -1140,7 +1164,7 @@ main() {
# 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
done
# Service finished, kill the journal follow
@ -1159,7 +1183,7 @@ main() {
echo "════════════════════════════════════════════════════════════"
# 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
error "Backup failed!"
echo