| 1234567891011121314151617181920 |
- """Restore this release's saved admin entry; preserve all versioned assets."""
- from pathlib import Path
- import hashlib, importlib.util, json, sys, urllib.request
- assert sys.argv[1:] == ['--apply'], 'Use --apply only for the authorized release rollback'
- root=Path('/Users/mac/.local/state/xiaoshu/cloud-releases/2026-11-10-admin-speed-round2/admin')
- origin='https://xiaoshu-admin.obs.cn-south-1.myhuaweicloud.com/'
- sha=lambda b:hashlib.sha256(b).hexdigest()
- current=json.loads(urllib.request.urlopen(origin+'deployment-version.json',timeout=30).read())
- expected=json.loads((root/'site/deployment-version.json').read_text())
- baseline=json.loads((root/'baseline/deployment-version.json').read_text())
- assert current['releaseId'] in [expected['releaseId'],baseline['releaseId']], 'Unrelated release has replaced this batch'
- for file in baseline['files']:
- assert sha(urllib.request.urlopen(origin+file['path'],timeout=30).read() if file['path']!='index.html' else (root/'baseline/index.html').read_bytes()) == file['sha256'], 'Baseline asset missing'
- spec=importlib.util.spec_from_file_location('cloud','/Users/mac/.local/state/xiaoshu/cloud-releases/2026-10-15-mobile-web/cloud.py')
- cloud=importlib.util.module_from_spec(spec);spec.loader.exec_module(cloud)
- for name in ['deployment-version.json','index.html']:
- (root/('rollback-'+name+'.log')).write_text(cloud.run('obs',['cp',str(root/'baseline'/name),'obs://xiaoshu-admin/'+name,'-vmd5','-acl=public-read']))
- assert sha(urllib.request.urlopen(origin+name,timeout=30).read())==sha((root/'baseline'/name).read_bytes())
- (root/'rollback-cdn.json').write_text(cloud.run('cdn',['CreateRefreshTasks/v2','--refresh_task.type=directory','--refresh_task.mode=all','--refresh_task.urls.1=https://admin.xiaoshu.pro/']))
- print(json.dumps({'restored':baseline['releaseId'],'originVerified':True}))
|