fix(free_games_claimer): address review findings on the data migration

Three defects found by the Codex and CodeRabbit PR reviewers, all
reproduced before being accepted:

- A CONFIG_LOCATION under /config/data (for example
  /config/data/custom.env) made "mkdir -p $HOME" create the migration's
  own guard directory before the guard was tested, so the migration
  silently skipped itself and the add-on started with no claim history
  and no authenticated sessions. The migration now runs before the
  CONFIG_LOCATION directory is created.

- The copy list held prime-gaming.json but not epic-games.json or
  gog.json, although migrate_vogler_data.py's locate_source() supports
  all three at the data root. A user whose only legacy history was Epic
  or GOG would have had the migrator write a completion marker with zero
  imported records.

- fgc.db-journal was not copied. Upstream sets no PRAGMA journal_mode,
  so SQLite runs in its default rollback-journal mode and a hot journal
  left by an unclean stop is needed to recover the database.

Also: CONFIG_LOCATION=/config/data/config.env made CONFIG_FILE and
RUNTIME_CONFIG the same path, and GNU install refuses a self-copy with
status 1, which aborted the "set -e" init script before the application
started. Verified: "install -m 0600 f f" exits 1 with "are the same
file".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
alexbelgium
2026-09-24 09:08:07 +02:00
parent 89973a2bb7
commit 4fd0cd55ec
3 changed files with 22 additions and 13 deletions

View File

@@ -7,9 +7,10 @@
the `screenshots/` captures, the `browser/` profiles, `TurboVNC.log` and the `screenshots/` captures, the `browser/` profiles, `TurboVNC.log` and
upstream's debug dumps (#3081). upstream's debug dumps (#3081).
- An existing `/data` payload is copied over once on the first start of this - An existing `/data` payload is copied over once on the first start of this
version: `fgc.db` and its pre-migration backup, `browser/`, `screenshots/`, version: `fgc.db` with its rollback journal and its pre-migration backup,
`prime-gaming.json`, the legacy `data/` directory and the migration marker. `browser/`, `screenshots/`, the `epic-games.json`, `prime-gaming.json` and
Logs and last-run debug dumps are not copied, because the application `gog.json` claim histories, the legacy `data/` directory and the migration
marker. Logs and last-run debug dumps are not copied, because the application
regenerates them. The copy is staged and renamed into place, so an interrupted regenerates them. The copy is staged and renamed into place, so an interrupted
migration is retried rather than leaving a half-copied database or browser migration is retried rather than leaving a half-copied database or browser
profile. Nothing is deleted from `/data`: the migration needs temporary free profile. Nothing is deleted from `/data`: the migration needs temporary free

View File

@@ -2,13 +2,6 @@
# shellcheck shell=bash # shellcheck shell=bash
set -e set -e
# Define home
# Creating config location
echo "Creating config location ..."
HOME="$(bashio::config "CONFIG_LOCATION")"
HOME="$(dirname "$HOME")"
mkdir -p "$HOME"
# Up to version 2.1.1 the application stored its data in the add-on's private # Up to version 2.1.1 the application stored its data in the add-on's private
# /data volume, which is only reachable with "docker exec". It now lives in # /data volume, which is only reachable with "docker exec". It now lives in
# /config/data, which Home Assistant exposes as # /config/data, which Home Assistant exposes as
@@ -17,10 +10,15 @@ mkdir -p "$HOME"
# is retried on the next start instead of leaving a half-copied database or # is retried on the next start instead of leaving a half-copied database or
# browser profile behind. Nothing is removed from /data, so downgrading still # browser profile behind. Nothing is removed from /data, so downgrading still
# finds its data. # finds its data.
#
# This runs before the CONFIG_LOCATION directory is created below: a
# CONFIG_LOCATION under /config/data would otherwise create the destination
# and make the migration skip itself.
if [ ! -d /config/data ]; then if [ ! -d /config/data ]; then
legacy=() legacy=()
for entry in fgc.db fgc.db.pre-vogler-migration .vogler-remaster-migrated-v1.json \ for entry in fgc.db fgc.db-journal fgc.db.pre-vogler-migration \
browser screenshots data prime-gaming.json; do .vogler-remaster-migrated-v1.json browser screenshots data \
epic-games.json prime-gaming.json gog.json; do
if [ -e "/data/$entry" ]; then if [ -e "/data/$entry" ]; then
legacy+=("/data/$entry") legacy+=("/data/$entry")
fi fi
@@ -35,3 +33,10 @@ if [ ! -d /config/data ]; then
fi fi
mkdir -p /config/data mkdir -p /config/data
# Define home
# Creating config location
echo "Creating config location ..."
HOME="$(bashio::config "CONFIG_LOCATION")"
HOME="$(dirname "$HOME")"
mkdir -p "$HOME"

View File

@@ -27,7 +27,10 @@ fi
# The remaster reads /fgc/data/config.env. /fgc/data is linked to /config/data # The remaster reads /fgc/data/config.env. /fgc/data is linked to /config/data
# by the Dockerfile, so the runtime copy is visible under /addon_configs. # by the Dockerfile, so the runtime copy is visible under /addon_configs.
install -m 0600 "${CONFIG_FILE}" "${RUNTIME_CONFIG}" # CONFIG_LOCATION may itself be /config/data/config.env, in which case the two
# paths are the same file and install would fail.
[ "${CONFIG_FILE}" -ef "${RUNTIME_CONFIG}" ] || install "${CONFIG_FILE}" "${RUNTIME_CONFIG}"
chmod 0600 "${RUNTIME_CONFIG}"
sed -i 's/\r$//' "${RUNTIME_CONFIG}" sed -i 's/\r$//' "${RUNTIME_CONFIG}"
# Export values needed by the VNC entrypoint as well as by the Python app. # Export values needed by the VNC entrypoint as well as by the Python app.