Rename public brand to VPSMaster, retain compatibility and document Beta roadmap
This commit is contained in:
1 parent
0fa26890f1
commit
01b325d19a
43 files changed
+530
-269
No files matched your search
@@ -0,0 +1,19 @@
|
||||
---
|
||||
name: Bug report / 问题报告
|
||||
about: Report a reproducible VPSMaster issue without sensitive data
|
||||
title: "[Bug] "
|
||||
labels: bug
|
||||
---
|
||||
|
||||
## Version and environment / 版本与环境
|
||||
|
||||
- VPSMaster version and ZIP SHA256:
|
||||
- OS / Python / architecture:
|
||||
- Command (remove IPs, tokens and private paths):
|
||||
|
||||
## Expected and actual / 预期与实际
|
||||
|
||||
## Steps and redacted evidence / 复现步骤与脱敏证据
|
||||
|
||||
Do not attach passwords, keys, subscriptions, raw journals or full system inventories.
|
||||
Unknown/provider-limited results are not automatically bugs. For sensitive vulnerabilities use the private route in SECURITY.md.
|
||||
@@ -0,0 +1,14 @@
|
||||
---
|
||||
name: Feature request / 功能建议
|
||||
about: Explain a VPSMaster use case and its safety boundaries
|
||||
title: "[Feature] "
|
||||
labels: enhancement
|
||||
---
|
||||
|
||||
## User problem / 用户问题
|
||||
|
||||
## Suggested behavior / 建议行为
|
||||
|
||||
## Sources, privacy, resource budget and rollback / 来源、隐私、资源预算与回滚
|
||||
|
||||
Check the Planned roadmap first. Do not include credentials or private reports.
|
||||
+10
@@ -9,3 +9,13 @@ dist/
|
||||
work/
|
||||
outputs/
|
||||
reports/
|
||||
evidence/
|
||||
backups/
|
||||
private/
|
||||
.env
|
||||
.env.*
|
||||
*.key
|
||||
*.pem
|
||||
*.log
|
||||
*.zip
|
||||
*.events.jsonl
|
||||
@@ -1,3 +1,5 @@
|
||||
> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。
|
||||
|
||||
> 历史 Alpha/问题状态记录:当前 1.0 公测候选请以 CURRENT_STATUS.md 和 PUBLIC_BETA_CHANGE_REPORT.md 为准;新增代码不等于已完成实测。
|
||||
|
||||
# v0.1.0-alpha 发布前报告
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。
|
||||
|
||||
> 历史 Alpha/问题状态记录:当前 1.0 公测候选请以 CURRENT_STATUS.md 和 PUBLIC_BETA_CHANGE_REPORT.md 为准;新增代码不等于已完成实测。
|
||||
|
||||
# v0.1.0-alpha 发布优先项状态
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。
|
||||
|
||||
## 1.0.0b1 — 2026-11-01 公测候选,非最终版本
|
||||
|
||||
终端、语言和参数修复;流媒体改为可达性;新增可选 ICMP/TCP、三城三运营商追踪、BGP 和候选节点探测。完整大陆三网未验证。详见 PUBLIC_BETA_CHANGE_REPORT.md。
|
||||
|
||||
+4
-1
@@ -1,4 +1,7 @@
|
||||
# Contributing / 参与贡献
|
||||
# Contributing to VPSMaster / 参与贡献
|
||||
|
||||
公开仓库建立后请使用顶部 Issues → New issue;Bug/功能模板在 .github/ISSUE_TEMPLATE/。
|
||||
Roadmap 标记 Planned 的能力不能在贡献说明中写为已实现;更名仍保留 proxydoctor 包/命令兼容。
|
||||
|
||||
Python 3.10+; runtime uses the standard library only.
|
||||
|
||||
|
||||
+7
-15
@@ -1,18 +1,10 @@
|
||||
# 当前状态:1.0.0b1 · 最终加固候选
|
||||
# VPSMaster · 1.0.0b1 当前状态
|
||||
|
||||
本轮新增路由错误分类、ASN/运营商与来源、逐轮结构化结果、窄终端适配和控制字符过滤。
|
||||
曾完成回归 281 项通过、1 项 Windows 权限跳过;之后修复实测发现的初次检查点中断清理边界,并新增回归,最终计数见包外报告。首次三项失败为校验清单过期,重建后通过,未删除或放宽测试。
|
||||
本轮实际验收以包外 FINAL_TEST_REPORT.md、BLACKBOX_TEST_RESULTS.json 中同一 ZIP SHA256 为准。
|
||||
以下 277 项与上轮虚拟机结果是历史,不能代替本轮验收。未将完整三网、海外 VPS、ARM、新装 22 Server 标为完成。
|
||||
项目从ProxyDoctor更名为VPSMaster,保持Python包、schema和旧CLI兼容,新增vpsmaster启动器与默认安装目录。
|
||||
本轮仅做品牌、文档与兼容处理,没有实现Roadmap中的CPU/磁盘基准、监控、部署或Web UI。
|
||||
|
||||
2026-11-01;非最终版本,未推送、合并或公开发布。
|
||||
旧验收ZIP SHA256 adffff5e9e6b251a17e8c8345768082d3cb8de6abc579f69efb59e7c6a6b7217已只读保留。旧282项回归和两机各103项是历史基线,不能作为新包的通过证据。
|
||||
VPSMaster新包须完整回归、从最终ZIP安装及关键功能验收;实际结论、数量、环境与SHA256见包外VPSMASTER_TEST_REPORT.md和VPSMASTER_TEST_RESULTS.json。
|
||||
|
||||
- 已读取并核实上轮 22.04 Desktop 的原始报告:22 项中 21 通过,字节码缓存检查失败。
|
||||
- BETA22-001 已修复:安装器、提供的 shell 启动器、联网 worker、DNS 和邮件子解释器均显式带 -B,不依赖父解释器或被 -I 忽略的环境变量。
|
||||
- 增加五种实际 worker 的全新源码副本回归,以及可写负对照。开发机 277 通过、1 项 Windows 权限跳过。
|
||||
- 用户已调整本轮 22.04 方案:使用原 22.04 Desktop 虚拟机的新 HOME/全新安装目录;这不等于新装 Server 镜像。另一验收目标已确认是 24.04.3 Server。
|
||||
- 本轮要求从本轮 ZIP 校验/解压/安装,测试主要命令、缓存、异常、中断和配置不变。当前构建的完成情况以候选包旁 BETA_ACCEPTANCE_REPORT.md / BETA_ACCEPTANCE_RESULTS.json 中的 SHA256 与实际日志为准。
|
||||
- 旧 Alpha、初版 Beta 和第三方模型报告均为历史证据,不自动赋予当前构建通过状态。
|
||||
- 可选 ICMP/TCP 依赖、完整大陆三网、海外 VPS 等能力必须按实机报告的实际覆盖解释,不因入口已存在而标记完成。
|
||||
|
||||
缓存承诺覆盖提供的安装启动器、源码脚本及其 Python 子进程;外部不带 -B 的自行导入、pip 安装预编译不作无缓存承诺。没有删除历史缓存来掩盖结果,验收使用全新目录。
|
||||
仍未全面验证海外VPS、ARM、公网IPv6、全新Ubuntu22 Server镜像。媒体仅网页可达性,三网实验性默认关闭;没有完整管理面板。
|
||||
未推送、合并或创建公开Release。历史Alpha/旧名文档保留原始证据,仅供追溯。
|
||||
@@ -1,3 +1,5 @@
|
||||
> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。
|
||||
|
||||
# VPS 综合检测工具——完整开发与工程优化任务书
|
||||
|
||||
## 0. 项目背景与最终目标
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。
|
||||
|
||||
# IPQuality 风格功能覆盖与外部资源
|
||||
|
||||
2026-11-01。目标是借鉴清楚的分区展示,优先自主实现,不直接运行或拼接第三方脚本。
|
||||
|
||||
+10
-2
@@ -1,4 +1,4 @@
|
||||
# Known limitations — 1.0 public Beta
|
||||
# VPSMaster Known Limitations — 1.0 public Beta
|
||||
|
||||
- Targets: Ubuntu22.04+ / Python3.10+. Available labs: existing Ubuntu22 Desktop with
|
||||
fresh HOME, Ubuntu24 Server. No new Ubuntu22 Server, overseas VPS or ARM acceptance implied.
|
||||
@@ -14,6 +14,14 @@
|
||||
user venv; reports create local files; opt-in bandwidth sends bounded test payloads.
|
||||
- Sharing redacts known patterns, not arbitrary text. Review exports; raw journals,
|
||||
inventories, credentials, snapshots and backups must remain private.
|
||||
- Reports do not expire automatically. Third-party data retention/sharing terms
|
||||
remain applicable; see docs/DATA_SERVICES.md, including IP2Location cache limits.
|
||||
- The manifest detects file changes, not publisher authenticity. Verify the ZIP
|
||||
digest through a trusted independent channel before installation.
|
||||
- Continuation files support manual restart of work, not automatic Codex scheduling.
|
||||
- Media checks cover public-page reachability only, not unlock or paid playback.
|
||||
- Mainland three-carrier speed testing is experimental and disabled by default.
|
||||
- Public IPv6 and complete public ICMP/TCP routes are not comprehensively accepted.
|
||||
- Beta is not production stability or an independent security certification.
|
||||
- No Web UI, automatic proxy deployment or full management panel is provided.
|
||||
- Bandwidth `attempted` counts scheduled sample slots, including automatically
|
||||
skipped slots; it is not an actual network-request counter. Inspect sample errors.
|
||||
@@ -1,6 +1,7 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 ProxyDoctor contributors
|
||||
Copyright (c) 2026 VPSMaster contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
+43
-36
@@ -1,60 +1,63 @@
|
||||
{
|
||||
"version": "1.0.0b1",
|
||||
"files": {
|
||||
"install.py": "c0f1f65b129c92beddadb3697b8bec4cadc99a1f982bd7a1b1aa5b5cc992c762",
|
||||
"pyproject.toml": "ebca11d7c070a9ab2f565178cd78da96fe303b9eeee4a14eccc8beb99e0a1922",
|
||||
"install.py": "f97f925d07c5589e24332b127a172c7fe1571cf66692d3611cae888553291888",
|
||||
"pyproject.toml": "98da2b2cc6af9c2d5cf6bf1bdd6513585b5c49dfa04c3ca2dc63d0031a5dcea2",
|
||||
"vpsmaster.sh": "7b5ccc2c96e36b4f6d53dd54915bc90416aba9ace06738e0c1913cf887b92972",
|
||||
"proxydoctor.sh": "7b5ccc2c96e36b4f6d53dd54915bc90416aba9ace06738e0c1913cf887b92972",
|
||||
"LICENSE": "4538e62067151c3795abf12838a4799f54ef6546a2a8a1697abd1ce21b03336d",
|
||||
"LICENSE": "07cace8b56becb2cd64969414c59082df9aa7453eeed8caab8378aaff38f6820",
|
||||
".gitattributes": "1cbf58d18ccb72113d6d1bb3996400d557ccc83cda00a11cd63ef5ca38bbf199",
|
||||
"ALPHA_RELEASE_REPORT.md": "f4efc245bcec8f78d1bc7a925dc922271d7b3705f43be6b7611f8d6547af0300",
|
||||
"ALPHA_TASK_STATUS.md": "faec6e515e8941b70b65774e36fb98b10c7b3f1284096bf186fe3345f3b7db7f",
|
||||
".gitignore": "7acff1fc699456d32b8d2a69205704d48193320644ed6d97c0f28612db75e87e",
|
||||
"ALPHA_RELEASE_REPORT.md": "ad4bbfa8600bd85278beb926bd7e4a8e5ca2d417f0dbec901931848fa50a86dc",
|
||||
"ALPHA_TASK_STATUS.md": "c64603125bc8ac129f0c753f21cd8b3a3ff029e6b7c5100d20574bbbc4b84d10",
|
||||
"ARCHITECTURE.md": "2d0167efe06df1eb10f0386b3a48c743fcd555a57e7a5247f1af24e6d2524701",
|
||||
"CHANGELOG.md": "98fc7cb3d1ba9f39680f5cbda1511340af05af35f8d3b12eaf2d213bce573e88",
|
||||
"CONTRIBUTING.md": "45fa883a73cd267a732bfd99e542f736c975a1e11ac9075c127262a4500de902",
|
||||
"CURRENT_STATUS.md": "208d863c73e3231a3be23380b7ba5a6885e0dd29f7e42c8b59331fbdd9b7ece9",
|
||||
"DEVELOPMENT_BRIEF.zh.md": "c80df4f88d60decdacb29864d48760a3517f1016bdb0ba784749365116affc6e",
|
||||
"IPQUALITY_COVERAGE.md": "342c4919b0ba7f05699f16526e8d0153b91e7e1c38876451019cd9ee5f1613c7",
|
||||
"KNOWN_LIMITATIONS.md": "a14f8eecb8ad2d13c06ee5c1c10edb13f17aebbf3d1119e7c3b00aabe6fc3823",
|
||||
"CHANGELOG.md": "6a813acbc64657a7aa3df39e9abdc5bb2e6a00b25eabae05940e8f4b7831fc68",
|
||||
"CONTRIBUTING.md": "ff542d9f3161d4034a9b1eb24c48fdbcf2834813e728a348393df8787825999d",
|
||||
"CURRENT_STATUS.md": "e8a1dd24324dd0e50756b9a89d08a67eebc010bfb52e846731690bd32d6e779c",
|
||||
"DEVELOPMENT_BRIEF.zh.md": "2826390187880a27ee3a14405ee2bff012fdda532fa567ee16643959842193f9",
|
||||
"IPQUALITY_COVERAGE.md": "57bb12daad9b52e2c9ff55a7de5dafcd7278e57ea86a2545e15701cfb4b27fdd",
|
||||
"KNOWN_LIMITATIONS.md": "77ad98e35bff5b60e99ba8ab74a5ada94858fe7a75add42dc821e8ed6577bcd9",
|
||||
"OPEN_SOURCE_REFERENCES.md": "f75ae885e4f31902a77e3eea90cfee3a3a0b38c0772ba70dc8935448fe483051",
|
||||
"OPEN_SOURCE_RESEARCH.md": "5ae3b119e93a0f7164a50bfd0e65f3c811285c04d626c25d02e950bd9b75d432",
|
||||
"PROBLEM_BACKLOG.md": "4d873fd0f3af48905a400c3bbfbbfc4d6ada5f7590bbdbb1ed46d430e8feb7fb",
|
||||
"PUBLIC_BETA_CHANGE_REPORT.md": "abe72da4c576e02089e4e564c5f88fd81e5c3034347ca48c2bcb981d0f0dcca4",
|
||||
"README.en.md": "04776b85400e347559b2dfc90e8ef322c02133e3d7d8de483cca2e5dab861a1b",
|
||||
"README.md": "9e2dc16f3bef869b7182965d6843fc0d5b3696a4d04c3eb44e85bfd52272087b",
|
||||
"RELEASE_NOTES.md": "4b168c3f59be6bc6c76818f5de26732dfd336e33cd709008f0c40f2493f171e7",
|
||||
"SECURITY.md": "5b55903153973d4413d53b4715d71df677df20cde4506bac5bc866778b654838",
|
||||
"TEST_PLAN.md": "6036d77b05958e9c088aa9605d3b78986ab3b7ded42abcf65f53118099d9e490",
|
||||
"THIRD_PARTY_NOTICES.md": "b1f24279e2870c4917b85b220a42d1ae31b6e39452cd1aa8dcb55425b0d6a6d1",
|
||||
"USER_CHECKLIST_STATUS.md": "fb983deeca9a1a4b2e219b95163a9e8f0ba02bca7cea778f96455603f2b29df2",
|
||||
"proxydoctor/__init__.py": "e86da25d9f8a2028fe7ece956847b17b4cb82f127ba356aa6ac28b5cdbe89855",
|
||||
"OPEN_SOURCE_RESEARCH.md": "b55daa9b58b49fc2acd7cc3ecec077a64ea5bb68be2893ed2f616cb581434803",
|
||||
"PROBLEM_BACKLOG.md": "e4ba9faf47c25ebb8af39f5d22185c1ccf191d9248f60fd6985406be34e42403",
|
||||
"PUBLIC_BETA_CHANGE_REPORT.md": "33f3eefb59f8445ccd974b3a40881febbfe3855baeb188c9edfe55167bbcf6e9",
|
||||
"README.en.md": "feafce6619ef02958a40f370da63c66d06c83d391e581973d1e435db8dcc0de2",
|
||||
"README.md": "abcd0e5413d2c8b60adafe5a926c0fb4b924ee4e354498ac37d39dce0996098e",
|
||||
"RELEASE_NOTES.md": "23283cb2b6636380f61a5dac27639ad2ea2275971524b7051ca3063fc19cc92c",
|
||||
"SECURITY.md": "24dd0d7306bd3643f9d9773db51ea777d9049337afdd92d5ce3c6dfd38b2c81f",
|
||||
"TEST_PLAN.md": "1c4cbc8d4608a3983c6ed7de782c9e7f0deba25b9b8f191e3eb1cd5f4757dd29",
|
||||
"THIRD_PARTY_NOTICES.md": "f6aaa77f22195916ca027e7756d74e3a206399c9e6a6c399d530a21a05f4e768",
|
||||
"USER_CHECKLIST_STATUS.md": "ef3255e772499813fb2c28cb9bdad3eac2ab970f4d4aff7e8a827c0f2c1b45f5",
|
||||
"proxydoctor/__init__.py": "78648a703705f6f05484eabdd61c9cc302943dd96c25c8448666d07a1eaa713b",
|
||||
"proxydoctor/__main__.py": "f21b83731acbaa16519e17fa795601ccd3543400cd5c59bb40098a488c225d84",
|
||||
"proxydoctor/bandwidth.py": "199a350483c53467cc341b521951e7a533ab04d5655dd8ceb2da94ad85653d34",
|
||||
"proxydoctor/bandwidth.py": "822392dd28872e55f4c67253983c69c4545a89dfbacc68d805c45d16c3283130",
|
||||
"proxydoctor/bgp.py": "4c9fea00e616058700f73335fe1995764b85d610a89b22936b4e5dd9f563c0c6",
|
||||
"proxydoctor/carriers.py": "11506fef02973552ab74367f3c1f91c7a7ec484ac574c71eada6ab82fc5448aa",
|
||||
"proxydoctor/checks.py": "f010c09c834af2f4ac48128113bb5aebef9d1fb0c796891623d02232ccf09e31",
|
||||
"proxydoctor/cli.py": "8f99e27e97a2551b40ab45f06c786d06ba8be53fd5a9fbd744cc431615717f2c",
|
||||
"proxydoctor/cli.py": "103bd8fa9d961320ae60dd90892e1343f3c45eb0f6723c15c705cba8fc6bcc82",
|
||||
"proxydoctor/connectivity.py": "2b6d4cfe69271ad582c3b0eb81bc69d38a9395c80cc12df2804bd01854f22385",
|
||||
"proxydoctor/console.py": "1cc0ab4b08aa0801cb8115b4ce205533f0e6436ebe699fdbcd0f9272a327bd5d",
|
||||
"proxydoctor/console.py": "e63da77fbb7c554ceb756a6155a124f689040a8722aa2eb84080f91d5eb14cf7",
|
||||
"proxydoctor/geo.py": "e4dde1452488743a0fc9a74e65bca65cad894ee357bc09c1d2b6dbdc2f0cfd04",
|
||||
"proxydoctor/i18n.py": "d9f619c0b0e85ef7295aec39bf1a94b1c43d7f19d5fd0fe86f438e84d05f89b1",
|
||||
"proxydoctor/i18n.py": "a7a72f7ce2d64d20564828438eba9becf68ee3ef33c7e39dc90efe767d636d4d",
|
||||
"proxydoctor/ipquality.py": "4dd1fc1421d11d03d8c803626393ca02d7be81527d4984da57c9ef2140c395bb",
|
||||
"proxydoctor/mailquality.py": "ae1ad2e071bd7038b6ea7fbcbd63b7128eac9e5477f79f43c22172d6a5bb5071",
|
||||
"proxydoctor/media.py": "b0c32211ed5a1b1ba37aac6cd31725be40ec0c2dbe1a5acbaf54a4e1d961229d",
|
||||
"proxydoctor/net.py": "ed53a91e7e048c3e4850b6f72d0d90c74dc8229dc2a36cb2deadf0071df7b68c",
|
||||
"proxydoctor/media.py": "d7920b5d9d946ec40532a756df2329d37f6ede07f1d6c73f6ef63f43b1a95717",
|
||||
"proxydoctor/net.py": "4ea5a7e722dfa2adc97dacf49e5ba28a5980e91e165382fce140b75f206db4c4",
|
||||
"proxydoctor/quality.py": "2e06f0d43cb95909fe4f14f08b39567b94cc1ee4ee03338fb8885fe1ec9fc878",
|
||||
"proxydoctor/reporting.py": "2689e39fe1c1f4f07ac43e3b7b564de34cb36d20e56669ab30c20923f27c727d",
|
||||
"proxydoctor/reporting.py": "3037733647a6f9bc6753d144bd79e8b46e975f26f9a6b305080c55d87ee97b99",
|
||||
"proxydoctor/reports.py": "09bd0952c89397ef601a3421e563bdad1e74b17d07976dfcb4066a0353cea4ba",
|
||||
"proxydoctor/resources.py": "b2b7355ef8f09a16d28956e292dfb848c2ddc927c3773730c437cf53de4a09a4",
|
||||
"proxydoctor/routes.py": "e73893f170c1ecb578d350843f2789be05e6ed616704e602c89e0924ec1c1c07",
|
||||
"proxydoctor/routes.py": "c266cd3768b0c17add3a7c073d721556d7e31b3a07ef082967d949eb33bd65d3",
|
||||
"proxydoctor/runner.py": "84462cb56bf335140a3aec08ace9c80dd745a9aeea99be618ac4483cb3430c8e",
|
||||
"proxydoctor/schema.py": "6ae0e99c696fae778e88f96132142ac8eecb51a6a5df91ba38b816895aa1ca88",
|
||||
"proxydoctor/security.py": "363327e43ab13dc8ebb9bb88f49fd14cea4aedca0952e9733159f99a195bb019",
|
||||
"proxydoctor/session.py": "3302f8aa1f031ca13c863ad0b464d94b11a41ee944e97cdb2f4d6ad2e7990737",
|
||||
"proxydoctor/suite.py": "68519399071bd6c700061aa86c10d05b88a87274d320c61ab846b79ea4b489da",
|
||||
"proxydoctor/suite.py": "86717aee014e0b7695e8390d4970167a0b9b092200552612ce04b895f572f0a2",
|
||||
"proxydoctor/worker.py": "c4745ba21aa68d4ce57c9bb8727841f8839d1c1c2d820e0e8e7ff071c88b0e06",
|
||||
"tests/conftest.py": "9ba6f678d6297f2dc85f42121790246cd86b120dd52e537ee09d4c19f2cdf1b9",
|
||||
"tests/test_alpha_quality.py": "a833be4ec7f0600383495b838ea1e95f50112003d47b2cc2cebbec50d0eba706",
|
||||
"tests/test_bandwidth_sources.py": "c9e41f7f3d25078feef335a549fb8a3229662d552b552f0579369ae61cfc659b",
|
||||
"tests/test_branding.py": "d9cf33286f9591564e722dd5c5be038eed85a4a3643f0348fb00f7d3db475ef6",
|
||||
"tests/test_bytecode_policy.py": "b66e5358d5e7adf36d5413b776e494d8c66d1dda368d259a79a02f0ea622d657",
|
||||
"tests/test_checks.py": "4ff2ff8562a13635d24cf6a29dd7063578bcc1a202840aeb76c7619c06cacfb3",
|
||||
"tests/test_connectivity.py": "e4cea940bf3783e312f7acf28b80c7fc709579e3809a415a5822b05431d6fde1",
|
||||
@@ -78,10 +81,14 @@
|
||||
"tests/test_server_info.py": "52bd0f409cc01ffaabb3fde25a0781dab286065d475f2c639ed586b89b5608c2",
|
||||
"tests/test_stage1.py": "9413983d55805a663d5b831b64146f191846192788ff014f4db256c5f68d3b9a",
|
||||
"tests/test_suite.py": "61c83fe1bdb54deea884120ae8f9cc17373cdbe2f27bc84b600f86e614b1b5cb",
|
||||
"docs/history-beta-before-p0-20261101.md": "e5dcc486181d3590905aa4ec7e181f0c3a7b7cb253c47578fae475b36094bb6c",
|
||||
"docs/pre-alpha-README.en.md": "82922b373bd7d0ede200368a6a3db68339678ca27bea8554cd41324d65d4a3ea",
|
||||
"docs/pre-alpha-README.md": "0d7819c12bc688f52e765c8bc6827198772548663dcb9f7adb26db59c79ed73d",
|
||||
"docs/status-history-before-2026-11-01.md": "f50bd7cb60fdaac5e2e5c14105fa08e5b19b1f354ae9414732b161d31b8665fd",
|
||||
".github/workflows/tests.yml": "ba27ec460fd71a2f9bbac20be0aa5b7043a14a04ae7c3ae0eaf5237cd72b4b5c"
|
||||
"docs/DATA_SERVICES.md": "d91be04176e6dda22c831cb9cd24f968ad82c1851c53bb6cbf356c51141b4a4c",
|
||||
"docs/GITHUB_ABOUT.md": "c4c03497033313c09e38f98403224924f04720351c48578349da9a9dd3b5062f",
|
||||
"docs/history-beta-before-p0-20261101.md": "fd1130fcf1e896b84954e1a6805ecf75dd88fb5ec7c2938ee8d0fce0e8488be0",
|
||||
"docs/pre-alpha-README.en.md": "0f6c892c62870b925ccdefd2659f09ef49c8c34d7a763cb922b6f121f5972843",
|
||||
"docs/pre-alpha-README.md": "ebc76331f714158bb0f4d3b4bd4e20ac92713bece32cfafab4b1ff32cae3d4a1",
|
||||
"docs/status-history-before-2026-11-01.md": "28cd2e77331469b9ffd4b7f298ad6eaecefd48e00b6f7e2823b54d4cacab1ca0",
|
||||
".github/workflows/tests.yml": "ba27ec460fd71a2f9bbac20be0aa5b7043a14a04ae7c3ae0eaf5237cd72b4b5c",
|
||||
".github/ISSUE_TEMPLATE/bug_report.md": "e0a64101b0552afc7bc0722379ade9e730faeb8e510ec89f6c2d177926c52a64",
|
||||
".github/ISSUE_TEMPLATE/feature_request.md": "e4efabb0a5961e03344f59985797f4a349989d94ce3bd9edabf5f4d5a656bc68"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,5 @@
|
||||
> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。
|
||||
|
||||
# 开源源码研究(首轮)
|
||||
|
||||
阅读日期:2026-11-01。通过 GitHub 连接器实际获取根目录、下列源码及 LICENSE;未运行参考脚本、未复制实现。链接为阅读时默认分支,可变化,实施任何复用前还需固定 commit 和复核依赖许可证。本轮是入口级研究,不宣称完成整个仓库审计。
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。
|
||||
|
||||
> 最终加固:路由错误分类、跳点 ASN/运营商来源、窄终端适配已有回归。环境覆盖与结论以同 SHA256 的 FINAL_TEST_REPORT.md 为准。完整大陆三网、海外 VPS、ARM、新装 22 Server 尚未完成。
|
||||
> 历史 Alpha/问题状态记录:当前 1.0 公测候选请以 CURRENT_STATUS.md 和 PUBLIC_BETA_CHANGE_REPORT.md 为准;新增代码不等于已完成实测。
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。
|
||||
|
||||
## P0 追加修复 · BETA22-001
|
||||
|
||||
本轮修复父解释器 -B 不被新 Python 进程继承的问题。联网、DNS、邮件子解释器均显式传 -B,安装器探测及源码脚本同步。
|
||||
|
||||
+96
-54
@@ -1,76 +1,118 @@
|
||||
# VPS Check · 1.0 public beta
|
||||
# VPSMaster
|
||||
|
||||
[中文](README.md) | [English](README.en.md)
|
||||
**An open-source VPS diagnostics and management toolkit.**
|
||||
|
||||
Read-only Python VPS diagnostics; internal package/command: proxydoctor. **Public beta, not the final release.** Version: `1.0.0b1`. Local candidate only; not publicly published or finally accepted.
|
||||
[中文](README.md) · [English](README.en.md) · [Limitations](KNOWN_LIMITATIONS.md) · [Contributing](CONTRIBUTING.md)
|
||||
|
||||
## Install
|
||||
VPSMaster is a Python toolkit for Linux VPS users, especially beginners and the Chinese Linux community.
|
||||
The **1.0.0b1 Beta is CLI-focused**: transparent diagnostics are available; management and Web UI remain planned.
|
||||
Routine checks do not change SSH, firewall, routes or system DNS. Missing evidence remains unknown.
|
||||
|
||||
Final hardening: route outcomes retain permission/dependency/network errors. ICMP/TCP
|
||||
permissions depend on system traceroute; no automatic elevation. Optional `--geo`
|
||||
adds estimated location, ASN/operator, provider and time, capped at 12 public lookups.
|
||||
Interactive frames adapt to narrow terminals. Exact acceptance scope is recorded in
|
||||
the separate report matching the ZIP SHA256; overseas VPS results are not implied.
|
||||
## Available
|
||||
|
||||
Requires Linux, Python 3.10+ and standard-library venv. Target: Ubuntu 22.04 and newer. No Python runtime dependencies, sudo, pip or automatic system package installation. Check the ZIP against a trusted SHA256 digest and review install.py first; Python extraction works without unzip.
|
||||
| Area | Current Beta | Boundary |
|
||||
| --- | --- | --- |
|
||||
| System/resources | OS, kernel, CPU, memory, Swap, disk capacity, visible quotas, short steal/PSI samples | No dedicated-hardware proof or CPU/disk benchmark |
|
||||
| Network | DNS, IPv4/IPv6 TCP and certificate-verified TLS, interfaces/routes | Subject to permissions, connectivity and target availability |
|
||||
| Traceroute | Native UDP; optional system ICMP/TCP; IP, RTT, timeout, optional ASN/operator/location | 30 TTLs by default, max64; router silence is not forwarding loss |
|
||||
| BGP/ASN | RIPE RIS prefixes, origins, neighbours and AS_PATH samples | Collector view, not local packet paths or commercial relationships |
|
||||
| IP risk | Provider-specific ownership, network type, proxy/VPN/Tor/risk evidence, conflicts | Quotas, missing fields and disagreement remain visible |
|
||||
| Media | Ten public service pages, including Netflix, Disney+ and YouTube | Reachability only, no unlock or account playback guarantee |
|
||||
| Security | Read-only SSH, ports, firewall, selected permissions and update caches | No full vulnerability scan or automatic repair |
|
||||
| Reports | Local redacted JSON/Markdown, recovery journals, English/Chinese themes | Review before sharing; incomplete data may remain partial |
|
||||
| Opt-in tests | Bounded repeated bandwidth and fixed China targets | Mainland three-carrier coverage is experimental, disabled by default |
|
||||
|
||||
Execution success does not mean every provider or destination is available. Results retain status, method, time, source and limitations.
|
||||
|
||||
## Install and use
|
||||
|
||||
Requires Linux, Python3.10+ and stdlib venv. No third-party Python runtime dependencies, pip, sudo or automatic system package installation.
|
||||
Obtain the ZIP/checksum through a trusted channel and review install.py. A checksum detects change, not publisher authenticity.
|
||||
|
||||
```bash
|
||||
sha256sum -c ProxyDoctor-v1.0.0-beta.1.zip.sha256
|
||||
python3 -m zipfile -e ProxyDoctor-v1.0.0-beta.1.zip .
|
||||
cd ProxyDoctor-v1.0.0-beta.1
|
||||
python3 install.py --run
|
||||
PD="$HOME/.local/share/proxydoctor/1.0.0b1/bin/proxydoctor"
|
||||
"$PD" check --theme framed --lang en
|
||||
"$PD" suite --offline --lang en
|
||||
sha256sum -c VPSMaster-v1.0.0-beta.1.zip.sha256
|
||||
python3 -m zipfile -e VPSMaster-v1.0.0-beta.1.zip .
|
||||
cd VPSMaster-v1.0.0-beta.1
|
||||
python3 -I -B install.py --run
|
||||
VM="$HOME/.local/share/vpsmaster/1.0.0b1/bin/vpsmaster"
|
||||
"$VM" --version
|
||||
"$VM" check --theme framed --lang en
|
||||
"$VM" suite --offline --lang en
|
||||
"$VM" quality --lang en
|
||||
"$VM" trace --target 1.1.1.1 --method tcp --tcp-port 443 --geo --lang en
|
||||
"$VM" bgp --target 1.1.1.1 --lang en
|
||||
"$VM" media --lang en
|
||||
"$VM" suite --lang en --json-output report.json
|
||||
"$VM" report --input report.json --output report.md --lang en
|
||||
"$VM" recover --journal report.json.events.jsonl --output recovered.json --lang en
|
||||
```
|
||||
|
||||
An isolated user environment is created. Existing destinations are refused; failures clean only the new directory. Missing prerequisites fail clearly. The supplied launcher and Python workers explicitly use -B. This covers supplied launch paths, not arbitrary external imports or pip precompilation; add -B when invoking Python directly.
|
||||
`--run` initially performs offline checks. Existing installation/report paths are refused; choose a new user-owned `--prefix` for a separate install.
|
||||
ICMP/TCP require an existing system traceroute and appropriate permissions. Missing dependency/permission failures are explicit; there is no automatic elevation.
|
||||
Online commands contact external services, which see the source IP. `check` is offline unless its explicit public-IP lookup is selected.
|
||||
|
||||
## Commands
|
||||
Bandwidth needs explicit consent, for example `bandwidth --allow-bandwidth --rounds 3 --sample-mib 4`.
|
||||
`--china` selects experimental mainland candidates; availability is incomplete. Hong Kong Mobile never substitutes for mainland Mobile.
|
||||
Download means node → this host, upload means this host → node. Short samples are not line capacity.
|
||||
The current `attempted` summary counts scheduled sample slots, including skipped slots, not actual wire requests; inspect sample errors.
|
||||
|
||||
```bash
|
||||
"$PD" suite --lang en
|
||||
"$PD" quality --color always --lang en
|
||||
"$PD" ipquality --show-ip --lang en
|
||||
"$PD" media --lang en
|
||||
"$PD" cn-nodes --lang en
|
||||
"$PD" bandwidth --china --allow-bandwidth --rounds 3 --sample-mib 4 --lang en
|
||||
"$PD" bandwidth --source mobile-hk --allow-bandwidth --lang en
|
||||
"$PD" trace --target 1.1.1.1 --method icmp --geo --lang en
|
||||
"$PD" trace --target 1.1.1.1 --method tcp --tcp-port 443 --lang en
|
||||
"$PD" return-route --method udp --lang en
|
||||
"$PD" bgp --target 1.1.1.1 --lang en
|
||||
"$PD" suite --route-method tcp --include-return-routes --include-bgp --lang en
|
||||
### Compatibility
|
||||
|
||||
Former project name: **ProxyDoctor**. New visible brand/command: **VPSMaster / vpsmaster**.
|
||||
The installer also creates the legacy `proxydoctor` launcher. Python package/distribution identity `proxydoctor`, imports, JSON schemas and `PROXYDOCTOR_*` variables remain compatible.
|
||||
New installs default to `~/.local/share/vpsmaster/1.0.0b1`; old directories/reports are not migrated or overwritten.
|
||||
Both source scripts `vpsmaster.sh` and `proxydoctor.sh` remain usable. Supplied launchers/workers use `-B`; arbitrary external imports are outside that promise.
|
||||
|
||||
### Illustrative CLI output
|
||||
|
||||
Placeholders below show structure, **not benchmark results for this build**:
|
||||
|
||||
```text
|
||||
1.0.0b1 · VPSMaster · 1.0 public beta (not the final release)
|
||||
1 127.0.0.1 <RTT> ms Private/reserved AS? --- [reached]
|
||||
Trace result reached
|
||||
Recovery journal: <local path>
|
||||
```
|
||||
|
||||
- check/suite support default, iprisk and framed themes, with live results. Explicit language choices override the Linux-console fallback.
|
||||
- System, visible resource quota, Swap, short steal/PSI, SSH/ports/firewall, file permissions and update-cache observations. No benchmarks or exclusive-resource certification.
|
||||
- IPv4/IPv6 DNS/TCP/certificate-verified TLS and native UDP trace. ICMP/TCP require existing system traceroute; no elevation or automatic installation.
|
||||
- IP provider evidence; failed providers remain visible. Optional PTR/outbound TCP25 sends no email.
|
||||
- Ten media services: public webpage reachability only. No unlock or playback verdict in the CLI.
|
||||
- Repeated bounded bandwidth requires --allow-bandwidth. Download means node to this host; upload means this host to node. China candidates currently provide download only; Cloudflare supports upload.
|
||||
- cn-nodes uses small plaintext protocol samples, without credentials or report uploads. Success is not a capacity measurement. Hong Kong Mobile never counts as mainland Mobile coverage.
|
||||
- Return routes: Beijing/Shanghai/Guangzhou × three carriers, this host to China targets. Not nationwide or reverse-direction coverage. Per-route soft probe budget: 30s; optional geo requests have separate limits.
|
||||
- BGP: RIPE RIS prefix, origin ASNs, sampled neighbours and AS paths. Collector observations do not prove local selected packet paths, commercial upstreams or premium tiers.
|
||||
## Validation and limitations
|
||||
|
||||
Development-host small JPEG samples succeeded for Shanghai Telecom and Hong Kong Mobile. Mainland Unicom/Mobile do not yet have successful evidence this round. HTTPS throughput never downgrades to HTTP or disables certificate verification. New Linux/overseas network capabilities remain pending real acceptance.
|
||||
Lab baselines are Ubuntu22.04.5 Desktop/Python3.10.12 and Ubuntu24.04.3 Server/Python3.12.3, x86_64.
|
||||
Each VPSMaster candidate requires fresh installation from its final ZIP; only a matching-SHA acceptance report establishes that build's pass.
|
||||
The old ProxyDoctor ZIP is preserved and cannot be renamed as proof for the new build.
|
||||
ICMP/TCP loopback success and limited public observations do not establish complete public routing.
|
||||
|
||||
## Reports and safety
|
||||
- Media is public-page reachability, not unlock, paid entitlement or actual playback.
|
||||
- Mainland three-carrier speed testing is experimental and off by default.
|
||||
- BGP/geolocation depend on third-party accuracy, terms and quotas; geography is estimated.
|
||||
- Overseas VPS, ARM, public IPv6 and a fresh Ubuntu22 Server image are not comprehensively validated.
|
||||
- PTY bytes/width checks do not prove GUI font rendering. Beta is not production stability or independent security certification.
|
||||
- No Web UI, automated proxy deployment, full management panel, long monitoring or CPU/disk benchmarks are currently provided.
|
||||
|
||||
Reports/journals are local (reports/ by default), with no overwrites. --show-ip affects only terminal display. Review redacted exports before sharing.
|
||||
See [full limitations](KNOWN_LIMITATIONS.md), [status](CURRENT_STATUS.md) and [Beta notes](RELEASE_NOTES.md).
|
||||
|
||||
```bash
|
||||
"$PD" suite --offline --json-output report.json --lang en
|
||||
"$PD" report --input report.json --output report.md --lang en
|
||||
"$PD" recover --journal report.json.events.jsonl --output recovered.json --lang en
|
||||
```
|
||||
## Security and privacy
|
||||
|
||||
Ctrl+C/SIGTERM cancels workers and attempts to save observations. Operations have timeouts; journals have size limits. Power/storage failure and SIGKILL cannot guarantee unfinished data survives. JSON keeps legacy fields and uniform result items; Markdown uses collision-safe JSON fences.
|
||||
No default configuration changes, automatic repairs or full-report uploads. Installation creates a user venv; diagnostics/reports create local files.
|
||||
`--show-ip` affects the terminal; exported files mask known IP/credential patterns, not arbitrary identifying text. Review before sharing.
|
||||
Ctrl+C/SIGTERM attempts cancellation and persistence; recovery uses the last complete journal event. SIGKILL, power/storage failure can prevent final JSON.
|
||||
Exit codes: 0 completed, 1 findings/incomplete/storage failure, 2 usage/install error, 130 cancelled.
|
||||
Never publish raw logs, subscriptions, passwords, tokens or keys. See [SECURITY.md](SECURITY.md).
|
||||
|
||||
Exit codes: 0 completed, 1 findings/incomplete/storage failure, 2 usage/install error, 130 cancelled. Defaults do not modify SSH/firewall/routes/system DNS, benchmark, repair or upload complete reports. Online targets see the request source.
|
||||
## Roadmap — Planned
|
||||
|
||||
P0 automation: 277 passed, one Windows symlink-permission skip. Current VM acceptance is recorded separately in BETA_ACCEPTANCE_REPORT.md and its JSON beside the candidate ZIP, identified by SHA256. Historical Alpha and earlier Beta evidence is not current-build acceptance. Full carrier throughput, ICMP/TCP permission variants and overseas paths require explicit coverage evidence.
|
||||
These are future goals, **not claims of current implementation**. Stage1 deepens existing basic diagnostics. No delivery dates are promised.
|
||||
|
||||
No nationwide carrier coverage, long monitoring, DNSBL, Web UI, proxy deployment, Karing subscriptions or automatic updates/uninstall. Install updates into a new directory; back up reports before removing a confirmed old installation.
|
||||
1. **Network and hardware:** improve mainland three-carrier tests; deepen ICMP/TCP/UDP diagnosis; BGP/ASN/path analysis; CPU/disk benchmarks; more IP intelligence/reputation sources.
|
||||
2. **Long-term diagnosis:** stability monitoring; peak-hour analysis; historical report comparison; anomaly detection/advice; VPS purchase acceptance reports.
|
||||
3. **Security and maintenance:** deeper audits; repair suggestions/previews; configuration backup/rollback; maintenance assistance.
|
||||
4. **Automation and Web UI:** optional service deployment; modular management; local Web UI; state visualization; optional service configuration/management.
|
||||
|
||||
See [current status](CURRENT_STATUS.md), [changes and pending acceptance](PUBLIC_BETA_CHANGE_REPORT.md), [security](SECURITY.md) and [third-party notices](THIRD_PARTY_NOTICES.md). MIT project, standard-library runtime, no bundled tracing/speed-test binaries.
|
||||
## Contributing, Issues and license
|
||||
|
||||
See [CONTRIBUTING.md](CONTRIBUTING.md). Once a repository is published, use its **Issues → New issue** tab with the bundled [bug](.github/ISSUE_TEMPLATE/bug_report.md) or [feature](.github/ISSUE_TEMPLATE/feature_request.md) template.
|
||||
No public repository URL is configured yet; no fictional owner/repo link is supplied. Use private channels for sensitive vulnerability reports.
|
||||
|
||||
MIT project; former-brand contributor notices remain in [LICENSE](LICENSE).
|
||||
No third-party traceroute clients, databases or remote test scripts are bundled/executed. References/attribution are in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md) and [OPEN_SOURCE_REFERENCES.md](OPEN_SOURCE_REFERENCES.md).
|
||||
Our license does not grant rights to third-party APIs/data/test services; their terms, quotas and permissions apply separately.
|
||||
Reports do not expire automatically; review [data-service retention/sharing terms](docs/DATA_SERVICES.md), including applicable IP2Location cache limits.
|
||||
@@ -1,111 +1,182 @@
|
||||
# VPS 检测工具 · 1.0 公测版
|
||||
# VPSMaster
|
||||
|
||||
[中文](README.md) | [English](README.en.md)
|
||||
**面向 Linux VPS 用户的一站式服务器检测、网络诊断与管理工具。**
|
||||
|
||||
面向 Ubuntu VPS 的 Python 命令行体检工具。内部项目名及命令仍为 ProxyDoctor / `proxydoctor`。
|
||||
**这是 1.0 公测版,非最终版本。** 包版本 `1.0.0b1`;当前是本地候选包,尚未公开发布或完成最终验收。
|
||||
[中文](README.md) · [English](README.en.md) · [已知限制](KNOWN_LIMITATIONS.md) · [贡献指南](CONTRIBUTING.md)
|
||||
|
||||
VPSMaster 是基于 Python 的开源 VPS 综合检测与管理工具,主要面向中文 Linux 社区及 VPS 初学者。
|
||||
**当前 `1.0.0b1` 是以 CLI 为核心的 Beta 公测候选,非生产稳定版;管理能力仍在规划中。**
|
||||
项目强调安全、易用和检测结果透明:普通检测默认不修改 SSH、防火墙、路由或系统 DNS,未知结果不会被写成安全或成功。
|
||||
|
||||
> An open-source VPS diagnostics and management toolkit. The current Beta focuses on transparent, read-only CLI diagnostics; management and Web UI are planned.
|
||||
|
||||
## Available / 当前可用
|
||||
|
||||
| 模块 | 当前 Beta 能力 | 判断边界 |
|
||||
| --- | --- | --- |
|
||||
| 服务器信息与资源 | Linux/内核/架构、CPU、内存、Swap、磁盘容量、可见配额、短时 steal/PSI | 不能证明硬件独享;没有 CPU/磁盘基准 |
|
||||
| 网络基础 | DNS、分 IPv4/IPv6 的 TCP、证书验证 TLS、接口和路由信息 | 取决于权限、网络和目标服务,保留错误与未知 |
|
||||
| Traceroute | 自主 UDP,可选系统 traceroute 的 ICMP/TCP;IP、RTT、响应/超时、可选 ASN/位置 | 默认30跳、最多64跳;跳点不响应不等于真实转发丢包 |
|
||||
| BGP / ASN | RIPE RIS 前缀、起源 ASN、邻居及有限 AS_PATH 样本 | 采集器视角,不代表本机选路、商业上游或优质线路承诺 |
|
||||
| IP 信息与风险 | 多来源归属、网络类型、代理/VPN/Tor/风险信息及冲突;可选 PTR/TCP25 | 不合成不透明“纯净度”;第三方可能失败、限额或缺字段 |
|
||||
| 流媒体网页 | Netflix、Disney+、YouTube 等10项公开服务页面的基础可达性 | **不保证解锁、登录后地区权限或实际播放** |
|
||||
| 基础安全体检 | SSH、监听端口、防火墙、固定敏感路径权限、更新缓存 | 只读提示,不是完整漏洞扫描或自动修复 |
|
||||
| 本地报告 | 脱敏 JSON、Markdown、逐步恢复日志、失败隔离、中英文终端主题 | 分享前仍需人工复核;断电/SIGKILL不能保证未落盘数据 |
|
||||
| 可选带宽与中国目标 | 多来源多轮有界下载/部分上传、固定中国候选与三城九方向追踪入口 | 需明确允许流量;大陆三网实验性,默认关闭;不是完整全国回程 |
|
||||
|
||||
“模块执行完成”不等于目标可用或检测结论完整。`success / failure / skipped / unsupported / unknown` 与原因、时间、方法和来源分别保留。
|
||||
|
||||
## 安装
|
||||
|
||||
需要 Linux、Python 3.10+ 和标准库 venv,支持目标为 Ubuntu 22.04 及更新版本。
|
||||
没有第三方 Python 运行依赖,不调用 sudo、pip 或系统包管理器。
|
||||
先从可信来源核对摘要,再解压并阅读 install.py。没有 unzip 也可用 Python 解压:
|
||||
需要 Linux、Python **3.10+** 及标准库 `venv`。运行时没有第三方 Python 包依赖;安装器不调用 pip、sudo 或系统包管理器。
|
||||
先从可信渠道取得 ZIP 和校验文件,并阅读 `install.py`;校验和不能独立证明发布者身份。
|
||||
|
||||
```bash
|
||||
sha256sum -c ProxyDoctor-v1.0.0-beta.1.zip.sha256
|
||||
python3 -m zipfile -e ProxyDoctor-v1.0.0-beta.1.zip .
|
||||
cd ProxyDoctor-v1.0.0-beta.1
|
||||
python3 install.py --run
|
||||
sha256sum -c VPSMaster-v1.0.0-beta.1.zip.sha256
|
||||
python3 -m zipfile -e VPSMaster-v1.0.0-beta.1.zip .
|
||||
cd VPSMaster-v1.0.0-beta.1
|
||||
python3 -I -B install.py --run
|
||||
VM="$HOME/.local/share/vpsmaster/1.0.0b1/bin/vpsmaster"
|
||||
"$VM" --version
|
||||
"$VM" check --lang zh --theme framed
|
||||
```
|
||||
|
||||
安装到用户目录的隔离环境,首次仅运行离线体检。已有目录不会覆盖;失败只清理本次新建目录。
|
||||
缺少 Python/venv 时明确退出,不自动安装系统依赖。`--prefix` 可指定不存在的用户目录。
|
||||
安装后的启动器及各 Python worker 显式使用 `-B`,忽略用户包路径并禁止这些启动路径生成字节码缓存。此承诺覆盖随包安装器启动命令和源码脚本;自行使用 Python 导入或 `python -m` 时应加 `-B`,pip 的安装期预编译及外部调用方不在此范围。
|
||||
安装到用户目录的隔离环境,`--run` 首次只运行离线体检。缺少 Python/venv 会明确退出,不擅自安装系统依赖。
|
||||
已有安装目录不会覆盖。需要另一路径时用 `python3 -I -B install.py --prefix "$HOME/vpsmaster-beta-test"`,并使用打印出的启动器路径。
|
||||
|
||||
### 更名与兼容性
|
||||
|
||||
- 项目旧名 **ProxyDoctor**;当前用户可见品牌统一为 **VPSMaster**。
|
||||
- 新命令为 `vpsmaster`,同一安装目录保留 `proxydoctor` 兼容入口;两者调用同一实现。
|
||||
- Python 包名、发行元数据中的旧包标识 `proxydoctor`、导入路径、已有 JSON schema 和 `PROXYDOCTOR_*` 环境变量保留。没有宣称支持新的 `VPSMASTER_*` 变量。
|
||||
- 新默认目录为 `~/.local/share/vpsmaster/1.0.0b1`;旧安装、报告和 `~/.local/share/proxydoctor/` 不自动改名或迁移。
|
||||
- 源码入口 `bash vpsmaster.sh ...` 与 `bash proxydoctor.sh ...` 均可用。提供的启动器与 Python workers 使用 `-B`,不通过删除缓存掩盖问题;外部自行导入不在此承诺范围。
|
||||
|
||||
## 使用
|
||||
|
||||
```bash
|
||||
PD="$HOME/.local/share/proxydoctor/1.0.0b1/bin/proxydoctor"
|
||||
"$PD" check --theme framed --lang zh
|
||||
"$PD" suite --offline --theme framed
|
||||
"$PD" suite --lang en
|
||||
"$PD" quality --color always
|
||||
"$PD" ipquality --show-ip
|
||||
"$PD" media
|
||||
"$PD" --help
|
||||
# 本机体检,不发起外部探测(--detect-public-ip 是另行选择的联网选项)
|
||||
"$VM" check --lang zh --color always
|
||||
"$VM" suite --offline --lang en
|
||||
|
||||
# 联网模式:目标服务会看到请求来源 IP
|
||||
"$VM" quality --lang zh
|
||||
"$VM" suite --lang zh --json-output report.json
|
||||
"$VM" trace --target 1.1.1.1 --method udp --max-hops 30
|
||||
"$VM" trace --target 1.1.1.1 --method tcp --tcp-port 443 --geo
|
||||
"$VM" bgp --target 1.1.1.1
|
||||
"$VM" ipquality
|
||||
"$VM" media
|
||||
|
||||
# 本地导出和恢复;不覆盖已有文件
|
||||
"$VM" report --input report.json --output report.md
|
||||
"$VM" recover --journal report.json.events.jsonl --output recovered.json
|
||||
"$VM" --help
|
||||
```
|
||||
|
||||
`check`、`suite` 支持 default/iprisk/framed 三种主题。结果直接逐项显示在命令行。
|
||||
中英文可选;纯 Linux 文本控制台默认英文,显式 `--lang zh` 或 `--lang=zh` 保留中文。
|
||||
ICMP/TCP 需要系统已有 traceroute,权限不足显示 `PERMISSION_DENIED`,缺依赖明确跳过/退出,不自动提权安装。
|
||||
`--geo` 最多查询12个公网跳点,私有/保留地址不外发;位置是数据库推测,不是物理路径证明。
|
||||
|
||||
## 能力与范围
|
||||
|
||||
| 模块 | 本版能力 | 结果范围 |
|
||||
| --- | --- | --- |
|
||||
| 系统和资源 | 系统、CPU、内存、Swap、根分区、可见配额、短采样 steal/PSI | 无法证明资源独享;不执行 CPU/磁盘基准 |
|
||||
| 网络 | 分 IPv4/IPv6 的 DNS、TCP、证书验证 TLS | 本机到指定目标的当前观测 |
|
||||
| 路由 | 原生 UDP;可选系统 traceroute 的 ICMP/TCP | 默认 30 跳、最多 64 跳;响应缺失不等于转发丢包 |
|
||||
| IP 信息 | 归属、ASN、运营商及分来源风险;可选 PTR/TCP25 | 缺失保持未知;接口失败显示,未配置的可选密钥来源可省略 |
|
||||
| 流媒体 | Netflix、Disney+、YouTube Premium 等 10 项公开网页 | 仅可达性,不输出解锁或播放成功结论 |
|
||||
| 安全 | SSH、端口、防火墙、权限和更新缓存只读检查 | 不修改配置,不是完整漏洞扫描 |
|
||||
| 带宽 | 多来源多轮下载,Cloudflare 支持上传 | 必须明确允许;短样本不报线路容量 |
|
||||
| BGP | RIPE RIS 前缀、起源 ASN、邻居、AS_PATH 样本 | 采集器视角,不等于本机选路或商业上游 |
|
||||
|
||||
## 三网、路由和 BGP
|
||||
|
||||
实测覆盖以随包提供、SHA256 一致的验收报告为准;没有海外 VPS 验收证据。
|
||||
|
||||
ICMP/TCP 权限取决于系统 traceroute。权限不足显示 `PERMISSION_DENIED`,不自动提权。
|
||||
可选 `--geo` 提供跳点 ASN、运营商、来源与时间;地理位置是数据库推测,最多查询 12 个公网跳点,遇限额停止。窄交互终端面板会适配窗口宽度。
|
||||
默认不运行带宽测试。确需测试时单独允许,并先核对命令预告的负载预算:
|
||||
|
||||
```bash
|
||||
# 固定候选的小流量探测,不运行带宽测试
|
||||
"$PD" cn-nodes
|
||||
# 大陆三运营商候选多轮下载;仍可能不可用,失败如实显示
|
||||
"$PD" bandwidth --china --allow-bandwidth --rounds 3 --sample-mib 4
|
||||
"$PD" bandwidth --source cn-telecom-sh --allow-bandwidth
|
||||
# 香港移动单独标注,不能替代大陆移动
|
||||
"$PD" bandwidth --source mobile-hk --allow-bandwidth
|
||||
# ICMP/TCP 需要系统已经安装 traceroute,缺少则明确退出,不提权安装
|
||||
"$PD" trace --target 1.1.1.1 --method tcp --tcp-port 443 --geo
|
||||
"$PD" trace --target 1.1.1.1 --method icmp --max-hops 64
|
||||
# 北京/上海/广州 × 三网,逐条执行,每条约 30 秒探测软预算
|
||||
"$PD" return-route --method udp
|
||||
"$PD" return-route --method tcp --family 6
|
||||
"$PD" bgp --target 1.1.1.1
|
||||
# 综合入口额外模块需明确开启
|
||||
"$PD" suite --route-method tcp --include-return-routes --include-bgp
|
||||
"$VM" bandwidth --allow-bandwidth --rounds 3 --sample-mib 4
|
||||
# 实验性:中国大陆三网候选,并不保证三网都有可用节点
|
||||
"$VM" bandwidth --china --allow-bandwidth --rounds 3 --sample-mib 1
|
||||
"$VM" cn-nodes
|
||||
"$VM" return-route --method udp --max-hops 30
|
||||
```
|
||||
|
||||
三城探测方向为“本机 → 中国目标”,在海外 VPS 上通常称回程;不包含中国侧到 VPS 的去程或全国各省全部线路。
|
||||
ASN 标签不能证明 CN2 GIA 等套餐等级。测速下载是节点到本机,上传是本机到节点,和逐跳探测方向分别解释。
|
||||
下载方向为“节点 → 本机”,上传为“本机 → 节点”;中国候选当前下载为主。香港移动单独标注,不能替代大陆移动。
|
||||
短文件成功不是线路容量;`attempted` 目前统计计划样本槽,包含失败后自动跳过的槽位,不是实际网络请求次数,需查看每个样本错误。
|
||||
|
||||
节点标签来自公开目录,不等于实测身份认证。当前开发机已验证上海电信及香港移动的小图片可访问;大陆联通、移动尚无本轮成功证据。
|
||||
香港不计入大陆三网覆盖。HTTPS 测速不自动降级明文或关闭证书验证。三网候选本轮仅下载,未实现三网上传。
|
||||
`cn-nodes` 使用少量明文测试协议数据,不发送凭据或报告;小样本成功不等于带宽容量。
|
||||
### CLI 示例输出
|
||||
|
||||
## 报告、安全和中断
|
||||
以下是**格式示意**,`<RTT>` 等为占位符,不是本发行包的测速成绩:
|
||||
|
||||
报告默认保存在当前目录的 reports/。支持 `--json-output` 的命令可指定路径;已有文件不会覆盖。
|
||||
保存文件默认脱敏 IP;`--show-ip` 只影响终端。分享前仍须人工复核。
|
||||
|
||||
```bash
|
||||
"$PD" suite --offline --json-output report.json
|
||||
"$PD" report --input report.json --output report.md
|
||||
"$PD" recover --journal report.json.events.jsonl --output recovered.json
|
||||
"$PD" recover --journal report.json.events.jsonl --output recovered.md --format markdown
|
||||
```text
|
||||
1.0.0b1 · VPSMaster · 1.0 公测版(非最终版本)
|
||||
1 127.0.0.1 <RTT> ms 内网/保留地址 AS? --- [reached]
|
||||
追踪结果 reached
|
||||
恢复日志: <本地文件路径>
|
||||
```
|
||||
|
||||
Ctrl+C/SIGTERM 尝试取消活动子进程并保存已有记录。API、DNS、命令、测速有限时;恢复日志有大小上限。
|
||||
JSON 保留原模块和统一 result_items 的状态、方法、时间、来源及范围。Markdown 使用防提前闭合的 JSON 代码围栏。
|
||||
断电、SIGKILL、磁盘故障时以最后完整恢复事件为准。
|
||||
终端逐项回显,支持 `default / iprisk / framed` 和中英文;`framed` 适配窄终端。
|
||||
Linux纯文字控制台默认英文,显式 `--lang zh` 保留中文,但需要终端字体支持。
|
||||
|
||||
退出码:0 正常完成,1 有提示/不完整/保存失败,2 参数或安装错误,130 中断。
|
||||
默认只读,不修改 SSH、防火墙、路由、系统 DNS,不自动上传完整报告或修复系统;联网目标会看到请求来源 IP。
|
||||
## 已验证环境与验收范围
|
||||
|
||||
## 公测状态与开源
|
||||
已有实机基线是 **Ubuntu 22.04.5 Desktop / Python3.10.12 / x86_64** 与 **Ubuntu 24.04.3 Server / Python3.12.3 / x86_64**。
|
||||
本次 VPSMaster 构建使用新 ZIP、全新 HOME/安装目录重新验收;**仅旁附与 ZIP SHA256 一致的验收报告可证明本构建通过**。
|
||||
旧 ProxyDoctor 验收包保留,不能换名充当 VPSMaster 的通过证据。
|
||||
|
||||
P0 修复自动化:277 通过、1 项 Windows 符号链接权限跳过。当前构建的实机验收结果以随候选 ZIP 单独交付的 BETA_ACCEPTANCE_REPORT.md 和结构化结果中的 SHA256 为准;不将旧候选报告当作本包已通过。ICMP/TCP 实际权限、完整大陆三网和海外回程需按该报告的覆盖范围判断。
|
||||
旧 Alpha 结果不是本包验收证据。见 [当前状态](CURRENT_STATUS.md)、[变更和待测项](PUBLIC_BETA_CHANGE_REPORT.md)。
|
||||
尚无全国完整三网、长期监测、CPU/磁盘基准、DNSBL、Web UI、代理部署、Karing 订阅或自动更新卸载。
|
||||
更新安装到新版本目录;卸载前退出进程、备份报告,仅移除自己确认过的安装目录。
|
||||
当前测试不等于全新22 Server镜像、海外VPS、ARM或公网IPv6已全面验证。
|
||||
ICMP/TCP 的回环成功和有限公网观察,不代表所有线路或完整公网路径可用。
|
||||
版本与实际范围见 [当前状态](CURRENT_STATUS.md)、[发行说明](RELEASE_NOTES.md) 和包外验收报告。
|
||||
|
||||
MIT 项目,标准库运行。感谢 [NextTrace](https://github.com/nxtrace/NTrace-core)、[CleanIP sh.cd](https://github.com/CleanIP/sh.cd)、[RIPEstat](https://stat.ripe.net/) 和既有参考项目;详见 [来源和许可](THIRD_PARTY_NOTICES.md)。不打包下载执行第三方检测脚本或测速客户端。
|
||||
## 安全与隐私
|
||||
|
||||
普通检测不修改 SSH、防火墙、路由或系统 DNS,不自动修复或上传完整报告。
|
||||
安装器只创建指定的用户隔离环境;检测和导出会创建本地报告。联网 API、媒体页和测速服务仍会看到请求来源 IP。
|
||||
提供的入口有超时与取消处理;Ctrl+C/SIGTERM 尝试保存已有结果,恢复以最后完整日志事件为准。
|
||||
退出码:`0` 完成,`1` 有发现/不完整/存储失败,`2` 参数或安装错误,`130` 中断。
|
||||
|
||||
`--show-ip` 只影响终端显示;导出默认脱敏 IP、已知密钥字段和URL凭据,但不是任意文本匿名器。
|
||||
不要公开原始日志、订阅地址、密码、Token或私钥。安全问题见 [SECURITY.md](SECURITY.md),未知不能当作安全保证。
|
||||
|
||||
## Roadmap / 开发路线 — Planned / 规划中
|
||||
|
||||
以下是未来目标,**不代表当前 Beta 已实现**。阶段一包含现有基础诊断的继续完善;未承诺交付日期。
|
||||
|
||||
### 阶段一:网络与硬件检测完善 — Planned
|
||||
|
||||
- 中国大陆三运营商测速完善
|
||||
- ICMP/TCP/UDP 线路诊断深化
|
||||
- BGP、ASN 和线路分析深化
|
||||
- CPU 和磁盘性能基准
|
||||
- IP 情报与信誉来源扩展
|
||||
|
||||
### 阶段二:长期监控与诊断 — Planned
|
||||
|
||||
- 长时间网络稳定性监测
|
||||
- 晚高峰性能分析
|
||||
- 历史报告对比
|
||||
- 异常检测和诊断建议
|
||||
- VPS 购买验收报告
|
||||
|
||||
### 阶段三:安全与维护 — Planned
|
||||
|
||||
- 深度安全体检
|
||||
- 安全修复建议和预览
|
||||
- 配置备份及回滚
|
||||
- 服务器维护辅助功能
|
||||
|
||||
### 阶段四:自动化管理及 Web UI — Planned
|
||||
|
||||
- 可选服务器服务部署
|
||||
- 模块化管理能力
|
||||
- 本地 Web UI
|
||||
- 服务器状态可视化
|
||||
- 可选服务配置和管理功能
|
||||
|
||||
## Known Limitations / 已知限制
|
||||
|
||||
- 流媒体主要是公开网页可达性,不保证解锁、订阅权限、地区可用性或实际播放。
|
||||
- 中国大陆三网测速仍为实验性能力,默认关闭;没有完整可靠三网覆盖承诺。
|
||||
- BGP/IP 地理信息依赖第三方来源、准确性、服务条款和限额;位置不证明物理路由。
|
||||
- 海外 VPS、ARM、公网 IPv6、全新 Ubuntu22 Server 镜像未全面验证;新GUI字体渲染须单独目视验收。
|
||||
- Beta 不代表生产稳定性、独立安全认证或资源独享证明。
|
||||
- **当前没有 Web UI、自动代理部署或完整管理面板。** 也没有长时间监控、CPU/磁盘基准或完整全国三网回程。
|
||||
|
||||
详见 [KNOWN_LIMITATIONS.md](KNOWN_LIMITATIONS.md)。更新请安装到新的、确认不存在的目录;卸载前备份报告,只移除自己确认的安装目录。
|
||||
|
||||
## 贡献、Issues 与许可
|
||||
|
||||
欢迎文档、翻译、可复现Bug和有来源的检测规则贡献,见 [CONTRIBUTING.md](CONTRIBUTING.md)。
|
||||
仓库公开后使用顶部 **Issues → New issue**;[Bug 模板](.github/ISSUE_TEMPLATE/bug_report.md) 和 [功能建议模板](.github/ISSUE_TEMPLATE/feature_request.md) 已随源码提供。
|
||||
当前未配置公开仓库地址,不编造仓库URL;敏感安全问题不要发到公开Issues。
|
||||
|
||||
项目采用 [MIT](LICENSE),保留旧品牌贡献者版权。标准库运行,不打包第三方测速客户端/地理数据库,不下载执行外部检测脚本。
|
||||
感谢相关开源项目与数据服务,详见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md) 和 [OPEN_SOURCE_REFERENCES.md](OPEN_SOURCE_REFERENCES.md)。
|
||||
本项目MIT许可不覆盖第三方API、数据库或测速服务,使用时仍需遵守其条款、配额与权限;没有长期或高负载使用授权保证。
|
||||
数据保留/分享边界(含IP2Location适用缓存期限)见 [第三方接口条款](docs/DATA_SERVICES.md);当前工具不自动删除历史报告。
|
||||
+25
-15
@@ -1,19 +1,29 @@
|
||||
# ProxyDoctor 1.0.0b1 / v1.0.0-beta.1
|
||||
# VPSMaster v1.0.0-beta.1 — Pre-release
|
||||
|
||||
Public Beta candidate, not the final release. Publication requires the separate
|
||||
acceptance report matching the exact ZIP SHA256; source changes alone are not a pass.
|
||||
**Beta / 公测候选,非稳定正式版。** Python版本1.0.0b1。发布标签建议v1.0.0-beta.1;GitHub应勾选Pre-release,不标记为稳定版。
|
||||
|
||||
- Preserve explicit no-bytecode flags on provided launchers and Python workers.
|
||||
- Preserve route permission/dependency/network errors in CLI and JSON.
|
||||
- Add bounded route ASN/operator metadata with provider, time and estimated-geography labels.
|
||||
- Adapt overview/frame widths to narrow interactive terminals; filter control and bidi characters.
|
||||
- Preserve cancellation reports and close journals when interrupted during context entry.
|
||||
- Retain system/resource, UDP route, IP/provider evidence, public media page,
|
||||
read-only security, opt-in bounded bandwidth and report/recovery capabilities.
|
||||
## Changes / 本轮变更
|
||||
|
||||
ICMP/TCP require system traceroute; permissions vary. No automatic elevation.
|
||||
China candidates are experimental and default off. Small probes are not capacity
|
||||
measurements. Media is page reachability only, BGP is RIPE RIS collector evidence.
|
||||
No CPU/disk benchmark, monitor, proxy deployment or Web UI added.
|
||||
- 正式品牌VPSMaster;更新CLI标题/帮助/报告/请求标识、项目介绍、中英文README、路线与安全说明。
|
||||
- 新增vpsmaster命令和vpsmaster.sh;同一安装保留proxydoctor入口及源码脚本。
|
||||
- 保留Python内部包、导入路径、JSON schema和PROXYDOCTOR_*环境变量,避免大规模重构。
|
||||
- 新默认目录~/.local/share/vpsmaster/1.0.0b1;旧安装与报告不自动迁移。
|
||||
- 不新增规划中的管理、监控、CPU/磁盘基准、代理部署或Web UI能力。
|
||||
|
||||
See KNOWN_LIMITATIONS.md, README.md, README.en.md and THIRD_PARTY_NOTICES.md.
|
||||
## 必须公开的边界
|
||||
|
||||
- 流媒体仅公开网页基础可达性,不保证解锁/登录地区权限/实际播放。
|
||||
- 大陆三网测速实验性、默认关闭,完整可靠覆盖尚未完成。
|
||||
- ICMP/TCP已知基线有回环成功和有限公网观察,不代表所有线路完整可用;新包以同SHA报告为准。
|
||||
- BGP/地理信息受第三方准确性、来源、配额和条款限制。
|
||||
- 海外VPS、ARM、公网IPv6、全新Ubuntu22 Server镜像尚未全面验证。
|
||||
- Beta不代表生产稳定性或独立安全认证,当前不提供Web UI、自动代理部署或完整管理面板。
|
||||
- 带宽attempted统计计划样本槽(包含自动跳过项),不是实际网络请求计数。
|
||||
|
||||
## 安装与验证
|
||||
|
||||
使用VPSMaster-v1.0.0-beta.1.zip与对应校验文件,按README离线隔离安装。
|
||||
旧ProxyDoctor ZIP不能改名充当新版通过。完整回归、新SHA、最终ZIP安装/关键功能证据写入包外VPSMASTER_TEST_REPORT.md;未验证构建必须标UNVERIFIED。
|
||||
升级使用新目录,保留旧报告。没有自动更新/迁移。
|
||||
|
||||
MIT许可,保留历史版权和第三方来源说明。尚未推送、合并或创建公开Release。
|
||||
+11
-38
@@ -1,42 +1,15 @@
|
||||
# VPSMaster Security / 安全反馈
|
||||
|
||||
## v0.1.0-alpha 候选(2026-11-01)
|
||||
普通检测只读:不更改SSH、防火墙、路由或系统DNS,不自动提权、安装依赖、执行修复或上传完整报告。
|
||||
离线check/suite模式不发起外部探测(check的--detect-public-ip是显式联网选项)。联网目标仍会看到请求来源。
|
||||
安装器会创建用户隔离目录,报告会写入本地文件;带宽必须另行允许。密钥使用既有PROXYDOCTOR_*环境变量,不保存到发行包。
|
||||
|
||||
隔离离线安装、完整性拒绝、网络worker超时/取消、统一结果schema、独立模块增量保存、路由重复探测统计已实现;两版Ubuntu各248自动测试/23实际验收。全新OS镜像尚缺,建议内部试用、暂缓公开。详情见ALPHA_RELEASE_REPORT.md。无主分支合并。
|
||||
不在公开Issues提交密码、Token、私钥、订阅地址或完整原始日志。发布仓库后若开启GitHub私密漏洞报告,优先使用该渠道;未开启时先请求维护者提供私密联系方式,不虚构安全邮箱。
|
||||
发现凭据暴露时应在提供方轮换。脱敏不是任意文本匿名保证,分享前必须人工检查。
|
||||
|
||||
# Current branch safety changes — 2026-11-01
|
||||
当前安全检查只是只读观察与人工审阅提示,既不是完整漏洞扫描,也不是生产稳定性或独立安全认证。
|
||||
检查固定路径权限、SSH/端口/防火墙及更新缓存;不读取shadow/gshadow内容,不刷新apt缓存,不递归证明所有ACL/capabilities或补丁状态。
|
||||
未知/权限不足/缓存缺失不等于安全。联网worker、命令有超时和取消;恢复以完整日志记录为准,SIGKILL/断电不能保证最终JSON。
|
||||
|
||||
Routine suites skip CPU and bandwidth benchmarks. Bandwidth requires explicit per-call consent via `--allow-bandwidth` / `allow_bandwidth=True`; payload limits are not a total network billing cap. External executable/script wrappers are disabled pending resource, license and upload review. Online native checks still disclose the request source to their target services; offline mode skips them.
|
||||
|
||||
The updated workflow is not yet tested. Fault isolation and incremental report saving are implemented but untested. Current scope excludes proxy deployment and Web UI. No full-report uploads, paid API use, system dependency installation, production VPS tests, main-branch merges or public releases are authorized by this development brief.
|
||||
|
||||
---
|
||||
|
||||
# Security / 安全反馈
|
||||
|
||||
Do not post vulnerabilities containing passwords, subscription URLs, API keys,
|
||||
SSH keys or full diagnostic reports to public issues. If this repository is
|
||||
published with GitHub private vulnerability reporting enabled, use that channel.
|
||||
Otherwise request a private contact without publishing exploit details or secrets.
|
||||
This source snapshot does not yet have a public repository or security mailbox.
|
||||
|
||||
Rotate any exposed credential at its provider. Report files hide IP addresses by
|
||||
default, but redaction does not guarantee removal of all identifying information.
|
||||
Review files before sharing. Native diagnostics do not upload reports or modify
|
||||
SSH/firewall settings. The default suite contacts external test/data/media
|
||||
services, which see the request source. `check` and `suite --offline` do not.
|
||||
Keys are accepted through local environment variables; the product never asks
|
||||
for them on a public web form. Future deployment/repair features require a
|
||||
separate review and SSH rollback safeguards.
|
||||
|
||||
中文:不要公开提交密码、密钥、订阅地址或完整诊断报告。仓库发布并开启私密漏洞报告后
|
||||
优先使用该渠道;未配置前先询问私密联系方式,不公开敏感细节。报告脱敏不是匿名保证,
|
||||
分享前需检查。当前原生检测不修改 SSH/防火墙,不上传报告;联网模式的服务会看到请求来源。
|
||||
|
||||
|
||||
## 基础安全第五组(2026-11-01:实现未测试)
|
||||
|
||||
新增 `proxydoctor/security.py`:独立 Python collect/render API,接入 suite 独立安全模块和 check 的结构化/双语终端输出。检查固定9个文件/目录的 lstat 权限、所有者和类型,不读取 shadow/gshadow 内容、不提权、不刷新包缓存、不执行任何修复。检测世界可写、同组可写、非root所有者、敏感文件世界可读,均为人工审阅提示而非漏洞确认;shadow 的同组只读本身不报风险。符号链接不跟随判断,结果未知。
|
||||
|
||||
更新状态只读取 apt 成功时间戳和可选 update-notifier 缓存的明确英文计数。记录缓存年龄;无缓存/无权限/本地化或不识别格式不解释为零更新。未调用 apt update/upgrade,不联网、不查询付费API。即使缓存为0也不能证明无漏洞或已完整修补。仅固定入口/父目录,不递归审计 sudoers.d/sshd_config.d;ACL、capabilities、运行态、ESM/订阅资格和完整包版本安全比对未实现。
|
||||
|
||||
新增 `tests/test_security.py` 九个离线场景(含权限、符号链接、错误不泄密、缓存缺失/年龄/本地化、禁止读取私密内容和非Linux降级),本轮没有执行测试。此前与本轮全部新增实现仍待回归和双Ubuntu实测。
|
||||
Do not publish secrets or raw reports. Use private vulnerability reporting if enabled; otherwise ask for a private contact first.
|
||||
Default checks do not change network/security configuration. This Beta is not an independent security certification.
|
||||
@@ -1,3 +1,5 @@
|
||||
> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。
|
||||
|
||||
## 1.0 公测待验收
|
||||
|
||||
当前包的 Ubuntu 安装、ICMP/TCP、三网有效下载、BGP 实网及海外三城回程均留待下一轮;本轮开发机 271 通过、1 跳过。旧 Alpha 验证仅为历史。具体步骤范围见 PUBLIC_BETA_CHANGE_REPORT.md。
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
# References and acknowledgements / 借鉴来源与致谢
|
||||
|
||||
ProxyDoctor's default Python checks are independently implemented. The projects
|
||||
VPSMaster更名后保留历史版权与引用;API/数据条款及保留边界见 [docs/DATA_SERVICES.md](docs/DATA_SERVICES.md)。本项目MIT不授予第三方数据的任意再分发权。
|
||||
|
||||
VPSMaster's default Python checks are independently implemented. The projects
|
||||
below informed the feature selection and terminal presentation. Their code is
|
||||
not bundled in this source release. Attribution does not replace license compliance:
|
||||
any future source reuse must retain the upstream notices and follow its license.
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。
|
||||
|
||||
> 历史 Alpha/问题状态记录:当前 1.0 公测候选请以 CURRENT_STATUS.md 和 PUBLIC_BETA_CHANGE_REPORT.md 为准;新增代码不等于已完成实测。
|
||||
|
||||
> 最新Alpha优先项状态见 [ALPHA_TASK_STATUS.md](ALPHA_TASK_STATUS.md)。以下包含本轮前历史统计,不能作为最新发布验收结论。
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# VPSMaster 第三方接口与数据条款
|
||||
|
||||
源码MIT许可与第三方服务/数据许可不同。本包不分发地理数据库、API密钥或第三方测速二进制,不提供共享查询代理,也不代表服务商授权无限访问或再分发。
|
||||
|
||||
核对入口与适用约束(以服务商当前条款和用户套餐为准):
|
||||
|
||||
| 来源 | 官方入口 | 本版使用与限制 |
|
||||
| --- | --- | --- |
|
||||
| ipapi.is | https://ipapi.is/developers.html | 可匿名查询,但字段/日限额受限;不把缺失风险标记当安全。密钥只由用户本地提供,不随包分发 |
|
||||
| proxycheck.io | https://proxycheck.io/terms/ | 查询即受条款约束;不得规避免费限额或损害服务,失败/限额不换账号绕过 |
|
||||
| IP2Location.io | https://www.ip2location.io/terms-of-service | 集成不等于取得数据再分发权;不批量重建数据库、不公开密钥、不把原始API作为独立服务再售;适用缓存条款含30天限制 |
|
||||
| IPWhois / ipwho.is | https://ipwhois.io/terms | 有限个人/内部使用权,不代表允许镜像、转售或任意再分发;只作可选有限跳点查询 |
|
||||
| RIPEstat / RIS | https://stat.ripe.net/docs/data-api/ripestat-data-api | 保留来源,有限查询;AS路径是采集器观察,服务政策独立适用 |
|
||||
| AbuseIPDB | https://docs.abuseipdb.com/ | 用户可选密钥只读查询;不提交举报,不分发服务访问凭据 |
|
||||
|
||||
**保留与分享:** 本工具不会自动删除用户历史报告。用户须遵守实际数据来源/套餐的保留与分享限制;尤其含IP2Location数据的存档需要按适用条款清理、刷新或取得另行许可。不要公开原始API响应或将其作为可再许可数据库分发。报告脱敏不等于获得再分发许可。
|
||||
|
||||
公网测速端点和流媒体页面仍受各自条款、限额、访问控制约束。目录公开不等于授权持续高负载;大陆候选保持实验性、默认关闭,未知许可/可用性不提升为可靠默认服务。测试不禁用TLS验证,不绕过登录或付费播放权限。
|
||||
|
||||
该清单是实现/文档边界核对,不是独立法律意见或所有套餐/地区用途的完整合规认证。服务政策变化、长期商业托管、公开数据再分发须另行审查。
|
||||
@@ -0,0 +1,14 @@
|
||||
# VPSMaster GitHub 展示设置(本地草案)
|
||||
|
||||
- Repository name: VPSMaster
|
||||
- English description: An open-source VPS diagnostics and management toolkit.
|
||||
- 中文描述:面向 Linux VPS 用户的一站式服务器检测、网络诊断与管理工具。
|
||||
- Suggested topics: linux, vps, diagnostics, network, traceroute, python, cli
|
||||
- Release tag: v1.0.0-beta.1
|
||||
- Release title: VPSMaster v1.0.0-beta.1 — Public Beta
|
||||
- Pre-release: true
|
||||
- Latest stable release: false
|
||||
|
||||
仓库地址/维护者身份尚未配置,不自动建立链接、公开仓库或发布。
|
||||
发布文案须附上RELEASE_NOTES、KNOWN_LIMITATIONS及最终ZIP的独立SHA文件;不能用旧包摘要。
|
||||
先复核当前文件与Git历史的凭据/原始日志,再经用户确认发布。只公开源码及经过审查的发行文件,不公开VM脚本、快照、备份或原始测试证据。
|
||||
@@ -1,3 +1,5 @@
|
||||
> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。
|
||||
|
||||
# 当前状态:1.0 公测候选,非最终版本
|
||||
|
||||
2026-11-01;版本 1.0.0b1。未公开发布、推送或合并主分支。
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。
|
||||
|
||||
See [current status](CURRENT_STATUS.md) for implemented and outstanding work. Family-specific DNS/TCP/TLS checks now back suite/quality; untested.
|
||||
|
||||
# Current development scope (2026-11-01)
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。
|
||||
|
||||
最新逐类完成情况和未完成重点见 [当前进度](CURRENT_STATUS.md)。新增双栈 DNS/TCP/TLS 已接入 suite/quality,尚未验证。
|
||||
|
||||
# 当前开发范围(2026-11-01)
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。
|
||||
|
||||
|
||||
## 报告与IP质量更新(2026-11-01)
|
||||
|
||||
|
||||
+8
-5
@@ -68,12 +68,15 @@ def install(source, prefix):
|
||||
notices.mkdir(parents=True)
|
||||
for name in ('LICENSE','THIRD_PARTY_NOTICES.md','MANIFEST.sha256.json'):
|
||||
shutil.copyfile(source/name,notices/name)
|
||||
launcher = prefix/'bin/proxydoctor'
|
||||
launcher = prefix/'bin/vpsmaster'
|
||||
# execv avoids shebang/path whitespace issues without shell interpolation.
|
||||
launcher.write_text('#!/bin/sh\nexec '+__import__('shlex').quote(str(python))+' -I -B -m proxydoctor "$@"\n',encoding='utf-8')
|
||||
launcher.chmod(0o700)
|
||||
legacy_launcher = prefix/'bin/proxydoctor'
|
||||
legacy_launcher.write_bytes(launcher.read_bytes())
|
||||
legacy_launcher.chmod(0o700)
|
||||
subprocess.run([str(launcher),'--version'],check=True,timeout=10,capture_output=True)
|
||||
(prefix/'proxydoctor-install.json').write_text(json.dumps({'version':VERSION,'isolated':True}),encoding='utf-8')
|
||||
(prefix/'proxydoctor-install.json').write_text(json.dumps({'brand':'VPSMaster','package':'proxydoctor','version':VERSION,'isolated':True}),encoding='utf-8')
|
||||
return launcher
|
||||
except BaseException:
|
||||
# Only remove the new directory reserved by this invocation.
|
||||
@@ -83,8 +86,8 @@ def install(source, prefix):
|
||||
|
||||
|
||||
def main():
|
||||
parser=argparse.ArgumentParser(description='Offline isolated ProxyDoctor installer / 离线隔离安装')
|
||||
parser.add_argument('--prefix',type=Path,default=Path.home()/'.local/share/proxydoctor'/VERSION)
|
||||
parser=argparse.ArgumentParser(description='Offline isolated VPSMaster installer / VPSMaster 离线隔离安装')
|
||||
parser.add_argument('--prefix',type=Path,default=Path.home()/'.local/share/vpsmaster'/VERSION)
|
||||
parser.add_argument('--run',action='store_true',help='Install and run a read-only offline check')
|
||||
args=parser.parse_args()
|
||||
try:
|
||||
@@ -96,7 +99,7 @@ def main():
|
||||
print('Installation failed. Check Python/venv availability, release checksum and destination. No system packages were installed. / 安装失败,请检查环境、校验和与目录。',file=sys.stderr)
|
||||
return 2
|
||||
print('Installed / 已安装:'+str(launcher),flush=True)
|
||||
print('1.0 public beta; not the final release / 1.0 公测版,非最终版本',flush=True)
|
||||
print('VPSMaster 1.0 public beta; not the final release / VPSMaster 1.0 公测版,非最终版本',flush=True)
|
||||
if args.run:
|
||||
return subprocess.call([str(launcher),'suite','--offline'])
|
||||
return 0
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
"""ProxyDoctor: collect evidence before proposing changes."""
|
||||
"""VPSMaster: collect evidence before proposing changes."""
|
||||
|
||||
__version__ = "1.0.0b1"
|
||||
|
||||
|
||||
def release_label(lang='zh'):
|
||||
return ('VPS 检测工具 · 1.0 公测版(非最终版本)' if lang == 'zh' else
|
||||
'VPS Check · 1.0 public beta (not the final release)')
|
||||
return ('VPSMaster · 1.0 公测版(非最终版本)' if lang == 'zh' else
|
||||
'VPSMaster · 1.0 public beta (not the final release)')
|
||||
@@ -80,7 +80,7 @@ def transfer(direction, size, source='cloudflare'):
|
||||
if direction == 'upload' and provider.upload_url is None:
|
||||
result.error = 'unsupported'
|
||||
return result
|
||||
headers = {'User-Agent': 'ProxyDoctor/0.4.1', 'Accept-Encoding': 'identity',
|
||||
headers = {'User-Agent': 'VPSMaster/1.0.0b1', 'Accept-Encoding': 'identity',
|
||||
'Cache-Control': 'no-cache'}
|
||||
url = provider.download_url
|
||||
if not provider.use_range and not provider.capped_stream:
|
||||
|
||||
+3
-3
@@ -73,7 +73,7 @@ def _main():
|
||||
lang = 'en'
|
||||
t = translator(lang)
|
||||
st = lambda zh, en: zh if lang == 'zh' else en
|
||||
parser = LocalizedParser(lang=lang, description=("VPS 检测工具(只读体检):check 默认离线;suite 会联网" if lang=='zh' else 'VPS Check (read-only diagnostics): check defaults offline; suite contacts external services'))
|
||||
parser = LocalizedParser(prog="vpsmaster", lang=lang, description=("VPSMaster(只读体检):check 默认离线;suite 会联网" if lang=='zh' else 'VPSMaster (read-only diagnostics): check defaults offline; suite contacts external services'))
|
||||
parser.add_argument("--version", action="version", version=__version__ + ' · ' + release_label(lang), help=t("显示版本并退出"))
|
||||
parser.add_argument("--lang", choices=("zh", "en"), default=lang, help=t("界面和报告语言:zh 中文,en 英文(默认 zh)"))
|
||||
sub = parser.add_subparsers(dest="command", required=True)
|
||||
@@ -343,7 +343,7 @@ def _main():
|
||||
info_ids = {'system', 'architecture', 'kernel', 'cpu', 'memory_total', 'memory', 'disk_capacity', 'disk', 'interfaces', 'public_ip'}
|
||||
status_color = {'pass': 'ok', 'warn': 'bad', 'fail': 'bad', 'unknown': 'unknown', 'skip': 'unknown'}
|
||||
if theme == 'framed':
|
||||
console.frame_open(st('VPS 检测报告','VPS check report'), box_w=78, subtitle=release_label(lang) + ' · ' + __version__)
|
||||
console.frame_open(st('VPSMaster 检测报告','VPSMaster diagnostic report'), box_w=78, subtitle=release_label(lang) + ' · ' + __version__)
|
||||
# header key/values
|
||||
from datetime import datetime
|
||||
console.frame_keyvalue(st('扫描时间','Scan time'), datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S UTC'))
|
||||
@@ -360,7 +360,7 @@ def _main():
|
||||
for line in item["evidence"].splitlines():
|
||||
console.frame_line(st('依据','Evidence') + separator + line, 'muted')
|
||||
elif theme == 'iprisk':
|
||||
console.banner(' VPS CHECK ' + ('v' + __version__))
|
||||
console.banner(' VPSMaster ' + ('v' + __version__))
|
||||
console.line(release_label(lang), 'unknown')
|
||||
console.keyvalue(st('只读体检报告','Read-only diagnostic report'),
|
||||
st('已请求 ipify 查询出口 IP' if args.detect_public_ip else '默认不请求外部网络','ipify egress query' if args.detect_public_ip else 'no external requests by default'), 'title')
|
||||
|
||||
@@ -128,7 +128,7 @@ class Console:
|
||||
return f'\033[{_CODES[status]}m[{value}]\033[0m'
|
||||
|
||||
def banner(self, text):
|
||||
"""A large ASCII-art title line, e.g. PROXYDOCTOR."""
|
||||
"""A large ASCII-art title line, e.g. VPSMASTER."""
|
||||
text = clean(text)
|
||||
if not self.enabled:
|
||||
print(text, flush=True)
|
||||
|
||||
+1
-1
@@ -122,7 +122,7 @@ MESSAGES = {
|
||||
"未确认 sing-box 服务运行;新系统尚未安装属于正常情况": "sing-box service operation is unconfirmed; absence is expected on a fresh system",
|
||||
"通过": "PASS", "注意": "WARN", "未知": "UNKNOWN", "跳过": "SKIP", "失败": "FAIL",
|
||||
"[IP已隐藏]": "[IP REDACTED]",
|
||||
"VPS 检测工具 只读体检:不修改系统;默认不请求外部网络": "VPS Check read-only checks: no system changes; no external requests by default",
|
||||
"VPS 检测工具 只读体检:不修改系统;默认不请求外部网络": "VPSMaster read-only checks: no system changes; no external requests by default",
|
||||
"读取系统信息并生成体检报告": "Read system information and generate a diagnostic report",
|
||||
"拟使用的代理端口,默认 8388": "Intended proxy port (default: 8388)",
|
||||
"云控制台提供的 IP;本工具不验证归属": "IP from your cloud console; ownership is not verified",
|
||||
|
||||
@@ -98,7 +98,7 @@ def fetch_page(url):
|
||||
return None
|
||||
return super().redirect_request(req,fp,code,msg,headers,newurl)
|
||||
opener=urllib.request.build_opener(urllib.request.ProxyHandler({}),SameSiteRedirect())
|
||||
req=urllib.request.Request(url,headers={'User-Agent':'Mozilla/5.0 ProxyDoctor/0.4','Accept-Language':'en-US,en;q=0.9','Accept-Encoding':'identity'})
|
||||
req=urllib.request.Request(url,headers={'User-Agent':'Mozilla/5.0 VPSMaster/1.0.0b1','Accept-Language':'en-US,en;q=0.9','Accept-Encoding':'identity'})
|
||||
try:
|
||||
response=opener.open(req,timeout=8)
|
||||
except urllib.error.HTTPError as exc:
|
||||
|
||||
+1
-1
@@ -38,7 +38,7 @@ def request_json(url, *, payload=None, headers=None, max_bytes=65536):
|
||||
result=invoke('json',{'url':url,'payload':payload,'headers':headers,'max_bytes':max_bytes})
|
||||
return tuple(result) if isinstance(result,list) and len(result)==2 else (None,'request_failed')
|
||||
request_headers = {'Accept': 'application/json', 'Accept-Encoding': 'identity',
|
||||
'User-Agent': 'ProxyDoctor/0.4'}
|
||||
'User-Agent': 'VPSMaster/1.0.0b1'}
|
||||
request_headers.update(headers or {})
|
||||
data = None
|
||||
if payload is not None:
|
||||
|
||||
@@ -63,7 +63,7 @@ def markdown(report, lang='zh'):
|
||||
rows=[['schema',report.get('schema_version')],[t('版本','Tool version'),report.get('tool_version','unknown')],
|
||||
[t('检测时间','Observation time'),report.get('generated_at',report.get('observed_at','unknown'))],
|
||||
[t('运行结果','Execution result'),report.get('result','unknown')]]
|
||||
lines=['# '+t('VPS 检测工具 · 本地检测报告','VPS Check · local diagnostic report'),'']
|
||||
lines=['# '+t('VPSMaster · 本地检测报告','VPSMaster · local diagnostic report'),'']
|
||||
lines += [release_label(lang),'']
|
||||
lines+=table([t('项目','Item'),t('记录','Observation')],rows)
|
||||
lines+=['',t('本报告来自已有本地记录,没有重新检测。缺失指标保持未知。',
|
||||
|
||||
@@ -109,7 +109,7 @@ def trace(target, emit=print, hops=30, wait=1.0, lang='zh', geo=True, records=No
|
||||
sock.setsockopt(protocol,socket.IPV6_UNICAST_HOPS if v6 else socket.IP_TTL,ttl)
|
||||
start=time.monotonic()
|
||||
endpoint=(str(address),33434+ttl,0,0) if v6 else (str(address),33434+ttl)
|
||||
sock.sendto(b'ProxyDoctor',endpoint)
|
||||
sock.sendto(b'VPSMaster',endpoint)
|
||||
found=False
|
||||
while time.monotonic()-start < wait:
|
||||
try:
|
||||
|
||||
@@ -42,11 +42,11 @@ def run_suite(lang='zh',offline=False,sample_mib=4,route_target='1.1.1.1',besttr
|
||||
from datetime import datetime,timezone
|
||||
report={'schema_version':3,'mode':'read-only','generated_at':datetime.now(timezone.utc).isoformat(),'target_port':port,'network':None,'route':None,'tool_version':__version__,'offline':offline,'bandwidth':None,'bandwidth_consent':allow_bandwidth,'cpu_benchmark':'not_run','ip_quality':None,'media':{}}
|
||||
if framed:
|
||||
out.frame_open(tr('VPS 检测报告','VPS check report'), box_w=78, subtitle=release_label(lang) + ' · ' + __version__)
|
||||
out.frame_open(tr('VPSMaster 检测报告','VPSMaster diagnostic report'), box_w=78, subtitle=release_label(lang) + ' · ' + __version__)
|
||||
out.frame_keyvalue(tr('模式','Mode'), tr('离线模式' if offline else '联网模式','Offline' if offline else 'Online'))
|
||||
out.frame_keyvalue(tr('目标端口','Target port'), str(port))
|
||||
elif iprisk:
|
||||
out.banner(' VPS CHECK ' + ('v' + __version__))
|
||||
out.banner(' VPSMaster ' + ('v' + __version__))
|
||||
out.line(release_label(lang), 'unknown')
|
||||
out.keyvalue(tr('只读体检报告 · 原生检测','Read-only diagnostic report · native checks'),
|
||||
tr('离线模式' if offline else '联网模式','Offline' if offline else 'Online'),'title')
|
||||
@@ -54,8 +54,8 @@ def run_suite(lang='zh',offline=False,sample_mib=4,route_target='1.1.1.1',besttr
|
||||
print(flush=True)
|
||||
else:
|
||||
out.line(release_label(lang), 'unknown')
|
||||
print(tr(f'VPS 检测工具 {__version__} | 原生检测 | 联网模式' if not offline else f'VPS 检测工具 {__version__} | 离线模式',
|
||||
f'VPS Check {__version__} | Native checks | Online' if not offline else f'VPS Check {__version__} | Offline'),flush=True)
|
||||
print(tr(f'VPSMaster {__version__} | 原生检测 | 联网模式' if not offline else f'VPSMaster {__version__} | 离线模式',
|
||||
f'VPSMaster {__version__} | Native checks | Online' if not offline else f'VPSMaster {__version__} | Offline'),flush=True)
|
||||
from .reports import ReportStore, UnavailableStore, utc_now
|
||||
from .runner import ModuleRunner
|
||||
data = {'checks': []}
|
||||
|
||||
+2
-1
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
|
||||
[project]
|
||||
name = "proxydoctor"
|
||||
version = "1.0.0b1"
|
||||
description = "Read-only Ubuntu preflight and security checks"
|
||||
description = "An open-source VPS diagnostics and management toolkit."
|
||||
readme = "README.en.md"
|
||||
license = "MIT"
|
||||
license-files = ["LICENSE", "THIRD_PARTY_NOTICES.md"]
|
||||
@@ -13,6 +13,7 @@ requires-python = ">=3.10"
|
||||
dependencies = []
|
||||
|
||||
[project.scripts]
|
||||
vpsmaster = "proxydoctor.cli:main"
|
||||
proxydoctor = "proxydoctor.cli:main"
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
"""Public branding contracts while legacy Python/API entry points stay usable."""
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
import pytest
|
||||
from proxydoctor import __version__,release_label
|
||||
from proxydoctor.reporting import markdown
|
||||
|
||||
|
||||
@pytest.mark.parametrize('lang',['zh','en'])
|
||||
@pytest.mark.parametrize('command',[['--version'],['--help'],['check','--theme','iprisk','--color','never'],['check','--theme','framed','--color','never']])
|
||||
def test_visible_legacy_python_entry_has_current_brand(lang,command):
|
||||
p=subprocess.run([sys.executable,'-B','-m','proxydoctor',*command,'--lang',lang],capture_output=True,text=True,encoding='utf-8',timeout=20)
|
||||
assert p.returncode in (0,1)
|
||||
assert 'VPSMaster' in p.stdout and 'ProxyDoctor' not in p.stdout and 'VPS CHECK' not in p.stdout
|
||||
assert 'Traceback' not in p.stderr
|
||||
|
||||
|
||||
@pytest.mark.parametrize('lang',['zh','en'])
|
||||
def test_report_brand_and_legacy_json_schema(lang):
|
||||
text=markdown({'schema_version':3,'tool_version':__version__,'checks':[]},lang)
|
||||
assert 'VPSMaster' in text and 'ProxyDoctor' not in text
|
||||
assert __version__=='1.0.0b1' and 'VPSMaster' in release_label(lang)
|
||||
|
||||
|
||||
def test_distribution_keeps_legacy_module_and_both_cli_names():
|
||||
root=Path(__file__).resolve().parents[1]
|
||||
metadata=(root/'pyproject.toml').read_text()
|
||||
assert 'name = "proxydoctor"' in metadata
|
||||
assert 'vpsmaster = "proxydoctor.cli:main"' in metadata
|
||||
assert 'proxydoctor = "proxydoctor.cli:main"' in metadata
|
||||
assert (root/'vpsmaster.sh').read_bytes()==(root/'proxydoctor.sh').read_bytes()
|
||||
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
cd -- "$(dirname -- "${BASH_SOURCE[0]}")"
|
||||
if ! command -v python3 >/dev/null 2>&1; then
|
||||
echo '需要 Python 3.10+ / Python 3.10+ is required.' >&2
|
||||
exit 2
|
||||
fi
|
||||
if [ "$#" -eq 0 ]; then
|
||||
exec python3 -B -u -m proxydoctor suite
|
||||
fi
|
||||
exec python3 -B -u -m proxydoctor "$@"
|
||||
Reference in new issue
Block a user