Explorer
/proc/58/root/tmp/aa048_baseline.py
← Zurück ↓ Download
from pathlib import Path
import datetime,hashlib,json,shutil,sqlite3,os
now=datetime.datetime.now(datetime.timezone.utc); stamp=now.strftime('%Y%m%dT%H%M%SZ')
root=Path('/opt/struktur/reports/aa048-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-graphiti-worker.service','systemd/youtube-research-graphiti-worker.service'),
('/etc/systemd/system/youtube-research-e2e-worker.service','systemd/youtube-research-e2e-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'),
('/opt/struktur/graphiti/request-data/requests.db','data/requests.db'),
]
# Copy only existing files; environment values are not printed.
manifest=[]
for src,rel in items:
 s=Path(src)
 if not s.exists(): continue
 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,next_attempt_at,graphiti_episode_id,last_http_status,last_error_class,remote_outcome from graphiti_import_queue where id=876").fetchone())
c.close()
# Non-secret runtime configuration inventory.
from subprocess import check_output
raw=check_output(['docker','inspect','graphiti-service','--format','{{json .Config.Env}}'],text=True)
env=json.loads(raw)
keys=['LLM_BASE_URL','LLM_MODEL','OPENROUTER_PROVIDER','PROVIDER_MAX_RETRIES','PROVIDER_CONNECT_TIMEOUT_SECONDS','PROVIDER_READ_TIMEOUT_SECONDS','PROVIDER_CALL_TIMEOUT_SECONDS','PROVIDER_WRITE_TIMEOUT_SECONDS','PROVIDER_POOL_TIMEOUT_SECONDS']
env_safe={k:(next((v.split('=',1)[1] for v in env if v.startswith(k+'=')),None)) for k in keys}
env_safe['OPENROUTER_API_KEY']='SET' if any(v.startswith('OPENROUTER_API_KEY=') and len(v.split('=',1)[1])>0 for v in env) else 'NICHT GESETZT'
snap={'captured_at_utc':now.isoformat(),'db':p,'queue_status':status,'queue876':q876,'runtime_env_nonsecret':env_safe,'backup_manifest':manifest}
Path('/opt/struktur/reports/AA-048-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-048-baseline.json','queue_status':status,'queue876':q876,'runtime_env_nonsecret':env_safe},ensure_ascii=False))