From 603c2926fae6d83aa9958679755981f0dcc2aa60 Mon Sep 17 00:00:00 2001 From: codex Date: Sun, 6 Sep 2026 01:25:14 +0200 Subject: [PATCH] Keep isolated SQL import on trusted container socket Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a06ecb-456a-71c2-b41e-0755d336e883 --- scripts/restore_forgejo_offsite_locally.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/restore_forgejo_offsite_locally.py b/scripts/restore_forgejo_offsite_locally.py index f1d41c1..b27a2ee 100644 --- a/scripts/restore_forgejo_offsite_locally.py +++ b/scripts/restore_forgejo_offsite_locally.py @@ -107,14 +107,16 @@ LEVEL = Error docker('run','-d','--name',db,'--network',network,'--log-driver','none','--memory','1g', '-e','POSTGRES_PASSWORD','-e','POSTGRES_USER=forgejo','-e','POSTGRES_DB=forgejo',POSTGRES,env=env) resources.append(('container',db)) + # Initialization uses a temporary socket-only server; wait for final TCP. + # Then use the disposable container's trusted local socket for import. for _ in range(30): if docker('exec',db,'pg_isready','-h','127.0.0.1','-U','forgejo',check=False).returncode==0: break time.sleep(2) else: raise ValueError('database_not_ready') sql=(staging/'forgejo-db.sql').read_bytes() - docker('exec','-i',db,'psql','-h','127.0.0.1','-U','forgejo','-d','forgejo','--single-transaction','-v','ON_ERROR_STOP=1',payload=sql,timeout=900) + docker('exec','-i',db,'psql','-U','forgejo','-d','forgejo','--single-transaction','-v','ON_ERROR_STOP=1',payload=sql,timeout=900) receipt['database_import']=True - counts=docker('exec',db,'psql','-h','127.0.0.1','-U','forgejo','-d','forgejo','-Atqc', + counts=docker('exec',db,'psql','-U','forgejo','-d','forgejo','-Atqc', 'SELECT (SELECT count(*) FROM repository),(SELECT count(*) FROM "user"),(SELECT count(*) FROM package_blob);').stdout.decode().strip() numbers=[int(n) for n in counts.split('|')] if min(numbers[:2]) <= 0: raise ValueError('empty_database') @@ -136,7 +138,7 @@ LEVEL = Error receipt['application_health']=True receipt['stage']='repository_recovery' # Select restored public repositories only, keeping payloads out of evidence. - rows=docker('exec',db,'psql','-h','127.0.0.1','-U','forgejo','-d','forgejo','-Atqc', + rows=docker('exec',db,'psql','-U','forgejo','-d','forgejo','-Atqc', 'SELECT u.lower_name || \'/\' || r.lower_name FROM repository r JOIN "user" u ON u.id=r.owner_id WHERE NOT r.is_private AND NOT r.is_empty LIMIT 2;').stdout.decode().splitlines() if not rows: raise ValueError('public_repository_fixture_missing') receipt['repositories_verified']=[] @@ -150,7 +152,7 @@ LEVEL = Error receipt['repositories_verified'].append(repo) receipt['stage']='package_blob_recovery' # Each stored blob must survive extraction and match its database digest. - rows=docker('exec',db,'psql','-h','127.0.0.1','-U','forgejo','-d','forgejo','-Atqc','SELECT hash_sha256 FROM package_blob;').stdout.decode().splitlines() + rows=docker('exec',db,'psql','-U','forgejo','-d','forgejo','-Atqc','SELECT hash_sha256 FROM package_blob;').stdout.decode().splitlines() files=list((staging/'data'/'packages').rglob('*')) if (staging/'data'/'packages').exists() else [] available={p.name:p for p in files if p.is_file()} verified=0