import pathlib,hashlib,shutil,subprocess,time,urllib.request,json,datetime b=pathlib.Path('/www/dk_project/dk_app/trilium');s=pathlib.Path('/tmp/trilium-api-final');h=lambda p:hashlib.sha256(p.read_bytes()).hexdigest() assert h(b/'patched/main.cjs')==h(s/'before.cjs') backup=b/'backups'/('before-api-final-'+datetime.datetime.now().strftime('%Y%m%d-%H%M%S'));backup.mkdir(mode=0o700) for n,target in [('main.cjs','patched/main.cjs'),('etapi.json','i18n_ko/doc_notes/en/api-ko/etapi.json'),('internal.json','i18n_ko/doc_notes/en/api-ko/internal.json')]:shutil.copy2(b/target,backup/n);(b/target).write_bytes((s/n).read_bytes()) subprocess.run(['docker','restart','trilium'],check=True) for i in range(40): try: with urllib.request.urlopen('http://127.0.0.1:18082/etapi/docs/swagger-ui-bundle.js',timeout=3) as r:assert hashlib.sha256(r.read()).hexdigest()==h(b/'i18n_ko/doc_notes/en/api-ko/swagger/swagger-ui-bundle.js') break except Exception: if i==39:raise time.sleep(1) checks=[] for rel in ['etapi.json','internal.json','frontend.html','fnote.html','backend.html']: with urllib.request.urlopen('http://127.0.0.1:18082/assets/v0.95.0-ko-20260913-r8/doc_notes/en/api-ko/'+rel,timeout=5) as r:assert hashlib.sha256(r.read()).hexdigest()==h(b/'i18n_ko/doc_notes/en/api-ko'/rel) checks.append(rel) for route in ['etapi','api']: with urllib.request.urlopen('http://127.0.0.1:18082/'+route+'/docs/',timeout=5) as r:assert '참고 자료' in r.read().decode() with urllib.request.urlopen('http://127.0.0.1:18082/'+route+'/docs/swagger-ui-init.js',timeout=5) as r:assert '설명' in r.read().decode() result={'status':'verified','backup':str(backup),'pages':checks,'swaggerVersion':'5.21.0','mainSha256':h(b/'patched/main.cjs')};(b/'i18n_ko/phase9-final-result.json').write_text(json.dumps(result));print(json.dumps(result))