This commit is contained in:
spiritysdx
2024-06-30 18:43:33 +08:00
parent 6a0fe661fa
commit c611946a9c
5 changed files with 218 additions and 125 deletions

2
go.mod
View File

@@ -13,7 +13,7 @@ require (
github.com/oneclickvirt/memorytest v0.0.1-20240624151629
github.com/oneclickvirt/nt3 v0.0.1-20240627070009
github.com/oneclickvirt/portchecker v0.0.1-20240624155429
github.com/oneclickvirt/security v0.0.1-20240625075931
github.com/oneclickvirt/security v0.0.1-20240630101628
github.com/oneclickvirt/speedtest v0.0.5-20240630045424
)

2
go.sum
View File

@@ -115,6 +115,8 @@ github.com/oneclickvirt/portchecker v0.0.1-20240624155429 h1:+wapaOcFrg1iWJDhBKT
github.com/oneclickvirt/portchecker v0.0.1-20240624155429/go.mod h1:HQxSTrqM8/QFqHMTBZ7S8H9eEO5FkUXU1eb7ZX5Mk+k=
github.com/oneclickvirt/security v0.0.1-20240625075931 h1:Vj1Wq/JVcqYpfqUWRtsITbz3zM4HxnLC0iPxxA6akP0=
github.com/oneclickvirt/security v0.0.1-20240625075931/go.mod h1:6bjZjpYJ8M3aRIcLP61b0mjYRwvtWbYkvoGjS28Bdy4=
github.com/oneclickvirt/security v0.0.1-20240630101628 h1:Ain+TvrWo22ex9CGc1Z2seOX32XIXW8ajs2K3sfd+JY=
github.com/oneclickvirt/security v0.0.1-20240630101628/go.mod h1:6bjZjpYJ8M3aRIcLP61b0mjYRwvtWbYkvoGjS28Bdy4=
github.com/oneclickvirt/speedtest v0.0.4-20240629100548 h1:DQA0R/EdtmLJrQBb9JvQBaBpcMgiGDvIHq+0quNZQQM=
github.com/oneclickvirt/speedtest v0.0.4-20240629100548/go.mod h1:JNIxUbEJD12w81b7754RLHD55fsH6wHj+fCV2PqBDhk=
github.com/oneclickvirt/speedtest v0.0.5-20240630045424 h1:LXvoAgCAJVGci0Tzm3cDgvNaezncS8R5nOn8s+p+kNA=

168
goecs.go
View File

@@ -3,8 +3,6 @@ package main
import (
"flag"
"fmt"
"github.com/oneclickvirt/UnlockTests/uts"
"github.com/oneclickvirt/basics/system"
"github.com/oneclickvirt/ecs/backtrace"
"github.com/oneclickvirt/ecs/commediatest"
"github.com/oneclickvirt/ecs/cputest"
@@ -13,13 +11,11 @@ import (
"github.com/oneclickvirt/ecs/ntrace"
"github.com/oneclickvirt/ecs/speedtest"
"github.com/oneclickvirt/ecs/unlocktest"
"github.com/oneclickvirt/ecs/utils"
"github.com/oneclickvirt/portchecker/email"
"github.com/oneclickvirt/security/network"
"runtime"
"strings"
"sync"
"time"
"unicode/utf8"
)
var (
@@ -35,76 +31,6 @@ var (
width = 84
)
func printCenteredTitle(title string, width int) {
titleLength := utf8.RuneCountInString(title) // 计算字符串的字符数
totalPadding := width - titleLength
padding := totalPadding / 2
paddingStr := strings.Repeat("-", padding)
fmt.Println(paddingStr + title + paddingStr + strings.Repeat("-", totalPadding%2))
}
func securityCheck() (string, string) {
var wgt sync.WaitGroup
var ipInfo, securityInfo, systemInfo string
var err error
wgt.Add(2)
go func() {
defer wgt.Done()
ipInfo, securityInfo, err = network.NetworkCheck("both", true, language)
if err != nil {
fmt.Println(err.Error())
}
}()
go func() {
defer wgt.Done()
systemInfo = system.CheckSystemInfo(language)
}()
wgt.Wait()
basicInfo := systemInfo + ipInfo
if strings.Contains(ipInfo, "IPV4") && strings.Contains(ipInfo, "IPV6") {
uts.IPV4 = true
uts.IPV6 = true
if nt3CheckType == "" {
nt3CheckType = "ipv4"
}
} else if strings.Contains(ipInfo, "IPV4") {
uts.IPV4 = true
uts.IPV6 = false
if nt3CheckType == "" {
nt3CheckType = "ipv4"
}
} else if strings.Contains(ipInfo, "IPV6") {
uts.IPV6 = true
uts.IPV4 = false
if nt3CheckType == "" {
nt3CheckType = "ipv6"
}
}
if nt3CheckType == "ipv4" && !strings.Contains(ipInfo, "IPV4") && strings.Contains(ipInfo, "IPV6") {
nt3CheckType = "ipv6"
} else if nt3CheckType == "ipv6" && !strings.Contains(ipInfo, "IPV6") && strings.Contains(ipInfo, "IPV4") {
nt3CheckType = "ipv4"
}
basicInfo = strings.ReplaceAll(basicInfo, "\n\n", "\n")
return basicInfo, securityInfo
}
func printHead() {
if language == "zh" {
printCenteredTitle("融合怪测试", width)
fmt.Printf("版本:%s\n", ecsVersion)
fmt.Println("测评频道: https://t.me/vps_reviews\n" +
"Go项目地址https://github.com/oneclickvirt/ecs\n" +
"Shell项目地址https://github.com/spiritLHLS/ecs")
} else {
printCenteredTitle("Fusion Monster Test", width)
fmt.Printf("Version: %s\n", ecsVersion)
fmt.Println("Review Channel: https://t.me/vps_reviews\n" +
"Go Project URL: https://github.com/oneclickvirt/ecs\n" +
"Shell Project URL: https://github.com/spiritLHLS/ecs")
}
}
func main() {
flag.BoolVar(&showVersion, "v", false, "Show version information")
flag.StringVar(&language, "l", "zh", "Specify language (supported: en, zh)")
@@ -125,17 +51,29 @@ func main() {
startTime := time.Now()
var wg sync.WaitGroup
var basicInfo, securityInfo, emailInfo, mediaInfo string
var output, tempOutput string
if language == "zh" {
printHead()
printCenteredTitle("基础信息", width)
basicInfo, securityInfo = securityCheck()
output = utils.PrintAndCapture(func() {
utils.PrintHead(language, width, ecsVersion)
utils.PrintCenteredTitle("基础信息", width)
}, tempOutput, output)
output = utils.PrintAndCapture(func() {
basicInfo, securityInfo, nt3CheckType = utils.SecurityCheck(language, nt3CheckType)
fmt.Printf(basicInfo)
printCenteredTitle(fmt.Sprintf("CPU测试-通过%s测试", cpuTestMethod), width)
utils.PrintCenteredTitle(fmt.Sprintf("CPU测试-通过%s测试", cpuTestMethod), width)
}, tempOutput, output)
output = utils.PrintAndCapture(func() {
cputest.CpuTest(language, cpuTestMethod, cpuTestThreadMode)
printCenteredTitle(fmt.Sprintf("内存测试-通过%s测试", cpuTestMethod), width)
utils.PrintCenteredTitle(fmt.Sprintf("内存测试-通过%s测试", cpuTestMethod), width)
}, tempOutput, output)
output = utils.PrintAndCapture(func() {
memorytest.MemoryTest(language, memoryTestMethod)
printCenteredTitle(fmt.Sprintf("硬盘测试-通过%s测试", diskTestMethod), width)
utils.PrintCenteredTitle(fmt.Sprintf("硬盘测试-通过%s测试", diskTestMethod), width)
}, tempOutput, output)
output = utils.PrintAndCapture(func() {
disktest.DiskTest(language, diskTestMethod, diskTestPath, diskMultiCheck)
utils.PrintCenteredTitle("御三家流媒体解锁", width)
}, tempOutput, output)
wg.Add(2)
go func() {
defer wg.Done()
@@ -145,69 +83,82 @@ func main() {
defer wg.Done()
mediaInfo = unlocktest.MediaTest(language)
}()
printCenteredTitle("御三家流媒体解锁", width)
output = utils.PrintAndCapture(func() {
commediatest.ComMediaTest(language)
printCenteredTitle("跨国流媒体解锁", width)
wg.Wait()
utils.PrintCenteredTitle("跨国流媒体解锁", width)
}, tempOutput, output)
wg.Wait() // 后台任务含流媒体测试和邮件测试
output = utils.PrintAndCapture(func() {
fmt.Printf(mediaInfo)
printCenteredTitle("IP质量检测", width)
utils.PrintCenteredTitle("IP质量检测", width)
fmt.Printf(securityInfo)
printCenteredTitle("邮件端口检测", width)
utils.PrintCenteredTitle("邮件端口检测", width)
fmt.Println(emailInfo)
printCenteredTitle("三网回程", width)
utils.PrintCenteredTitle("三网回程", width)
}, tempOutput, output)
output = utils.PrintAndCapture(func() {
backtrace.BackTrace()
}, tempOutput, output)
if runtime.GOOS != "windows" {
// nexttrace 在win上不支持检测报错 bind: An invalid argument was supplied.
printCenteredTitle("路由检测", width)
output = utils.PrintAndCapture(func() {
utils.PrintCenteredTitle("路由检测", width)
ntrace.TraceRoute3(language, nt3Location, nt3CheckType)
}, tempOutput, output)
}
printCenteredTitle("就近节点测速", width)
output = utils.PrintAndCapture(func() {
utils.PrintCenteredTitle("就近节点测速", width)
speedtest.ShowHead(language)
}, tempOutput, output)
output = utils.PrintAndCapture(func() {
speedtest.NearbySP()
speedtest.CustomSP("net", "global", 4)
speedtest.CustomSP("net", "cu", spNum)
speedtest.CustomSP("net", "ct", spNum)
speedtest.CustomSP("net", "cmcc", spNum)
printCenteredTitle("", width)
utils.PrintCenteredTitle("", width)
}, tempOutput, output)
endTime := time.Now()
duration := endTime.Sub(startTime)
minutes := int(duration.Minutes())
seconds := int(duration.Seconds()) % 60
fmt.Printf("花费 : %d 分 %d 秒\n", minutes, seconds)
currentTime := time.Now().Format("Mon Jan 2 15:04:05 MST 2006")
output = utils.PrintAndCapture(func() {
fmt.Printf("花费 : %d 分 %d 秒\n", minutes, seconds)
fmt.Printf("时间 : %s\n", currentTime)
printCenteredTitle("", width)
utils.PrintCenteredTitle("", width)
}, tempOutput, output)
} else if language == "en" {
printHead()
printCenteredTitle("Basic Information", width)
basicInfo, securityInfo = securityCheck()
utils.PrintHead(language, width, ecsVersion)
utils.PrintCenteredTitle("Basic Information", width)
basicInfo, securityInfo, nt3CheckType = utils.SecurityCheck(language, nt3CheckType)
fmt.Printf(basicInfo)
printCenteredTitle(fmt.Sprintf("CPU Test - %s Method", cpuTestMethod), width)
utils.PrintCenteredTitle(fmt.Sprintf("CPU Test - %s Method", cpuTestMethod), width)
cputest.CpuTest(language, cpuTestMethod, cpuTestThreadMode)
printCenteredTitle(fmt.Sprintf("Memory Test - %s Method", memoryTestMethod), width)
utils.PrintCenteredTitle(fmt.Sprintf("Memory Test - %s Method", memoryTestMethod), width)
memorytest.MemoryTest(language, memoryTestMethod)
printCenteredTitle(fmt.Sprintf("Disk Test - %s Method", diskTestMethod), width)
utils.PrintCenteredTitle(fmt.Sprintf("Disk Test - %s Method", diskTestMethod), width)
disktest.DiskTest(language, diskTestMethod, diskTestPath, diskMultiCheck)
wg.Add(1)
go func() {
defer wg.Done()
emailInfo = email.EmailCheck()
}()
printCenteredTitle("The Three Families Streaming Media Unlock", width)
utils.PrintCenteredTitle("The Three Families Streaming Media Unlock", width)
commediatest.ComMediaTest(language)
printCenteredTitle("Cross-Border Streaming Media Unlock", width)
utils.PrintCenteredTitle("Cross-Border Streaming Media Unlock", width)
unlocktest.MediaTest(language)
printCenteredTitle("IP Quality Check", width)
utils.PrintCenteredTitle("IP Quality Check", width)
fmt.Printf(securityInfo)
printCenteredTitle("Email Port Check", width)
utils.PrintCenteredTitle("Email Port Check", width)
wg.Wait()
fmt.Println(emailInfo)
//printCenteredTitle("Return Path Routing", width)
printCenteredTitle("Nearby Node Speed Test", width)
//utils.PrintCenteredTitle("Return Path Routing", width)
utils.PrintCenteredTitle("Nearby Node Speed Test", width)
speedtest.ShowHead(language)
speedtest.NearbySP()
speedtest.CustomSP("net", "global", -1)
printCenteredTitle("", width)
utils.PrintCenteredTitle("", width)
endTime := time.Now()
duration := endTime.Sub(startTime)
minutes := int(duration.Minutes())
@@ -215,6 +166,11 @@ func main() {
fmt.Printf("Cost Time : %d 分 %d 秒\n", minutes, seconds)
currentTime := time.Now().Format("Mon Jan 2 15:04:05 MST 2006")
fmt.Printf("Current Time : %s\n", currentTime)
printCenteredTitle("", width)
utils.PrintCenteredTitle("", width)
}
shorturl, err := utils.UploadText(output)
if err != nil {
fmt.Println("Upload failed, can not generate short URL.")
}
fmt.Println("Upload successful, short URL:", shorturl)
}

View File

@@ -1,6 +1,8 @@
package main
import "testing"
import (
"testing"
)
func Test(t *testing.T) {
main()

133
utils/utils.go Normal file
View File

@@ -0,0 +1,133 @@
package utils
import (
"bytes"
"fmt"
"github.com/imroc/req/v3"
"github.com/oneclickvirt/UnlockTests/uts"
"github.com/oneclickvirt/basics/system"
"github.com/oneclickvirt/security/network"
"os"
"strings"
"sync"
"unicode/utf8"
)
// PrintCenteredTitle 根据指定的宽度打印居中标题
func PrintCenteredTitle(title string, width int) {
// 计算字符串的字符数
titleLength := utf8.RuneCountInString(title)
totalPadding := width - titleLength
padding := totalPadding / 2
paddingStr := strings.Repeat("-", padding)
fmt.Println(paddingStr + title + paddingStr + strings.Repeat("-", totalPadding%2))
}
// PrintHead 根据语言打印头部信息
func PrintHead(language string, width int, ecsVersion string) {
if language == "zh" {
PrintCenteredTitle("融合怪测试", width)
fmt.Printf("版本:%s\n", ecsVersion)
fmt.Println("测评频道: https://t.me/vps_reviews\n" +
"Go项目地址https://github.com/oneclickvirt/ecs\n" +
"Shell项目地址https://github.com/spiritLHLS/ecs")
} else {
PrintCenteredTitle("Fusion Monster Test", width)
fmt.Printf("Version: %s\n", ecsVersion)
fmt.Println("Review Channel: https://t.me/vps_reviews\n" +
"Go Project URL: https://github.com/oneclickvirt/ecs\n" +
"Shell Project URL: https://github.com/spiritLHLS/ecs")
}
}
// SecurityCheck 执行安全检查
func SecurityCheck(language, nt3CheckType string) (string, string, string) {
var wgt sync.WaitGroup
var ipInfo, securityInfo, systemInfo string
var err error
wgt.Add(2)
go func() {
defer wgt.Done()
ipInfo, securityInfo, err = network.NetworkCheck("both", true, language)
if err != nil {
fmt.Println(err.Error())
}
}()
go func() {
defer wgt.Done()
systemInfo = system.CheckSystemInfo(language)
}()
wgt.Wait()
basicInfo := systemInfo + ipInfo
if strings.Contains(ipInfo, "IPV4") && strings.Contains(ipInfo, "IPV6") {
uts.IPV4 = true
uts.IPV6 = true
if nt3CheckType == "" {
nt3CheckType = "ipv4"
}
} else if strings.Contains(ipInfo, "IPV4") {
uts.IPV4 = true
uts.IPV6 = false
if nt3CheckType == "" {
nt3CheckType = "ipv4"
}
} else if strings.Contains(ipInfo, "IPV6") {
uts.IPV6 = true
uts.IPV4 = false
if nt3CheckType == "" {
nt3CheckType = "ipv6"
}
}
if nt3CheckType == "ipv4" && !strings.Contains(ipInfo, "IPV4") && strings.Contains(ipInfo, "IPV6") {
nt3CheckType = "ipv6"
} else if nt3CheckType == "ipv6" && !strings.Contains(ipInfo, "IPV6") && strings.Contains(ipInfo, "IPV4") {
nt3CheckType = "ipv4"
}
basicInfo = strings.ReplaceAll(basicInfo, "\n\n", "\n")
return basicInfo, securityInfo, nt3CheckType
}
// CaptureOutput 捕获函数输出并返回字符串
func CaptureOutput(f func()) string {
old := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w
f()
w.Close()
os.Stdout = old
var buf bytes.Buffer
buf.ReadFrom(r)
return buf.String()
}
// PrintAndCapture 捕获函数输出的同时打印内容
func PrintAndCapture(f func(), tempOutput, output string) string {
tempOutput = CaptureOutput(f)
fmt.Printf(tempOutput)
output += tempOutput
return output
}
// UploadText 上传文本内容到指定URL
func UploadText(textContent string) (string, error) {
url := "https://paste.spiritlhl.net/api/upload"
token := network.SecurityUploadToken
client := req.C().SetTimeout(10 * 1000 * 1000) // 10 seconds timeout
resp, err := client.R().
SetHeader("Authorization", token).
SetHeader("Format", "RANDOM").
SetHeader("Max-Views", "0").
SetHeader("UploadText", "true").
SetHeader("Content-Type", "multipart/form-data").
SetHeader("No-JSON", "true").
SetBodyString(textContent).
Post(url)
if err != nil {
return "", err
}
if resp.StatusCode >= 200 && resp.StatusCode <= 299 {
return resp.String(), nil
} else {
return "", fmt.Errorf("upload failed with status code: %d", resp.StatusCode)
}
}