diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..a0832d4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -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. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..b8942b1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.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. diff --git a/.gitignore b/.gitignore index 9b017a8..2fc458b 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,13 @@ dist/ work/ outputs/ reports/ +evidence/ +backups/ +private/ +.env +.env.* +*.key +*.pem +*.log +*.zip +*.events.jsonl diff --git a/ALPHA_RELEASE_REPORT.md b/ALPHA_RELEASE_REPORT.md index 9807f81..d83edfc 100644 --- a/ALPHA_RELEASE_REPORT.md +++ b/ALPHA_RELEASE_REPORT.md @@ -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 发布前报告 diff --git a/ALPHA_TASK_STATUS.md b/ALPHA_TASK_STATUS.md index c36efd1..8517fea 100644 --- a/ALPHA_TASK_STATUS.md +++ b/ALPHA_TASK_STATUS.md @@ -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 发布优先项状态 diff --git a/CHANGELOG.md b/CHANGELOG.md index 076b87f..185ad2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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。 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4feabea..1c1bd89 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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. diff --git a/CURRENT_STATUS.md b/CURRENT_STATUS.md index c50905b..ca4fb90 100644 --- a/CURRENT_STATUS.md +++ b/CURRENT_STATUS.md @@ -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/旧名文档保留原始证据,仅供追溯。 diff --git a/DEVELOPMENT_BRIEF.zh.md b/DEVELOPMENT_BRIEF.zh.md index e5e1189..35cd04c 100644 --- a/DEVELOPMENT_BRIEF.zh.md +++ b/DEVELOPMENT_BRIEF.zh.md @@ -1,3 +1,5 @@ +> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。 + # VPS 综合检测工具——完整开发与工程优化任务书 ## 0. 项目背景与最终目标 diff --git a/IPQUALITY_COVERAGE.md b/IPQUALITY_COVERAGE.md index 5d07552..7a30a1c 100644 --- a/IPQUALITY_COVERAGE.md +++ b/IPQUALITY_COVERAGE.md @@ -1,3 +1,5 @@ +> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。 + # IPQuality 风格功能覆盖与外部资源 2026-11-01。目标是借鉴清楚的分区展示,优先自主实现,不直接运行或拼接第三方脚本。 diff --git a/KNOWN_LIMITATIONS.md b/KNOWN_LIMITATIONS.md index e4456df..2962a2f 100644 --- a/KNOWN_LIMITATIONS.md +++ b/KNOWN_LIMITATIONS.md @@ -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. diff --git a/LICENSE b/LICENSE index d556de0..48eab64 100644 --- a/LICENSE +++ b/LICENSE @@ -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 diff --git a/MANIFEST.sha256.json b/MANIFEST.sha256.json index c1022b6..09e545c 100644 --- a/MANIFEST.sha256.json +++ b/MANIFEST.sha256.json @@ -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" } } diff --git a/OPEN_SOURCE_RESEARCH.md b/OPEN_SOURCE_RESEARCH.md index f8e66ec..56b6066 100644 --- a/OPEN_SOURCE_RESEARCH.md +++ b/OPEN_SOURCE_RESEARCH.md @@ -1,3 +1,5 @@ +> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。 + # 开源源码研究(首轮) 阅读日期:2026-11-01。通过 GitHub 连接器实际获取根目录、下列源码及 LICENSE;未运行参考脚本、未复制实现。链接为阅读时默认分支,可变化,实施任何复用前还需固定 commit 和复核依赖许可证。本轮是入口级研究,不宣称完成整个仓库审计。 diff --git a/PROBLEM_BACKLOG.md b/PROBLEM_BACKLOG.md index fb8bcb8..467e494 100644 --- a/PROBLEM_BACKLOG.md +++ b/PROBLEM_BACKLOG.md @@ -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 为准;新增代码不等于已完成实测。 diff --git a/PUBLIC_BETA_CHANGE_REPORT.md b/PUBLIC_BETA_CHANGE_REPORT.md index 5720c57..f520f74 100644 --- a/PUBLIC_BETA_CHANGE_REPORT.md +++ b/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,安装器探测及源码脚本同步。 diff --git a/README.en.md b/README.en.md index 93cee7b..57b8f78 100644 --- a/README.en.md +++ b/README.en.md @@ -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 ms Private/reserved AS? --- [reached] +Trace result reached +Recovery journal: ``` -- 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. diff --git a/README.md b/README.md index 34d9327..1926372 100644 --- a/README.md +++ b/README.md @@ -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 示例输出 -## 报告、安全和中断 +以下是**格式示意**,`` 等为占位符,不是本发行包的测速成绩: -报告默认保存在当前目录的 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 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);当前工具不自动删除历史报告。 diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index c93b7c3..688eaad 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -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。 diff --git a/SECURITY.md b/SECURITY.md index 4cbc0ad..d4d51ad 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -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. diff --git a/TEST_PLAN.md b/TEST_PLAN.md index 52ec719..a13005d 100644 --- a/TEST_PLAN.md +++ b/TEST_PLAN.md @@ -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。 diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 136d38f..31c6b13 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.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. diff --git a/USER_CHECKLIST_STATUS.md b/USER_CHECKLIST_STATUS.md index 6df3e24..aa39c6a 100644 --- a/USER_CHECKLIST_STATUS.md +++ b/USER_CHECKLIST_STATUS.md @@ -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)。以下包含本轮前历史统计,不能作为最新发布验收结论。 diff --git a/docs/DATA_SERVICES.md b/docs/DATA_SERVICES.md new file mode 100644 index 0000000..1869c21 --- /dev/null +++ b/docs/DATA_SERVICES.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验证,不绕过登录或付费播放权限。 + +该清单是实现/文档边界核对,不是独立法律意见或所有套餐/地区用途的完整合规认证。服务政策变化、长期商业托管、公开数据再分发须另行审查。 diff --git a/docs/GITHUB_ABOUT.md b/docs/GITHUB_ABOUT.md new file mode 100644 index 0000000..915722b --- /dev/null +++ b/docs/GITHUB_ABOUT.md @@ -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脚本、快照、备份或原始测试证据。 diff --git a/docs/history-beta-before-p0-20261101.md b/docs/history-beta-before-p0-20261101.md index 901f10a..b47bbce 100644 --- a/docs/history-beta-before-p0-20261101.md +++ b/docs/history-beta-before-p0-20261101.md @@ -1,3 +1,5 @@ +> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。 + # 当前状态:1.0 公测候选,非最终版本 2026-11-01;版本 1.0.0b1。未公开发布、推送或合并主分支。 diff --git a/docs/pre-alpha-README.en.md b/docs/pre-alpha-README.en.md index d33c41a..4159731 100644 --- a/docs/pre-alpha-README.en.md +++ b/docs/pre-alpha-README.en.md @@ -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) diff --git a/docs/pre-alpha-README.md b/docs/pre-alpha-README.md index 12bf0e9..57901dc 100644 --- a/docs/pre-alpha-README.md +++ b/docs/pre-alpha-README.md @@ -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) diff --git a/docs/status-history-before-2026-11-01.md b/docs/status-history-before-2026-11-01.md index daf64cd..dc559a7 100644 --- a/docs/status-history-before-2026-11-01.md +++ b/docs/status-history-before-2026-11-01.md @@ -1,3 +1,5 @@ +> 历史记录 / Historical record:ProxyDoctor 是项目旧名。以下旧版本、SHA256、测试数量与路径保留原样,不代表 VPSMaster 新构建已通过;当前范围见 README.md、CURRENT_STATUS.md 和新包同 SHA256 验收报告。 + ## 报告与IP质量更新(2026-11-01) diff --git a/install.py b/install.py index a65082b..293792a 100644 --- a/install.py +++ b/install.py @@ -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 diff --git a/proxydoctor/__init__.py b/proxydoctor/__init__.py index 2f856be..bb819ae 100644 --- a/proxydoctor/__init__.py +++ b/proxydoctor/__init__.py @@ -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)') diff --git a/proxydoctor/bandwidth.py b/proxydoctor/bandwidth.py index 7f3c5dc..d3aacdb 100644 --- a/proxydoctor/bandwidth.py +++ b/proxydoctor/bandwidth.py @@ -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: diff --git a/proxydoctor/cli.py b/proxydoctor/cli.py index e5266d6..544ede9 100644 --- a/proxydoctor/cli.py +++ b/proxydoctor/cli.py @@ -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') diff --git a/proxydoctor/console.py b/proxydoctor/console.py index f297e9b..2db874d 100644 --- a/proxydoctor/console.py +++ b/proxydoctor/console.py @@ -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) diff --git a/proxydoctor/i18n.py b/proxydoctor/i18n.py index 73fb5e9..acc78a1 100644 --- a/proxydoctor/i18n.py +++ b/proxydoctor/i18n.py @@ -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", diff --git a/proxydoctor/media.py b/proxydoctor/media.py index fbfcac4..ac0df28 100644 --- a/proxydoctor/media.py +++ b/proxydoctor/media.py @@ -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: diff --git a/proxydoctor/net.py b/proxydoctor/net.py index e53dcee..fdb8756 100644 --- a/proxydoctor/net.py +++ b/proxydoctor/net.py @@ -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: diff --git a/proxydoctor/reporting.py b/proxydoctor/reporting.py index 2f9a7d0..f2a5d97 100644 --- a/proxydoctor/reporting.py +++ b/proxydoctor/reporting.py @@ -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('本报告来自已有本地记录,没有重新检测。缺失指标保持未知。', diff --git a/proxydoctor/routes.py b/proxydoctor/routes.py index 39a7bdf..531dd16 100644 --- a/proxydoctor/routes.py +++ b/proxydoctor/routes.py @@ -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: diff --git a/proxydoctor/suite.py b/proxydoctor/suite.py index 2b09297..a77a305 100644 --- a/proxydoctor/suite.py +++ b/proxydoctor/suite.py @@ -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': []} diff --git a/pyproject.toml b/pyproject.toml index 6e10b09..27c7ab8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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] diff --git a/tests/test_branding.py b/tests/test_branding.py new file mode 100644 index 0000000..713b7b7 --- /dev/null +++ b/tests/test_branding.py @@ -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() diff --git a/vpsmaster.sh b/vpsmaster.sh new file mode 100644 index 0000000..d25ea45 --- /dev/null +++ b/vpsmaster.sh @@ -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 "$@"