steam-backlog-enforcer/steam_backlog_enforcer
Krzysztof kuhy Rudnicki 243e11bc00
Some checks are pending
pre-commit / pre-commit (push) Waiting to run
Tests / test (3.10) (push) Waiting to run
Tests / test (3.11) (push) Waiting to run
Tests / test (3.12) (push) Waiting to run
perf(whitelist): only shell out to chattr when the immutable flag differs
lock_enforcement_files() runs at the end of every enforce-loop iteration and
called _try_set_immutable() on both config files unconditionally, so the
daemon forked `chattr +i` twice per iteration whether or not the flag was
already set. Measured with bpftrace: 20 chattr execs per 30 seconds, ~56,000
per day, all of them re-applying a flag that was already there.

Read the flag first with FS_IOC_GETFLAGS, which is an ioctl and costs no
process, and only spawn chattr when the current state differs.

_immutable_flag_is() fails closed on purpose: an unsupported filesystem, a
refused ioctl, or an unreadable file all report False so the caller still
runs chattr. A wrong True would silently stop enforcing immutability, which
is much worse than a redundant fork.

Verified live, not just in tests: `chattr` execs over 30s went 20 -> 0 after
restarting the service, and clearing the flag by hand
(`sudo chattr -i ~/.config/steam_backlog_enforcer/config.json`) still got it
re-applied within ~10 seconds, so enforcement is unchanged.

Full suite: 1091 passed, coverage 100.00%.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-25 20:15:12 +02:00
..
docs feat(enforcer): raise manual pick cap from 2 to 3 concurrent games 2026-07-23 18:05:29 +02:00
tests perf(whitelist): only shell out to chattr when the immutable flag differs 2026-07-25 20:15:12 +02:00
__init__.py feat: steam 100 percent extension 2026-03-02 20:29:32 +01:00
_actions.py fix(game_install): refuse to delete folders matching an allowed game's name 2026-07-25 15:50:29 +02:00
_allowed_games.py fix(game_install): refuse to delete folders matching an allowed game's name 2026-07-25 15:50:29 +02:00
_cmd_done.py feat(enforcer): allow two concurrent manual picks 2026-07-19 17:28:23 +02:00
_enforce_loop.py feat(enforcer): allow two concurrent manual picks 2026-07-19 17:28:23 +02:00
_hltb_detail.py fix: HLTB count_comp=0 bug, false matches, and ProtonDB log noise 2026-05-28 20:40:51 +02:00
_hltb_search.py fix: HLTB count_comp=0 bug, false matches, and ProtonDB log noise 2026-05-28 20:40:51 +02:00
_hltb_types.py chore: set up as standalone repo 2026-05-28 07:21:29 +02:00
_mcp.py fix(game_install): refuse to delete folders matching an allowed game's name 2026-07-25 15:50:29 +02:00
_scanning_confidence.py fix: HLTB count_comp=0 bug, false matches, and ProtonDB log noise 2026-05-28 20:40:51 +02:00
_stats.py Fix pre-existing CI failures from the MCP-server commit 2026-07-10 23:04:07 +02:00
_steam_state.py fix(enforcer): defer Steam restart while a game update is in progress 2026-07-18 15:59:47 +02:00
_total_block.py feat: block-gaming purges Steam/Proton filesystem remnants + helper packages 2026-07-04 17:25:08 +02:00
_web_dataset.py feat(enforcer): allow two concurrent manual picks 2026-07-19 17:28:23 +02:00
_web_server.py feat: add interactive web UI for backlog completion planning 2026-05-29 18:35:45 +02:00
_whitelist.py perf(whitelist): only shell out to chattr when the immutable flag differs 2026-07-25 20:15:12 +02:00
config.py feat(enforcer): raise manual pick cap from 2 to 3 concurrent games 2026-07-23 18:05:29 +02:00
enforcer.py feat(enforcer): allow two concurrent manual picks 2026-07-19 17:28:23 +02:00
game_install.py fix(game_install): refuse to delete folders matching an allowed game's name 2026-07-25 15:50:29 +02:00
hltb.py feat: add pick-manual command with 2-week enforcement lock 2026-05-30 17:15:37 +02:00
library_hider.py feat(enforcer): allow two concurrent manual picks 2026-07-19 17:28:23 +02:00
main.py fix(game_install): refuse to delete folders matching an allowed game's name 2026-07-25 15:50:29 +02:00
protondb.py fix: HLTB count_comp=0 bug, false matches, and ProtonDB log noise 2026-05-28 20:40:51 +02:00
scanning.py chore: set up as standalone repo 2026-05-28 07:21:29 +02:00
steam_api.py feat(steam_backlog_enforcer): harden whitelist against circumvention 2026-05-17 20:44:05 +02:00
store_blocker.py feat: add block-gaming command (Stage 4) + guard-lib migration cleanup 2026-07-04 11:45:54 +02:00