mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-19 14:10:43 +00:00
监测单元和预案重写成"分层"版(来源改为本地整份文件)
== 为什么重写 ==
certbot 签证书时加了 http -> https 的 301,而监测单元原来判断
"curl 拿到 200 才算健康"、且 curl **默认不跟跳转** -> 拿到 301
-> 判成"网站挂了" -> 又要启动预案 -> 重启中转 -> 再查还是 301。
这是**第二次**踩同一类坑了(上一次是改监听地址忘了改探测地址)。
共同教训:**改了入口的行为,必须回头看所有探测入口的地方。**
== 新设计:分两层探测 ==
PRIMARY https://yk.xxmxxs.top/v1/health 用户实际走的路
FALLBACK http://127.0.0.1:13245/v1/health 中转本身
两个都查才能分清哪一层坏了,进而选对抢救动作:
PRIMARY 挂 + FALLBACK 好 -> edge 层(CF / DNS / nginx)
两个都挂 -> core 层(中转服务本身)
预案据此走不同的阶梯:
edge: 重载 nginx -> 重启 nginx -> 查 443 与证书
core: 重启中转 -> 强杀重拉 -> 中转+nginx 都重启
不区分层次的话只能瞎重启,而 edge 层的问题重启中转一万次也没用。
== 做法上的改进:不再远端打补丁 ==
前几轮一直是"SSH 过去用嵌套 heredoc 现场改 monitor.sh",
连续踩三次:PowerShell 在本机求值 \、引号被吃、
脚本里的 %{http_code} 和 Python 的 %% 格式化打架。
现在改成:relay/monitor-lightsail.sh 和 relay/rescue-lightsail.sh
是**唯一事实来源**,本地编辑 -> 整份上传 -> 重装,
改了什么一目了然,也能进 git。
== 顺带 ==
因为 Lightsail 防火墙还没放行 443,PRIMARY 一直是 000,
监测会把 fails 一直加上去、白生成抢救报告。
所以暂时把 monitor.timer 停掉,等 443 开了再启用
(脚本 _build/pause_monitor.py,恢复是一条 systemctl start)。
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
监测单元和预案重写成"分层"版(来源改为本地整份文件)
|
||||
|
||||
== 为什么重写 ==
|
||||
|
||||
certbot 签证书时加了 http -> https 的 301,而监测单元原来判断
|
||||
"curl 拿到 200 才算健康"、且 curl **默认不跟跳转** -> 拿到 301
|
||||
-> 判成"网站挂了" -> 又要启动预案 -> 重启中转 -> 再查还是 301。
|
||||
这是**第二次**踩同一类坑了(上一次是改监听地址忘了改探测地址)。
|
||||
|
||||
共同教训:**改了入口的行为,必须回头看所有探测入口的地方。**
|
||||
|
||||
== 新设计:分两层探测 ==
|
||||
|
||||
PRIMARY https://yk.xxmxxs.top/v1/health 用户实际走的路
|
||||
FALLBACK http://127.0.0.1:13245/v1/health 中转本身
|
||||
|
||||
两个都查才能分清哪一层坏了,进而选对抢救动作:
|
||||
|
||||
PRIMARY 挂 + FALLBACK 好 -> edge 层(CF / DNS / nginx)
|
||||
两个都挂 -> core 层(中转服务本身)
|
||||
|
||||
预案据此走不同的阶梯:
|
||||
|
||||
edge: 重载 nginx -> 重启 nginx -> 查 443 与证书
|
||||
core: 重启中转 -> 强杀重拉 -> 中转+nginx 都重启
|
||||
|
||||
不区分层次的话只能瞎重启,而 edge 层的问题重启中转一万次也没用。
|
||||
|
||||
== 做法上的改进:不再远端打补丁 ==
|
||||
|
||||
前几轮一直是"SSH 过去用嵌套 heredoc 现场改 monitor.sh",
|
||||
连续踩三次:PowerShell 在本机求值 \、引号被吃、
|
||||
脚本里的 %{http_code} 和 Python 的 %% 格式化打架。
|
||||
|
||||
现在改成:relay/monitor-lightsail.sh 和 relay/rescue-lightsail.sh
|
||||
是**唯一事实来源**,本地编辑 -> 整份上传 -> 重装,
|
||||
改了什么一目了然,也能进 git。
|
||||
|
||||
== 顺带 ==
|
||||
|
||||
因为 Lightsail 防火墙还没放行 443,PRIMARY 一直是 000,
|
||||
监测会把 fails 一直加上去、白生成抢救报告。
|
||||
所以暂时把 monitor.timer 停掉,等 443 开了再启用
|
||||
(脚本 _build/pause_monitor.py,恢复是一条 systemctl start)。
|
||||
@@ -0,0 +1,171 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
r'''监测单元适配"80 会 301 到 https"之后的新情况。
|
||||
|
||||
== 问题 ==
|
||||
|
||||
certbot 签证书时加了 `--redirect`,于是 nginx 的 80 端口现在这样:
|
||||
|
||||
listen 80; server_name yk.xxmxxs.top;
|
||||
return 301 https://$host$request_uri;
|
||||
|
||||
而监测单元原来的判断是"curl 拿到 200 才算健康"。curl **默认不跟跳转**,
|
||||
于是它拿到 301 -> 判定失败 -> 连续 3 次就启动紧急预案
|
||||
-> 预案重启中转服务 -> 再查还是 301 -> **又一个无限循环**。
|
||||
|
||||
这个坑和刚才那个"改监听地址忘了改探测地址"是同一类:
|
||||
**改了入口的行为,必须回头看所有探测入口的地方。**
|
||||
|
||||
== 改法 ==
|
||||
|
||||
把探测地址和判断都改成"看用户真实路径":
|
||||
|
||||
PRIMARY https://yk.xxmxxs.top/v1/health (经 Cloudflare,用户实际走的)
|
||||
FALLBACK http://127.0.0.1:13245/v1/health (中转本身,绕开 CF 和 nginx)
|
||||
|
||||
判断规则也放宽一点:
|
||||
* curl 加 -L 跟跳转(301 本身不算故障)
|
||||
* 200 才算健康
|
||||
* **如果 PRIMARY 挂着但 FALLBACK 好**,说明问题在
|
||||
Cloudflare / DNS / nginx 那一层 —— 这时需要的是
|
||||
"重启 nginx",而不是重启中转。所以预案里补一级。
|
||||
|
||||
== 为什么 PRIMARY 用 https 而不是 http ==
|
||||
|
||||
因为 http 现在只是个跳转,真正的服务在 https 上。
|
||||
用 https 探测,用户遇到什么我们就测到什么。
|
||||
(443 端口还没在 Lightsail 防火墙开之前,PRIMARY 会失败、
|
||||
FALLBACK 成功 —— 这时不会误判成"中转挂了",见上面的规则。)
|
||||
'''
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parent.parent
|
||||
sys.path.insert(0, str(ROOT / "_build"))
|
||||
from lssh import run # noqa: E402
|
||||
|
||||
RELAY_DIR = "/opt/ykxmz-relay"
|
||||
|
||||
NEW_HEAD = '''# ============================================================================
|
||||
# 探测地址
|
||||
# ============================================================================
|
||||
#
|
||||
# PRIMARY:用户实际走的路(经 Cloudflare -> nginx -> 中转,全程 https)
|
||||
# FALLBACK:中转本身,绕开 Cloudflare 和 nginx
|
||||
#
|
||||
# ⚠ 两个都查是有意的:
|
||||
# * PRIMARY 挂 + FALLBACK 好 -> 问题在 CF / DNS / nginx 层
|
||||
# * 两个都挂 -> 中转服务本身出问题了
|
||||
# 分开判才能选对抢救动作(重启 nginx 还是重启中转)。
|
||||
PRIMARY_URL="${PRIMARY_URL:-https://yk.xxmxxs.top}"
|
||||
FALLBACK_URL="${FALLBACK_URL:-http://127.0.0.1:13245}"
|
||||
'''
|
||||
|
||||
|
||||
def main() -> int:
|
||||
print("=" * 62)
|
||||
print(" 监测单元适配 https + 301")
|
||||
print("=" * 62)
|
||||
|
||||
print()
|
||||
print(" ── 1. 改探测地址那几行 ──")
|
||||
script = (
|
||||
"python3 - <<'PYEOF'\n"
|
||||
"from pathlib import Path\n"
|
||||
"p = Path('%s/monitor.sh')\n"
|
||||
"lines = p.read_text(encoding='utf-8').splitlines()\n"
|
||||
"out = []\n"
|
||||
"done = False\n"
|
||||
"for l in lines:\n"
|
||||
" if l.startswith('PUBLIC_URL=') or l.startswith('FALLBACK_URL='):\n"
|
||||
" continue\n"
|
||||
" if l.strip() == '# 探测地址:域名优先(用户实际走的路),IP:80 兜底' and not done:\n"
|
||||
" out.append(%r)\n"
|
||||
" done = True\n"
|
||||
" continue\n"
|
||||
" out.append(l)\n"
|
||||
"p.write_text('\\n'.join(out) + '\\n', encoding='utf-8', newline='\\n')\n"
|
||||
"print(' 替换完成: %s' % done)\n"
|
||||
"PYEOF" % (RELAY_DIR, NEW_HEAD))
|
||||
out = run(script, timeout=120, quiet=True)
|
||||
for ln in out[1].strip().splitlines():
|
||||
print(" " + ln)
|
||||
|
||||
print()
|
||||
print(" ── 2. 健康检查改成 -L + 分清两层 ──")
|
||||
script2 = (
|
||||
"python3 - <<'PYEOF'\n"
|
||||
"from pathlib import Path\n"
|
||||
"p = Path('%s/monitor.sh')\n"
|
||||
"t = p.read_text(encoding='utf-8')\n"
|
||||
"\n"
|
||||
"old = '''PROBE=\"$PUBLIC_URL\"\n"
|
||||
"CODE=$(curl -s -o /dev/null -w '%%{http_code}' --max-time \"$CHECK_TIMEOUT\" \"$PROBE/v1/health\" 2>/dev/null)\n"
|
||||
"if [ \"$CODE\" != \"200\" ] && [ -n \"$FALLBACK_URL\" ]; then\n"
|
||||
" PROBE=\"$FALLBACK_URL\"\n"
|
||||
" CODE=$(curl -s -o /dev/null -w '%%{http_code}' --max-time \"$CHECK_TIMEOUT\" \"$PROBE/v1/health\" 2>/dev/null)\n"
|
||||
"fi'''\n"
|
||||
"\n"
|
||||
"new = '''# -L 跟跳转:nginx 那边 http 会 301 到 https,\n"
|
||||
"# 不跟跳转的话拿到 301 会被误判成故障(这坑踩过一次)。\n"
|
||||
"PUB_CODE=$(curl -sL -o /dev/null -w '%%{http_code}' --max-time \"$CHECK_TIMEOUT\" \"$PRIMARY_URL/v1/health\" 2>/dev/null)\n"
|
||||
"LOC_CODE=$(curl -s -o /dev/null -w '%%{http_code}' --max-time \"$CHECK_TIMEOUT\" \"$FALLBACK_URL/v1/health\" 2>/dev/null)\n"
|
||||
"CODE=\"$PUB_CODE\"\n"
|
||||
"LAYER=\"\"\n"
|
||||
"if [ \"$PUB_CODE\" != \"200\" ] && [ \"$LOC_CODE\" = \"200\" ]; then\n"
|
||||
" LAYER=\"edge\" # 中转是好的,问题在 CF / DNS / nginx 层\n"
|
||||
"elif [ \"$PUB_CODE\" != \"200\" ] && [ \"$LOC_CODE\" != \"200\" ]; then\n"
|
||||
" LAYER=\"core\" # 中转本身也不行\n"
|
||||
"fi'''\n"
|
||||
"\n"
|
||||
"if old in t:\n"
|
||||
" t = t.replace(old, new, 1)\n"
|
||||
" print(' ok 健康检查替换完成')\n"
|
||||
"else:\n"
|
||||
" print(' x 没匹配上,实际内容:')\n"
|
||||
" i = t.find('CODE=$(curl')\n"
|
||||
" print(t[max(0,i-200):i+400])\n"
|
||||
"p.write_text(t, encoding='utf-8', newline='\\n')\n"
|
||||
"PYEOF" % RELAY_DIR)
|
||||
out = run(script2, timeout=120, quiet=True)
|
||||
for ln in out[1].strip().splitlines():
|
||||
print(" " + ln)
|
||||
|
||||
print()
|
||||
print(" ── 3. 语法检查 + 跑一次 ──")
|
||||
out = run("bash -n %s/monitor.sh && echo ' 语法 OK'; "
|
||||
"printf 'fails=0\\nlast_rescue=0\\n' > "
|
||||
"%s/monitor_state.txt; "
|
||||
"bash %s/monitor.sh; echo ' --- 状态 ---'; "
|
||||
"cat %s/monitor_state.txt; echo ' --- 日志尾 ---'; "
|
||||
"grep -v 'Permission denied' %s/monitor.log | tail -4"
|
||||
% (RELAY_DIR, RELAY_DIR, RELAY_DIR, RELAY_DIR, RELAY_DIR),
|
||||
timeout=180, quiet=True)
|
||||
for ln in out[1].strip().splitlines():
|
||||
print(" " + ln)
|
||||
|
||||
print()
|
||||
print(" ── 4. 现在探测的各层 ──")
|
||||
out = run(
|
||||
'printf " %%-34s %%s\\n" "PRIMARY https://域名" '
|
||||
'"$(curl -sL -o /dev/null -w \'%{http_code}\' --max-time 15 '
|
||||
'https://yk.xxmxxs.top/v1/health)"; '
|
||||
'printf " %%-34s %%s\\n" "FALLBACK 127.0.0.1:13245" '
|
||||
'"$(curl -s -o /dev/null -w \'%{http_code}\' --max-time 8 '
|
||||
'http://127.0.0.1:13245/v1/health)"; '
|
||||
'printf " %%-34s %%s\\n" "nginx 本机:80(会 301)" '
|
||||
'"$(curl -s -o /dev/null -w \'%{http_code}\' --max-time 8 '
|
||||
'http://127.0.0.1:80/v1/health)"; '
|
||||
'printf " %%-34s %%s\\n" "nginx 本机:443" '
|
||||
'"$(curl -sk -o /dev/null -w \'%{http_code}\' --max-time 8 '
|
||||
'--resolve yk.xxmxxs.top:443:127.0.0.1 '
|
||||
'https://yk.xxmxxs.top/v1/health)"',
|
||||
timeout=180, quiet=True)
|
||||
for ln in out[1].strip().splitlines():
|
||||
print(ln)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -0,0 +1,112 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
r'''把本地的 monitor/rescue 脚本装到 Lightsail(第二版:https 版)。
|
||||
|
||||
== 为什么单独写一个,而不是继续远端打补丁 ==
|
||||
|
||||
前面几轮我一直在用"SSH 过去、用嵌套 heredoc 现场改 monitor.sh"的做法,
|
||||
结果连续踩了三次:
|
||||
|
||||
1. PowerShell 的 `$(...)` 在**本机**被求值(报"systemctl 不是 cmdlet")
|
||||
2. 引号被吃掉 -> Python 报 unterminated string literal
|
||||
3. 脚本里的 `%{http_code}` 和 Python 的 `%` 格式化打架
|
||||
-> "not enough arguments for format string"
|
||||
|
||||
根本问题:**远端打补丁这件事本身就脆弱**。
|
||||
本地写完整文件、整份上传,就没有这些问题 —— 而且改了什么一目了然,
|
||||
还能进 git 做版本管理。
|
||||
|
||||
所以现在改成:relay/monitor-lightsail.sh 和 relay/rescue-lightsail.sh
|
||||
是**唯一事实来源**,本地编辑 -> 整份上传 -> 重装。
|
||||
|
||||
== 本地文件名 vs 远端文件名 ==
|
||||
|
||||
本地叫 monitor-lightsail.sh(和那台旧的 monitor.sh 区分开,
|
||||
免得看混),远端统一叫 monitor.sh / rescue.sh,
|
||||
因为 systemd unit 和监测脚本里写的是这个名字。
|
||||
'''
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parent.parent
|
||||
sys.path.insert(0, str(ROOT / "_build"))
|
||||
from lssh import run, upload # noqa: E402
|
||||
|
||||
RELAY_DIR = "/opt/ykxmz-relay"
|
||||
|
||||
# (本地文件, 远端文件名)
|
||||
PAIRS = [
|
||||
("relay/monitor-lightsail.sh", "monitor.sh"),
|
||||
("relay/rescue-lightsail.sh", "rescue.sh"),
|
||||
]
|
||||
|
||||
|
||||
def main() -> int:
|
||||
print("=" * 62)
|
||||
print(" 装 monitor / rescue 到 Lightsail")
|
||||
print("=" * 62)
|
||||
|
||||
print()
|
||||
print(" ── 1. 上传 ──")
|
||||
for local_name, remote_name in PAIRS:
|
||||
local = ROOT / local_name
|
||||
if not local.is_file():
|
||||
print(" ✗ 找不到 %s" % local_name)
|
||||
return 1
|
||||
upload(str(local), "%s/%s" % (RELAY_DIR, remote_name), mode=0o755)
|
||||
|
||||
print()
|
||||
print(" ── 2. 语法检查 ──")
|
||||
out = run("cd %s && for f in monitor.sh rescue.sh; do "
|
||||
"bash -n $f || exit 1; done && echo SH_OK" % RELAY_DIR,
|
||||
timeout=120, quiet=True)
|
||||
print(" " + out[1].strip())
|
||||
|
||||
print()
|
||||
print(" ── 3. 重置状态 + 跑一次监测 ──")
|
||||
out = run("printf 'fails=0\\nlast_rescue=0\\n' > "
|
||||
"%s/monitor_state.txt; "
|
||||
"bash %s/monitor.sh; echo ' --- 状态 ---'; "
|
||||
"cat %s/monitor_state.txt | sed 's/^/ /'; "
|
||||
"echo ' --- 日志尾 ---'; "
|
||||
"tail -3 %s/monitor.log | sed 's/^/ /'"
|
||||
% (RELAY_DIR, RELAY_DIR, RELAY_DIR, RELAY_DIR),
|
||||
timeout=180, quiet=True)
|
||||
for ln in out[1].strip().splitlines():
|
||||
print(ln)
|
||||
|
||||
print()
|
||||
print(" ── 4. 探测各层现在什么状态 ──")
|
||||
probe = (
|
||||
'printf " %-36s %s\\n" "PRIMARY https://域名" '
|
||||
'"$(curl -sL -o /dev/null -w \'%{http_code}\' --max-time 15 '
|
||||
'https://yk.xxmxxs.top/v1/health)"; '
|
||||
'printf " %-36s %s\\n" "FALLBACK 127.0.0.1:13245" '
|
||||
'"$(curl -s -o /dev/null -w \'%{http_code}\' --max-time 8 '
|
||||
'http://127.0.0.1:13245/v1/health)"; '
|
||||
'printf " %-36s %s\\n" "nginx :80(301 到 https)" '
|
||||
'"$(curl -s -o /dev/null -w \'%{http_code}\' --max-time 8 '
|
||||
'http://127.0.0.1:80/v1/health)"; '
|
||||
'printf " %-36s %s\\n" "nginx :443(本机带 SNI)" '
|
||||
'"$(curl -sk -o /dev/null -w \'%{http_code}\' --max-time 8 '
|
||||
'--resolve yk.xxmxxs.top:443:127.0.0.1 '
|
||||
'https://yk.xxmxxs.top/v1/health)"; '
|
||||
'printf " %-36s %s\\n" "公网 443(Lightsail 防火墙)" '
|
||||
'"$(curl -sk -o /dev/null -w \'%{http_code}\' --max-time 8 '
|
||||
'https://13.54.30.196/v1/health 2>/dev/null || echo 不通)"'
|
||||
)
|
||||
out = run(probe, timeout=180, quiet=True)
|
||||
for ln in out[1].strip().splitlines():
|
||||
print(ln)
|
||||
|
||||
print()
|
||||
print(" 说明:PRIMARY 现在是 522 —— 因为公网 443 还没开。")
|
||||
print(" 这不影响 FALLBACK 正常,所以监测**不会**误报成")
|
||||
print(" '中转挂了';它会把层次标成 edge(问题在边缘层),")
|
||||
print(" 等 443 开了 PRIMARY 自然就 200 了。")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -0,0 +1,100 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
r'''暂停监测单元,等 443 端口开好再启用。
|
||||
|
||||
== 为什么要暂停 ==
|
||||
|
||||
新架构:用户 -> Cloudflare -> nginx(443) -> 127.0.0.1:13245
|
||||
|
||||
证书签好了、nginx 也配了 443,但 **Lightsail 防火墙还没放行 443**,
|
||||
所以外部访问 https://yk.xxmxxs.top 是 522。
|
||||
|
||||
监测查的是"用户实际走的路",于是一直判失败、fails 一直涨。
|
||||
涨到 3 就启动紧急预案 —— 而预案能做的都解决不了"防火墙没开",
|
||||
结果只会白折腾服务 + 每 10 分钟塞一份没用的报告进后台,
|
||||
把以后真正出事的现场淹掉。
|
||||
|
||||
所以:**系统还没部署完,先别开监测**。443 通了再启用。
|
||||
|
||||
== 暂停不是关掉 ==
|
||||
|
||||
只 stop,配置和脚本都留着,一条命令就能恢复:
|
||||
|
||||
sudo systemctl start ykxmz-monitor.timer
|
||||
|
||||
== 写这个文件的原因 ==
|
||||
|
||||
之前用 `python -c @"..."@` 写过一次,里面 `\$(...)` 转义错了,
|
||||
bash 报 "syntax error near unexpected token `('"。
|
||||
教训一致:**远端命令超过一行就写文件**,别在 -c 里跟转义缠斗。
|
||||
'''
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parent.parent
|
||||
sys.path.insert(0, str(ROOT / "_build"))
|
||||
from lssh import run # noqa: E402
|
||||
|
||||
RELAY_DIR = "/opt/ykxmz-relay"
|
||||
|
||||
|
||||
def main() -> int:
|
||||
print("=" * 62)
|
||||
print(" 暂停监测单元(等 443 开好再启用)")
|
||||
print("=" * 62)
|
||||
|
||||
print()
|
||||
print(" ── 1. 停掉监测定时器 ──")
|
||||
# 分几条简单命令跑,不做复杂嵌套 —— 免得又踩转义
|
||||
run("sudo systemctl stop ykxmz-monitor.timer", timeout=120, quiet=True)
|
||||
out = run("systemctl is-active ykxmz-monitor.timer", timeout=60,
|
||||
quiet=True)
|
||||
print(" monitor.timer = " + out[1].strip())
|
||||
|
||||
print()
|
||||
print(" ── 2. 失败计数清零 ──")
|
||||
run("printf 'fails=0\\nlast_rescue=0\\nlast_code=000\\n"
|
||||
"local_code=200\\nlayer=edge\\n' > %s/monitor_state.txt"
|
||||
% RELAY_DIR, timeout=60, quiet=True)
|
||||
out = run("cat %s/monitor_state.txt" % RELAY_DIR, timeout=60, quiet=True)
|
||||
for ln in out[1].strip().splitlines():
|
||||
print(" " + ln)
|
||||
|
||||
print()
|
||||
print(" ── 3. 清掉演练产生的报告 ──")
|
||||
before = run("ls -1 %s/rescue_reports 2>/dev/null | wc -l" % RELAY_DIR,
|
||||
timeout=60, quiet=True)
|
||||
print(" 清之前: %s 份" % before[1].strip())
|
||||
run("rm -f %s/rescue_reports/*.txt" % RELAY_DIR, timeout=60, quiet=True)
|
||||
after = run("ls -1 %s/rescue_reports 2>/dev/null | wc -l" % RELAY_DIR,
|
||||
timeout=60, quiet=True)
|
||||
print(" 清之后: %s 份" % after[1].strip())
|
||||
|
||||
print()
|
||||
print(" ── 4. 当前状态 ──")
|
||||
st = run("systemctl is-active ykxmz-relay nginx ykxmz-monitor.timer "
|
||||
"certbot.timer", timeout=60, quiet=True)
|
||||
names = ["ykxmz-relay", "nginx", "ykxmz-monitor.timer", "certbot.timer"]
|
||||
for i, ln in enumerate(st[1].strip().splitlines()):
|
||||
if i < len(names):
|
||||
print(" %-24s %s" % (names[i], ln))
|
||||
|
||||
print()
|
||||
code1 = run("curl -s -o /dev/null -w '%{http_code}' "
|
||||
"http://127.0.0.1:13245/v1/health", timeout=60, quiet=True)
|
||||
print(" %-24s %s" % ("中转本机", code1[1].strip()))
|
||||
code2 = run("curl -sk -o /dev/null -w '%{http_code}' --resolve "
|
||||
"yk.xxmxxs.top:443:127.0.0.1 "
|
||||
"https://yk.xxmxxs.top/v1/health", timeout=60, quiet=True)
|
||||
print(" %-24s %s" % ("nginx 443 本机", code2[1].strip()))
|
||||
|
||||
print()
|
||||
print(" 443 开好之后恢复监测:")
|
||||
print(" sudo systemctl start ykxmz-monitor.timer")
|
||||
print(" (或者告诉我,我来开 + 全链路验证)")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user