Files
Investidor-V2/tools/portal-country-https-active-reverse.py
nala 287e991486
tests / ci (push) Waiting to run
oportunidades 7
2026-10-13 11:40:29 +02:00

39 lines
2.7 KiB
Python

"""Pre-installation reversal from validated snapshots. Never undo SQL or erase immutable assets."""
from pathlib import Path
from datetime import datetime,timezone
import hashlib,json,os
ROOT=Path(__file__).resolve().parent.parent
DIR=ROOT/'storage/app/private/investmoz-v2/portal-audit'
read=lambda p:json.loads(Path(p).read_text(encoding='utf-8-sig'))
sha=lambda p:hashlib.sha256(Path(p).read_bytes()).hexdigest()
stage=read(DIR/'country-https-active-stage-latest.json')
check=read(DIR/'country-https-active-check-before-apply-20261011.json')
assert check['result']=='passed' and check['phase']=='before-apply' and not check['country_enabled']
assert check['installed_packages']==[] and check['columns']==[] and check['installation_audits']==0
assert 0<=(datetime.now(timezone.utc)-datetime.fromisoformat(check['at'])).total_seconds()<180
assert not (ROOT/'bootstrap/cache/config.php').exists()
manifest=read(ROOT/'outputs/investmoz-country02-https-20261011/manifesto-candidata.json')
for name,digest in manifest['files'].items():assert sha(ROOT/name)==digest
assert sha(ROOT/'public/build/manifest.json')==manifest['production']['manifest_sha256']
allowed={str(ROOT/name) for name in manifest['changed_source_files']}
allowed|={str(ROOT/'.env'),str(ROOT/'public/build/manifest.json'),
str(ROOT/'storage/app/private/investmoz-v2/organization-country-installation/readiness.json')}
cfg=read(ROOT/'outputs/investmoz-country02-https-20261011/configuracao-ativa-leitura.json')
allowed.add(str(Path(cfg['active_vhost']['path'])))
assert sha(cfg['active_vhost']['path'])==stage['active_vhost_sha256']
records=stage['backup_files']
for target,entry in records.items():assert sha(entry['backup'])==entry['sha256']
restored=[]
for target,entry in records.items():
if target not in allowed:continue
file=Path(target);temp=file.with_name(file.name+'.country02-reversal-new')
assert not temp.exists();temp.write_bytes(Path(entry['backup']).read_bytes());os.replace(temp,file)
assert sha(file)==entry['sha256'];restored.append(target)
assert sha(ROOT/'public/build/manifest.json')==cfg['active_manifest_sha256']
result={'result':'pre_installation_sources_bundle_env_vhost_restored','at':datetime.now(timezone.utc).isoformat(),
'restored_files':restored,'active_SQL_writes':0,'installation_performed':False,
'immutable_assets_and_TLS_files_preserved':True,'certificate_trust_not_removed_automatically':True,
'Apache_reload_if_needed':'Use the normal Laragon Apache control; do not terminate processes'}
(DIR/'country-https-active-reversal-20261011.json').write_text(json.dumps(result,indent=2),encoding='utf-8')
print(json.dumps({'result':result['result'],'restored_file_count':len(restored),'active_SQL_writes':0,'installation_performed':False}))