mirror of
https://github.com/oneclickvirt/ecs.git
synced 2025-09-28 04:02:12 +08:00
Compare commits
35 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
956f65941e | ||
![]() |
6d1f806e94 | ||
![]() |
d727d6b778 | ||
![]() |
ea891861b3 | ||
![]() |
e0826a80c8 | ||
![]() |
74868a918e | ||
![]() |
889ecee3f3 | ||
![]() |
f6dd0bbb56 | ||
![]() |
01686f3e9d | ||
![]() |
5a6cd7d671 | ||
![]() |
35e183b640 | ||
![]() |
a684052966 | ||
![]() |
2beb74c319 | ||
![]() |
5218c95162 | ||
![]() |
83be2066c8 | ||
![]() |
975bcbfc00 | ||
![]() |
dbddbc29a3 | ||
![]() |
af3894a908 | ||
![]() |
abb2fd079a | ||
![]() |
83dacb4e6b | ||
![]() |
e83cbaf011 | ||
![]() |
ecd61fd51b | ||
![]() |
3c800b5193 | ||
![]() |
861a8f46e4 | ||
![]() |
6f0b1556bb | ||
![]() |
ab91735695 | ||
![]() |
c611946a9c | ||
![]() |
6a0fe661fa | ||
![]() |
dd20c72910 | ||
![]() |
0de20a290f | ||
![]() |
b4ba95b3f6 | ||
![]() |
b33b588ea4 | ||
![]() |
9d214e2b8f | ||
![]() |
9073802585 | ||
![]() |
f7b00cf621 |
@@ -27,4 +27,8 @@ Shell版本: https://github.com/spiritLHLS/ecs
|
||||
|
||||
## 说明
|
||||
|
||||
开发中,勿要使用
|
||||
开发中,勿要使用
|
||||
|
||||
```
|
||||
curl -L https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh -o goecs.sh && chmod +x goecs.sh
|
||||
```
|
@@ -1,4 +1,4 @@
|
||||
package basic
|
||||
package basic1
|
||||
|
||||
import "testing"
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
package basic
|
||||
package basic1
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
@@ -10,11 +10,10 @@ import (
|
||||
// 使用gopsutil查询可能会特别慢,执行命令查询反而更快
|
||||
// TODO
|
||||
// 迁移Shell的完整检测逻辑使用执行命令的方式查询,最后都失败才使用gopsutil查询
|
||||
|
||||
// 本包不在main中使用
|
||||
func Basic(language string) {
|
||||
ipInfo, _, _ := network.NetworkCheck("both", false, language)
|
||||
res := system.CheckSystemInfo(language)
|
||||
//fmt.Println("--------------------------------------------------")
|
||||
fmt.Printf(strings.ReplaceAll(res+ipInfo, "\n\n", "\n"))
|
||||
//fmt.Println("--------------------------------------------------")
|
||||
systemInfo := system.CheckSystemInfo(language)
|
||||
basicInfo := strings.ReplaceAll(systemInfo+ipInfo, "\n\n", "\n")
|
||||
fmt.Printf(basicInfo)
|
||||
}
|
||||
|
40
go.mod
40
go.mod
@@ -3,42 +3,41 @@ module github.com/oneclickvirt/ecs
|
||||
go 1.22.4
|
||||
|
||||
require (
|
||||
github.com/imroc/req/v3 v3.43.7
|
||||
github.com/oneclickvirt/CommonMediaTests v0.0.2-20240630023003
|
||||
github.com/oneclickvirt/UnlockTests v0.0.10-20240630044930
|
||||
github.com/oneclickvirt/backtrace v0.0.4-20240624090335
|
||||
github.com/oneclickvirt/basics v0.0.3-20240625075226
|
||||
github.com/oneclickvirt/cputest v0.0.5-20240630022206
|
||||
github.com/oneclickvirt/basics v0.0.3-20240701085439
|
||||
github.com/oneclickvirt/cputest v0.0.7-20240701020012
|
||||
github.com/oneclickvirt/defaultset v0.0.2-20240624082446
|
||||
github.com/oneclickvirt/disktest v0.0.3-20240629152513
|
||||
github.com/oneclickvirt/gostun v0.0.2-20240625025941
|
||||
github.com/oneclickvirt/memorytest v0.0.1-20240624151629
|
||||
github.com/oneclickvirt/nt3 v0.0.1-20240627070009
|
||||
github.com/oneclickvirt/nt3 v0.0.2-20240630152642
|
||||
github.com/oneclickvirt/portchecker v0.0.1-20240624155429
|
||||
github.com/oneclickvirt/security v0.0.1-20240625075931
|
||||
github.com/oneclickvirt/speedtest v0.0.5-20240630045424
|
||||
github.com/oneclickvirt/security v0.0.3-20240701065755
|
||||
github.com/oneclickvirt/speedtest v0.0.6-20240630114816
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/PuerkitoBio/goquery v1.9.2 // indirect
|
||||
github.com/andybalholm/brotli v1.1.0 // indirect
|
||||
github.com/andybalholm/cascadia v1.3.2 // indirect
|
||||
github.com/cloudflare/circl v1.3.7 // indirect
|
||||
github.com/cloudflare/circl v1.3.9 // indirect
|
||||
github.com/fatih/color v1.17.0 // indirect
|
||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
||||
github.com/go-ole/go-ole v1.2.6 // indirect
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
|
||||
github.com/gofrs/uuid/v5 v5.2.0 // indirect
|
||||
github.com/google/gopacket v1.1.19 // indirect
|
||||
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 // indirect
|
||||
github.com/gopherjs/gopherjs v1.17.2 // indirect
|
||||
github.com/google/pprof v0.0.0-20240625030939-27f56978b8b0 // indirect
|
||||
github.com/gorilla/websocket v1.5.1 // indirect
|
||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||
github.com/huin/goupnp v1.2.0 // indirect
|
||||
github.com/imroc/req/v3 v3.43.7 // indirect
|
||||
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
|
||||
github.com/jtolds/gls v4.20.0+incompatible // indirect
|
||||
github.com/klauspost/compress v1.17.7 // indirect
|
||||
github.com/klauspost/compress v1.17.9 // indirect
|
||||
github.com/koron/go-ssdp v0.0.4 // indirect
|
||||
github.com/libp2p/go-nat v0.2.0 // indirect
|
||||
github.com/libp2p/go-netroute v0.2.1 // indirect
|
||||
@@ -48,22 +47,18 @@ require (
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
|
||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||
github.com/moul/http2curl v1.0.0 // indirect
|
||||
github.com/nxtrace/NTrace-core v1.3.1 // indirect
|
||||
github.com/oneclickvirt/gostun v0.0.2-20240625025941 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.16.0 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.19.0 // indirect
|
||||
github.com/oschwald/maxminddb-golang v1.12.0 // indirect
|
||||
github.com/parnurzeal/gorequest v0.3.0 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
|
||||
github.com/pion/dtls/v2 v2.2.7 // indirect
|
||||
github.com/pion/logging v0.2.2 // indirect
|
||||
github.com/pion/stun/v2 v2.0.0 // indirect
|
||||
github.com/pion/transport/v2 v2.2.1 // indirect
|
||||
github.com/pion/transport/v3 v3.0.1 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/quic-go/qpack v0.4.0 // indirect
|
||||
github.com/quic-go/quic-go v0.41.0 // indirect
|
||||
github.com/refraction-networking/utls v1.6.3 // indirect
|
||||
github.com/quic-go/quic-go v0.45.1 // indirect
|
||||
github.com/refraction-networking/utls v1.6.6 // indirect
|
||||
github.com/rivo/uniseg v0.4.7 // indirect
|
||||
github.com/rodaine/table v1.2.0 // indirect
|
||||
github.com/sagikazarmark/locafero v0.4.0 // indirect
|
||||
@@ -71,7 +66,6 @@ require (
|
||||
github.com/schollz/progressbar/v3 v3.14.4 // indirect
|
||||
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
|
||||
github.com/showwin/speedtest-go v1.7.7 // indirect
|
||||
github.com/smarty/assertions v1.16.0 // indirect
|
||||
github.com/sourcegraph/conc v0.3.0 // indirect
|
||||
github.com/spf13/afero v1.11.0 // indirect
|
||||
github.com/spf13/cast v1.6.0 // indirect
|
||||
@@ -89,14 +83,14 @@ require (
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
go.uber.org/zap v1.27.0 // indirect
|
||||
golang.org/x/crypto v0.24.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
|
||||
golang.org/x/mod v0.17.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect
|
||||
golang.org/x/mod v0.18.0 // indirect
|
||||
golang.org/x/net v0.26.0 // indirect
|
||||
golang.org/x/sync v0.7.0 // indirect
|
||||
golang.org/x/sys v0.21.0 // indirect
|
||||
golang.org/x/term v0.21.0 // indirect
|
||||
golang.org/x/text v0.16.0 // indirect
|
||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
|
||||
golang.org/x/tools v0.22.0 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
97
go.sum
97
go.sum
@@ -4,14 +4,12 @@ github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1
|
||||
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
|
||||
github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
|
||||
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
|
||||
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
|
||||
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
|
||||
github.com/cloudflare/circl v1.3.9 h1:QFrlgFYf2Qpi8bSpVPK1HBvWpx16v/1TZivyo7pGuBE=
|
||||
github.com/cloudflare/circl v1.3.9/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/elazarl/goproxy v0.0.0-20240618083138-03be62527ccb h1:2SoxRauy2IqekRMggrQk3yNI5X6omSnk6ugVbFywwXs=
|
||||
github.com/elazarl/goproxy v0.0.0-20240618083138-03be62527ccb/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
|
||||
github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
|
||||
github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
|
||||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
||||
@@ -22,20 +20,16 @@ github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
|
||||
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
||||
github.com/gofrs/uuid/v5 v5.2.0 h1:qw1GMx6/y8vhVsx626ImfKMuS5CvJmhIKKtuyvfajMM=
|
||||
github.com/gofrs/uuid/v5 v5.2.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8=
|
||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
|
||||
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
|
||||
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q=
|
||||
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
|
||||
github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=
|
||||
github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=
|
||||
github.com/google/pprof v0.0.0-20240625030939-27f56978b8b0 h1:e+8XbKB6IMn8A4OAyZccO4pYfB3s7bt6azNIPE7AnPg=
|
||||
github.com/google/pprof v0.0.0-20240625030939-27f56978b8b0/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
|
||||
github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
|
||||
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
|
||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
@@ -51,11 +45,9 @@ github.com/imroc/req/v3 v3.43.7 h1:dOcNb9n0X83N5/5/AOkiU+cLhzx8QFXjv5MhikazzQA=
|
||||
github.com/imroc/req/v3 v3.43.7/go.mod h1:SQIz5iYop16MJxbo8ib+4LnostGCok8NQf8ToyQc2xA=
|
||||
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
|
||||
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
|
||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw=
|
||||
github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg=
|
||||
github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
||||
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||
github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0=
|
||||
github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
@@ -81,26 +73,22 @@ github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2Em
|
||||
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
|
||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs=
|
||||
github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ=
|
||||
github.com/nxtrace/NTrace-core v1.3.1 h1:f4z5UaZEuhUP/g6xElpZ2bo+guWITJVrMKrJTqd27oc=
|
||||
github.com/nxtrace/NTrace-core v1.3.1/go.mod h1:0Px/Zc60qk6cssmP+yv4kstFxvX9sXqDduoVqBO+qf8=
|
||||
github.com/oneclickvirt/CommonMediaTests v0.0.2-20240630023003 h1:8jQFqDK5m7V9xlLBk8rSUYDyi3u5xzf5kqwEx5b+/7g=
|
||||
github.com/oneclickvirt/CommonMediaTests v0.0.2-20240630023003/go.mod h1:DAmFPRjFV5p9fEzUUSml5jJGn2f1NZJQCzTxITHDjc4=
|
||||
github.com/oneclickvirt/UnlockTests v0.0.7-20240624115527 h1:rMC+aLDkvOe9K+AXjUt/IMAOx1LieyBv6DN/0/2ww7Q=
|
||||
github.com/oneclickvirt/UnlockTests v0.0.7-20240624115527/go.mod h1:HP3CvAS+AJWxxY+BVbxIOlvaQ87YOSge89vAMG52b5o=
|
||||
github.com/oneclickvirt/UnlockTests v0.0.9-20240630032239 h1:b2tf2AVZtTmDvOOtm7tmeOCqFJPm7fe2mF/0Kk15Mhk=
|
||||
github.com/oneclickvirt/UnlockTests v0.0.9-20240630032239/go.mod h1:HP3CvAS+AJWxxY+BVbxIOlvaQ87YOSge89vAMG52b5o=
|
||||
github.com/oneclickvirt/UnlockTests v0.0.10-20240630041851 h1:YC/Phn7I4hxlj+WvNfO7uHfKOSiNvd+3JA1vVkqKv1M=
|
||||
github.com/oneclickvirt/UnlockTests v0.0.10-20240630041851/go.mod h1:HP3CvAS+AJWxxY+BVbxIOlvaQ87YOSge89vAMG52b5o=
|
||||
github.com/oneclickvirt/UnlockTests v0.0.10-20240630044930 h1:/Sc4Eas1Pso18ak93wlazkuMKRRElCntITja/0opOpM=
|
||||
github.com/oneclickvirt/UnlockTests v0.0.10-20240630044930/go.mod h1:HP3CvAS+AJWxxY+BVbxIOlvaQ87YOSge89vAMG52b5o=
|
||||
github.com/oneclickvirt/backtrace v0.0.4-20240624090335 h1:0LP5KyA6GLlqQAtOF0uyBSAykHJrzOA96Eb87qUhGQw=
|
||||
github.com/oneclickvirt/backtrace v0.0.4-20240624090335/go.mod h1:zvsC7xY/WZqs5KL2JB967OVnuqjNbxu9bW6wXRLo5h8=
|
||||
github.com/oneclickvirt/basics v0.0.3-20240625075226 h1:K9VriCHIYnXPZXBSn9PRQX+jBS6AIFH8tBVb/i8VGAw=
|
||||
github.com/oneclickvirt/basics v0.0.3-20240625075226/go.mod h1:dTB+/oyFQYfTYX55rFJVWatum5F9g62zjfmHCM6Vj1s=
|
||||
github.com/oneclickvirt/cputest v0.0.5-20240630022206 h1:L+Su9CNpERf7ZwJZPhvasZdXrlEt6VfqZQpuaPntzkI=
|
||||
github.com/oneclickvirt/cputest v0.0.5-20240630022206/go.mod h1:wh4fGT3KFG9qztew5eBL9EfWr8WeZPBLsq60ZzudU4g=
|
||||
github.com/oneclickvirt/basics v0.0.3-20240701085006 h1:wYimtnZuVmWxncwDevEzo4JZ/Xc2hj07vvbX3jgQLME=
|
||||
github.com/oneclickvirt/basics v0.0.3-20240701085006/go.mod h1:dTB+/oyFQYfTYX55rFJVWatum5F9g62zjfmHCM6Vj1s=
|
||||
github.com/oneclickvirt/basics v0.0.3-20240701085439 h1:1PE7Womqy4AW2c9PlyFdHsBocZXSo02V5uJDSzQLzgs=
|
||||
github.com/oneclickvirt/basics v0.0.3-20240701085439/go.mod h1:dTB+/oyFQYfTYX55rFJVWatum5F9g62zjfmHCM6Vj1s=
|
||||
github.com/oneclickvirt/cputest v0.0.7-20240701020012 h1:U5cCI+6ZU3pudoAlmb1b3yB9IQNm5AnDXi1TQAZJCIA=
|
||||
github.com/oneclickvirt/cputest v0.0.7-20240701020012/go.mod h1:MmaHN9+XMntI3rLycwj8Ne31fG18IfNoa8N2utDK1CY=
|
||||
github.com/oneclickvirt/defaultset v0.0.2-20240624082446 h1:5Pg3mK/u/vQvSz7anu0nxzrNdELi/AcDAU1mMsmPzyc=
|
||||
github.com/oneclickvirt/defaultset v0.0.2-20240624082446/go.mod h1:e9Jt4tf2sbemCtc84/XgKcHy9EZ2jkc5x2sW1NiJS+E=
|
||||
github.com/oneclickvirt/disktest v0.0.3-20240629152513 h1:ZW7MBMd2HxQi1ktg/ztVI2A10JzF4ZI6I7ATZvcK9w8=
|
||||
@@ -109,24 +97,20 @@ github.com/oneclickvirt/gostun v0.0.2-20240625025941 h1:h+ZL8jkjXR6QE0qEX34FjWTv
|
||||
github.com/oneclickvirt/gostun v0.0.2-20240625025941/go.mod h1:f7DPEXAxbmwXSW33dbxtb0/KzqvOBWhTs2Or5xBerQA=
|
||||
github.com/oneclickvirt/memorytest v0.0.1-20240624151629 h1:2rJAB3gFGlFPocIb/WRVWYqs4nr2jGYokfDOgqFicD4=
|
||||
github.com/oneclickvirt/memorytest v0.0.1-20240624151629/go.mod h1:+YNzy+NeVg61d0kNwSyVDqHyVtKzjuRe1NvMzsDLg0I=
|
||||
github.com/oneclickvirt/nt3 v0.0.1-20240627070009 h1:020pqkdGDnkIIpyNbbS1sjG1uIl3GgjeNgVqJzAw0ng=
|
||||
github.com/oneclickvirt/nt3 v0.0.1-20240627070009/go.mod h1:Vb724PgpP17W09mLw5I2UZZAuYbY8WwGlKZdxRDFr0Y=
|
||||
github.com/oneclickvirt/nt3 v0.0.2-20240630152642 h1:BkpR1j9JaDxMzx7iIwtsnFDxSldjYr2TUYpZE7m8z/Y=
|
||||
github.com/oneclickvirt/nt3 v0.0.2-20240630152642/go.mod h1:UojPmtangn17TiQaDccVrZbn6sZwJOtzBgg3idp68cA=
|
||||
github.com/oneclickvirt/portchecker v0.0.1-20240624155429 h1:+wapaOcFrg1iWJDhBKThDzppyIMY7hWxK7F5RBkZg4o=
|
||||
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/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=
|
||||
github.com/oneclickvirt/speedtest v0.0.5-20240630045424/go.mod h1:zd5ZgIGslmtQLQehEfRjyumlvgDHTpCSMchKfKXoASI=
|
||||
github.com/onsi/ginkgo/v2 v2.16.0 h1:7q1w9frJDzninhXxjZd+Y/x54XNjG/UlRLIYPZafsPM=
|
||||
github.com/onsi/ginkgo/v2 v2.16.0/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs=
|
||||
github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
|
||||
github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
|
||||
github.com/oneclickvirt/security v0.0.3-20240701065755 h1:eHZDuyvzufOu2yDUIMggK2iRtMWJaFlCzG4+leQn5+0=
|
||||
github.com/oneclickvirt/security v0.0.3-20240701065755/go.mod h1:cUNNOldoVQuovyc0EtAVAZlAT4y2xA1e0uA80aj1ly8=
|
||||
github.com/oneclickvirt/speedtest v0.0.6-20240630114816 h1:gI2hqV0IwcvGqYzLhlt4w2oZvYhCL+73jftUuJYBsuI=
|
||||
github.com/oneclickvirt/speedtest v0.0.6-20240630114816/go.mod h1:zd5ZgIGslmtQLQehEfRjyumlvgDHTpCSMchKfKXoASI=
|
||||
github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
|
||||
github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
|
||||
github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk=
|
||||
github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0=
|
||||
github.com/oschwald/maxminddb-golang v1.12.0 h1:9FnTOD0YOhP7DGxGsq4glzpGy5+w7pq50AS6wALUMYs=
|
||||
github.com/oschwald/maxminddb-golang v1.12.0/go.mod h1:q0Nob5lTCqyQ8WT6FYgS1L7PXKVVbgiymefNwIjPzgY=
|
||||
github.com/parnurzeal/gorequest v0.3.0 h1:SoFyqCDC9COr1xuS6VA8fC8RU7XyrJZN2ona1kEX7FI=
|
||||
github.com/parnurzeal/gorequest v0.3.0/go.mod h1:3Kh2QUMJoqw3icWAecsyzkpY7UzRfDhbRdTjtNwNiUE=
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
|
||||
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
|
||||
github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8=
|
||||
@@ -139,17 +123,15 @@ github.com/pion/transport/v2 v2.2.1 h1:7qYnCBlpgSJNYMbLCKuSY9KbQdBFoETvPNETv0y4N
|
||||
github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g=
|
||||
github.com/pion/transport/v3 v3.0.1 h1:gDTlPJwROfSfz6QfSi0ZmeCSkFcnWWiiR9ES0ouANiM=
|
||||
github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
||||
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
|
||||
github.com/quic-go/quic-go v0.41.0 h1:aD8MmHfgqTURWNJy48IYFg2OnxwHT3JL7ahGs73lb4k=
|
||||
github.com/quic-go/quic-go v0.41.0/go.mod h1:qCkNjqczPEvgsOnxZ0eCD14lv+B2LHlFAB++CNOh9hA=
|
||||
github.com/refraction-networking/utls v1.6.3 h1:MFOfRN35sSx6K5AZNIoESsBuBxS2LCgRilRIdHb6fDc=
|
||||
github.com/refraction-networking/utls v1.6.3/go.mod h1:yil9+7qSl+gBwJqztoQseO6Pr3h62pQoY1lXiNR/FPs=
|
||||
github.com/quic-go/quic-go v0.45.1 h1:tPfeYCk+uZHjmDRwHHQmvHRYL2t44ROTujLeFVBmjCA=
|
||||
github.com/quic-go/quic-go v0.45.1/go.mod h1:1dLehS7TIR64+vxGR70GDcatWTOtMX2PUtnKsjbTurI=
|
||||
github.com/refraction-networking/utls v1.6.6 h1:igFsYBUJPYM8Rno9xUuDoM5GQrVEqY4llzEXOkL43Ig=
|
||||
github.com/refraction-networking/utls v1.6.6/go.mod h1:BC3O4vQzye5hqpmDTWUqi4P5DDhzJfkV1tdqtawQIH0=
|
||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
||||
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||
@@ -167,10 +149,6 @@ github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKl
|
||||
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
||||
github.com/showwin/speedtest-go v1.7.7 h1:VmK75SZOTKiuWjIVrs+mo7ZoKEw0utiGCvpnurS0olU=
|
||||
github.com/showwin/speedtest-go v1.7.7/go.mod h1:uLgdWCNarXxlYsL2E5TOZpCIwpgSWnEANZp7gfHXHu0=
|
||||
github.com/smarty/assertions v1.16.0 h1:EvHNkdRA4QHMrn75NZSoUQ/mAUXAYWfatfB01yTCzfY=
|
||||
github.com/smarty/assertions v1.16.0/go.mod h1:duaaFdCS0K9dnoM50iyek/eYINOZ64gbh1Xlf6LG7AI=
|
||||
github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY=
|
||||
github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60=
|
||||
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
|
||||
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
|
||||
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
|
||||
@@ -186,7 +164,6 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
@@ -226,14 +203,14 @@ golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE
|
||||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||
golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI=
|
||||
golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
|
||||
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM=
|
||||
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
|
||||
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY=
|
||||
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI=
|
||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
|
||||
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0=
|
||||
golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
@@ -283,17 +260,19 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
|
||||
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
|
||||
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
|
||||
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
|
||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
|
||||
golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA=
|
||||
golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
|
||||
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
|
||||
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
|
554
goecs.go
554
goecs.go
@@ -3,224 +3,388 @@ package main
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"github.com/oneclickvirt/UnlockTests/uts"
|
||||
"github.com/oneclickvirt/CommonMediaTests/commediatests"
|
||||
backtraceori "github.com/oneclickvirt/backtrace/bk"
|
||||
basicmodel "github.com/oneclickvirt/basics/model"
|
||||
"github.com/oneclickvirt/ecs/backtrace"
|
||||
"github.com/oneclickvirt/ecs/basic"
|
||||
"github.com/oneclickvirt/ecs/commediatest"
|
||||
"github.com/oneclickvirt/ecs/cputest"
|
||||
"github.com/oneclickvirt/ecs/disktest"
|
||||
"github.com/oneclickvirt/ecs/memorytest"
|
||||
"github.com/oneclickvirt/ecs/network"
|
||||
"github.com/oneclickvirt/ecs/ntrace"
|
||||
"github.com/oneclickvirt/ecs/speedtest"
|
||||
"github.com/oneclickvirt/ecs/unlocktest"
|
||||
"github.com/oneclickvirt/ecs/utils"
|
||||
gostunmodel "github.com/oneclickvirt/gostun/model"
|
||||
"github.com/oneclickvirt/portchecker/email"
|
||||
speedtestmodel "github.com/oneclickvirt/speedtest/model"
|
||||
"os"
|
||||
"os/signal"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"strings"
|
||||
"sync"
|
||||
"syscall"
|
||||
"time"
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
var (
|
||||
ecsVersion = "2024.06.30"
|
||||
showVersion bool
|
||||
language string
|
||||
cpuTestMethod, cpuTestThread string
|
||||
memoryTestMethod string
|
||||
diskTestMethod, diskTestPath string
|
||||
diskMultiCheck bool
|
||||
nt3CheckType, nt3Location string
|
||||
spNum int
|
||||
width = 84
|
||||
ecsVersion = "v0.0.21"
|
||||
menuMode bool
|
||||
input, choice string
|
||||
showVersion bool
|
||||
enableLogger bool
|
||||
language string
|
||||
cpuTestMethod, cpuTestThreadMode string
|
||||
memoryTestMethod string
|
||||
diskTestMethod, diskTestPath string
|
||||
diskMultiCheck bool
|
||||
nt3CheckType, nt3Location string
|
||||
spNum int
|
||||
width = 84
|
||||
basicStatus, cpuTestStatus, memoryTestStatus, diskTestStatus bool
|
||||
commTestStatus, utTestStatus, securityTestStatus, emailTestStatus bool
|
||||
backtraceStatus, nt3Status, speedTestStatus bool
|
||||
filePath = "goecs.txt"
|
||||
enabelUpload = true
|
||||
)
|
||||
|
||||
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 {
|
||||
ipInfo, securityInfo, _ := network.NetworkCheck("both", true, language)
|
||||
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"
|
||||
}
|
||||
return securityInfo
|
||||
}
|
||||
|
||||
func mediatest(language string) string {
|
||||
return unlocktest.MediaTest(language)
|
||||
}
|
||||
|
||||
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)")
|
||||
flag.StringVar(&cpuTestMethod, "cpum", "sysbench", "Specify CPU test method (supported: sysbench, geekbench, winsat)")
|
||||
flag.StringVar(&cpuTestThread, "cput", "", "Specify CPU test thread count (supported: 1, 2, ...)")
|
||||
flag.StringVar(&memoryTestMethod, "memorym", "dd", "Specify Memory test method (supported: sysbench, dd, winsat)")
|
||||
flag.StringVar(&diskTestMethod, "diskm", "fio", "Specify Disk test method (supported: fio, dd, winsat)")
|
||||
flag.StringVar(&diskTestPath, "diskp", "", "Specify Disk test path, example: -diskp /root")
|
||||
flag.BoolVar(&diskMultiCheck, "diskmc", false, "Enable multiple disk checks, example: -diskmc=false")
|
||||
flag.Parse()
|
||||
if language == "zh" {
|
||||
flag.StringVar(&nt3Location, "nt3loc", "GZ", "指定三网回程路由检测的地址,支持 GZ, SH, BJ, CD 对应 广州,上海,北京,成都")
|
||||
flag.StringVar(&nt3CheckType, "nt3t", "ipv4", "指定三网回程路由检测的类型,支持 both, ipv4, ipv6")
|
||||
}
|
||||
flag.IntVar(&spNum, "spnum", 2, "Specify speedtest each operator servers num")
|
||||
flag.BoolVar(&showVersion, "v", false, "Display version information")
|
||||
flag.BoolVar(&menuMode, "menu", true, "Enable/Disable menu mode, disable example: -menu=false") // true 默认启用菜单栏模式
|
||||
flag.StringVar(&language, "l", "zh", "Set language (supported: en, zh)")
|
||||
flag.BoolVar(&basicStatus, "basic", true, "Enable/Disable basic test")
|
||||
flag.BoolVar(&cpuTestStatus, "cpu", true, "Enable/Disable CPU test")
|
||||
flag.BoolVar(&memoryTestStatus, "memory", true, "Enable/Disable memory test")
|
||||
flag.BoolVar(&diskTestStatus, "disk", true, "Enable/Disable disk test")
|
||||
flag.BoolVar(&commTestStatus, "comm", true, "Enable/Disable common media test")
|
||||
flag.BoolVar(&utTestStatus, "ut", true, "Enable/Disable unlock media test")
|
||||
flag.BoolVar(&securityTestStatus, "security", true, "Enable/Disable security test")
|
||||
flag.BoolVar(&emailTestStatus, "email", true, "Enable/Disable email port test")
|
||||
flag.BoolVar(&backtraceStatus, "backtrace", true, "Enable/Disable backtrace test (in 'en' language or on `windows` it always false)")
|
||||
flag.BoolVar(&nt3Status, "nt3", true, "Enable/Disable NT3 test (in 'en' language or on `windows` it always false)")
|
||||
flag.BoolVar(&speedTestStatus, "speed", true, "Enable/Disable speed test")
|
||||
flag.StringVar(&cpuTestMethod, "cpum", "sysbench", "Set CPU test method (supported: sysbench, geekbench, winsat)")
|
||||
flag.StringVar(&cpuTestThreadMode, "cput", "multi", "Set CPU test thread mode (supported: single, multi)")
|
||||
flag.StringVar(&memoryTestMethod, "memorym", "dd", "Set memory test method (supported: sysbench, dd, winsat)")
|
||||
flag.StringVar(&diskTestMethod, "diskm", "fio", "Set disk test method (supported: fio, dd, winsat)")
|
||||
flag.StringVar(&diskTestPath, "diskp", "", "Set disk test path, e.g., -diskp /root")
|
||||
flag.BoolVar(&diskMultiCheck, "diskmc", false, "Enable/Disable multiple disk checks, e.g., -diskmc=false")
|
||||
flag.StringVar(&nt3Location, "nt3loc", "GZ", "Specify NT3 test location (supported: GZ, SH, BJ, CD for Guangzhou, Shanghai, Beijing, Chengdu)")
|
||||
flag.StringVar(&nt3CheckType, "nt3t", "ipv4", "Set NT3 test type (supported: both, ipv4, ipv6)")
|
||||
flag.IntVar(&spNum, "spnum", 2, "Set the number of servers per operator for speed test")
|
||||
flag.BoolVar(&enableLogger, "log", false, "Enable/Disable logging in the current path")
|
||||
flag.Parse()
|
||||
sig := make(chan os.Signal, 1)
|
||||
signal.Notify(sig, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
|
||||
if showVersion {
|
||||
fmt.Println(ecsVersion)
|
||||
return
|
||||
}
|
||||
startTime := time.Now()
|
||||
var wg sync.WaitGroup
|
||||
var securityInfo, emailInfo, mediaInfo string
|
||||
if language == "zh" {
|
||||
printHead()
|
||||
printCenteredTitle("基础信息", width)
|
||||
wg.Add(2)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
basic.Basic(language)
|
||||
}()
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
securityInfo = securityCheck()
|
||||
}()
|
||||
wg.Wait()
|
||||
printCenteredTitle(fmt.Sprintf("CPU测试-通过%s测试", cpuTestMethod), width)
|
||||
cputest.CpuTest(language, cpuTestMethod, cpuTestThread)
|
||||
printCenteredTitle(fmt.Sprintf("内存测试-通过%s测试", cpuTestMethod), width)
|
||||
memorytest.MemoryTest(language, memoryTestMethod)
|
||||
printCenteredTitle(fmt.Sprintf("硬盘测试-通过%s测试", diskTestMethod), width)
|
||||
disktest.DiskTest(language, diskTestMethod, diskTestPath, diskMultiCheck)
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
emailInfo = email.EmailCheck()
|
||||
}()
|
||||
printCenteredTitle("御三家流媒体解锁", width)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
mediaInfo = mediatest(language)
|
||||
}()
|
||||
commediatest.ComMediaTest(language)
|
||||
printCenteredTitle("跨国流媒体解锁", width)
|
||||
wg.Wait()
|
||||
fmt.Printf(mediaInfo)
|
||||
printCenteredTitle("IP质量检测", width)
|
||||
fmt.Printf(securityInfo)
|
||||
printCenteredTitle("邮件端口检测", width)
|
||||
fmt.Println(emailInfo)
|
||||
printCenteredTitle("三网回程", width)
|
||||
backtrace.BackTrace()
|
||||
if runtime.GOOS != "windows" {
|
||||
// nexttrace 在win上不支持检测,报错 bind: An invalid argument was supplied.
|
||||
printCenteredTitle("路由检测", width)
|
||||
ntrace.TraceRoute3(language, nt3Location, nt3CheckType)
|
||||
}
|
||||
printCenteredTitle("就近节点测速", width)
|
||||
speedtest.ShowHead(language)
|
||||
speedtest.NearbySP()
|
||||
speedtest.CustomSP("net", "global", 4)
|
||||
speedtest.CustomSP("net", "cu", spNum)
|
||||
speedtest.CustomSP("net", "ct", spNum)
|
||||
speedtest.CustomSP("net", "cmcc", spNum)
|
||||
printCenteredTitle("", width)
|
||||
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")
|
||||
fmt.Printf("时间 : %s\n", currentTime)
|
||||
printCenteredTitle("", width)
|
||||
} else if language == "en" {
|
||||
printHead()
|
||||
printCenteredTitle("Basic Information", width)
|
||||
wg.Add(2)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
basic.Basic(language)
|
||||
}()
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
securityInfo = securityCheck()
|
||||
}()
|
||||
wg.Wait()
|
||||
printCenteredTitle(fmt.Sprintf("CPU Test - %s Method", cpuTestMethod), width)
|
||||
cputest.CpuTest(language, cpuTestMethod, cpuTestThread)
|
||||
printCenteredTitle(fmt.Sprintf("Memory Test - %s Method", memoryTestMethod), width)
|
||||
memorytest.MemoryTest(language, memoryTestMethod)
|
||||
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)
|
||||
commediatest.ComMediaTest(language)
|
||||
printCenteredTitle("Cross-Border Streaming Media Unlock", width)
|
||||
unlocktest.MediaTest(language)
|
||||
printCenteredTitle("IP Quality Check", width)
|
||||
fmt.Printf(securityInfo)
|
||||
printCenteredTitle("Email Port Check", width)
|
||||
wg.Wait()
|
||||
fmt.Println(emailInfo)
|
||||
//printCenteredTitle("Return Path Routing", width)
|
||||
printCenteredTitle("Nearby Node Speed Test", width)
|
||||
speedtest.ShowHead(language)
|
||||
speedtest.NearbySP()
|
||||
speedtest.CustomSP("net", "global", -1)
|
||||
printCenteredTitle("", width)
|
||||
endTime := time.Now()
|
||||
duration := endTime.Sub(startTime)
|
||||
minutes := int(duration.Minutes())
|
||||
seconds := int(duration.Seconds()) % 60
|
||||
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)
|
||||
if enableLogger {
|
||||
basicmodel.EnableLoger = true
|
||||
speedtestmodel.EnableLoger = true
|
||||
gostunmodel.EnableLoger = true
|
||||
commediatests.EnableLoger = true
|
||||
backtraceori.EnableLoger = true
|
||||
}
|
||||
if menuMode {
|
||||
basicStatus, cpuTestStatus, memoryTestStatus, diskTestStatus = false, false, false, false
|
||||
commTestStatus, utTestStatus, securityTestStatus, emailTestStatus = false, false, false, false
|
||||
backtraceStatus, nt3Status, speedTestStatus = false, false, false
|
||||
switch language {
|
||||
case "zh":
|
||||
fmt.Println("1. 融合怪完全体")
|
||||
fmt.Println("2. 极简版(系统信息+CPU+内存+磁盘+测速节点5个)")
|
||||
fmt.Println("3. 精简版(系统信息+CPU+内存+磁盘+御三家+常用流媒体+回程+路由+测速节点5个)")
|
||||
fmt.Println("4. 精简网络版(系统信息+CPU+内存+磁盘+回程+路由+测速节点5个)")
|
||||
fmt.Println("5. 精简解锁版(系统信息+CPU+内存+磁盘IO+御三家+常用流媒体+测速节点5个)")
|
||||
fmt.Println("6. 网络单项(IP质量检测+三网回程+三网路由与延迟+测速节点11个)")
|
||||
fmt.Println("7. 解锁单项(御三家解锁+常用流媒体解锁)")
|
||||
fmt.Println("8. 硬件单项(基础系统信息+CPU+内存+dd磁盘测试+fio磁盘测试)")
|
||||
fmt.Println("9. IP质量检测(15个数据库的IP检测+邮件端口检测)")
|
||||
fmt.Println("10. 三网回程线路+广州三网路由+全国三网延迟")
|
||||
case "en":
|
||||
fmt.Println("1. VPS Fusion Monster Test Comprehensive Test Suite")
|
||||
fmt.Println("2. Minimal Test Suite (System Info + CPU + Memory + Disk + 5 Speed Test Nodes)")
|
||||
fmt.Println("3. Standard Test Suite (System Info + CPU + Memory + Disk + Basic Unlock Tests + Common Streaming Services + 5 Speed Test Nodes)")
|
||||
fmt.Println("4. Network-Focused Test Suite (System Info + CPU + Memory + Disk + 5 Speed Test Nodes)")
|
||||
fmt.Println("5. Unlock-Focused Test Suite (System Info + CPU + Memory + Disk IO + Basic Unlock Tests + Common Streaming Services + 5 Speed Test Nodes)")
|
||||
fmt.Println("6. Network-Only Test (IP Quality Test + 5 Speed Test Nodes)")
|
||||
fmt.Println("7. Unlock-Only Test (Basic Unlock Tests + Common Streaming Services Unlock)")
|
||||
fmt.Println("8. Hardware-Only Test (Basic System Info + CPU + Memory + dd Disk Test + fio Disk Test)")
|
||||
fmt.Println("9. IP Quality Test (IP Test with 15 Databases + Email Port Test)")
|
||||
}
|
||||
Loop:
|
||||
for {
|
||||
fmt.Print("请输入选项 / Please enter your choice: ")
|
||||
fmt.Scanln(&input)
|
||||
input = strings.TrimSpace(input)
|
||||
input = strings.TrimRight(input, "\n")
|
||||
re := regexp.MustCompile(`^\d+$`) // 正则表达式匹配纯数字
|
||||
if re.MatchString(input) {
|
||||
choice = input
|
||||
switch choice {
|
||||
case "1":
|
||||
basicStatus = true
|
||||
cpuTestStatus = true
|
||||
memoryTestStatus = true
|
||||
diskTestStatus = true
|
||||
commTestStatus = true
|
||||
utTestStatus = true
|
||||
securityTestStatus = true
|
||||
emailTestStatus = true
|
||||
backtraceStatus = true
|
||||
nt3Status = true
|
||||
speedTestStatus = true
|
||||
break Loop
|
||||
case "2":
|
||||
basicStatus = true
|
||||
cpuTestStatus = true
|
||||
memoryTestStatus = true
|
||||
diskTestStatus = true
|
||||
speedTestStatus = true
|
||||
break Loop
|
||||
case "3":
|
||||
basicStatus = true
|
||||
cpuTestStatus = true
|
||||
memoryTestStatus = true
|
||||
diskTestStatus = true
|
||||
commTestStatus = true
|
||||
utTestStatus = true
|
||||
securityTestStatus = true
|
||||
backtraceStatus = true
|
||||
nt3Status = true
|
||||
speedTestStatus = true
|
||||
break Loop
|
||||
case "4":
|
||||
basicStatus = true
|
||||
cpuTestStatus = true
|
||||
memoryTestStatus = true
|
||||
diskTestStatus = true
|
||||
backtraceStatus = true
|
||||
nt3Status = true
|
||||
speedTestStatus = true
|
||||
break Loop
|
||||
case "5":
|
||||
basicStatus = true
|
||||
cpuTestStatus = true
|
||||
memoryTestStatus = true
|
||||
diskTestStatus = true
|
||||
securityTestStatus = true
|
||||
speedTestStatus = true
|
||||
break Loop
|
||||
case "6":
|
||||
speedTestStatus = true
|
||||
backtraceStatus = true
|
||||
nt3Status = true
|
||||
break Loop
|
||||
case "7":
|
||||
securityTestStatus = true
|
||||
commTestStatus = true
|
||||
break Loop
|
||||
case "8":
|
||||
basicStatus = true
|
||||
cpuTestStatus = true
|
||||
memoryTestStatus = true
|
||||
diskTestStatus = true
|
||||
break Loop
|
||||
case "9":
|
||||
emailTestStatus = true
|
||||
break Loop
|
||||
case "10":
|
||||
backtraceStatus = true
|
||||
nt3Status = true
|
||||
speedTestStatus = true
|
||||
break Loop
|
||||
default:
|
||||
if language == "zh" {
|
||||
fmt.Println("无效的选项")
|
||||
} else {
|
||||
fmt.Println("Invalid choice")
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if language == "zh" {
|
||||
fmt.Println("输入错误,请输入一个纯数字")
|
||||
} else {
|
||||
fmt.Println("Invalid input, please enter a number")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if language == "en" {
|
||||
backtraceStatus = false
|
||||
nt3Status = false
|
||||
}
|
||||
startTime := time.Now()
|
||||
var (
|
||||
wg1, wg2 sync.WaitGroup
|
||||
basicInfo, securityInfo, emailInfo, mediaInfo string
|
||||
output, tempOutput string
|
||||
)
|
||||
// 启动一个goroutine来等待信号
|
||||
go func() {
|
||||
// 等待信号
|
||||
<-sig
|
||||
utils.ProcessAndUpload(output, filePath, enabelUpload)
|
||||
os.Exit(1) // 使用非零状态码退出,表示意外退出
|
||||
}()
|
||||
output = utils.PrintAndCapture(func() {
|
||||
switch language {
|
||||
case "zh":
|
||||
utils.PrintHead(language, width, ecsVersion)
|
||||
if basicStatus || securityTestStatus {
|
||||
if basicStatus {
|
||||
utils.PrintCenteredTitle("基础信息", width)
|
||||
}
|
||||
basicInfo, securityInfo, nt3CheckType = utils.SecurityCheck(language, nt3CheckType, securityTestStatus)
|
||||
if basicStatus {
|
||||
fmt.Printf(basicInfo)
|
||||
}
|
||||
}
|
||||
if cpuTestStatus {
|
||||
utils.PrintCenteredTitle(fmt.Sprintf("CPU测试-通过%s测试", cpuTestMethod), width)
|
||||
cputest.CpuTest(language, cpuTestMethod, cpuTestThreadMode)
|
||||
}
|
||||
if memoryTestStatus {
|
||||
utils.PrintCenteredTitle(fmt.Sprintf("内存测试-通过%s测试", cpuTestMethod), width)
|
||||
memorytest.MemoryTest(language, memoryTestMethod)
|
||||
}
|
||||
if diskTestStatus {
|
||||
utils.PrintCenteredTitle(fmt.Sprintf("硬盘测试-通过%s测试", diskTestMethod), width)
|
||||
disktest.DiskTest(language, diskTestMethod, diskTestPath, diskMultiCheck)
|
||||
}
|
||||
if emailTestStatus {
|
||||
wg2.Add(1)
|
||||
go func() {
|
||||
defer wg2.Done()
|
||||
emailInfo = email.EmailCheck()
|
||||
}()
|
||||
}
|
||||
if utTestStatus {
|
||||
wg1.Add(1)
|
||||
go func() {
|
||||
defer wg1.Done()
|
||||
mediaInfo = unlocktest.MediaTest(language)
|
||||
}()
|
||||
}
|
||||
if commTestStatus {
|
||||
utils.PrintCenteredTitle("御三家流媒体解锁", width)
|
||||
commediatest.ComMediaTest(language)
|
||||
}
|
||||
if utTestStatus {
|
||||
utils.PrintCenteredTitle("跨国流媒体解锁", width)
|
||||
wg1.Wait()
|
||||
fmt.Printf(mediaInfo)
|
||||
}
|
||||
if securityTestStatus {
|
||||
utils.PrintCenteredTitle("IP质量检测", width)
|
||||
fmt.Printf(securityInfo)
|
||||
}
|
||||
if emailTestStatus {
|
||||
utils.PrintCenteredTitle("邮件端口检测", width)
|
||||
wg2.Wait()
|
||||
fmt.Println(emailInfo)
|
||||
}
|
||||
if runtime.GOOS != "windows" {
|
||||
if backtraceStatus {
|
||||
utils.PrintCenteredTitle("三网回程", width)
|
||||
backtrace.BackTrace()
|
||||
}
|
||||
// nexttrace 在win上不支持检测,报错 bind: An invalid argument was supplied.
|
||||
if nt3Status {
|
||||
utils.PrintCenteredTitle("路由检测", width)
|
||||
ntrace.TraceRoute3(language, nt3Location, nt3CheckType)
|
||||
}
|
||||
}
|
||||
if speedTestStatus {
|
||||
utils.PrintCenteredTitle("就近节点测速", width)
|
||||
speedtest.ShowHead(language)
|
||||
if (menuMode && choice == "1") || !menuMode {
|
||||
speedtest.NearbySP()
|
||||
speedtest.CustomSP("net", "global", 2)
|
||||
speedtest.CustomSP("net", "cu", spNum)
|
||||
speedtest.CustomSP("net", "ct", spNum)
|
||||
speedtest.CustomSP("net", "cmcc", spNum)
|
||||
} else if menuMode && choice == "2" || choice == "3" || choice == "4" || choice == "5" {
|
||||
speedtest.CustomSP("net", "global", 4)
|
||||
}
|
||||
}
|
||||
utils.PrintCenteredTitle("", width)
|
||||
endTime := time.Now()
|
||||
duration := endTime.Sub(startTime)
|
||||
minutes := int(duration.Minutes())
|
||||
seconds := int(duration.Seconds()) % 60
|
||||
currentTime := time.Now().Format("Mon Jan 2 15:04:05 MST 2006")
|
||||
fmt.Printf("花费 : %d 分 %d 秒\n", minutes, seconds)
|
||||
fmt.Printf("时间 : %s\n", currentTime)
|
||||
utils.PrintCenteredTitle("", width)
|
||||
case "en":
|
||||
utils.PrintHead(language, width, ecsVersion)
|
||||
if basicStatus || securityTestStatus {
|
||||
if basicStatus {
|
||||
utils.PrintCenteredTitle("Basic Information", width)
|
||||
}
|
||||
basicInfo, securityInfo, nt3CheckType = utils.SecurityCheck(language, nt3CheckType, securityTestStatus)
|
||||
if basicStatus {
|
||||
fmt.Printf(basicInfo)
|
||||
}
|
||||
}
|
||||
if cpuTestStatus {
|
||||
utils.PrintCenteredTitle(fmt.Sprintf("CPU Test - %s Method", cpuTestMethod), width)
|
||||
cputest.CpuTest(language, cpuTestMethod, cpuTestThreadMode)
|
||||
}
|
||||
if memoryTestStatus {
|
||||
utils.PrintCenteredTitle(fmt.Sprintf("Memory Test - %s Method", memoryTestMethod), width)
|
||||
memorytest.MemoryTest(language, memoryTestMethod)
|
||||
}
|
||||
if diskTestStatus {
|
||||
utils.PrintCenteredTitle(fmt.Sprintf("Disk Test - %s Method", diskTestMethod), width)
|
||||
disktest.DiskTest(language, diskTestMethod, diskTestPath, diskMultiCheck)
|
||||
}
|
||||
if emailTestStatus {
|
||||
wg1.Add(1)
|
||||
go func() {
|
||||
defer wg1.Done()
|
||||
emailInfo = email.EmailCheck()
|
||||
}()
|
||||
}
|
||||
if commTestStatus {
|
||||
utils.PrintCenteredTitle("The Three Families Streaming Media Unlock", width)
|
||||
commediatest.ComMediaTest(language)
|
||||
}
|
||||
if utTestStatus {
|
||||
utils.PrintCenteredTitle("Cross-Border Streaming Media Unlock", width)
|
||||
unlocktest.MediaTest(language)
|
||||
}
|
||||
if securityTestStatus {
|
||||
utils.PrintCenteredTitle("IP Quality Check", width)
|
||||
fmt.Printf(securityInfo)
|
||||
}
|
||||
if emailTestStatus {
|
||||
utils.PrintCenteredTitle("Email Port Check", width)
|
||||
wg1.Wait()
|
||||
fmt.Println(emailInfo)
|
||||
}
|
||||
if speedTestStatus {
|
||||
utils.PrintCenteredTitle("Nearby Node Speed Test", width)
|
||||
speedtest.ShowHead(language)
|
||||
speedtest.NearbySP()
|
||||
speedtest.CustomSP("net", "global", -1)
|
||||
}
|
||||
utils.PrintCenteredTitle("", width)
|
||||
endTime := time.Now()
|
||||
duration := endTime.Sub(startTime)
|
||||
minutes := int(duration.Minutes())
|
||||
seconds := int(duration.Seconds()) % 60
|
||||
currentTime := time.Now().Format("Mon Jan 2 15:04:05 MST 2006")
|
||||
fmt.Printf("Cost Time : %d 分 %d 秒\n", minutes, seconds)
|
||||
fmt.Printf("Current Time : %s\n", currentTime)
|
||||
utils.PrintCenteredTitle("", width)
|
||||
default:
|
||||
fmt.Println("Unsupported language")
|
||||
}
|
||||
}, tempOutput, output)
|
||||
utils.ProcessAndUpload(output, filePath, enabelUpload)
|
||||
}
|
||||
|
539
goecs.sh
539
goecs.sh
@@ -5,299 +5,346 @@
|
||||
# curl -L https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh -o goecs.sh && chmod +x goecs.sh
|
||||
|
||||
cat <<"EOF"
|
||||
GGG OOO EEEE CCCC SSS
|
||||
G G O O E C S
|
||||
G O O EEE C SSS
|
||||
G GG O O E C S
|
||||
GGG OOO EEEE CCCC SSS
|
||||
GGGGGGGG OOOOOOO EEEEEEEE CCCCCCCCC SSSSSSSSSS
|
||||
GG GG OO OO EE CC SS
|
||||
GG OO OO EE CC SS
|
||||
GG OO OO EE CC SS
|
||||
GG OO OO EEEEEEEE CC SSSSSSSSSS
|
||||
GG GGGGGG OO OO EE CC SS
|
||||
GG GG OO OO EE CC SS
|
||||
GG GG OO OO EE CC SS
|
||||
GGGGGGGG OOOOOOO EEEEEEEE CCCCCCCCC SSSSSSSSSS
|
||||
EOF
|
||||
cd /root >/dev/null 2>&1
|
||||
|
||||
cd /root >/dev/null 2>&1
|
||||
if [ ! -d "/usr/bin/" ]; then
|
||||
mkdir -p "/usr/bin/"
|
||||
fi
|
||||
_red() { echo -e "\033[31m\033[01m$@\033[0m"; }
|
||||
_green() { echo -e "\033[32m\033[01m$@\033[0m"; }
|
||||
_yellow() { echo -e "\033[33m\033[01m$@\033[0m"; }
|
||||
_blue() { echo -e "\033[36m\033[01m$@\033[0m"; }
|
||||
|
||||
check_cdn() {
|
||||
local o_url=$1
|
||||
for cdn_url in "${cdn_urls[@]}"; do
|
||||
if curl -sL -k "$cdn_url$o_url" --max-time 6 | grep -q "success" >/dev/null 2>&1; then
|
||||
export cdn_success_url="$cdn_url"
|
||||
return
|
||||
fi
|
||||
sleep 0.5
|
||||
done
|
||||
export cdn_success_url=""
|
||||
local o_url=$1
|
||||
for cdn_url in "${cdn_urls[@]}"; do
|
||||
if curl -sL -k "$cdn_url$o_url" --max-time 6 | grep -q "success" >/dev/null 2>&1; then
|
||||
export cdn_success_url="$cdn_url"
|
||||
return
|
||||
fi
|
||||
sleep 0.5
|
||||
done
|
||||
export cdn_success_url=""
|
||||
}
|
||||
|
||||
check_cdn_file() {
|
||||
check_cdn "https://raw.githubusercontent.com/spiritLHLS/ecs/main/back/test"
|
||||
if [ -n "$cdn_success_url" ]; then
|
||||
echo "CDN available, using CDN"
|
||||
else
|
||||
echo "No CDN available, no use CDN"
|
||||
fi
|
||||
check_cdn "https://raw.githubusercontent.com/spiritLHLS/ecs/main/back/test"
|
||||
if [ -n "$cdn_success_url" ]; then
|
||||
echo "CDN available, using CDN"
|
||||
else
|
||||
echo "No CDN available, no use CDN"
|
||||
fi
|
||||
}
|
||||
|
||||
goecs_check() {
|
||||
os=$(uname -s)
|
||||
arch=$(uname -m)
|
||||
ECS_VERSION=$(curl -m 6 -sSL "https://api.github.com/repos/oneclickvirt/ecs/releases/latest" | awk -F \" '/tag_name/{gsub(/^v/,"",$4); print $4}')
|
||||
# 如果 https://api.github.com/ 请求失败,则使用 https://githubapi.spiritlhl.workers.dev/ ,此时可能宿主机无IPV4网络
|
||||
if [ -z "$ECS_VERSION" ]; then
|
||||
ECS_VERSION=$(curl -m 6 -sSL "https://githubapi.spiritlhl.workers.dev/repos/oneclickvirt/ecs/releases/latest" | awk -F \" '/tag_name/{gsub(/^v/,"",$4); print $4}')
|
||||
fi
|
||||
# 如果 https://githubapi.spiritlhl.workers.dev/ 请求失败,则使用 https://githubapi.spiritlhl.top/ ,此时可能宿主机在国内
|
||||
if [ -z "$ECS_VERSION" ]; then
|
||||
ECS_VERSION=$(curl -m 6 -sSL "https://githubapi.spiritlhl.top/repos/oneclickvirt/ecs/releases/latest" | awk -F \" '/tag_name/{gsub(/^v/,"",$4); print $4}')
|
||||
fi
|
||||
# 检测原始goecs命令是否存在,若存在则升级,不存在则安装
|
||||
version_output=$(goecs -v || ./goecs -v)
|
||||
if [ $? -eq 0 ]; then
|
||||
extracted_version=$(echo "$version_output" | grep -oP '^v\d+(\.\d+)+')
|
||||
if [ -n "$extracted_version" ]; then
|
||||
current_version=$(echo "$extracted_version" | cut -c 2-)
|
||||
ecs_version=$ECS_VERSION
|
||||
if [[ "$(echo -e "$current_version\n$ecs_version" | sort -V | tail -n 1)" == "$current_version" ]]; then
|
||||
echo "goecs version ($current_version) is latest, no need to upgrade."
|
||||
return
|
||||
else
|
||||
echo "goecs version ($current_version) < $ecs_version, need to upgrade, 5 seconds later will start to upgrade"
|
||||
rm -rf /usr/bin/goecs
|
||||
rm -rf goecs
|
||||
fi
|
||||
os=$(uname -s)
|
||||
arch=$(uname -m)
|
||||
ECS_VERSION=$(curl -m 6 -sSL "https://api.github.com/repos/oneclickvirt/ecs/releases/latest" | awk -F \" '/tag_name/{gsub(/^v/,"",$4); print $4}')
|
||||
# 如果 https://api.github.com/ 请求失败,则使用 https://githubapi.spiritlhl.workers.dev/ ,此时可能宿主机无IPV4网络
|
||||
if [ -z "$ECS_VERSION" ]; then
|
||||
ECS_VERSION=$(curl -m 6 -sSL "https://githubapi.spiritlhl.workers.dev/repos/oneclickvirt/ecs/releases/latest" | awk -F \" '/tag_name/{gsub(/^v/,"",$4); print $4}')
|
||||
fi
|
||||
else
|
||||
echo "Can not find goecs, need to download and install, 5 seconds later will start to install"
|
||||
fi
|
||||
sleep 5
|
||||
cdn_urls=("https://cdn0.spiritlhl.top/" "http://cdn3.spiritlhl.net/" "http://cdn1.spiritlhl.net/" "http://cdn2.spiritlhl.net/")
|
||||
check_cdn_file
|
||||
case $os in
|
||||
Linux)
|
||||
case $arch in
|
||||
"x86_64" | "x86" | "amd64" | "x64")
|
||||
wget -O goecs.tar.gz "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/ecs_${ECS_VERSION}_linux_amd64.tar.gz"
|
||||
;;
|
||||
"i386" | "i686")
|
||||
wget -O goecs.tar.gz "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/ecs_${ECS_VERSION}_linux_386.tar.gz"
|
||||
;;
|
||||
"armv7l" | "armv8" | "armv8l" | "aarch64" | "arm64")
|
||||
wget -O goecs.tar.gz "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/ecs_${ECS_VERSION}_linux_arm64.tar.gz"
|
||||
;;
|
||||
# 如果 https://githubapi.spiritlhl.workers.dev/ 请求失败,则使用 https://githubapi.spiritlhl.top/ ,此时可能宿主机在国内
|
||||
if [ -z "$ECS_VERSION" ]; then
|
||||
ECS_VERSION=$(curl -m 6 -sSL "https://githubapi.spiritlhl.top/repos/oneclickvirt/ecs/releases/latest" | awk -F \" '/tag_name/{gsub(/^v/,"",$4); print $4}')
|
||||
fi
|
||||
# 检测原始goecs命令是否存在,若存在则升级,不存在则安装
|
||||
version_output=$(goecs -v command 2>/dev/null || ./goecs -v command 2>/dev/null)
|
||||
if [ $? -eq 0 ]; then
|
||||
extracted_version=$(echo "${version_output//v/}")
|
||||
if [ -n "$extracted_version" ]; then
|
||||
ecs_version=$ECS_VERSION
|
||||
if [[ "$(echo -e "$extracted_version\n$ecs_version" | sort -V | tail -n 1)" == "$extracted_version" ]]; then
|
||||
echo "goecs version ($extracted_version) is latest, no need to upgrade."
|
||||
return
|
||||
else
|
||||
echo "goecs version ($extracted_version) < $ecs_version, need to upgrade, 5 seconds later will start to upgrade"
|
||||
rm -rf /usr/bin/goecs
|
||||
rm -rf goecs
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "Can not find goecs, need to download and install, 5 seconds later will start to install"
|
||||
fi
|
||||
sleep 5
|
||||
cdn_urls=("https://cdn0.spiritlhl.top/" "http://cdn3.spiritlhl.net/" "http://cdn1.spiritlhl.net/" "http://cdn2.spiritlhl.net/")
|
||||
check_cdn_file
|
||||
case $os in
|
||||
Linux)
|
||||
case $arch in
|
||||
"x86_64" | "x86" | "amd64" | "x64")
|
||||
wget -O goecs.tar.gz "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/ecs_${ECS_VERSION}_linux_amd64.tar.gz"
|
||||
;;
|
||||
"i386" | "i686")
|
||||
wget -O goecs.tar.gz "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/ecs_${ECS_VERSION}_linux_386.tar.gz"
|
||||
;;
|
||||
"armv7l" | "armv8" | "armv8l" | "aarch64" | "arm64")
|
||||
wget -O goecs.tar.gz "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/ecs_${ECS_VERSION}_linux_arm64.tar.gz"
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported architecture: $arch"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
Darwin)
|
||||
case $arch in
|
||||
"x86_64" | "x86" | "amd64" | "x64")
|
||||
wget -O goecs.tar.gz "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/ecs_${ECS_VERSION}_linux_amd64.tar.gz"
|
||||
;;
|
||||
"armv7l" | "armv8" | "armv8l" | "aarch64" | "arm64")
|
||||
wget -O goecs.tar.gz "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/ecs_${ECS_VERSION}_linux_arm64.tar.gz"
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported architecture: $arch"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported architecture: $arch"
|
||||
exit 1
|
||||
;;
|
||||
echo "Unsupported operating system: $os"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
Darwin)
|
||||
case $arch in
|
||||
"x86_64" | "x86" | "amd64" | "x64")
|
||||
wget -O goecs.tar.gz "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/ecs_${ECS_VERSION}_linux_amd64.tar.gz"
|
||||
;;
|
||||
"armv7l" | "armv8" | "armv8l" | "aarch64" | "arm64")
|
||||
wget -O goecs.tar.gz "${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}/ecs_${ECS_VERSION}_linux_arm64.tar.gz"
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported architecture: $arch"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported operating system: $os"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
tar -xvf goecs.tar.gz
|
||||
rm -rf goecs.tar.gz
|
||||
rm -rf README.md
|
||||
rm -rf LICENSE
|
||||
mv ecs goecs
|
||||
chmod 777 goecs
|
||||
cp goecs /usr/bin/goecs
|
||||
echo "goecs version:"
|
||||
goecs -v || ./goecs -v
|
||||
tar -xvf goecs.tar.gz
|
||||
rm -rf goecs.tar.gz
|
||||
rm -rf README.md
|
||||
rm -rf LICENSE
|
||||
mv ecs goecs
|
||||
sleep 1
|
||||
chmod 777 goecs
|
||||
rm -rf /usr/bin/goecs
|
||||
sleep 1
|
||||
cp goecs /usr/bin/goecs
|
||||
echo "goecs version:"
|
||||
goecs -v || ./goecs -v
|
||||
}
|
||||
|
||||
InstallSysbench() {
|
||||
if [ -f "/etc/centos-release" ]; then # CentOS
|
||||
Var_OSRelease="centos"
|
||||
elif [ -f "/etc/fedora-release" ]; then # Fedora
|
||||
Var_OSRelease="fedora"
|
||||
elif [ -f "/etc/redhat-release" ]; then # RedHat
|
||||
Var_OSRelease="rhel"
|
||||
elif [ -f "/etc/astra_version" ]; then # Astra
|
||||
Var_OSRelease="astra"
|
||||
elif [ -f "/etc/lsb-release" ]; then # Ubuntu
|
||||
Var_OSRelease="ubuntu"
|
||||
elif [ -f "/etc/debian_version" ]; then # Debian
|
||||
Var_OSRelease="debian"
|
||||
elif [ -f "/etc/alpine-release" ]; then # Alpine Linux
|
||||
Var_OSRelease="alpinelinux"
|
||||
elif [ -f "/etc/almalinux-release" ]; then # almalinux
|
||||
Var_OSRelease="almalinux"
|
||||
elif [ -f "/etc/arch-release" ]; then # archlinux
|
||||
Var_OSRelease="arch"
|
||||
elif [ -f "/etc/freebsd-update.conf" ]; then # freebsd
|
||||
Var_OSRelease="freebsd"
|
||||
else
|
||||
Var_OSRelease="unknown" # 未知系统分支
|
||||
fi
|
||||
case "$Var_OSRelease" in
|
||||
ubuntu | debian | astra) ! apt-get install -y sysbench && apt-get --fix-broken install -y && apt-get install --no-install-recommends -y sysbench ;;
|
||||
centos | rhel | almalinux | redhat) (yum -y install epel-release && yum -y install sysbench) || (dnf install epel-release -y && dnf install sysbench -y) ;;
|
||||
fedora) dnf -y install sysbench ;;
|
||||
arch) pacman -S --needed --noconfirm sysbench && pacman -S --needed --noconfirm libaio && ldconfig ;;
|
||||
freebsd) pkg install -y sysbench ;;
|
||||
alpinelinux) echo -e "${Msg_Warning}Sysbench Module not found, installing ..." && echo -e "${Msg_Warning}SysBench Current not support Alpine Linux, Skipping..." && Var_Skip_SysBench="1" ;;
|
||||
*) echo "Error: Unknown OS release: $os_release" && exit 1 ;;
|
||||
esac
|
||||
if [ -f "/etc/centos-release" ]; then # CentOS
|
||||
Var_OSRelease="centos"
|
||||
elif [ -f "/etc/fedora-release" ]; then # Fedora
|
||||
Var_OSRelease="fedora"
|
||||
elif [ -f "/etc/redhat-release" ]; then # RedHat
|
||||
Var_OSRelease="rhel"
|
||||
elif [ -f "/etc/astra_version" ]; then # Astra
|
||||
Var_OSRelease="astra"
|
||||
elif [ -f "/etc/lsb-release" ]; then # Ubuntu
|
||||
Var_OSRelease="ubuntu"
|
||||
elif [ -f "/etc/debian_version" ]; then # Debian
|
||||
Var_OSRelease="debian"
|
||||
elif [ -f "/etc/alpine-release" ]; then # Alpine Linux
|
||||
Var_OSRelease="alpinelinux"
|
||||
elif [ -f "/etc/almalinux-release" ]; then # almalinux
|
||||
Var_OSRelease="almalinux"
|
||||
# rockylinux
|
||||
elif [ -f "/etc/arch-release" ]; then # archlinux
|
||||
Var_OSRelease="arch"
|
||||
elif [ -f "/etc/freebsd-update.conf" ]; then # freebsd
|
||||
Var_OSRelease="freebsd"
|
||||
else
|
||||
Var_OSRelease="unknown" # 未知系统分支
|
||||
fi
|
||||
case "$Var_OSRelease" in
|
||||
ubuntu | debian | astra) ! apt-get install -y sysbench && apt-get --fix-broken install -y && apt-get install --no-install-recommends -y sysbench ;;
|
||||
centos | rhel | almalinux | redhat) (yum -y install epel-release && yum -y install sysbench) || (dnf install epel-release -y && dnf install sysbench -y) ;;
|
||||
fedora) dnf -y install sysbench ;;
|
||||
arch) pacman -S --needed --noconfirm sysbench && pacman -S --needed --noconfirm libaio && ldconfig ;;
|
||||
freebsd) pkg install -y sysbench ;;
|
||||
alpinelinux) echo -e "${Msg_Warning}Sysbench Module not found, installing ..." && echo -e "${Msg_Warning}SysBench Current not support Alpine Linux, Skipping..." && Var_Skip_SysBench="1" ;;
|
||||
*) echo "Error: Unknown OS release: $os_release" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
Check_SysBench() {
|
||||
if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then
|
||||
InstallSysbench
|
||||
fi
|
||||
# 尝试编译安装
|
||||
if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then
|
||||
echo -e "${Msg_Warning}Sysbench Module install Failure, trying compile modules ..."
|
||||
Check_Sysbench_InstantBuild
|
||||
fi
|
||||
source ~/.bashrc
|
||||
# 最终检测
|
||||
if [ "$(command -v sysbench)" ] || [ -f "/usr/bin/sysbench" ] || [ -f "/usr/local/bin/sysbench" ]; then
|
||||
_yellow "Install sysbench successfully!"
|
||||
else
|
||||
_red "SysBench Moudle install Failure! Try Restart Bench or Manually install it! (/usr/bin/sysbench)"
|
||||
_blue "Will try to test with geekbench5 instead later on"
|
||||
test_cpu_type="gb5"
|
||||
fi
|
||||
sleep 3
|
||||
if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then
|
||||
InstallSysbench
|
||||
fi
|
||||
# 尝试编译安装
|
||||
if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then
|
||||
echo -e "${Msg_Warning}Sysbench Module install Failure, trying compile modules ..."
|
||||
Check_Sysbench_InstantBuild
|
||||
fi
|
||||
source ~/.bashrc
|
||||
# 最终检测
|
||||
if [ "$(command -v sysbench)" ] || [ -f "/usr/bin/sysbench" ] || [ -f "/usr/local/bin/sysbench" ]; then
|
||||
_yellow "Install sysbench successfully!"
|
||||
else
|
||||
_red "SysBench Moudle install Failure! Try Restart Bench or Manually install it! (/usr/bin/sysbench)"
|
||||
_blue "Will try to test with geekbench5 instead later on"
|
||||
test_cpu_type="gb5"
|
||||
fi
|
||||
sleep 3
|
||||
}
|
||||
|
||||
Check_Sysbench_InstantBuild() {
|
||||
if [ "${Var_OSRelease}" = "centos" ] || [ "${Var_OSRelease}" = "rhel" ] || [ "${Var_OSRelease}" = "almalinux" ] || [ "${Var_OSRelease}" = "ubuntu" ] || [ "${Var_OSRelease}" = "debian" ] || [ "${Var_OSRelease}" = "fedora" ] || [ "${Var_OSRelease}" = "arch" ] || [ "${Var_OSRelease}" = "astra" ]; then
|
||||
local os_sysbench=${Var_OSRelease}
|
||||
if [ "$os_sysbench" = "astra" ]; then
|
||||
os_sysbench="debian"
|
||||
if [ "${Var_OSRelease}" = "centos" ] || [ "${Var_OSRelease}" = "rhel" ] || [ "${Var_OSRelease}" = "almalinux" ] || [ "${Var_OSRelease}" = "ubuntu" ] || [ "${Var_OSRelease}" = "debian" ] || [ "${Var_OSRelease}" = "fedora" ] || [ "${Var_OSRelease}" = "arch" ] || [ "${Var_OSRelease}" = "astra" ]; then
|
||||
local os_sysbench=${Var_OSRelease}
|
||||
if [ "$os_sysbench" = "astra" ]; then
|
||||
os_sysbench="debian"
|
||||
fi
|
||||
echo -e "${Msg_Info}Release Detected: ${os_sysbench}"
|
||||
echo -e "${Msg_Info}Preparing compile enviorment ..."
|
||||
prepare_compile_env "${os_sysbench}"
|
||||
echo -e "${Msg_Info}Downloading Source code (Version 1.0.20)..."
|
||||
mkdir -p /tmp/sysbench_install/src/
|
||||
mv /tmp/sysbench-1.0.20 /tmp/sysbench_install/src/
|
||||
echo -e "${Msg_Info}Compiling Sysbench Module ..."
|
||||
cd /tmp/sysbench_install/src/sysbench-1.0.20
|
||||
./autogen.sh && ./configure --without-mysql && make -j8 && make install
|
||||
echo -e "${Msg_Info}Cleaning up ..."
|
||||
cd /tmp && rm -rf /tmp/sysbench_install/src/sysbench*
|
||||
else
|
||||
echo -e "${Msg_Warning}Unsupported operating system: ${Var_OSRelease}"
|
||||
fi
|
||||
echo -e "${Msg_Info}Release Detected: ${os_sysbench}"
|
||||
echo -e "${Msg_Info}Preparing compile enviorment ..."
|
||||
prepare_compile_env "${os_sysbench}"
|
||||
echo -e "${Msg_Info}Downloading Source code (Version 1.0.20)..."
|
||||
mkdir -p /tmp/sysbench_install/src/
|
||||
mv /tmp/sysbench-1.0.20 /tmp/sysbench_install/src/
|
||||
echo -e "${Msg_Info}Compiling Sysbench Module ..."
|
||||
cd /tmp/sysbench_install/src/sysbench-1.0.20
|
||||
./autogen.sh && ./configure --without-mysql && make -j8 && make install
|
||||
echo -e "${Msg_Info}Cleaning up ..."
|
||||
cd /tmp && rm -rf /tmp/sysbench_install/src/sysbench*
|
||||
else
|
||||
echo -e "${Msg_Warning}Unsupported operating system: ${Var_OSRelease}"
|
||||
fi
|
||||
}
|
||||
|
||||
prepare_compile_env() {
|
||||
local system="$1"
|
||||
if [ "${system}" = "centos" ] || [ "${system}" = "rhel" ] || [ "${system}" = "almalinux" ]; then
|
||||
yum install -y epel-release
|
||||
yum install -y wget curl make gcc gcc-c++ make automake libtool pkgconfig libaio-devel
|
||||
elif [ "${system}" = "ubuntu" ] || [ "${system}" = "debian" ]; then
|
||||
! apt-get update && apt-get --fix-broken install -y && apt-get update
|
||||
! apt-get -y install --no-install-recommends curl wget make automake libtool pkg-config libaio-dev unzip && apt-get --fix-broken install -y && apt-get -y install --no-install-recommends curl wget make automake libtool pkg-config libaio-dev unzip
|
||||
elif [ "${system}" = "fedora" ]; then
|
||||
dnf install -y wget curl gcc gcc-c++ make automake libtool pkgconfig libaio-devel
|
||||
elif [ "${system}" = "arch" ]; then
|
||||
pacman -S --needed --noconfirm wget curl gcc gcc make automake libtool pkgconfig libaio lib32-libaio
|
||||
else
|
||||
echo -e "${Msg_Warning}Unsupported operating system: ${system}"
|
||||
fi
|
||||
local system="$1"
|
||||
if [ "${system}" = "centos" ] || [ "${system}" = "rhel" ] || [ "${system}" = "almalinux" ]; then
|
||||
yum install -y epel-release
|
||||
yum install -y wget curl make gcc gcc-c++ make automake libtool pkgconfig libaio-devel
|
||||
elif [ "${system}" = "ubuntu" ] || [ "${system}" = "debian" ]; then
|
||||
! apt-get update && apt-get --fix-broken install -y && apt-get update
|
||||
! apt-get -y install --no-install-recommends curl wget make automake libtool pkg-config libaio-dev unzip && apt-get --fix-broken install -y && apt-get -y install --no-install-recommends curl wget make automake libtool pkg-config libaio-dev unzip
|
||||
elif [ "${system}" = "fedora" ]; then
|
||||
dnf install -y wget curl gcc gcc-c++ make automake libtool pkgconfig libaio-devel
|
||||
elif [ "${system}" = "arch" ]; then
|
||||
pacman -S --needed --noconfirm wget curl gcc gcc make automake libtool pkgconfig libaio lib32-libaio
|
||||
else
|
||||
echo -e "${Msg_Warning}Unsupported operating system: ${system}"
|
||||
fi
|
||||
}
|
||||
|
||||
env_check() {
|
||||
REGEX=("debian|astra" "ubuntu" "centos|red hat|kernel|oracle linux|alma|rocky" "'amazon linux'" "fedora" "arch" "freebsd" "alpine" "openbsd")
|
||||
RELEASE=("Debian" "Ubuntu" "CentOS" "CentOS" "Fedora" "Arch" "FreeBSD" "Alpine" "OpenBSD")
|
||||
PACKAGE_UPDATE=("! apt-get update && apt-get --fix-broken install -y && apt-get update" "apt-get update" "yum -y update" "yum -y update" "yum -y update" "pacman -Sy" "pkg update" "apk update" "pkg_add -u")
|
||||
PACKAGE_INSTALL=("apt-get -y install" "apt-get -y install" "yum -y install" "yum -y install" "yum -y install" "pacman -Sy --noconfirm --needed" "pkg install -y" "apk add")
|
||||
PACKAGE_REMOVE=("apt-get -y remove" "apt-get -y remove" "yum -y remove" "yum -y remove" "yum -y remove" "pacman -Rsc --noconfirm" "pkg delete" "apk del")
|
||||
PACKAGE_UNINSTALL=("apt-get -y autoremove" "apt-get -y autoremove" "yum -y autoremove" "yum -y autoremove" "yum -y autoremove" "" "pkg autoremove" "apk autoremove")
|
||||
CMD=("$(grep -i pretty_name /etc/os-release 2>/dev/null | cut -d \" -f2)" "$(hostnamectl 2>/dev/null | grep -i system | cut -d : -f2)" "$(lsb_release -sd 2>/dev/null)" "$(grep -i description /etc/lsb-release 2>/dev/null | cut -d \" -f2)" "$(grep . /etc/redhat-release 2>/dev/null)" "$(grep . /etc/issue 2>/dev/null | cut -d \\ -f1 | sed '/^[ ]*$/d')" "$(grep -i pretty_name /etc/os-release 2>/dev/null | cut -d \" -f2)" "$(uname -s)" "$(uname -s)")
|
||||
SYS="${CMD[0]}"
|
||||
[[ -n $SYS ]] || exit 1
|
||||
for ((int = 0; int < ${#REGEX[@]}; int++)); do
|
||||
if [[ $(echo "$SYS" | tr '[:upper:]' '[:lower:]') =~ ${REGEX[int]} ]]; then
|
||||
SYSTEM="${RELEASE[int]}"
|
||||
[[ -n $SYSTEM ]] && break
|
||||
REGEX=("debian|astra" "ubuntu" "centos|red hat|kernel|oracle linux|alma|rocky" "'amazon linux'" "fedora" "arch" "freebsd" "alpine" "openbsd")
|
||||
RELEASE=("Debian" "Ubuntu" "CentOS" "CentOS" "Fedora" "Arch" "FreeBSD" "Alpine" "OpenBSD")
|
||||
PACKAGE_UPDATE=("apt-get update" "apt-get update" "yum -y update" "yum -y update" "yum -y update" "pacman -Sy" "pkg update" "apk update" "pkg_add -u")
|
||||
PACKAGE_INSTALL=("apt-get -y install" "apt-get -y install" "yum -y install" "yum -y install" "yum -y install" "pacman -Sy --noconfirm --needed" "pkg install -y" "apk add")
|
||||
PACKAGE_REMOVE=("apt-get -y remove" "apt-get -y remove" "yum -y remove" "yum -y remove" "yum -y remove" "pacman -Rsc --noconfirm" "pkg delete" "apk del")
|
||||
PACKAGE_UNINSTALL=("apt-get -y autoremove" "apt-get -y autoremove" "yum -y autoremove" "yum -y autoremove" "yum -y autoremove" "" "pkg autoremove" "apk autoremove")
|
||||
CMD=("$(grep -i pretty_name /etc/os-release 2>/dev/null | cut -d \" -f2)" "$(hostnamectl 2>/dev/null | grep -i system | cut -d : -f2)" "$(lsb_release -sd 2>/dev/null)" "$(grep -i description /etc/lsb-release 2>/dev/null | cut -d \" -f2)" "$(grep . /etc/redhat-release 2>/dev/null)" "$(grep . /etc/issue 2>/dev/null | cut -d \\ -f1 | sed '/^[ ]*$/d')" "$(grep -i pretty_name /etc/os-release 2>/dev/null | cut -d \" -f2)" "$(uname -s)" "$(uname -s)")
|
||||
SYS="${CMD[0]}"
|
||||
[[ -n $SYS ]] || exit 1
|
||||
for ((int = 0; int < ${#REGEX[@]}; int++)); do
|
||||
if [[ $(echo "$SYS" | tr '[:upper:]' '[:lower:]') =~ ${REGEX[int]} ]]; then
|
||||
SYSTEM="${RELEASE[int]}"
|
||||
[[ -n $SYSTEM ]] && break
|
||||
fi
|
||||
done
|
||||
cdn_urls=("https://cdn0.spiritlhl.top/" "http://cdn3.spiritlhl.net/" "http://cdn1.spiritlhl.net/" "http://cdn2.spiritlhl.net/")
|
||||
check_cdn_file
|
||||
_green "Update system manager."
|
||||
$PACKAGE_UPDATE command 2>/dev/null
|
||||
if ! command -v tar >/dev/null 2>&1; then
|
||||
_green "Installing tar"
|
||||
$PACKAGE_INSTALL tar
|
||||
fi
|
||||
done
|
||||
cdn_urls=("https://cdn0.spiritlhl.top/" "http://cdn3.spiritlhl.net/" "http://cdn1.spiritlhl.net/" "http://cdn2.spiritlhl.net/")
|
||||
check_cdn_file
|
||||
if ! command -v dd >/dev/null 2>&1; then
|
||||
_green "Installing dd"
|
||||
$PACKAGE_INSTALL dd
|
||||
if ! command -v unzip >/dev/null 2>&1; then
|
||||
_green "Installing unzip"
|
||||
$PACKAGE_INSTALL unzip
|
||||
fi
|
||||
if ! command -v fio >/dev/null 2>&1; then
|
||||
_green "Installing fio"
|
||||
$PACKAGE_INSTALL fio
|
||||
fi
|
||||
if ! command -v sysbench >/dev/null 2>&1; then
|
||||
_green "Installing sysbench"
|
||||
$PACKAGE_INSTALL sysbench
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Unable to download sysbench through the system's package manager, speak to try compiling and installing it..."
|
||||
if ! wget -O /tmp/sysbench.zip "${cdn_success_url}https://github.com/akopytov/sysbench/archive/1.0.20.zip"; then
|
||||
echo "wget failed, trying with curl"
|
||||
curl -Lk -o /tmp/sysbench.zip "${cdn_success_url}https://github.com/akopytov/sysbench/archive/1.0.20.zip"
|
||||
fi
|
||||
if [ ! -f /tmp/sysbench.zip ]; then
|
||||
wget -q -O /tmp/sysbench.zip "https://hub.fgit.cf/akopytov/sysbench/archive/1.0.20.zip"
|
||||
fi
|
||||
chmod +x /tmp/sysbench.zip
|
||||
unzip /tmp/sysbench.zip -d /tmp
|
||||
if ! command -v dd >/dev/null 2>&1; then
|
||||
_green "Installing dd"
|
||||
$PACKAGE_INSTALL dd
|
||||
fi
|
||||
fi
|
||||
if ! commadn -v geekbench >/dev/null 2>&1; then
|
||||
_green "Installing geekbench"
|
||||
curl -L "${cdn_success_url}https://raw.githubusercontent.com/oneclickvirt/cputest/main/dgb.sh" -o dgb.sh && chmod +x dgb.sh
|
||||
bash dgb.sh -v gb5
|
||||
_blue "If you not want to use geekbench5, you can use"
|
||||
echo "bash dgb.sh -v gb6"
|
||||
echo "bash dgb.sh -v gb4"
|
||||
_blue "to change version, or use"
|
||||
echo "rm -rf /usr/bin/geekbench*"
|
||||
_blue "to uninstall geekbench"
|
||||
fi
|
||||
if ! command -v fio >/dev/null 2>&1; then
|
||||
_green "Installing fio"
|
||||
$PACKAGE_INSTALL fio
|
||||
fi
|
||||
if ! command -v sysbench >/dev/null 2>&1; then
|
||||
_green "Installing sysbench"
|
||||
$PACKAGE_INSTALL sysbench
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Unable to download sysbench through the system's package manager, speak to try compiling and installing it..."
|
||||
if ! wget -O /tmp/sysbench.zip "${cdn_success_url}https://github.com/akopytov/sysbench/archive/1.0.20.zip"; then
|
||||
echo "wget failed, trying with curl"
|
||||
curl -Lk -o /tmp/sysbench.zip "${cdn_success_url}https://github.com/akopytov/sysbench/archive/1.0.20.zip"
|
||||
fi
|
||||
if [ ! -f /tmp/sysbench.zip ]; then
|
||||
wget -q -O /tmp/sysbench.zip "https://hub.fgit.cf/akopytov/sysbench/archive/1.0.20.zip"
|
||||
fi
|
||||
chmod +x /tmp/sysbench.zip
|
||||
unzip /tmp/sysbench.zip -d /tmp
|
||||
fi
|
||||
fi
|
||||
if ! command -v geekbench >/dev/null 2>&1; then
|
||||
_green "Installing geekbench"
|
||||
curl -L "${cdn_success_url}https://raw.githubusercontent.com/oneclickvirt/cputest/main/dgb.sh" -o dgb.sh && chmod +x dgb.sh
|
||||
bash dgb.sh -v gb5
|
||||
_blue "If you not want to use geekbench5, you can use"
|
||||
echo "bash dgb.sh -v gb6"
|
||||
echo "bash dgb.sh -v gb4"
|
||||
_blue "to change version, or use"
|
||||
echo "rm -rf /usr/bin/geekbench*"
|
||||
_blue "to uninstall geekbench"
|
||||
rm -rf dgb.sh
|
||||
fi
|
||||
if ! command -v speedtest >/dev/null 2>&1; then
|
||||
_green "Installing geekbench"
|
||||
curl -L "${cdn_success_url}https://raw.githubusercontent.com/oneclickvirt/speedtest/main/dspt.sh" -o dspt.sh && chmod +x dspt.sh
|
||||
bash dspt.sh
|
||||
rm -rf dspt.sh
|
||||
_blue "if you want to use golang origin speedtest, you can use"
|
||||
echo "rm -rf /usr/bin/speedtest"
|
||||
echo "rm -rf /usr/bin/speedtest-go"
|
||||
_blue "to uninstall speedtest and speedtest-go"
|
||||
fi
|
||||
_green "The environment is ready."
|
||||
}
|
||||
|
||||
delete_goecs() {
|
||||
rm -rf /root/goecs
|
||||
rm -rf /usr/bin/goecs
|
||||
}
|
||||
|
||||
show_help() {
|
||||
cat <<"EOF"
|
||||
cat <<"EOF"
|
||||
Available commands:
|
||||
|
||||
env Check and install dd fio sysbench geekbench5
|
||||
install Install goecs command
|
||||
help Show this message
|
||||
./goecs.sh env Check and Install package:
|
||||
tar (Almost all unix-like systems have it.)
|
||||
unzip (Almost all unix-like systems have it.)
|
||||
dd (Almost all unix-like systems have it.)
|
||||
fio (Almost all unix-like systems can be installed through the system's package manager.)
|
||||
sysbench (Almost all unix-like systems can be installed through the system's package manager.)
|
||||
geekbench (geekbench5)(Only support IPV4 environment, and memory greater than 1GB network detection, only support amd64 and arm64 architecture.)
|
||||
speedtest (Use the officially provided binaries for more accurate test results.)
|
||||
In fact, sysbench/geekbench is the only one of the above dependencies that must be installed, without which the CPU score cannot be tested.
|
||||
./goecs.sh install Install goecs command
|
||||
./goecs.sh upgrade Upgrade goecs command
|
||||
./goecs.sh delete Uninstall goecs command
|
||||
./goecs.sh help Show this message
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
"help")
|
||||
show_help
|
||||
;;
|
||||
show_help
|
||||
;;
|
||||
"env")
|
||||
env_check
|
||||
;;
|
||||
"install")
|
||||
goecs_check
|
||||
;;
|
||||
"upgrade")
|
||||
goecs_check
|
||||
;;
|
||||
env_check
|
||||
;;
|
||||
"install" | "upgrade")
|
||||
goecs_check
|
||||
;;
|
||||
"delete")
|
||||
delete_goecs
|
||||
;;
|
||||
*)
|
||||
echo "No command found."
|
||||
echo
|
||||
show_help
|
||||
;;
|
||||
echo "No command found."
|
||||
echo
|
||||
show_help
|
||||
;;
|
||||
esac
|
||||
|
@@ -1,6 +1,8 @@
|
||||
package main
|
||||
|
||||
import "testing"
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func Test(t *testing.T) {
|
||||
main()
|
||||
|
@@ -1,542 +1,8 @@
|
||||
package network
|
||||
package network1
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"runtime"
|
||||
"strings"
|
||||
"sync"
|
||||
import "github.com/oneclickvirt/security/network"
|
||||
|
||||
"github.com/oneclickvirt/basics/model"
|
||||
"github.com/oneclickvirt/basics/network/baseinfo"
|
||||
"github.com/oneclickvirt/basics/network/utils"
|
||||
. "github.com/oneclickvirt/defaultset"
|
||||
"github.com/oneclickvirt/security/network/printhead"
|
||||
. "github.com/oneclickvirt/security/network/security"
|
||||
)
|
||||
|
||||
// sortAndTranslateText 对原始文本进行排序和翻译
|
||||
func sortAndTranslateText(orginList []string, language string, fields []string) string {
|
||||
var result string
|
||||
for _, key := range fields {
|
||||
var displayKey string
|
||||
if language == "zh" {
|
||||
displayKey = model.TranslationMap[key]
|
||||
if displayKey == "" {
|
||||
displayKey = key
|
||||
}
|
||||
} else {
|
||||
displayKey = key
|
||||
}
|
||||
for _, line := range orginList {
|
||||
if strings.Contains(line, key) {
|
||||
if displayKey == key {
|
||||
result = result + line + "\n"
|
||||
} else {
|
||||
result = result + strings.ReplaceAll(line, key, displayKey) + "\n"
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// fetchAndLogInfo 子函数执行和日志记录
|
||||
func fetchAndLogInfo(wg *sync.WaitGroup, ip string, scorePtr **model.SecurityScore, infoPtr **model.SecurityInfo, fetchFunc func(string) (*model.SecurityScore, *model.SecurityInfo, error)) {
|
||||
defer wg.Done()
|
||||
var err error
|
||||
if scorePtr != nil && *scorePtr != nil && infoPtr != nil && *infoPtr != nil {
|
||||
*scorePtr, *infoPtr, err = fetchFunc(ip)
|
||||
} else if scorePtr == nil && infoPtr != nil && *infoPtr != nil {
|
||||
_, *infoPtr, err = fetchFunc(ip)
|
||||
} else if scorePtr != nil && *scorePtr != nil && infoPtr == nil {
|
||||
*scorePtr, _, err = fetchFunc(ip)
|
||||
}
|
||||
if err != nil {
|
||||
if model.EnableLoger {
|
||||
Logger.Info(fmt.Sprintf("%s: %s", runtime.FuncForPC(reflect.ValueOf(fetchFunc).Pointer()).Name(), err.Error()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Ipv4SecurityCheck 检测 ipv4 安全信息和安全得分
|
||||
func Ipv4SecurityCheck(ipInfo *model.IpInfo, cheervisionInfo *model.SecurityInfo, language string) (string, error) {
|
||||
if model.EnableLoger {
|
||||
InitLogger()
|
||||
defer Logger.Sync()
|
||||
}
|
||||
if ipInfo == nil {
|
||||
if model.EnableLoger {
|
||||
Logger.Info("ipv4 is not available")
|
||||
}
|
||||
return "", fmt.Errorf("ipv4 is not available")
|
||||
}
|
||||
if cheervisionInfo == nil {
|
||||
if model.EnableLoger {
|
||||
Logger.Info("ipv4 cheervisionInfo nil")
|
||||
}
|
||||
}
|
||||
var (
|
||||
ip, temp, orgin, result string
|
||||
wg sync.WaitGroup
|
||||
iPInfoIoInfo = &model.SecurityInfo{}
|
||||
scamalyticsInfo = &model.SecurityInfo{}
|
||||
abuseipdbInfo = &model.SecurityInfo{}
|
||||
ip2locationIoInfo = &model.SecurityInfo{}
|
||||
ipapicomInfo = &model.SecurityInfo{}
|
||||
ipwhoisioInfo = &model.SecurityInfo{}
|
||||
ipregistryCoInfo = &model.SecurityInfo{}
|
||||
ipdataCoInfo = &model.SecurityInfo{}
|
||||
dbIpComInfo = &model.SecurityInfo{}
|
||||
ipapiisInfo = &model.SecurityInfo{}
|
||||
ipapiComInfo = &model.SecurityInfo{}
|
||||
abstractapiInfo = &model.SecurityInfo{}
|
||||
ipqualityscoreComInfo = &model.SecurityInfo{}
|
||||
|
||||
scamalyticsScore = &model.SecurityScore{}
|
||||
virustotalScore = &model.SecurityScore{}
|
||||
abuseipdbScore = &model.SecurityScore{}
|
||||
dbIpComScore = &model.SecurityScore{}
|
||||
ipapiisScore = &model.SecurityScore{}
|
||||
ipdataCoScore = &model.SecurityScore{}
|
||||
ipapiComScore = &model.SecurityScore{}
|
||||
ipqualityscoreComScore = &model.SecurityScore{}
|
||||
)
|
||||
ip = ipInfo.Ip
|
||||
wg.Add(14)
|
||||
go fetchAndLogInfo(&wg, ip, nil, &iPInfoIoInfo, IPInfoIo)
|
||||
go fetchAndLogInfo(&wg, ip, &scamalyticsScore, &scamalyticsInfo, Scamalytics)
|
||||
go fetchAndLogInfo(&wg, ip, &virustotalScore, nil, Virustotal)
|
||||
go fetchAndLogInfo(&wg, ip, &abuseipdbScore, &abuseipdbInfo, Abuseipdb)
|
||||
go fetchAndLogInfo(&wg, ip, nil, &ip2locationIoInfo, Ip2locationIo)
|
||||
go fetchAndLogInfo(&wg, ip, nil, &ipapicomInfo, IpApiCom)
|
||||
go fetchAndLogInfo(&wg, ip, nil, &ipwhoisioInfo, IpwhoisIo)
|
||||
go fetchAndLogInfo(&wg, ip, nil, &ipregistryCoInfo, IpregistryCo)
|
||||
go fetchAndLogInfo(&wg, ip, &ipdataCoScore, &ipdataCoInfo, IpdataCo)
|
||||
go fetchAndLogInfo(&wg, ip, &dbIpComScore, &dbIpComInfo, DbIpCom)
|
||||
go fetchAndLogInfo(&wg, ip, &ipapiisScore, &ipapiisInfo, Ipapiis)
|
||||
go fetchAndLogInfo(&wg, ip, &ipapiComScore, &ipapiComInfo, IpapiCom)
|
||||
go fetchAndLogInfo(&wg, ip, nil, &abstractapiInfo, Abstractapi)
|
||||
go fetchAndLogInfo(&wg, ip, &ipqualityscoreComScore, &ipqualityscoreComInfo, IpqualityscoreCom)
|
||||
wg.Wait()
|
||||
// 构建非空信息
|
||||
var allScoreList []model.SecurityScore
|
||||
scorePointers := []*model.SecurityScore{virustotalScore, scamalyticsScore, abuseipdbScore, dbIpComScore,
|
||||
ipapiisScore, ipapiComScore, ipdataCoScore, ipqualityscoreComScore}
|
||||
for _, score := range scorePointers {
|
||||
if score != nil {
|
||||
allScoreList = append(allScoreList, *score)
|
||||
}
|
||||
}
|
||||
var allInfoList []model.SecurityInfo
|
||||
infoPointers := []*model.SecurityInfo{iPInfoIoInfo, scamalyticsInfo, abuseipdbInfo, ip2locationIoInfo, ipapicomInfo,
|
||||
ipwhoisioInfo, ipregistryCoInfo, ipdataCoInfo, dbIpComInfo, ipapiisInfo, ipapiComInfo, abstractapiInfo,
|
||||
cheervisionInfo, ipqualityscoreComInfo}
|
||||
for _, info := range infoPointers {
|
||||
if info != nil {
|
||||
allInfoList = append(allInfoList, *info)
|
||||
}
|
||||
}
|
||||
// 构建回传的文本内容
|
||||
temp += FormatSecurityScore(allScoreList)
|
||||
temp += "\n"
|
||||
temp += FormatSecurityInfo(allInfoList)
|
||||
// 分割输入为行
|
||||
lines := strings.Split(temp, "\n")
|
||||
// 初始化一个映射用于存储冒号之前的内容及其对应的行数
|
||||
contentMap := make(map[string][]int)
|
||||
// 遍历每一行,提取冒号之前的内容及其行数
|
||||
for i, line := range lines {
|
||||
// 如果行为空则跳过
|
||||
if line == "" {
|
||||
continue
|
||||
}
|
||||
// 切割行,以冒号为分隔符
|
||||
parts := strings.Split(line, ":")
|
||||
// 获取冒号之前的内容
|
||||
content := parts[0]
|
||||
// 将当前行的行号添加到映射中
|
||||
contentMap[content] = append(contentMap[content], i)
|
||||
}
|
||||
// 遍历映射,拼接相同内容的行
|
||||
for _, lineNumbers := range contentMap {
|
||||
if len(lineNumbers) > 1 { // 只对有多个行的内容进行拼接
|
||||
// 初始化一个字符串切片,用于存储拼接后的行
|
||||
var mergedLines []string
|
||||
// 遍历相同内容的行 添加当前行到拼接后的行中
|
||||
for _, lineNumber := range lineNumbers {
|
||||
if lineNumber == lineNumbers[0] {
|
||||
mergedLines = append(mergedLines, strings.TrimSpace(lines[lineNumber]))
|
||||
} else {
|
||||
mergedLines = append(mergedLines, strings.TrimSpace(strings.Split(lines[lineNumber], ":")[1]))
|
||||
}
|
||||
}
|
||||
// 将拼接后的行以空格连接起来
|
||||
mergedLine := strings.Join(mergedLines, " ")
|
||||
// 替换原始行中相同内容的行为拼接后的行,仅替换一次,其他行标注要删除
|
||||
isMerged := false
|
||||
for _, lineNumber := range lineNumbers {
|
||||
if !isMerged {
|
||||
lines[lineNumber] = mergedLine
|
||||
isMerged = true
|
||||
} else {
|
||||
lines[lineNumber] += "delete"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 删除对应的行,构建原始文本
|
||||
for _, line := range lines {
|
||||
if !strings.Contains(line, "delete") {
|
||||
orgin = orgin + line + "\n"
|
||||
}
|
||||
}
|
||||
orginList := strings.Split(orgin, "\n")
|
||||
// 将原始文本按要求进行排序和翻译
|
||||
var score model.SecurityScore
|
||||
scoreFields := utils.ExtractFieldNames(&score)
|
||||
var info model.SecurityInfo
|
||||
infoFields := utils.ExtractFieldNames(&info)
|
||||
// 拼接安全得分
|
||||
if language == "zh" {
|
||||
result += Blue("安全得分:") + "\n"
|
||||
} else if language == "en" {
|
||||
result = Blue("Security Score:") + "\n"
|
||||
}
|
||||
if len(scoreFields) > 4 {
|
||||
result += sortAndTranslateText(orginList, language, scoreFields[:len(scoreFields)-4])
|
||||
} else {
|
||||
result += sortAndTranslateText(orginList, language, scoreFields)
|
||||
}
|
||||
// 安全信息中前三个是字符串类型的得分
|
||||
result += sortAndTranslateText(orginList, language, infoFields[:3])
|
||||
// 需要确保后4个属性都为对应属性时才进行说明的拼接
|
||||
if len(scoreFields) > 4 {
|
||||
t := ""
|
||||
foundKeys := 0
|
||||
for _, key := range scoreFields[len(scoreFields)-4:] {
|
||||
var displayKey string
|
||||
if language == "zh" {
|
||||
displayKey = model.TranslationMap[key]
|
||||
if displayKey == "" {
|
||||
displayKey = key
|
||||
}
|
||||
} else {
|
||||
displayKey = key
|
||||
}
|
||||
found := false
|
||||
for _, line := range orginList {
|
||||
if strings.Contains(line, key) {
|
||||
key = strings.ReplaceAll(key, ": ", "")
|
||||
if displayKey == key {
|
||||
t = t + line + " "
|
||||
} else {
|
||||
t = t + strings.ReplaceAll(line, key, displayKey) + " "
|
||||
}
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if found {
|
||||
foundKeys++
|
||||
}
|
||||
}
|
||||
if foundKeys == 4 {
|
||||
if language == "zh" {
|
||||
result = result + "黑名单记录统计:(有多少黑名单网站有记录):\n" + t + "\n"
|
||||
} else if language == "en" {
|
||||
result = result + "Blacklist_Records_Statistics(how many blacklisted websites have records):\n" + t + "\n"
|
||||
}
|
||||
}
|
||||
}
|
||||
// 拼接安全信息
|
||||
if language == "zh" {
|
||||
result += Blue("安全信息:") + "\n"
|
||||
} else if language == "en" {
|
||||
result += Blue("Security Info:") + "\n"
|
||||
}
|
||||
result += sortAndTranslateText(orginList, language, infoFields[3:])
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// Ipv6SecurityCheck 检测 ipv4 安全信息和安全得分
|
||||
func Ipv6SecurityCheck(ipInfo *model.IpInfo, cheervisionInfo *model.SecurityInfo, language string) (string, error) {
|
||||
if model.EnableLoger {
|
||||
InitLogger()
|
||||
defer Logger.Sync()
|
||||
}
|
||||
if ipInfo == nil {
|
||||
if model.EnableLoger {
|
||||
Logger.Info("ipv6 is not available")
|
||||
}
|
||||
return "", fmt.Errorf("ipv6 is not available")
|
||||
}
|
||||
if cheervisionInfo == nil {
|
||||
if model.EnableLoger {
|
||||
Logger.Info("ipv6 cheervisionInfo nil")
|
||||
}
|
||||
}
|
||||
var (
|
||||
ip, temp, orgin, result string
|
||||
wg sync.WaitGroup
|
||||
scamalyticsInfo = &model.SecurityInfo{}
|
||||
abuseipdbInfo = &model.SecurityInfo{}
|
||||
ipapiisInfo = &model.SecurityInfo{}
|
||||
ipapiComInfo = &model.SecurityInfo{}
|
||||
scamalyticsScore = &model.SecurityScore{}
|
||||
abuseipdbScore = &model.SecurityScore{}
|
||||
ipapiisScore = &model.SecurityScore{}
|
||||
ipapiComScore = &model.SecurityScore{}
|
||||
)
|
||||
ip = ipInfo.Ip
|
||||
wg.Add(4)
|
||||
go fetchAndLogInfo(&wg, ip, &scamalyticsScore, &scamalyticsInfo, Scamalytics)
|
||||
go fetchAndLogInfo(&wg, ip, &abuseipdbScore, &abuseipdbInfo, Abuseipdb)
|
||||
go fetchAndLogInfo(&wg, ip, &ipapiisScore, &ipapiisInfo, Ipapiis)
|
||||
go fetchAndLogInfo(&wg, ip, &ipapiComScore, &ipapiComInfo, IpapiComIpv6)
|
||||
wg.Wait()
|
||||
// 构建非空信息
|
||||
var allScoreList []model.SecurityScore
|
||||
scorePointers := []*model.SecurityScore{scamalyticsScore, abuseipdbScore, ipapiisScore, ipapiComScore}
|
||||
for _, score := range scorePointers {
|
||||
if score != nil {
|
||||
allScoreList = append(allScoreList, *score)
|
||||
}
|
||||
}
|
||||
var allInfoList []model.SecurityInfo
|
||||
infoPointers := []*model.SecurityInfo{scamalyticsInfo, abuseipdbInfo, ipapiisInfo, ipapiComInfo, cheervisionInfo}
|
||||
for _, info := range infoPointers {
|
||||
if info != nil {
|
||||
allInfoList = append(allInfoList, *info)
|
||||
}
|
||||
}
|
||||
// 构建回传的文本内容
|
||||
temp += FormatSecurityScore(allScoreList)
|
||||
temp += "\n"
|
||||
temp += FormatSecurityInfo(allInfoList)
|
||||
// 分割输入为行
|
||||
lines := strings.Split(temp, "\n")
|
||||
// 初始化一个映射用于存储冒号之前的内容及其对应的行数
|
||||
contentMap := make(map[string][]int)
|
||||
// 遍历每一行,提取冒号之前的内容及其行数
|
||||
for i, line := range lines {
|
||||
// 如果行为空则跳过
|
||||
if line == "" {
|
||||
continue
|
||||
}
|
||||
// 切割行,以冒号为分隔符
|
||||
parts := strings.Split(line, ":")
|
||||
// 获取冒号之前的内容
|
||||
content := parts[0]
|
||||
// 将当前行的行号添加到映射中
|
||||
contentMap[content] = append(contentMap[content], i)
|
||||
}
|
||||
// 遍历映射,拼接相同内容的行
|
||||
for _, lineNumbers := range contentMap {
|
||||
if len(lineNumbers) > 1 { // 只对有多个行的内容进行拼接
|
||||
// 初始化一个字符串切片,用于存储拼接后的行
|
||||
var mergedLines []string
|
||||
// 遍历相同内容的行 添加当前行到拼接后的行中
|
||||
for _, lineNumber := range lineNumbers {
|
||||
if lineNumber == lineNumbers[0] {
|
||||
mergedLines = append(mergedLines, strings.TrimSpace(lines[lineNumber]))
|
||||
} else {
|
||||
mergedLines = append(mergedLines, strings.TrimSpace(strings.Split(lines[lineNumber], ":")[1]))
|
||||
}
|
||||
}
|
||||
// 将拼接后的行以空格连接起来
|
||||
mergedLine := strings.Join(mergedLines, " ")
|
||||
// 替换原始行中相同内容的行为拼接后的行,仅替换一次,其他行标注要删除
|
||||
isMerged := false
|
||||
for _, lineNumber := range lineNumbers {
|
||||
if !isMerged {
|
||||
lines[lineNumber] = mergedLine
|
||||
isMerged = true
|
||||
} else {
|
||||
lines[lineNumber] += "delete"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 删除对应的行,构建原始文本
|
||||
for _, line := range lines {
|
||||
if !strings.Contains(line, "delete") {
|
||||
orgin = orgin + line + "\n"
|
||||
}
|
||||
}
|
||||
orginList := strings.Split(orgin, "\n")
|
||||
var score model.SecurityScore
|
||||
scoreFields := utils.ExtractFieldNames(&score)
|
||||
var info model.SecurityInfo
|
||||
infoFields := utils.ExtractFieldNames(&info)
|
||||
// 拼接安全得分
|
||||
if language == "zh" {
|
||||
result += Blue("安全得分:") + "\n"
|
||||
} else if language == "en" {
|
||||
result = Blue("Security Score:") + "\n"
|
||||
}
|
||||
result += sortAndTranslateText(orginList, language, scoreFields)
|
||||
result += sortAndTranslateText(orginList, language, infoFields[:3])
|
||||
// 拼接完整安全信息
|
||||
if language == "zh" {
|
||||
result += Blue("安全信息:") + "\n"
|
||||
} else if language == "en" {
|
||||
result += Blue("Security Info:") + "\n"
|
||||
}
|
||||
result += sortAndTranslateText(orginList, language, infoFields[3:])
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// processPrintIPInfo 处理IP信息
|
||||
func processPrintIPInfo(headASNString string, headLocationString string, ipResult *model.IpInfo) string {
|
||||
var info string
|
||||
// 处理ASN信息
|
||||
if ipResult.ASN != "" || ipResult.Org != "" {
|
||||
info += headASNString
|
||||
if ipResult.ASN != "" {
|
||||
info += "AS" + ipResult.ASN
|
||||
if ipResult.Org != "" {
|
||||
info += " "
|
||||
}
|
||||
}
|
||||
info += ipResult.Org + "\n"
|
||||
}
|
||||
// 处理位置信息
|
||||
if ipResult.City != "" || ipResult.Region != "" || ipResult.Country != "" {
|
||||
info += headLocationString
|
||||
if ipResult.City != "" {
|
||||
info += ipResult.City + " / "
|
||||
}
|
||||
if ipResult.Region != "" {
|
||||
info += ipResult.Region + " / "
|
||||
}
|
||||
if ipResult.Country != "" {
|
||||
info += ipResult.Country
|
||||
}
|
||||
info += "\n"
|
||||
}
|
||||
return info
|
||||
}
|
||||
|
||||
// NetworkCheck 查询网络信息
|
||||
// checkType 可选 both ipv4 ipv6
|
||||
// enableSecurityCheck 可选 true false
|
||||
// language 暂时仅支持 en 或 zh
|
||||
// 回传 ipInfo securityInfo err
|
||||
// 本包在main中不使用
|
||||
func NetworkCheck(checkType string, enableSecurityCheck bool, language string) (string, string, error) {
|
||||
var ipInfo, securityInfo string
|
||||
if checkType == "both" {
|
||||
ipInfoV4Result, cheervisionInfoV4, ipInfoV6Result, cheervisionInfoV6, _ := baseinfo.RunIpCheck("both")
|
||||
if ipInfoV4Result != nil {
|
||||
ipInfo += processPrintIPInfo(" IPV4 ASN : ", " IPV4 Location : ", ipInfoV4Result)
|
||||
}
|
||||
if ipInfoV6Result != nil {
|
||||
ipInfo += processPrintIPInfo(" IPV6 ASN : ", " IPV6 Location : ", ipInfoV6Result)
|
||||
}
|
||||
// 检测是否需要查询相关安全信息
|
||||
if enableSecurityCheck {
|
||||
var (
|
||||
wg sync.WaitGroup
|
||||
ipv4Res, ipv6Res, ipv4DNSRes, ipv6DNSRes string
|
||||
err1, err2 error
|
||||
)
|
||||
wg.Add(4)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
ipv4DNSRes = BlackList(ipInfoV4Result, "ipv4", language)
|
||||
}()
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
ipv6DNSRes = BlackList(ipInfoV6Result, "ipv6", language)
|
||||
}()
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
ipv4Res, err1 = Ipv4SecurityCheck(ipInfoV4Result, cheervisionInfoV4, language)
|
||||
}()
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
ipv6Res, err2 = Ipv6SecurityCheck(ipInfoV6Result, cheervisionInfoV6, language)
|
||||
}()
|
||||
wg.Wait()
|
||||
securityHead, err3 := printhead.PrintDatabaseInfo(language)
|
||||
if err1 == nil && err2 == nil && err3 == nil {
|
||||
securityInfo = securityHead + Green("IPV4:") + "\n" + ipv4Res + ipv4DNSRes + Green("IPV6:") + "\n" + ipv6Res + ipv6DNSRes
|
||||
return ipInfo, securityInfo, nil
|
||||
} else if err1 == nil && err2 != nil && err3 == nil {
|
||||
securityInfo = securityHead + Green("IPV4:") + "\n" + ipv4Res + ipv4DNSRes
|
||||
return ipInfo, securityInfo, nil
|
||||
} else if err1 != nil && err2 == nil && err3 == nil {
|
||||
securityInfo = securityHead + Green("IPV6:") + "\n" + ipv6Res + ipv6DNSRes
|
||||
return ipInfo, securityInfo, nil
|
||||
} else {
|
||||
return ipInfo, "", nil
|
||||
}
|
||||
} else {
|
||||
return ipInfo, "", nil
|
||||
}
|
||||
} else if checkType == "ipv4" {
|
||||
ipInfoV4Result, cheervisionInfoV4, _, _, _ := baseinfo.RunIpCheck("ipv4")
|
||||
if ipInfoV4Result != nil {
|
||||
ipInfo += processPrintIPInfo(" IPV4 ASN : ", " IPV4 Location : ", ipInfoV4Result)
|
||||
}
|
||||
if enableSecurityCheck {
|
||||
var (
|
||||
wg sync.WaitGroup
|
||||
ipv4Res, ipv4DNSRes string
|
||||
err1 error
|
||||
)
|
||||
wg.Add(2)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
ipv4DNSRes = BlackList(ipInfoV4Result, "ipv4", language)
|
||||
}()
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
ipv4Res, err1 = Ipv4SecurityCheck(ipInfoV4Result, cheervisionInfoV4, language)
|
||||
}()
|
||||
wg.Wait()
|
||||
securityHead, err2 := printhead.PrintDatabaseInfo(language)
|
||||
if err1 == nil && err2 == nil {
|
||||
securityInfo = securityHead + Green("IPV4:") + "\n" + ipv4Res + ipv4DNSRes
|
||||
return ipInfo, securityInfo, nil
|
||||
} else {
|
||||
return ipInfo, "", nil
|
||||
}
|
||||
} else {
|
||||
return ipInfo, "", nil
|
||||
}
|
||||
} else if checkType == "ipv6" {
|
||||
_, _, ipInfoV6Result, cheervisionInfoV6, _ := baseinfo.RunIpCheck("ipv6")
|
||||
if ipInfoV6Result != nil {
|
||||
ipInfo += processPrintIPInfo(" IPV6 ASN : ", " IPV6 Location : ", ipInfoV6Result)
|
||||
}
|
||||
if enableSecurityCheck {
|
||||
var (
|
||||
wg sync.WaitGroup
|
||||
ipv6Res, ipv6DNSRes string
|
||||
err1 error
|
||||
)
|
||||
wg.Add(2)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
ipv6DNSRes = BlackList(ipInfoV6Result, "ipv6", language)
|
||||
}()
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
ipv6Res, err1 = Ipv6SecurityCheck(ipInfoV6Result, cheervisionInfoV6, language)
|
||||
}()
|
||||
wg.Wait()
|
||||
securityHead, err2 := printhead.PrintDatabaseInfo(language)
|
||||
if err1 == nil && err2 == nil {
|
||||
securityInfo = securityHead + Green("IPV6:") + "\n" + ipv6Res + ipv6DNSRes
|
||||
return ipInfo, securityInfo, nil
|
||||
} else {
|
||||
return ipInfo, "", nil
|
||||
}
|
||||
} else {
|
||||
return ipInfo, "", nil
|
||||
}
|
||||
}
|
||||
return "", "", fmt.Errorf("wrong in NetworkCheck")
|
||||
return network.NetworkCheck(checkType, enableSecurityCheck, language)
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
package network
|
||||
package network1
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
@@ -6,6 +6,7 @@ import (
|
||||
)
|
||||
|
||||
// 常用端口阻断检测 TCP/UDP/ICMP 协议
|
||||
// 本包不在main中使用
|
||||
func EmailCheck() {
|
||||
res := email.EmailCheck()
|
||||
fmt.Println(res)
|
||||
|
@@ -3,6 +3,7 @@ package speedtest
|
||||
import (
|
||||
"github.com/oneclickvirt/speedtest/model"
|
||||
"github.com/oneclickvirt/speedtest/sp"
|
||||
"runtime"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -11,7 +12,11 @@ func ShowHead(language string) {
|
||||
}
|
||||
|
||||
func NearbySP() {
|
||||
sp.NearbySpeedTest()
|
||||
if runtime.GOOS == "windows" || sp.OfficialAvailableTest() != nil {
|
||||
sp.NearbySpeedTest()
|
||||
} else {
|
||||
sp.OfficialNearbySpeedTest()
|
||||
}
|
||||
}
|
||||
|
||||
func CustomSP(platform, operator string, num int) {
|
||||
@@ -53,5 +58,9 @@ func CustomSP(platform, operator string, num int) {
|
||||
}
|
||||
parseType = "id"
|
||||
}
|
||||
sp.CustomSpeedTest(url, parseType, num)
|
||||
if runtime.GOOS == "windows" || sp.OfficialAvailableTest() != nil {
|
||||
sp.CustomSpeedTest(url, parseType, num)
|
||||
} else {
|
||||
sp.OfficialCustomSpeedTest(url, parseType, num)
|
||||
}
|
||||
}
|
||||
|
@@ -1,24 +1,26 @@
|
||||
package unlocktest
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/oneclickvirt/UnlockTests/utils"
|
||||
"github.com/oneclickvirt/UnlockTests/uts"
|
||||
"github.com/oneclickvirt/defaultset"
|
||||
)
|
||||
|
||||
func MediaTest(language string) string {
|
||||
var res string
|
||||
readStatus := uts.ReadSelect(language, "0")
|
||||
if !readStatus {
|
||||
return ""
|
||||
}
|
||||
if uts.IPV4 {
|
||||
fmt.Println(defaultset.Blue("IPV4:"))
|
||||
return uts.RunTests(utils.Ipv4HttpClient, "ipv4", language, false)
|
||||
res += defaultset.Blue("IPV4:") + "\n"
|
||||
res += uts.RunTests(utils.Ipv4HttpClient, "ipv4", language, false)
|
||||
return res
|
||||
}
|
||||
if uts.IPV6 {
|
||||
fmt.Println(defaultset.Blue("IPV6:"))
|
||||
return uts.RunTests(utils.Ipv6HttpClient, "ipv6", language, false)
|
||||
res += defaultset.Blue("IPV6:") + "\n"
|
||||
res += uts.RunTests(utils.Ipv6HttpClient, "ipv6", language, false)
|
||||
return res
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
232
utils/utils.go
Normal file
232
utils/utils.go
Normal file
@@ -0,0 +1,232 @@
|
||||
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"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
"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("VPS融合怪测试", 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("VPS 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, securtyCheckStatus bool) (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", securtyCheckStatus, 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 {
|
||||
// 保存旧的 stdout 和 stderr
|
||||
oldStdout := os.Stdout
|
||||
oldStderr := os.Stderr
|
||||
// 创建管道
|
||||
stdoutPipeR, stdoutPipeW, err := os.Pipe()
|
||||
if err != nil {
|
||||
return "Error creating stdout pipe"
|
||||
}
|
||||
stderrPipeR, stderrPipeW, err := os.Pipe()
|
||||
if err != nil {
|
||||
stdoutPipeW.Close()
|
||||
stdoutPipeR.Close()
|
||||
return "Error creating stderr pipe"
|
||||
}
|
||||
// 替换标准输出和标准错误输出为管道写入端
|
||||
os.Stdout = stdoutPipeW
|
||||
os.Stderr = stderrPipeW
|
||||
// 恢复标准输出和标准错误输出
|
||||
defer func() {
|
||||
os.Stdout = oldStdout
|
||||
os.Stderr = oldStderr
|
||||
stdoutPipeW.Close()
|
||||
stderrPipeW.Close()
|
||||
stdoutPipeR.Close()
|
||||
stderrPipeR.Close()
|
||||
}()
|
||||
// 缓冲区
|
||||
var stdoutBuf, stderrBuf bytes.Buffer
|
||||
// 并发读取 stdout 和 stderr
|
||||
done := make(chan struct{})
|
||||
go func() {
|
||||
multiWriter := io.MultiWriter(&stdoutBuf, oldStdout)
|
||||
io.Copy(multiWriter, stdoutPipeR)
|
||||
done <- struct{}{}
|
||||
}()
|
||||
go func() {
|
||||
multiWriter := io.MultiWriter(&stderrBuf, oldStderr)
|
||||
io.Copy(multiWriter, stderrPipeR)
|
||||
done <- struct{}{}
|
||||
}()
|
||||
// 执行函数
|
||||
f()
|
||||
// 关闭管道写入端,让管道读取端可以读取所有数据
|
||||
stdoutPipeW.Close()
|
||||
stderrPipeW.Close()
|
||||
// 等待两个 goroutine 完成
|
||||
<-done
|
||||
<-done
|
||||
// 返回捕获的输出字符串
|
||||
// stderrBuf.String()
|
||||
return stdoutBuf.String()
|
||||
}
|
||||
|
||||
// PrintAndCapture 捕获函数输出的同时打印内容
|
||||
func PrintAndCapture(f func(), tempOutput, output string) string {
|
||||
tempOutput = CaptureOutput(f)
|
||||
output += tempOutput
|
||||
return output
|
||||
}
|
||||
|
||||
// UploadText 上传文本内容到指定URL
|
||||
func UploadText(absPath string) (string, error) {
|
||||
url := "https://paste.spiritlhl.net/api/upload"
|
||||
token := network.SecurityUploadToken
|
||||
client := req.DefaultClient()
|
||||
client.SetTimeout(6 * time.Second)
|
||||
client.R().
|
||||
SetRetryCount(2).
|
||||
SetRetryBackoffInterval(1*time.Second, 5*time.Second).
|
||||
SetRetryFixedInterval(2 * time.Second)
|
||||
file, _ := os.Open(absPath)
|
||||
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").
|
||||
SetFileReader("file", "goecs.txt", file).
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
// ProcessAndUpload 创建结果文件并上传文件
|
||||
func ProcessAndUpload(output string, filePath string, enableUplaod bool) {
|
||||
// 检查文件是否存在
|
||||
if _, err := os.Stat(filePath); err == nil {
|
||||
// 文件存在,删除文件
|
||||
err = os.Remove(filePath)
|
||||
if err != nil {
|
||||
fmt.Println("Cannot delete file:", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
// 创建文件
|
||||
file, err := os.Create(filePath)
|
||||
if err != nil {
|
||||
fmt.Println("Cannot create file:", err)
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
// 匹配 ANSI 转义序列
|
||||
ansiRegex := regexp.MustCompile("\x1B\\[[0-9;]+[a-zA-Z]")
|
||||
// 移除 ANSI 转义序列
|
||||
cleanedOutput := ansiRegex.ReplaceAllString(output, "")
|
||||
// 写入文件
|
||||
_, err = file.WriteString(cleanedOutput)
|
||||
if err != nil {
|
||||
fmt.Println("Cannot write to file:", err)
|
||||
return
|
||||
} else {
|
||||
fmt.Println("Write test result in ", filePath)
|
||||
}
|
||||
if enableUplaod {
|
||||
// 获取文件的绝对路径
|
||||
absPath, err2 := filepath.Abs(filePath)
|
||||
if err2 != nil {
|
||||
fmt.Println("Failed to get absolute file path:", err2)
|
||||
return
|
||||
}
|
||||
// 上传文件并生成短链接
|
||||
shorturl, err3 := UploadText(absPath)
|
||||
if err3 != nil {
|
||||
fmt.Println("Upload failed, cannot generate short URL.")
|
||||
fmt.Println(err3.Error())
|
||||
return
|
||||
}
|
||||
fmt.Println("Upload successful, short URL:", shorturl)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user