Explorer
/proc/21/root/tmp/aa047_baseline.py
← Zurück ↓ Download
from pathlib import Path
import datetime,hashlib,json,shutil,sqlite3,subprocess
now=datetime.datetime.now(datetime.timezone.utc); stamp=now.strftime('%Y%m%dT%H%M%SZ')
root=Path('/opt/struktur/reports/aa047-backup')/stamp; root.mkdir(parents=True,exist_ok=True)
items=[
('/opt/struktur/graphiti/service/main.py','graphiti/main.py'),
('/opt/struktur/graphiti/docker-compose.yml','graphiti/docker-compose.yml'),
('/opt/struktur/obsidian-graphiti-import/aa043/aa043_single_writer.py','workers/aa043_single_writer.py'),
('/opt/struktur/youtube-research/e2e_worker.py','workers/e2e_worker.py'),
('/etc/systemd/system/youtube-research-e2e-worker.service','systemd/youtube-research-e2e-worker.service'),
('/etc/systemd/system/youtube-research-graphiti-worker.service','systemd/youtube-research-graphiti-worker.service'),
('/etc/systemd/system/obsidian-graphiti-import.service','systemd/obsidian-graphiti-import.service'),
('/etc/systemd/system/obsidian-graphiti-import.timer','systemd/obsidian-graphiti-import.timer'),
('/opt/struktur/youtube-research/knowledge.db','data/knowledge.db'),
]
manifest=[]
for src,rel in items:
 s=Path(src); d=root/rel; d.parent.mkdir(parents=True,exist_ok=True); shutil.copy2(s,d); b=d.read_bytes(); st=d.stat()
 manifest.append({'source':src,'backup':str(d),'bytes':len(b),'mtime_utc':datetime.datetime.fromtimestamp(st.st_mtime,datetime.timezone.utc).isoformat(),'sha256':hashlib.sha256(b).hexdigest()})
p='/opt/struktur/youtube-research/knowledge.db'; c=sqlite3.connect('file:'+p+'?mode=ro',uri=True); c.row_factory=sqlite3.Row
status=[dict(r) for r in c.execute("select graphiti_status,count(*) rows,count(distinct video_id) ids from graphiti_import_queue group by graphiti_status order by graphiti_status")]
q876=dict(c.execute("select id,video_id,graphiti_status,attempt_count,graphiti_attempts,graphiti_episode_id,lock_owner,remote_outcome,last_error_class,last_error_message,last_http_status,updated_at from graphiti_import_queue where id=876").fetchone())
q4=dict(c.execute("select id,video_id,graphiti_status,graphiti_episode_id,remote_outcome,completed_at from graphiti_import_queue where id=4").fetchone())
counts={r['k']:r['n'] for r in c.execute("select 'videos' k,count(*) n from videos union all select 'distinct_video_ids',count(distinct youtube_id) from videos union all select 'queue_rows',count(*) from graphiti_import_queue union all select 'queue_unique_ids',count(distinct video_id) from graphiti_import_queue")}
c.close()
snap={'captured_at_utc':now.isoformat(),'db':p,'queue_status':status,'queue876':q876,'queue4':q4,'counts':counts,'backup_manifest':manifest}
Path('/opt/struktur/reports/AA-047-baseline.json').write_text(json.dumps(snap,indent=2,ensure_ascii=False)+'\n')
print(json.dumps({'captured_at_utc':now.isoformat(),'backup_dir':str(root),'baseline':'/opt/struktur/reports/AA-047-baseline.json','queue_status':status,'queue876':q876,'queue4':q4,'counts':counts},ensure_ascii=False))