feat:设置额外提供的CI参数设置优先级高于选项本身的预设值

This commit is contained in:
spiritlhl
2025-11-02 15:41:39 +00:00
parent 4503fb55b0
commit 6b42f626b0
2 changed files with 296 additions and 20 deletions

View File

@@ -17,6 +17,7 @@
- [邮件端口检测](#邮件端口检测)
- [上游及回程线路检测](#上游及回程线路检测)
- [三网回程路由检测](#三网回程路由检测)
- [PING值测试](#PING值测试)
- [就近测速](#就近测速)
## English
@@ -27,6 +28,7 @@
- [Streaming Media Unlocking](#Streaming-Media-Unlocking)
- [IP Quality Detection](#IP-Quality-Detection)
- [Email Port Detection](#Email-Port-Detection)
- [PING Testing](#PING-Testing)
- [Nearby Speed Testing](#Nearby-Speed-Testing)
## 日本語
@@ -37,12 +39,15 @@
- [ストリーミングメディアロック解除](#ストリーミングメディアロック解除)
- [IP品質検出](#IP品質検出)
- [メールポート検出](#メールポート検出)
- [PING検出](#PING検出)
- [近隣スピードテスト](#近隣スピードテスト)
---
## 中文
menu模式默认启用执行时显示菜单可选择选项测试在menu模式启用的情况下默认额外提供的CI参数设置优先级高于选项本身的预设值方便用户随时针对某个选项自行修改某些单项测试的参数设置。
### **系统基础信息**
依赖项目:[https://github.com/oneclickvirt/basics](https://github.com/oneclickvirt/basics) [https://github.com/oneclickvirt/gostun](https://github.com/oneclickvirt/gostun)
@@ -407,6 +412,18 @@ Abuser 或 Abuse 的滥用得分会直接影响机器的正常使用(中国境
有时候路由信息完全藏起来了,只知道实际使用的延迟低,实际可能也是优质线路只是查不到信息,这就没办法直接识别了。
### **PING值测试**
依赖项目:[https://github.com/oneclickvirt/pingtest](https://github.com/oneclickvirt/pingtest)
对于选项1如果启用中国模式将仅检测三网全国各省份的PING值延迟从小到大排序。如果不启用中国模式默认将不检测三网全国各省份的PING值延迟仅检测TGDC和主流网站的延迟。
对于选项6和选项10默认都进行测试。
对于中国境内的测试测试TGDC和主流跨国网站的延迟无意义所以默认不测试。
对于参数指定的状态,优先级会高于选项中默认的参数设置。
### **就近测速**
依赖项目:[https://github.com/oneclickvirt/speedtest](https://github.com/oneclickvirt/speedtest)
@@ -423,6 +440,8 @@ Abuser 或 Abuse 的滥用得分会直接影响机器的正常使用(中国境
## English
Menu mode is enabled by default, the menu is displayed to select the option test, in the case of menu mode enabled, the default additional CI parameter setting priority is higher than the preset value of the option itself, which is convenient for the user to modify the parameter settings of some single test for a certain option at any time by themselves.
### Basic System Information
Dependency project: [https://github.com/oneclickvirt/basics](https://github.com/oneclickvirt/basics) [https://github.com/oneclickvirt/gostun](https://github.com/oneclickvirt/gostun)
@@ -733,6 +752,12 @@ Dependency project: [https://github.com/oneclickvirt/portchecker](https://github
If the current host doesn't function as a mail server and doesn't send/receive emails, this project indicator can be ignored.
### PING Testing
Dependency project: [https://github.com/oneclickvirt/pingtest](https://github.com/oneclickvirt/pingtest)
Measure the latency from the current IP address to each TG data center and major websites.
### Nearby Speed Testing
Dependency project: [https://github.com/oneclickvirt/speedtest](https://github.com/oneclickvirt/speedtest)
@@ -747,6 +772,8 @@ In daily use, I prefer to use servers with 1Gbps bandwidth, at least the speed o
## 日本語
メニューモードはデフォルトで有効化されており、実行時にメニューを表示してオプションテストを選択できます。メニューモードが有効な場合、デフォルトで追加提供されるCIパラメータ設定はオプション自体のプリセット値よりも優先度が高く、ユーザーが特定のオプションに対して随時個別のテストパラメータ設定を変更できるようにします。
### システム基本情報
依存プロジェクト:[https://github.com/oneclickvirt/basics](https://github.com/oneclickvirt/basics) [https://github.com/oneclickvirt/gostun](https://github.com/oneclickvirt/gostun)
@@ -1057,6 +1084,12 @@ IPタイプの分類について詳しく説明する必要がある
現在のホストがメール局として機能せず、電子メールの送受信を行わない場合、この項目指標は無視して構いません。
### PING検出
依存プロジェクト:[https://github.com/oneclickvirt/pingtest](https://github.com/oneclickvirt/pingtest)
現在のIPアドレスからTGの各データセンターおよび主要ウェブサイトまでの遅延を測定します。
### 近隣スピードテスト
依存プロジェクト:[https://github.com/oneclickvirt/speedtest](https://github.com/oneclickvirt/speedtest)

277
goecs.go
View File

@@ -63,6 +63,8 @@ var (
onlyIpInfoCheckStatus, help bool
goecsFlag = flag.NewFlagSet("goecs", flag.ContinueOnError)
finish bool
// 用于跟踪哪些参数是用户显式设置的
userSetFlags = make(map[string]bool)
)
func getMenuChoice(language string) string {
@@ -153,6 +155,11 @@ func parseFlags() {
goecsFlag.BoolVar(&enableLogger, "log", false, "Enable/Disable logging in the current path")
goecsFlag.BoolVar(&enabelUpload, "upload", true, "Enable/Disable upload the result")
goecsFlag.Parse(os.Args[1:])
// 记录用户显式设置的参数
goecsFlag.Visit(func(f *flag.Flag) {
userSetFlags[f.Name] = true
})
}
func handleHelpAndVersion() bool {
@@ -184,7 +191,253 @@ func initLogger() {
}
}
// saveUserSetParams 保存用户通过命令行显式设置的参数值
func saveUserSetParams() map[string]interface{} {
saved := make(map[string]interface{})
if userSetFlags["basic"] {
saved["basic"] = basicStatus
}
if userSetFlags["cpu"] {
saved["cpu"] = cpuTestStatus
}
if userSetFlags["memory"] {
saved["memory"] = memoryTestStatus
}
if userSetFlags["disk"] {
saved["disk"] = diskTestStatus
}
if userSetFlags["comm"] {
saved["comm"] = commTestStatus
}
if userSetFlags["ut"] {
saved["ut"] = utTestStatus
}
if userSetFlags["security"] {
saved["security"] = securityTestStatus
}
if userSetFlags["email"] {
saved["email"] = emailTestStatus
}
if userSetFlags["backtrace"] {
saved["backtrace"] = backtraceStatus
}
if userSetFlags["nt3"] {
saved["nt3"] = nt3Status
}
if userSetFlags["speed"] {
saved["speed"] = speedTestStatus
}
if userSetFlags["ping"] {
saved["ping"] = pingTestStatus
}
if userSetFlags["tgdc"] {
saved["tgdc"] = tgdcTestStatus
}
if userSetFlags["web"] {
saved["web"] = webTestStatus
}
if userSetFlags["cpum"] {
saved["cpum"] = cpuTestMethod
}
if userSetFlags["cput"] {
saved["cput"] = cpuTestThreadMode
}
if userSetFlags["memorym"] {
saved["memorym"] = memoryTestMethod
}
if userSetFlags["diskm"] {
saved["diskm"] = diskTestMethod
}
if userSetFlags["diskp"] {
saved["diskp"] = diskTestPath
}
if userSetFlags["diskmc"] {
saved["diskmc"] = diskMultiCheck
}
if userSetFlags["nt3loc"] {
saved["nt3loc"] = nt3Location
}
if userSetFlags["nt3t"] {
saved["nt3t"] = nt3CheckType
}
if userSetFlags["spnum"] {
saved["spnum"] = spNum
}
return saved
}
// restoreUserSetParams 恢复用户通过命令行显式设置的参数值,覆盖菜单的默认值
func restoreUserSetParams(saved map[string]interface{}) {
if val, ok := saved["basic"]; ok {
basicStatus = val.(bool)
}
if val, ok := saved["cpu"]; ok {
cpuTestStatus = val.(bool)
}
if val, ok := saved["memory"]; ok {
memoryTestStatus = val.(bool)
}
if val, ok := saved["disk"]; ok {
diskTestStatus = val.(bool)
}
if val, ok := saved["comm"]; ok {
commTestStatus = val.(bool)
}
if val, ok := saved["ut"]; ok {
utTestStatus = val.(bool)
}
if val, ok := saved["security"]; ok {
securityTestStatus = val.(bool)
}
if val, ok := saved["email"]; ok {
emailTestStatus = val.(bool)
}
if val, ok := saved["backtrace"]; ok {
backtraceStatus = val.(bool)
}
if val, ok := saved["nt3"]; ok {
nt3Status = val.(bool)
}
if val, ok := saved["speed"]; ok {
speedTestStatus = val.(bool)
}
if val, ok := saved["ping"]; ok {
pingTestStatus = val.(bool)
}
if val, ok := saved["tgdc"]; ok {
tgdcTestStatus = val.(bool)
}
if val, ok := saved["web"]; ok {
webTestStatus = val.(bool)
}
if val, ok := saved["cpum"]; ok {
cpuTestMethod = val.(string)
}
if val, ok := saved["cput"]; ok {
cpuTestThreadMode = val.(string)
}
if val, ok := saved["memorym"]; ok {
memoryTestMethod = val.(string)
}
if val, ok := saved["diskm"]; ok {
diskTestMethod = val.(string)
}
if val, ok := saved["diskp"]; ok {
diskTestPath = val.(string)
}
if val, ok := saved["diskmc"]; ok {
diskMultiCheck = val.(bool)
}
if val, ok := saved["nt3loc"]; ok {
// 如果用户没有在菜单中选择选项10才恢复用户设置的nt3Location
// 选项10会强制设置 nt3Location = "ALL"
if choice != "10" {
nt3Location = val.(string)
}
}
if val, ok := saved["nt3t"]; ok {
nt3CheckType = val.(string)
}
if val, ok := saved["spnum"]; ok {
spNum = val.(int)
}
// 验证参数的有效性
validateParams()
}
// validateParams 验证参数的有效性,如果无效则使用默认值
func validateParams() {
// 验证 cpuTestMethod
validCpuMethods := map[string]bool{"sysbench": true, "geekbench": true, "winsat": true}
if !validCpuMethods[cpuTestMethod] {
if language == "zh" {
fmt.Printf("警告: CPU测试方法 '%s' 无效,使用默认值 'sysbench'\n", cpuTestMethod)
} else {
fmt.Printf("Warning: Invalid CPU test method '%s', using default 'sysbench'\n", cpuTestMethod)
}
cpuTestMethod = "sysbench"
}
// 验证 cpuTestThreadMode
validThreadModes := map[string]bool{"single": true, "multi": true}
if !validThreadModes[cpuTestThreadMode] {
if language == "zh" {
fmt.Printf("警告: CPU线程模式 '%s' 无效,使用默认值 'multi'\n", cpuTestThreadMode)
} else {
fmt.Printf("Warning: Invalid CPU thread mode '%s', using default 'multi'\n", cpuTestThreadMode)
}
cpuTestThreadMode = "multi"
}
// 验证 memoryTestMethod
validMemoryMethods := map[string]bool{"stream": true, "sysbench": true, "dd": true, "winsat": true, "auto": true}
if !validMemoryMethods[memoryTestMethod] {
if language == "zh" {
fmt.Printf("警告: 内存测试方法 '%s' 无效,使用默认值 'stream'\n", memoryTestMethod)
} else {
fmt.Printf("Warning: Invalid memory test method '%s', using default 'stream'\n", memoryTestMethod)
}
memoryTestMethod = "stream"
}
// 验证 diskTestMethod
validDiskMethods := map[string]bool{"fio": true, "dd": true, "winsat": true}
if !validDiskMethods[diskTestMethod] {
if language == "zh" {
fmt.Printf("警告: 磁盘测试方法 '%s' 无效,使用默认值 'fio'\n", diskTestMethod)
} else {
fmt.Printf("Warning: Invalid disk test method '%s', using default 'fio'\n", diskTestMethod)
}
diskTestMethod = "fio"
}
// 验证 nt3Location
validNt3Locations := map[string]bool{"GZ": true, "SH": true, "BJ": true, "CD": true, "ALL": true}
if !validNt3Locations[nt3Location] {
if language == "zh" {
fmt.Printf("警告: NT3测试位置 '%s' 无效,使用默认值 'GZ'\n", nt3Location)
} else {
fmt.Printf("Warning: Invalid NT3 location '%s', using default 'GZ'\n", nt3Location)
}
nt3Location = "GZ"
}
// 验证 nt3CheckType
validNt3Types := map[string]bool{"both": true, "ipv4": true, "ipv6": true}
if !validNt3Types[nt3CheckType] {
if language == "zh" {
fmt.Printf("警告: NT3测试类型 '%s' 无效,使用默认值 'ipv4'\n", nt3CheckType)
} else {
fmt.Printf("Warning: Invalid NT3 check type '%s', using default 'ipv4'\n", nt3CheckType)
}
nt3CheckType = "ipv4"
}
// 验证 spNum (应该是正数)
if spNum < 0 {
if language == "zh" {
fmt.Printf("警告: 测速节点数量 '%d' 无效,使用默认值 2\n", spNum)
} else {
fmt.Printf("Warning: Invalid speed test node count '%d', using default 2\n", spNum)
}
spNum = 2
}
// 验证 language
validLanguages := map[string]bool{"zh": true, "en": true}
if !validLanguages[language] {
fmt.Printf("Warning: Invalid language '%s', using default 'zh'\n", language)
language = "zh"
}
}
func handleMenuMode(preCheck utils.NetCheckResult) {
// 保存用户显式设置的参数值
savedParams := saveUserSetParams()
basicStatus, cpuTestStatus, memoryTestStatus, diskTestStatus = false, false, false, false
commTestStatus, utTestStatus, securityTestStatus, emailTestStatus = false, false, false, false
backtraceStatus, nt3Status, speedTestStatus = false, false, false
@@ -249,6 +502,9 @@ Loop:
printInvalidChoice()
}
}
// 恢复用户显式设置的参数,覆盖菜单的默认值
restoreUserSetParams(savedParams)
}
func printMenuOptions(preCheck utils.NetCheckResult) {
@@ -606,13 +862,7 @@ func runEnglishTests(preCheck utils.NetCheckResult, wg1, wg2, wg3 *sync.WaitGrou
*emailInfo = email.EmailCheck()
}()
}
if pingTestStatus {
wg3.Add(1)
go func() {
defer wg3.Done()
*ptInfo = pt.PingTest()
}()
}
// 英文模式不进行三网PING测试,所以不启动 pt.PingTest()
*output = runStreamingTests(wg1, mediaInfo, *output, tempOutput, outputMutex)
*output = runSecurityTests(*securityInfo, *output, tempOutput, outputMutex)
*output = runEmailTests(wg2, emailInfo, *output, tempOutput, outputMutex)
@@ -864,23 +1114,16 @@ func runEnglishNetworkTests(wg3 *sync.WaitGroup, ptInfo *string, output, tempOut
outputMutex.Lock()
defer outputMutex.Unlock()
return utils.PrintAndCapture(func() {
if pingTestStatus && *ptInfo != "" {
wg3.Wait()
// 英文模式只测试 TGDC 和主流网站不测试三网PING
if tgdcTestStatus || webTestStatus {
utils.PrintCenteredTitle("PING-Test", width)
fmt.Println(*ptInfo)
}
if tgdcTestStatus {
if !pingTestStatus || *ptInfo == "" {
utils.PrintCenteredTitle("PING-Test", width)
}
fmt.Println(pt.TelegramDCTest())
}
if webTestStatus {
if !pingTestStatus && !tgdcTestStatus {
utils.PrintCenteredTitle("PING-Test", width)
}
fmt.Println(pt.WebsiteTest())
}
}
}, tempOutput, output)
}