chore(docs): 文档库并入代码仓(R4 选 a)+ 索引/台账跟进
1) dsh-server-docs/ 从工作区(原 E:\...\aliyun-dsh-server\dsh-server-docs)**整体并入本仓**,
保留目录名 ⇒ 仓库内 dsh-server-docs/... 的相对引用天然继续有效;旧目录(含其 .git)已归档到
工作区 _中间产物_待清理/,未随本提交带入。
2) .gitattributes:新增 `dsh-server-docs/** -text` —— 原文档库是 `* -text` + autocrlf=false,
必须保持纯 LF,否则会被本仓的 CRLF 规则翻掉。
3) 活引用里的绝对路径已全部改到新位置(docs 的 INDEX / README / scripts / skills + 用户级 skills
+ ~/.workbuddy/settings.json 的 hooks);历史档案(04-调整方案/、archive/)按「只增不改」未动。
⚠️ hooks 路径改动需「完全重启会话」才生效(配置是会话启动快照)。
4) 交接单/T08:新增 §16「生产整体切换执行记录」(形态 / 落地动作 / **4 个只有真上线才暴露的真 bug** /
验收证据 / 回滚命令 / 残留项);台账 T08 行 → 已完成并归档;03-路线图 §二 登记 T08 收尾项。
5) 统一称谓:**「本机」只指跑 WorkBuddy 的开发机**,47 / 106 一律写「远程服务器」。
This commit is contained in:
1 parent
c70d5d860e
commit
5ad755116e
173 files changed
+27632
No files matched your search
@@ -0,0 +1,61 @@
|
||||
#!/usr/bin/env python3
|
||||
"""列出 Cloudflare 账号可见的 zone(可选某 zone 的 DNS 记录)——只读。
|
||||
用法: python3 cf-dns.py [zone名]
|
||||
凭据: /etc/cloudflare.ini 的 dns_cloudflare_api_token(不打印 token 本身)
|
||||
"""
|
||||
import json
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import urllib.request
|
||||
|
||||
CRED = '/etc/cloudflare.ini'
|
||||
API = 'https://api.cloudflare.com/client/v4'
|
||||
|
||||
|
||||
def token():
|
||||
txt = open(CRED, 'r', encoding='utf-8').read()
|
||||
m = re.search(r'dns_cloudflare_api_token\s*=\s*([A-Za-z0-9_\-]+)', txt)
|
||||
if not m:
|
||||
sys.exit('未在 %s 找到 dns_cloudflare_api_token' % CRED)
|
||||
return m.group(1)
|
||||
|
||||
|
||||
def get(path, tok):
|
||||
req = urllib.request.Request(API + path, headers={'Authorization': 'Bearer ' + tok})
|
||||
with urllib.request.urlopen(req, timeout=20) as resp:
|
||||
return json.loads(resp.read().decode('utf-8'))
|
||||
|
||||
|
||||
def short(v, n=44):
|
||||
v = str(v)
|
||||
return v if len(v) <= n else v[: n - 3] + '...'
|
||||
|
||||
|
||||
def main():
|
||||
tok = token()
|
||||
zones = (get('/zones?per_page=100', tok).get('result') or [])
|
||||
print('可见 zone (%d):' % len(zones))
|
||||
for z in zones:
|
||||
print(' - %s status=%s id=%s...' % (z['name'], z['status'], z['id'][:8]))
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
return
|
||||
want = sys.argv[1]
|
||||
zid = ''
|
||||
for z in zones:
|
||||
if z['name'] == want:
|
||||
zid = z['id']
|
||||
if zid == '':
|
||||
print('\nzone %s 不在该 token 权限内(无法管理其 DNS/证书)' % want)
|
||||
return
|
||||
|
||||
recs = (get('/zones/%s/dns_records?per_page=100' % zid, tok).get('result') or [])
|
||||
print('\n=== %s 的 DNS 记录(%d 条)===' % (want, len(recs)))
|
||||
for r in sorted(recs, key=lambda x: (x['type'], x['name'])):
|
||||
prox = 'on' if r.get('proxied') else 'off'
|
||||
print(' %-6s %-34s -> %-46s proxied=%s' % (r['type'], r['name'], short(r['content']), prox))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in new issue
Block a user