From 8f351ae4d14fc2abcc83716a192dfacff6dc65ef Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Thu, 25 Jun 2026 01:37:41 -0400 Subject: feat: lock backups internally so cron needs no flock wrapper rsyncshot now acquires an exclusive, non-blocking lock (fd 200) before the backup phase, so a slow backup can't overlap the next cron tick. Only real backups lock. Help, list, status, and dryrun don't, so they're never blocked. The lock file defaults to /run/lock/rsyncshot.lock, a root-only directory that avoids the symlink-truncation risk of a predictable name in world-writable /tmp. It falls back to /var/lock then /tmp, and is configurable via LOCKFILE. It's deliberately a different file from the old /tmp/rsyncshot.lock cron wrappers, so existing wrapped crontabs keep working until the wrapper is removed. setup() no longer wraps cron entries in flock, since the script locks itself. --- tests/cases/test_cron.sh | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'tests/cases/test_cron.sh') diff --git a/tests/cases/test_cron.sh b/tests/cases/test_cron.sh index 5c9bbfa..7e38060 100755 --- a/tests/cases/test_cron.sh +++ b/tests/cases/test_cron.sh @@ -118,6 +118,35 @@ EOF assert_contains "$crontab_content" "rsyncshot" "should also have rsyncshot jobs" || return 1 } +# ------------------------------------------------------------------------------ +# Test: Cron entries no longer wrap rsyncshot in an external flock +# ------------------------------------------------------------------------------ +# rsyncshot locks internally now, so setup should write bare cron commands. +test_cron_no_flock_wrapper() { + setup_test_env + save_crontab + + crontab -r 2>/dev/null || true + + cat > "$TEST_CONFIG_DIR/config" << EOF +REMOTE_HOST="" +MOUNTDIR="$TEST_BACKUP_DIR" +EOF + create_test_includes + create_test_excludes + + sudo INSTALLHOME="$TEST_CONFIG_DIR" SCRIPTLOC="/tmp/rsyncshot-test" RSYNCSHOT_SKIP_MOUNT_CHECK=1 "$SCRIPT_PATH" setup >/dev/null 2>&1 || true + + local crontab_content + crontab_content=$(crontab -l 2>/dev/null) + + restore_crontab + teardown_test_env + + assert_not_contains "$crontab_content" "flock" "cron entries should not wrap rsyncshot in flock (internal locking)" || return 1 + assert_contains "$crontab_content" "rsyncshot" "cron should still contain rsyncshot entries" || return 1 +} + # ------------------------------------------------------------------------------ # Run tests # ------------------------------------------------------------------------------ @@ -129,6 +158,7 @@ run_cron_tests() { run_test "setup adds cron jobs" test_setup_adds_cron_jobs run_test "repeated setup doesn't duplicate entries" test_no_duplicate_cron_entries run_test "setup preserves existing cron jobs" test_preserves_existing_cron + run_test "cron entries have no flock wrapper" test_cron_no_flock_wrapper } # Run if executed directly -- cgit v1.2.3