Compare commits

...

60 Commits

Author SHA1 Message Date
spiritlhl
e5f3ca1ec3 fix: 添加openbsd支持,说明中添加对于CGO编译参数的说明 2025-07-17 15:46:59 +00:00
spiritlhl
e70a295a5f fix: darwin迁移使用Action自身的runner编译 2025-07-17 15:30:29 +00:00
spiritlhl
58821f2603 fix: darwin去除CGO编译需求,不再使用CGO进行编译(部分linux的C代码不可迁移) 2025-07-17 15:27:58 +00:00
spiritlhl
33a656304b fix: 更新go编译器版本 2025-07-17 15:02:20 +00:00
spiritlhl
33d9a3ccb0 fix: 减少无效输出 2025-07-17 09:31:28 +00:00
spiritlhl
1d5758999c fix: 设置缓存强制重新生成 2025-07-17 09:12:55 +00:00
spiritlhl
94ce394e04 fix: 设置缓存清除 2025-07-17 08:56:12 +00:00
spiritlhl
ede04bd2c2 fix: 设置 osxcross 的编译器 2025-07-17 08:40:20 +00:00
spiritlhl
50f6ef1f60 fix: 修复darwin的cgo编译问题 2025-07-17 06:37:02 +00:00
spiritlhl
e5129ab244 fix: 修复darwin的cgo设置识别 2025-07-17 06:27:46 +00:00
spiritlhl
15b6ba4eb8 fix: 修复darwin的cc识别 2025-07-17 06:22:43 +00:00
spiritlhl
6c77f74003 fix: 添加windows的arm架构的编译 2025-07-17 06:15:00 +00:00
spiritlhl
61a1508b53 fix: 修复依赖对cgo要求冲突的问题 2025-07-17 06:10:38 +00:00
spiritlhl
022284018d fix: 对应平台使用对应的runner 2025-07-17 05:59:47 +00:00
spiritlhl
1d682213fe fix: 修复预设 2025-07-17 05:45:24 +00:00
spiritlhl
649a09b50a fix: 修复darwin和386和arm的编译的cgo设置问题 2025-07-17 05:36:43 +00:00
spiritlhl
0fa2ff9300 fix: linux的arm不区分具体32位的版本 2025-07-17 05:25:29 +00:00
spiritlhl
b174e5cfa8 fix: darwin 不再启用cgo编译 2025-07-17 05:21:36 +00:00
spiritlhl
afd667db59 fix: 删除不必要的前置编译检测 2025-07-17 05:11:23 +00:00
spiritlhl
d846dcbf4f fix: 设置忽略弃用文件的文件夹进行编译 2025-07-17 05:05:35 +00:00
spiritlhl
f47b1e3023 fix: 不再使用goreleaser编译,直接使用原生runner进行编译 2025-07-17 05:01:53 +00:00
spiritlhl
63658bb2dc fix: 循环下载可能需要下载的依赖 2025-07-17 03:40:19 +00:00
spiritlhl
b1a8368af3 fix: 去除无效的CXX命令 2025-07-17 03:38:25 +00:00
spiritlhl
df6d1236cc fix: 暂时注释调freebsd进行编译 2025-07-17 03:12:06 +00:00
spiritlhl
7c64102581 fix: 修复头文件导入 2025-07-17 03:07:18 +00:00
spiritlhl
58cb4f3831 fix: 修复头文件导入 2025-07-17 03:04:13 +00:00
spiritlhl
20bddae048 fix: 更新版本 2025-07-17 02:49:04 +00:00
spiritlhl
3c0590ca8d fix: 删除暂不适配的freebsd-arm 2025-07-17 02:43:28 +00:00
spiritlhl
a752eeeeb0 fix: 修复配置错配 2025-07-17 02:26:32 +00:00
spiritlhl
630a28f2f2 fix: 编译顺序执行避免报错无法溯源 2025-07-17 02:14:19 +00:00
spiritlhl
cfd70e100b fix: 编译顺序执行避免报错无法溯源 2025-07-17 02:02:59 +00:00
spiritlhl
9114f5b97a fix: linux的amd64架构无需额外设置gcc 2025-07-17 01:36:26 +00:00
spiritlhl
8c0fc16384 fix: 升级默认编译容器的版本 2025-07-17 01:25:15 +00:00
spiritlhl
2ded570639 fix: 去除暂不支持的系统 2025-07-16 16:52:34 +00:00
spiritlhl
42f0cb3399 fix: 去除暂不支持的系统 2025-07-16 16:35:48 +00:00
spiritlhl
14adbddeb9 fix: 添加错误追踪 2025-07-16 16:19:21 +00:00
spiritlhl
27fd06b007 fix: 无法去除默认验证 2025-07-16 16:08:41 +00:00
spiritlhl
88db8df827 fix: 重构编译逻辑避免全部任务失败 2025-07-16 16:03:46 +00:00
spiritlhl
ec728796f4 fix: 修复缺失的前置依赖 2025-07-16 15:44:40 +00:00
spiritlhl
147e8c1113 fix: 修复缺失的前置依赖 2025-07-16 15:27:55 +00:00
spiritlhl
b9b1d5ca76 fix: 删除goreleaser的部分无效参数 2025-07-16 15:00:35 +00:00
spiritlhl
1500c8342e fix: 更新goreleaser的yaml版本 2025-07-16 14:54:49 +00:00
spiritlhl
e523ca3c84 fix: 修复cputest和memorytest的C重构,尽量使用CGO编译嵌入依赖,拓展编译支持的系统和架构,增加容错机制 2025-07-16 14:47:11 +00:00
github-actions[bot]
42943370bb chore: update ECS_VERSION to 0.1.55 in goecs.sh 2025-07-15 12:48:33 +00:00
spiritlhl
7339f0336c fix: 修复传递过程中非指针传递导致的写入丢失 2025-07-15 12:44:24 +00:00
github-actions[bot]
54bbe16563 chore: update ECS_VERSION to 0.1.54 in goecs.sh 2025-07-15 12:27:50 +00:00
spiritlhl
2a66452f40 fix: 更新版本号 2025-07-15 12:23:20 +00:00
spiritlhl
aab6bf197d fix: 修复测试项目自动切换了测试方式在测试项头部同步更改说明 2025-07-15 12:22:51 +00:00
github-actions[bot]
9206088bad chore: update ECS_VERSION to 0.1.53 in goecs.sh 2025-07-15 11:55:49 +00:00
spiritlhl
48e150036d fix: 在CPU测试自动切换测试类型的时候头部测试方式自动替换测试说明 2025-07-15 11:51:30 +00:00
spiritlhl
486b767a25 fix: 修复文本赋值顺序错位 2025-07-15 19:29:13 +08:00
spiritlhl
5a2e68bf92 fix: 修复文本赋值顺序错位 2025-07-15 19:27:11 +08:00
github-actions[bot]
97d05f4b57 chore: update ECS_VERSION to 0.1.52 in goecs.sh 2025-07-15 11:12:52 +00:00
spiritlhl
4f08a33de8 fix: 离线环境下不再尝试结果分享链接的生成 2025-07-15 10:58:40 +00:00
spiritlhl
ff8712a743 fix: 修复中途退出文本内容未正常保存并生成分享链接的问题 2025-07-15 10:51:55 +00:00
spiritlhl
abd38554b6 fix: 更新basics模块支持多盘智能检测同时显示boot和mount路径 2025-07-15 10:29:41 +00:00
github-actions[bot]
918a9b3a46 chore: update ECS_VERSION to 0.1.51 in goecs.sh 2025-07-10 08:15:00 +00:00
spiritlhl
d9dac50487 fix: 更新basics支持多盘检测,更新security数据库来源,增加maxmind数据库获取IP信息 2025-07-10 08:02:54 +00:00
spiritlhl
cd65f04433 fix: 添加测试环境类型说明 2025-07-01 13:36:18 +00:00
github-actions[bot]
8b5193eca1 chore: update ECS_VERSION to 0.1.50 in goecs.sh 2025-07-01 13:14:04 +00:00
33 changed files with 1320 additions and 220 deletions

522
.back/.goreleaser.yaml Normal file
View File

@@ -0,0 +1,522 @@
version: 2
project_name: goecs
env:
- GO111MODULE=on
before:
hooks:
- go mod tidy -v
builds:
# Linux AMD64 with CGO
- id: linux-amd64-cgo
env:
- CGO_ENABLED=1
- CC=x86_64-linux-gnu-gcc
- CGO_CFLAGS=-O2 -static -fno-stack-protector
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 -extldflags=-static
flags:
- -trimpath
goos:
- linux
goarch:
- amd64
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for linux/amd64 (CGO)"
post:
- echo "Successfully built linux/amd64 (CGO)"
- echo "---"
# Linux 386 with CGO - 修复了编译器和标志
- id: linux-386-cgo
env:
- CGO_ENABLED=1
- CC=gcc
- CGO_CFLAGS=-m32 -O1 -march=i686 -mtune=generic -fno-stack-protector
- CGO_LDFLAGS=-m32
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 -extldflags="-m32 -static"
flags:
- -trimpath
goos:
- linux
goarch:
- 386
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for linux/386 (CGO)"
post:
- echo "Successfully built linux/386 (CGO)"
- echo "---"
# Linux ARM64 with CGO
- id: linux-arm64-cgo
env:
- CGO_ENABLED=1
- CC=aarch64-linux-gnu-gcc
- CGO_CFLAGS=-O1 -fno-stack-protector
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 -extldflags=-static
flags:
- -trimpath
goos:
- linux
goarch:
- arm64
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for linux/arm64 (CGO)"
post:
- echo "Successfully built linux/arm64 (CGO)"
- echo "---"
# Windows AMD64 with CGO
- id: windows-amd64-cgo
env:
- CGO_ENABLED=1
- CC=x86_64-w64-mingw32-gcc
- CGO_CFLAGS=-O2 -static-libgcc -static-libstdc++
- CGO_LDFLAGS=-static-libgcc -static-libstdc++
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 -extldflags=-static
flags:
- -trimpath
goos:
- windows
goarch:
- amd64
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for windows/amd64 (CGO)"
post:
- echo "Successfully built windows/amd64 (CGO)"
- echo "---"
# Windows 386 with CGO - 修复了编译器名称
- id: windows-386-cgo
env:
- CGO_ENABLED=1
- CC=i686-w64-mingw32-gcc
- CGO_CFLAGS=-O2 -static-libgcc -static-libstdc++
- CGO_LDFLAGS=-static-libgcc -static-libstdc++
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 -extldflags=-static
flags:
- -trimpath
goos:
- windows
goarch:
- 386
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for windows/386 (CGO)"
post:
- echo "Successfully built windows/386 (CGO)"
- echo "---"
# Darwin AMD64 with CGO
- id: darwin-amd64-cgo
env:
- CGO_ENABLED=1
- CC=o64-clang
- CGO_CFLAGS=-O2 -arch x86_64 -mmacosx-version-min=10.12
- CGO_LDFLAGS=-arch x86_64 -mmacosx-version-min=10.12
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0
flags:
- -trimpath
goos:
- darwin
goarch:
- amd64
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for darwin/amd64 (CGO)"
- echo "Checking osxcross tools..."
- which o64-clang || echo "o64-clang not found"
- which o64-clang++ || echo "o64-clang++ not found"
post:
- echo "Successfully built darwin/amd64 (CGO)"
- echo "---"
# Darwin ARM64 with CGO
- id: darwin-arm64-cgo
env:
- CGO_ENABLED=1
- CC=oa64-clang
- CGO_CFLAGS=-O2 -arch arm64 -mmacosx-version-min=11.0
- CGO_LDFLAGS=-arch arm64 -mmacosx-version-min=11.0
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0
flags:
- -trimpath
goos:
- darwin
goarch:
- arm64
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for darwin/arm64 (CGO)"
- echo "Checking osxcross tools..."
- which oa64-clang || echo "oa64-clang not found"
- which oa64-clang++ || echo "oa64-clang++ not found"
post:
- echo "Successfully built darwin/arm64 (CGO)"
- echo "---"
# Linux RISC-V 64 with CGO
- id: linux-riscv64-cgo
env:
- CGO_ENABLED=1
- CC=riscv64-linux-gnu-gcc
- CGO_CFLAGS=-O1 -fno-stack-protector
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 -extldflags=-static
flags:
- -trimpath
goos:
- linux
goarch:
- riscv64
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for linux/riscv64 (CGO)"
post:
- echo "Successfully built linux/riscv64 (CGO)"
- echo "---"
# Linux MIPS64 with CGO
- id: linux-mips64-cgo
env:
- CGO_ENABLED=1
- CC=mips64-linux-gnuabi64-gcc
- CGO_CFLAGS=-O1 -fno-stack-protector
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 -extldflags=-static
flags:
- -trimpath
goos:
- linux
goarch:
- mips64
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for linux/mips64 (CGO)"
post:
- echo "Successfully built linux/mips64 (CGO)"
- echo "---"
# Linux MIPS64LE with CGO
- id: linux-mips64le-cgo
env:
- CGO_ENABLED=1
- CC=mips64el-linux-gnuabi64-gcc
- CGO_CFLAGS=-O1 -fno-stack-protector
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 -extldflags=-static
flags:
- -trimpath
goos:
- linux
goarch:
- mips64le
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for linux/mips64le (CGO)"
post:
- echo "Successfully built linux/mips64le (CGO)"
- echo "---"
# Linux PPC64LE with CGO
- id: linux-ppc64le-cgo
env:
- CGO_ENABLED=1
- CC=powerpc64le-linux-gnu-gcc
- CGO_CFLAGS=-O1 -fno-stack-protector
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 -extldflags=-static
flags:
- -trimpath
goos:
- linux
goarch:
- ppc64le
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for linux/ppc64le (CGO)"
post:
- echo "Successfully built linux/ppc64le (CGO)"
- echo "---"
# Linux ARM (no CGO)
- id: linux-arm-nocgo
env:
- CGO_ENABLED=0
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0
flags:
- -trimpath
goos:
- linux
goarch:
- arm
goarm:
- "5"
- "6"
- "7"
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for linux/arm (no CGO)"
post:
- echo "Successfully built linux/arm (no CGO)"
- echo "---"
# Linux S390X (no CGO)
- id: linux-s390x-nocgo
env:
- CGO_ENABLED=0
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0
flags:
- -trimpath
goos:
- linux
goarch:
- s390x
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for linux/s390x (no CGO)"
post:
- echo "Successfully built linux/s390x (no CGO)"
- echo "---"
# Linux MIPS (no CGO)
- id: linux-mips-nocgo
env:
- CGO_ENABLED=0
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0
flags:
- -trimpath
goos:
- linux
goarch:
- mips
gomips:
- softfloat
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for linux/mips (no CGO)"
post:
- echo "Successfully built linux/mips (no CGO)"
- echo "---"
# Linux MIPSLE (no CGO)
- id: linux-mipsle-nocgo
env:
- CGO_ENABLED=0
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0
flags:
- -trimpath
goos:
- linux
goarch:
- mipsle
gomips:
- softfloat
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for linux/mipsle (no CGO)"
post:
- echo "Successfully built linux/mipsle (no CGO)"
- echo "---"
# Linux PPC64 (no CGO)
- id: linux-ppc64-nocgo
env:
- CGO_ENABLED=0
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0
flags:
- -trimpath
goos:
- linux
goarch:
- ppc64
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for linux/ppc64 (no CGO)"
post:
- echo "Successfully built linux/ppc64 (no CGO)"
- echo "---"
# FreeBSD AMD64 (no CGO)
- id: freebsd-amd64-nocgo
env:
- CGO_ENABLED=0
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0
flags:
- -trimpath
goos:
- freebsd
goarch:
- amd64
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for freebsd/amd64 (no CGO)"
post:
- echo "Successfully built freebsd/amd64 (no CGO)"
- echo "---"
# FreeBSD ARM64 (no CGO)
- id: freebsd-arm64-nocgo
env:
- CGO_ENABLED=0
ldflags:
- -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0
flags:
- -trimpath
goos:
- freebsd
goarch:
- arm64
main: ./
binary: goecs
no_unique_dist_dir: true
hooks:
pre:
- echo "Starting build for freebsd/arm64 (no CGO)"
post:
- echo "Successfully built freebsd/arm64 (no CGO)"
- echo "---"
universal_binaries:
- name_template: "goecs"
replace: false
ids:
- darwin-amd64-cgo
- darwin-arm64-cgo
checksum:
name_template: "checksums.txt"
algorithm: sha256
disable: false
ids:
- linux-amd64-cgo
- linux-386-cgo
- linux-arm64-cgo
- linux-riscv64-cgo
- linux-mips64-cgo
- linux-mips64le-cgo
- linux-ppc64le-cgo
- windows-amd64-cgo
- windows-386-cgo
- darwin-amd64-cgo
- darwin-arm64-cgo
- linux-arm-nocgo
- linux-s390x-nocgo
- linux-mips-nocgo
- linux-mipsle-nocgo
- linux-ppc64-nocgo
- freebsd-amd64-nocgo
- freebsd-arm64-nocgo
extra_files:
- glob: "./goecs.sh"
snapshot:
name_template: "goecs"
archives:
- id: default
name_template: "goecs_{{ .Os }}_{{ .Arch }}"
format: zip
files:
- none*
allow_different_binary_count: true
builds:
- linux-amd64-cgo
- linux-386-cgo
- linux-arm64-cgo
- linux-riscv64-cgo
- linux-mips64-cgo
- linux-mips64le-cgo
- linux-ppc64le-cgo
- windows-amd64-cgo
- windows-386-cgo
- darwin-amd64-cgo
- darwin-arm64-cgo
- linux-arm-nocgo
- linux-s390x-nocgo
- linux-mips-nocgo
- linux-mipsle-nocgo
- linux-ppc64-nocgo
- freebsd-amd64-nocgo
- freebsd-arm64-nocgo
changelog:
sort: asc
filters:
exclude:
- "^docs:"
- "^test:"
- "^chore"
- Merge pull request
- Merge branch
- go mod tidy
- New translations

132
.back/build.yaml Normal file
View File

@@ -0,0 +1,132 @@
name: Goreleaser
on:
workflow_dispatch:
tags:
- "v*.*.*"
jobs:
goreleaser:
runs-on: ubuntu-latest
container:
# 1.20 是 Windows 7/8 Server 2008/2012 最后一个支持版本
image: goreleaser/goreleaser-cross:v1.20
steps:
- name: Configure git safe directory
run: |
git config --global --add safe.directory /__w/ecs/ecs
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: 1.23.4
- name: Configure Git for Private Modules
run: |
git config --global url."https://${{ secrets.GHT }}@github.com/".insteadOf "https://github.com/"
git config --global url."git@github.com:".insteadOf "https://github.com/"
env:
GITHUB_TOKEN: ${{ secrets.GHT }}
- name: Install missing cross-compilation tools
run: |
echo "Installing missing cross-compilation tools..."
apt-get update
PACKAGES=(
gcc-multilib
g++-multilib
linux-libc-dev
linux-libc-dev:i386
libc6-dev-i386
libc6-dev-i386-cross
gcc-aarch64-linux-gnu
gcc-riscv64-linux-gnu
gcc-mips64-linux-gnuabi64
gcc-mips64el-linux-gnuabi64
gcc-powerpc64le-linux-gnu
gcc-mingw-w64-x86-64
gcc-mingw-w64-i686
libc6-dev-amd64-cross
libc6-dev-arm64-cross
libc6-dev-riscv64-cross
libc6-dev-mips64-cross
libc6-dev-mips64el-cross
libc6-dev-ppc64el-cross
)
for pkg in "${PACKAGES[@]}"; do
echo "Installing $pkg..."
apt-get install -y "$pkg" || echo "Failed to install $pkg, continuing..."
done
- name: Verify cross-compilation tools
run: |
echo "Checking available cross-compilation tools..."
echo "=== GCC compilers ==="
which gcc || echo "gcc not found"
which x86_64-linux-gnu-gcc || echo "x86_64-linux-gnu-gcc not found"
which aarch64-linux-gnu-gcc || echo "aarch64-linux-gnu-gcc not found"
which riscv64-linux-gnu-gcc || echo "riscv64-linux-gnu-gcc not found"
which mips64-linux-gnuabi64-gcc || echo "mips64-linux-gnuabi64-gcc not found"
which mips64el-linux-gnuabi64-gcc || echo "mips64el-linux-gnuabi64-gcc not found"
which powerpc64le-linux-gnu-gcc || echo "powerpc64le-linux-gnu-gcc not found"
echo "=== MinGW compilers ==="
which x86_64-w64-mingw32-gcc || echo "x86_64-w64-mingw32-gcc not found"
which i686-w64-mingw32-gcc || echo "i686-w64-mingw32-gcc not found"
echo "=== OSXCross compilers ==="
which o64-clang || echo "o64-clang not found"
which oa64-clang || echo "oa64-clang not found"
which o64-clang++ || echo "o64-clang++ not found"
which oa64-clang++ || echo "oa64-clang++ not found"
echo "=== Clang compilers ==="
which clang || echo "clang not found"
echo "=== Available gcc binaries ==="
ls -la /usr/bin/*gcc* | head -20
echo "=== Available clang binaries ==="
ls -la /usr/bin/*clang* | head -10
echo "=== OSXCross directory ==="
ls -la /usr/osxcross/bin/ 2>/dev/null || echo "OSXCross not found in /usr/osxcross/bin/"
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v6
with:
distribution: goreleaser
version: latest
args: release --parallelism 1 --verbose
env:
GITHUB_TOKEN: ${{ secrets.GHT }}
GOPRIVATE: github.com/oneclickvirt/security
- name: Update goecs.sh with new version
run: |
if [[ "$GITHUB_REF" == refs/tags/* ]]; then
VERSION="${GITHUB_REF#refs/tags/v}"
else
VERSION=$(git describe --tags --abbrev=0 2>/dev/null | sed 's/^v//' || echo "0.1.37")
fi
echo "Using version: $VERSION"
FILE="goecs.sh"
BRANCH="master"
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git config --global --unset url."git@github.com:".insteadOf || true
git fetch origin $BRANCH
git checkout $BRANCH
if [ ! -f "$FILE" ]; then
echo "Error: $FILE not found"
exit 1
fi
sed -i "s/\(_yellow \"Unable to get version info, using default version \).*\(\".*\)/\1$VERSION\2/" "$FILE"
sed -i "s/\(ECS_VERSION=\"\).*\(\"\)/\1$VERSION\2/" "$FILE"
if git diff --quiet "$FILE"; then
echo "No changes detected in $FILE"
exit 0
fi
git add "$FILE"
git commit -m "chore: update ECS_VERSION to $VERSION in goecs.sh"
git push origin $BRANCH
env:
GITHUB_TOKEN: ${{ secrets.GHT }}

439
.github/workflows/build_binary.yaml vendored Normal file
View File

@@ -0,0 +1,439 @@
name: Build and Release
on:
workflow_dispatch:
tags:
- "v*.*.*"
jobs:
build:
name: Release Check And Build
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get latest tag
id: tag
run: |
TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.1.0")
echo "tag=$TAG" >> $GITHUB_OUTPUT
echo "version=${TAG#v}" >> $GITHUB_OUTPUT
- name: Generate changelog
id: changelog
run: |
TAG="${{ steps.tag.outputs.tag }}"
PREV_TAG=$(git describe --tags --abbrev=0 "$TAG^" 2>/dev/null || echo "")
if [ -z "$PREV_TAG" ]; then
CHANGELOG=$(git log --oneline --pretty=format:"* %H %s" "$TAG" | head -20)
else
CHANGELOG=$(git log --oneline --pretty=format:"* %H %s" "$PREV_TAG..$TAG")
fi
FULL_CHANGELOG="## Changelog"$'\n'"$CHANGELOG"
echo "$FULL_CHANGELOG" > changelog.txt
echo "changelog<<EOF" >> $GITHUB_OUTPUT
echo "$FULL_CHANGELOG" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Create release if not exists
run: |
TAG="${{ steps.tag.outputs.tag }}"
RELEASE_EXISTS=$(curl -s -H "Authorization: Bearer ${{ secrets.GHT }}" "https://api.github.com/repos/${{ github.repository }}/releases/tags/$TAG" | jq -r '.id // empty')
if [ -z "$RELEASE_EXISTS" ]; then
CHANGELOG_BODY=$(cat changelog.txt | jq -Rs .)
curl -s -X POST -H "Authorization: Bearer ${{ secrets.GHT }}" \
-H "Content-Type: application/json" \
-d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\",\"body\":$CHANGELOG_BODY,\"draft\":false,\"prerelease\":false}" \
"https://api.github.com/repos/${{ github.repository }}/releases" > /dev/null
fi
- name: Delete existing release assets
run: |
TAG="${{ steps.tag.outputs.tag }}"
RELEASE_ID=$(curl -s -H "Authorization: Bearer ${{ secrets.GHT }}" "https://api.github.com/repos/${{ github.repository }}/releases/tags/$TAG" | jq -r '.id')
if [ "$RELEASE_ID" != "null" ]; then
ASSETS=$(curl -s -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/${{ github.repository }}/releases/$RELEASE_ID/assets" | jq -r '.[] | .id')
for asset in $ASSETS; do
curl -s -X DELETE -H "Authorization: Bearer ${{ secrets.GHT }}" "https://api.github.com/repos/${{ github.repository }}/releases/assets/$asset"
done
sleep 30
fi
release-binary:
name: Release Go Binary
needs: build
strategy:
fail-fast: false
matrix:
include:
- goos: linux
goarch: amd64
cgo_enabled: "1"
cc: x86_64-linux-gnu-gcc
cflags: "-O2 -static -fno-stack-protector"
ldflags: "-extldflags=-static -s -w"
packages: "build-essential gcc"
runner: ubuntu-latest
- goos: linux
goarch: 386
cgo_enabled: "1"
cc: x86_64-linux-gnu-gcc
cflags: "-m32 -O1 -march=i686 -mtune=generic -fno-stack-protector"
ldflags: "-extldflags=-static -s -w"
packages: "build-essential gcc-multilib"
runner: ubuntu-latest
- goos: linux
goarch: arm64
cgo_enabled: "1"
cc: aarch64-linux-gnu-gcc
cflags: "-O1 -fno-stack-protector"
ldflags: "-extldflags=-static -s -w"
packages: "build-essential gcc-aarch64-linux-gnu"
runner: ubuntu-latest
- goos: linux
goarch: riscv64
cgo_enabled: "1"
cc: riscv64-linux-gnu-gcc
cflags: "-O1 -fno-stack-protector"
ldflags: "-extldflags=-static -s -w"
packages: "build-essential gcc-riscv64-linux-gnu"
runner: ubuntu-latest
- goos: linux
goarch: mips64
cgo_enabled: "1"
cc: mips64-linux-gnuabi64-gcc
cflags: "-O1 -fno-stack-protector"
ldflags: "-extldflags=-static -s -w"
packages: "build-essential gcc-mips64-linux-gnuabi64"
runner: ubuntu-latest
- goos: linux
goarch: mips64le
cgo_enabled: "1"
cc: mips64el-linux-gnuabi64-gcc
cflags: "-O1 -fno-stack-protector"
ldflags: "-extldflags=-static -s -w"
packages: "build-essential gcc-mips64el-linux-gnuabi64"
runner: ubuntu-latest
- goos: linux
goarch: ppc64le
cgo_enabled: "1"
cc: powerpc64le-linux-gnu-gcc
cflags: "-O1 -fno-stack-protector"
ldflags: "-extldflags=-static -s -w"
packages: "build-essential gcc-powerpc64le-linux-gnu"
runner: ubuntu-latest
- goos: windows
goarch: amd64
cgo_enabled: "1"
cc: x86_64-w64-mingw32-gcc
cflags: "-O2 -static-libgcc -static-libstdc++"
ldflags: "-extldflags=-static -s -w"
packages: "build-essential gcc-mingw-w64-x86-64"
runner: ubuntu-latest
- goos: windows
goarch: 386
cgo_enabled: "1"
cc: i686-w64-mingw32-gcc
cflags: "-O2 -static-libgcc -static-libstdc++"
ldflags: "-extldflags=-static -s -w"
packages: "build-essential gcc-mingw-w64-i686"
runner: ubuntu-latest
- goos: darwin
goarch: amd64
cgo_enabled: "0"
ldflags: "-s -w"
runner: macos-latest
- goos: darwin
goarch: arm64
cgo_enabled: "0"
ldflags: "-s -w"
runner: macos-latest
- goos: linux
goarch: arm
cgo_enabled: "0"
ldflags: "-s -w"
runner: ubuntu-latest
- goos: linux
goarch: s390x
cgo_enabled: "0"
ldflags: "-s -w"
runner: ubuntu-latest
- goos: linux
goarch: mips
cgo_enabled: "0"
ldflags: "-s -w"
runner: ubuntu-latest
- goos: linux
goarch: mipsle
cgo_enabled: "0"
ldflags: "-s -w"
runner: ubuntu-latest
- goos: linux
goarch: ppc64
cgo_enabled: "0"
ldflags: "-s -w"
runner: ubuntu-latest
- goos: windows
goarch: arm64
cgo_enabled: "0"
ldflags: "-s -w"
runner: ubuntu-latest
- goos: freebsd
goarch: amd64
cgo_enabled: "0"
ldflags: "-s -w"
runner: ubuntu-latest
- goos: freebsd
goarch: arm64
cgo_enabled: "0"
ldflags: "-s -w"
runner: ubuntu-latest
- goos: openbsd
goarch: amd64
cgo_enabled: "0"
ldflags: "-s -w"
runner: ubuntu-latest
- goos: openbsd
goarch: arm64
cgo_enabled: "0"
ldflags: "-s -w"
runner: ubuntu-latest
runs-on: ${{ matrix.runner }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: 1.24.5
- name: Configure Git for Private Modules
run: |
git config --global url."https://${{ secrets.GHT }}@github.com/".insteadOf "https://github.com/"
git config --global url."git@github.com:".insteadOf "https://github.com/"
env:
GITHUB_TOKEN: ${{ secrets.GHT }}
- name: Install cross-compilation tools
if: matrix.runner != 'macos-latest'
run: |
sudo apt-get update -qq
case "${{ matrix.goos }}-${{ matrix.goarch }}" in
linux-386)
sudo apt-get install -y build-essential gcc-multilib g++-multilib ;;
linux-arm64)
sudo apt-get install -y build-essential gcc-aarch64-linux-gnu ;;
linux-riscv64)
sudo apt-get install -y build-essential gcc-riscv64-linux-gnu ;;
linux-mips64)
sudo apt-get install -y build-essential gcc-mips64-linux-gnuabi64 ;;
linux-mips64le)
sudo apt-get install -y build-essential gcc-mips64el-linux-gnuabi64 ;;
linux-ppc64le)
sudo apt-get install -y build-essential gcc-powerpc64le-linux-gnu ;;
windows-amd64|windows-386)
sudo apt-get install -y build-essential gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 ;;
*)
sudo apt-get install -y build-essential ;;
esac
- name: Get latest tag
id: tag
run: |
TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.1.0")
echo "tag=$TAG" >> $GITHUB_OUTPUT
echo "version=${TAG#v}" >> $GITHUB_OUTPUT
- name: Build Binary
run: |
go clean -cache -modcache -testcache
export CGO_ENABLED=${{ matrix.cgo_enabled }}
export GOOS=${{ matrix.goos }}
export GOARCH=${{ matrix.goarch }}
if [[ -n "${{ matrix.goarm }}" ]]; then
export GOARM=${{ matrix.goarm }}
fi
if [[ -n "${{ matrix.gomips }}" ]]; then
export GOMIPS=${{ matrix.gomips }}
fi
if [[ "${{ matrix.cgo_enabled }}" == "1" && "${{ matrix.goos }}" == "darwin" ]]; then
if [[ "${{ matrix.goarch }}" == "amd64" ]]; then
export CC="x86_64-apple-darwin21.4-clang"
export CXX="x86_64-apple-darwin21.4-clang++"
elif [[ "${{ matrix.goarch }}" == "arm64" ]]; then
export CC="aarch64-apple-darwin21.4-clang"
export CXX="aarch64-apple-darwin21.4-clang++"
fi
export CGO_CFLAGS="${{ matrix.cflags }}"
export CGO_LDFLAGS="${{ matrix.ldflags }}"
export OSXCROSS_ROOT="${OSXCROSS_ROOT}"
elif [[ "${{ matrix.cgo_enabled }}" == "1" && "${{ matrix.runner }}" != "macos-latest" ]]; then
export CC="${{ matrix.cc }}"
export CGO_CFLAGS="${{ matrix.cflags }}"
if [[ "${{ matrix.goos }}" == "windows" ]]; then
export CGO_LDFLAGS="-static-libgcc -static-libstdc++"
fi
fi
if [[ "${{ matrix.cgo_enabled }}" == "1" ]]; then
echo 'int main() { return 0; }' > test.c
$CC $CGO_CFLAGS test.c -o test || exit 1
rm -f test.c test
fi
rm -rf vendor/
go mod download
go mod tidy
mkdir -p bin
BINARY_NAME="goecs"
if [[ "${{ matrix.goos }}" == "windows" ]]; then
BINARY_NAME="${BINARY_NAME}.exe"
fi
LDFLAGS="-s -w -X main.version=${{ steps.tag.outputs.version }} -X main.arch=${{ matrix.goarch }}"
if [[ "${{ matrix.cgo_enabled }}" == "1" ]]; then
LDFLAGS="${LDFLAGS} -checklinkname=0 ${{ matrix.ldflags }}"
env CGO_ENABLED=1 GOOS=$GOOS GOARCH=$GOARCH CC="$CC" CGO_CFLAGS="$CGO_CFLAGS" CGO_LDFLAGS="$CGO_LDFLAGS" \
go build -a -o bin/$BINARY_NAME -ldflags="$LDFLAGS" -trimpath ./
else
LDFLAGS="${LDFLAGS} -checklinkname=0 ${{ matrix.ldflags }}"
env CGO_ENABLED=0 GOOS=$GOOS GOARCH=$GOARCH \
go build -o bin/$BINARY_NAME -ldflags="$LDFLAGS" -trimpath ./
fi
[[ -f "bin/$BINARY_NAME" ]] || exit 1
- name: Create ZIP archive
run: |
cd bin
BINARY_NAME="goecs"
if [[ "${{ matrix.goos }}" == "windows" ]]; then
BINARY_NAME="${BINARY_NAME}.exe"
fi
ZIP_NAME="goecs_${{ matrix.goos }}_${{ matrix.goarch }}"
if [[ -n "${{ matrix.goarm }}" ]]; then
ZIP_NAME="${ZIP_NAME}v${{ matrix.goarm }}"
fi
if [[ -n "${{ matrix.gomips }}" ]]; then
ZIP_NAME="${ZIP_NAME}_${{ matrix.gomips }}"
fi
ZIP_NAME="${ZIP_NAME}.zip"
zip "$ZIP_NAME" "$BINARY_NAME"
- name: Upload to Release
run: |
TAG="${{ steps.tag.outputs.tag }}"
RELEASE_ID=$(curl -s -H "Authorization: Bearer ${{ secrets.GHT }}" "https://api.github.com/repos/${{ github.repository }}/releases/tags/$TAG" | jq -r '.id')
cd bin
for file in *.zip; do
if [[ -f "$file" ]]; then
curl -s -H "Authorization: Bearer ${{ secrets.GHT }}" \
-H "Content-Type: application/zip" \
--data-binary @"$file" \
"https://uploads.github.com/repos/${{ github.repository }}/releases/$RELEASE_ID/assets?name=$file"
fi
done
checksums:
name: Generate Checksums
runs-on: ubuntu-latest
needs: release-binary
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get latest tag
id: tag
run: |
TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.1.0")
echo "tag=$TAG" >> $GITHUB_OUTPUT
- name: Download release assets
run: |
TAG="${{ steps.tag.outputs.tag }}"
RELEASE_ID=$(curl -s -H "Authorization: Bearer ${{ secrets.GHT }}" "https://api.github.com/repos/${{ github.repository }}/releases/tags/$TAG" | jq -r '.id')
mkdir -p assets
ASSETS=$(curl -s -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/${{ github.repository }}/releases/$RELEASE_ID/assets")
echo "$ASSETS" | jq -r '.[] | select(.name | endswith(".zip")) | .browser_download_url' | while read url; do
filename=$(basename "$url")
curl -L -H "Authorization: Bearer ${{ secrets.GHT }}" "$url" -o "assets/$filename"
done
- name: Generate checksums
run: |
cd assets
sha256sum *.zip > checksums.txt
if [[ -f "../goecs.sh" ]]; then
sha256sum ../goecs.sh >> checksums.txt
fi
- name: Upload checksums
run: |
TAG="${{ steps.tag.outputs.tag }}"
RELEASE_ID=$(curl -s -H "Authorization: Bearer ${{ secrets.GHT }}" "https://api.github.com/repos/${{ github.repository }}/releases/tags/$TAG" | jq -r '.id')
curl -s -H "Authorization: Bearer ${{ secrets.GHT }}" \
-H "Content-Type: text/plain" \
--data-binary @assets/checksums.txt \
"https://uploads.github.com/repos/${{ github.repository }}/releases/$RELEASE_ID/assets?name=checksums.txt"
update-script:
name: Update Script Version
runs-on: ubuntu-latest
needs: checksums
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get latest tag
id: tag
run: |
TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.1.0")
echo "tag=$TAG" >> $GITHUB_OUTPUT
echo "version=${TAG#v}" >> $GITHUB_OUTPUT
- name: Update goecs.sh version
run: |
VERSION="${{ steps.tag.outputs.version }}"
BRANCH="master"
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git config --global --unset url."git@github.com:".insteadOf || true
git fetch origin $BRANCH
git checkout $BRANCH
if [ -f "goecs.sh" ]; then
sed -i "s/\(_yellow \"Unable to get version info, using default version \).*\(\".*\)/\1$VERSION\2/" "goecs.sh"
sed -i "s/\(ECS_VERSION=\"\).*\(\"\)/\1$VERSION\2/" "goecs.sh"
if ! git diff --quiet "goecs.sh"; then
git add "goecs.sh"
git commit -m "chore: update ECS_VERSION to $VERSION in goecs.sh"
git push origin $BRANCH
fi
fi
env:
GITHUB_TOKEN: ${{ secrets.GHT }}

View File

@@ -1,8 +1,10 @@
name: Build and Push Docker Image
on:
release:
types: [ published ]
workflow_run:
workflows: ["Build and Release"]
types:
- completed
workflow_dispatch:
jobs:

View File

@@ -1,73 +0,0 @@
name: goreleaser
on:
workflow_dispatch:
tags:
- "v*.*.*"
jobs:
goreleaser:
runs-on: ubuntu-latest
container:
# 1.20 是 Windows 7/8 Server 2008/2012 最后一个支持版本
image: goreleaser/goreleaser-cross:v1.20
steps:
- run: |
git config --global --add safe.directory /__w/ecs/ecs
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: 1.23.4
- name: Configure Git for Private Modules
run: |
git config --global url."https://${{ secrets.GHT }}@github.com/".insteadOf "https://github.com/"
git config --global url."git@github.com:".insteadOf "https://github.com/"
env:
GITHUB_TOKEN: ${{ secrets.GHT }}
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v2
with:
distribution: goreleaser
version: latest
args: release
env:
GITHUB_TOKEN: ${{ secrets.GHT }}
GOPRIVATE: github.com/oneclickvirt/security
- name: Update goecs.sh with new version
run: |
if [[ "$GITHUB_REF" == refs/tags/* ]]; then
VERSION="${GITHUB_REF#refs/tags/v}"
else
VERSION=$(git describe --tags --abbrev=0 2>/dev/null | sed 's/^v//' || echo "0.1.37")
fi
echo "Using version: $VERSION"
FILE="goecs.sh"
BRANCH="master"
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git config --global --unset url."git@github.com:".insteadOf || true
git fetch origin $BRANCH
git checkout $BRANCH
if [ ! -f "$FILE" ]; then
echo "Error: $FILE not found"
exit 1
fi
sed -i "s/\(_yellow \"Unable to get version info, using default version \).*\(\".*\)/\1$VERSION\2/" "$FILE"
sed -i "s/\(ECS_VERSION=\"\).*\(\"\)/\1$VERSION\2/" "$FILE"
if git diff --quiet "$FILE"; then
echo "No changes detected in $FILE"
exit 0
fi
git add "$FILE"
git commit -m "chore: update ECS_VERSION to $VERSION in goecs.sh"
git push origin $BRANCH
env:
GITHUB_TOKEN: ${{ secrets.GHT }}

View File

@@ -1,8 +1,10 @@
name: Public Build
on:
release:
types: [ published ]
workflow_run:
workflows: ["Build and Release"]
types:
- completed
workflow_dispatch:
jobs:
@@ -68,9 +70,7 @@ jobs:
- name: Build and Test
run: |
# 构建二进制文件
go build -o maintest
# 测试无菜单模式是否正常运行(禁用 security 检测)
env CGO_ENABLED=1 go build -o maintest
./maintest -menu=false -l en -security=false -upload=false || exit 1
rm -rf maintest

View File

@@ -1,8 +1,10 @@
name: Sync Latest Release
on:
release:
types: [published]
workflow_run:
workflows: ["Build and Release"]
types:
- completed
workflow_dispatch:
jobs:

View File

@@ -30,9 +30,9 @@ Shell 版本:[https://github.com/spiritLHLS/ecs](https://github.com/spiritLHLS
| 编译支持的架构 | 测试支持的架构 | 编译支持的系统 | 测试支持的系统 |
|---------------------------|-----------|---------|-----------|
| amd64 | amd64 | Linux | Linux |
| arm | arm | Windows | Windows |
| arm64 | arm64 | FreeBSD | FreeBSD |
| 386 | 386 | OpenBSD | |
| arm | | Windows | Windows |
| arm64 | arm64 | FreeBSD | |
| 386 | | OpenBSD | |
| mips | | MacOS | MacOS |
| mipsle | | | |
| s390x | s390x | | |
@@ -62,6 +62,7 @@ Shell 版本:[https://github.com/spiritLHLS/ecs](https://github.com/spiritLHLS
- 三网路由测试:基于 [NTrace-core](https://github.com/nxtrace/NTrace-core),二次开发至 [nt3](https://github.com/oneclickvirt/nt3)
- 网速测试:基于 [speedtest.net](https://github.com/spiritLHLS/speedtest.net-CN-ID) 和 [speedtest.cn](https://github.com/spiritLHLS/speedtest.cn-CN-ID) 数据,开发至 [oneclickvirt/speedtest](https://github.com/oneclickvirt/speedtest)
- 三网 Ping 值测试:借鉴 [ecsspeed](https://github.com/spiritLHLS/ecsspeed),二次开发至 [pingtest](https://github.com/oneclickvirt/pingtest)
- 支持root或admin环境下测试支持非root或非admin环境下测试支持离线环境下进行测试**暂未**支持无DNS环境下进行测试
**本项目初次使用建议查看说明:[跳转](https://github.com/oneclickvirt/ecs/blob/master/README_NEW_USER.md)**
@@ -305,9 +306,11 @@ export PATH=$PATH:/usr/local/go/bin
3. 编译
```bash
go build -o goecs
env CGO_ENABLED=1 go build -o goecs
```
CGO在某些系统和架构中可能需要设置为0请都进行尝试直到编译成功无报错。
4. 运行测试
```bash
./goecs -menu=false -l zh
@@ -368,7 +371,7 @@ GOOS=darwin GOARCH=amd64 go build -o goecs_darwin
## 致谢
感谢 [he.net](https://he.net) [bgp.tools](https://bgp.tools) [ipinfo.io](https://ipinfo.io) [ip.sb](https://ip.sb) [cheervision.co](https://cheervision.co) [scamalytics.com](https://scamalytics.com) [abuseipdb.com](https://www.abuseipdb.com/) [virustotal.com](https://www.virustotal.com/) [ip2location.com](https://ip2location.com/) [ip-api.com](https://ip-api.com) [ipregistry.co](https://ipregistry.co/) [ipdata.co](https://ipdata.co/) [ipgeolocation.io](https://ipgeolocation.io) [ipwhois.io](https://ipwhois.io) [ipapi.com](https://ipapi.com/) [ipapi.is](https://ipapi.is/) [ipqualityscore.com](https://www.ipqualityscore.com/) [bigdatacloud.com](https://www.bigdatacloud.com/) 等网站提供的API进行检测感谢互联网各网站提供的查询资源
感谢 [he.net](https://he.net) [bgp.tools](https://bgp.tools) [ipinfo.io](https://ipinfo.io) [maxmind.com](https://www.maxmind.com/en/home) [cloudflare.com](https://www.cloudflare.com/) [ip.sb](https://ip.sb) [scamalytics.com](https://scamalytics.com) [abuseipdb.com](https://www.abuseipdb.com/) [ip2location.com](https://ip2location.com/) [ip-api.com](https://ip-api.com) [ipregistry.co](https://ipregistry.co/) [ipdata.co](https://ipdata.co/) [ipgeolocation.io](https://ipgeolocation.io) [ipwhois.io](https://ipwhois.io) [ipapi.com](https://ipapi.com/) [ipapi.is](https://ipapi.is/) [ipqualityscore.com](https://www.ipqualityscore.com/) [bigdatacloud.com](https://www.bigdatacloud.com/) [dkly.net](https://data.dkly.net) [virustotal.com](https://www.virustotal.com/) 等网站提供的API进行检测感谢互联网各网站提供的查询资源
感谢

View File

@@ -28,10 +28,10 @@ Shell version: [https://github.com/spiritLHLS/ecs/blob/main/README_EN.md](https:
| Supported for Compilation | Tested on | Supported OS for Compilation | Tested OS |
|---------------------------|-----------|------------------------------|-----------|
| amd64 | amd64 | Linux | Linux |
| arm | arm | Windows | Windows |
| arm64 | arm64 | FreeBSD | FreeBSD |
| 386 | 386 | OpenBSD | |
| mips | | MacOS | MacOS |
| arm | | Windows | Windows |
| arm64 | arm64 | FreeBSD | |
| 386 | | OpenBSD | |
| mips | | MacOS(darwin) | MacOS |
| mipsle | | | |
| s390x | s390x | | |
| riscv64 | | | |
@@ -58,6 +58,7 @@ Shell version: [https://github.com/spiritLHLS/ecs/blob/main/README_EN.md](https:
- Three-network route test: Modified from [NTrace-core](https://github.com/nxtrace/NTrace-core) to [nt3](https://github.com/oneclickvirt/nt3)
- Speed test: Based on data from [speedtest.net](https://github.com/spiritLHLS/speedtest.net-CN-ID) and [speedtest.cn](https://github.com/spiritLHLS/speedtest.cn-CN-ID), developed to [oneclickvirt/speedtest](https://github.com/oneclickvirt/speedtest)
- Three-network Ping test: Modified from [ecsspeed](https://github.com/spiritLHLS/ecsspeed) to [pingtest](https://github.com/oneclickvirt/pingtest)
- Support root or admin environment testing, support non-root or non-admin environment testing, support offline environment for testing, not support no DNS environment for testing
**For first-time users of this project, it is recommended to check the instructions: [Jump to](https://github.com/oneclickvirt/ecs/blob/master/README_NEW_USER.md)**
@@ -300,9 +301,11 @@ export PATH=$PATH:/usr/local/go/bin
3. Compile
```bash
go build -o goecs
env CGO_ENABLED=1 go build -o goecs
```
CGO may need to be set to 0 in some systems and architectures, please try them all until they compile successfully without errors.
4. Run test
```bash
./goecs -menu=false -l en
@@ -362,7 +365,7 @@ Note that `goecs` allows you to specify CPU test method via parameters. The defa
## Thanks
Thank [he.net](https://he.net) [bgp.tools](https://bgp.tools) [ipinfo.io](https://ipinfo.io) [ip.sb](https://ip.sb) [cheervision.co](https://cheervision.co) [scamalytics.com](https://scamalytics.com) [abuseipdb.com](https://www.abuseipdb.com/) [virustotal.com](https://www.virustotal.com/) [ip2location.com](https://ip2location.com/) [ip-api.com](https://ip-api.com) [ipregistry.co](https://ipregistry.co/) [ipdata.co](https://ipdata.co/) [ipgeolocation.io](https://ipgeolocation.io) [ipwhois.io](https://ipwhois.io) [ipapi.com](https://ipapi.com/) [ipapi.is](https://ipapi.is/) [ipqualityscore.com](https://www.ipqualityscore.com/) [bigdatacloud.com](https://www.bigdatacloud.com/) and others for providing APIs for testing, and thanks to various websites on the Internet for providing query resources.
Thank [he.net](https://he.net) [bgp.tools](https://bgp.tools) [ipinfo.io](https://ipinfo.io) [maxmind.com](https://www.maxmind.com/en/home) [cloudflare.com](https://www.cloudflare.com/) [ip.sb](https://ip.sb) [scamalytics.com](https://scamalytics.com) [abuseipdb.com](https://www.abuseipdb.com/) [ip2location.com](https://ip2location.com/) [ip-api.com](https://ip-api.com) [ipregistry.co](https://ipregistry.co/) [ipdata.co](https://ipdata.co/) [ipgeolocation.io](https://ipgeolocation.io) [ipwhois.io](https://ipwhois.io) [ipapi.com](https://ipapi.com/) [ipapi.is](https://ipapi.is/) [ipqualityscore.com](https://www.ipqualityscore.com/) [bigdatacloud.com](https://www.bigdatacloud.com/) [dkly.net](https://data.dkly.net) [virustotal.com](https://www.virustotal.com/) and others for providing APIs for testing, and thanks to various websites on the Internet for providing query resources.
Thank

View File

@@ -250,9 +250,9 @@ Load: Displays system load.
Virtualization Architecture: Shows what virtualization architecture the host machine uses. Generally speaking, the recommended order is `Dedicated > KVM > Xen` virtualization. Other virtualization will have performance losses, leading to shared/degraded performance during use. However, this is not definitive. Only dedicated servers have completely independent resource usage; other virtualization methods basically all have resource sharing, depending on whether the host machine seller has a conscience. The specific performance merits still depend on the specialized tests that follow.
NAT Type: Displays NAT type. Specifically recommended in order: `Full Cone > Restricted Cone > Port Restricted Cone > Symmetric`. When not detectable, it will show `Inconclusive`. Generally speaking, if you're not using it for special purposes (related to special proxy and real-time communication needs), you don't need to pay attention to this metric.
NAT Type: Displays NAT type. Specifically recommended in order: ```Full Cone > Restricted Cone > Port Restricted Cone > Symmetric```. When not detectable, it will show ```Inconclusive```. Generally speaking, if you're not using it for special purposes (related to special proxy and real-time communication needs), you don't need to pay attention to this metric.
TCP Acceleration Method: Generally this is the `cubic/bbr` congestion control protocol. Generally speaking, using bbr for proxy servers can improve network speed; for ordinary purposes, you don't need to pay attention to this indicator.
TCP Acceleration Method: Generally this is the ```cubic/bbr``` congestion control protocol. Generally speaking, using bbr for proxy servers can improve network speed; for ordinary purposes, you don't need to pay attention to this indicator.
IPv4/IPv6 ASN: Displays the ASN organization ID and name that the host machine's IP belongs to. The same IDC may have multiple ASNs, and an ASN may have multiple vendors selling servers with different IP segments. The specific upstream and downstream relationships are complex and can be further viewed using bgp.tool.
@@ -273,17 +273,17 @@ Supports selecting `GeekBench` and `Sysbench` for testing through command line p
| Test Content | Only tests computational performance, based on prime number calculation | Covers multiple performance tests, weighted score calculation, but some tests are not commonly used in practice |
| Applicable Scenarios | Suitable for quick testing, only tests computational performance | Suitable for comprehensive testing |
By default, `Sysbench` is used for testing, with the baseline roughly as follows:
By default, ```Sysbench``` is used for testing, with the baseline roughly as follows:
CPU test single-core `Sysbench` scores above 5000 can be considered first tier, 4000 to 5000 points second tier, with roughly one tier per 1000 points.
CPU test single-core ```Sysbench``` scores above 5000 can be considered first tier, 4000 to 5000 points second tier, with roughly one tier per 1000 points.
AMD's 7950x single-core full performance score is around 6500, AMD's 5950x single-core full performance score is around 5700, Intel's ordinary CPUs (E5 series, etc.) are around 1000~800, and single-core CPUs scoring below 500 can be said to have relatively poor performance.
Sometimes multi-core scores are the same as single-core scores, proving that the vendor is limiting program concurrent use of CPU, a typical example being Tencent Cloud.
Benchmarks for ```Sysbench`` can be found in the [CPU Performance Ladder For Sysbench](https://sysbench.spiritlhl.net/) ladder chart, with specific scores regardless of the version of sysbench tested.
Benchmarks for ```Sysbench``` can be found in the [CPU Performance Ladder For Sysbench](https://sysbench.spiritlhl.net/) ladder chart, with specific scores regardless of the version of sysbench tested.
For `GeekBench` baselines, see the [official website](https://browser.geekbench.com/processor-benchmarks/) ladder chart. Specific scores differ for each `GeekBench` version, so note which `GeekBench` version is being used when testing.
For ```GeekBench``` baselines, see the [official website](https://browser.geekbench.com/processor-benchmarks/) ladder chart. Specific scores differ for each ```GeekBench``` version, so note which ```GeekBench``` version is being used when testing.
As an additional note, many things tested by `GeekBench` are not actually used in server usage processes, so the test is for reference only. Of course, `Sysbench` is very incomplete, but it can roughly compare CPU performance based on the most basic computational performance.

View File

@@ -1,17 +1,17 @@
package cputest
import (
"fmt"
"github.com/oneclickvirt/cputest/cpu"
"runtime"
"strings"
"github.com/oneclickvirt/cputest/cpu"
)
func CpuTest(language, testMethod, testThread string) {
var res string
func CpuTest(language, testMethod, testThread string) (realTestMethod, res string) {
if runtime.GOOS == "windows" {
if testMethod != "winsat" && testMethod != "" {
res = "Detected host is Windows, using Winsat for testing.\n"
// res = "Detected host is Windows, using Winsat for testing.\n"
realTestMethod = "winsat"
}
res += cpu.WinsatTest(language, testThread)
} else {
@@ -19,21 +19,28 @@ func CpuTest(language, testMethod, testThread string) {
case "sysbench":
res = cpu.SysBenchTest(language, testThread)
if res == "" {
res = "Sysbench test failed, switching to Geekbench for testing.\n"
// res = "Sysbench test failed, switching to Geekbench for testing.\n"
realTestMethod = "geekbench"
res += cpu.GeekBenchTest(language, testThread)
} else {
realTestMethod = "sysbench"
}
case "geekbench":
res = cpu.GeekBenchTest(language, testThread)
if res == "" {
res = "Geekbench test failed, switching to Sysbench for testing.\n"
// res = "Geekbench test failed, switching to Sysbench for testing.\n"
realTestMethod = "sysbench"
res += cpu.SysBenchTest(language, testThread)
} else {
realTestMethod = "geekbench"
}
default:
res = "Invalid test method specified.\n"
realTestMethod = "null"
}
}
if !strings.Contains(res, "\n") && res != "" {
res += "\n"
}
fmt.Print(res)
return
}

View File

@@ -1,9 +1,11 @@
package cputest
import (
"fmt"
"testing"
)
func Test(t *testing.T) {
CpuTest("zh", "sysbench", "1")
_, res := CpuTest("zh", "sysbench", "1")
fmt.Print(res)
}

View File

@@ -1,17 +1,17 @@
package disktest
import (
"fmt"
"github.com/oneclickvirt/disktest/disk"
"runtime"
"strings"
"github.com/oneclickvirt/disktest/disk"
)
func DiskTest(language, testMethod, testPath string, isMultiCheck bool, autoChange bool) {
var res string
func DiskTest(language, testMethod, testPath string, isMultiCheck bool, autoChange bool) (realTestMethod, res string) {
if runtime.GOOS == "windows" {
if testMethod != "winsat" && testMethod != "" {
res = "Detected host is Windows, using Winsat for testing.\n"
// res = "Detected host is Windows, using Winsat for testing.\n"
realTestMethod = "winsat"
}
res = disk.WinsatTest(language, isMultiCheck, testPath)
} else {
@@ -19,24 +19,29 @@ func DiskTest(language, testMethod, testPath string, isMultiCheck bool, autoChan
case "fio":
res = disk.FioTest(language, isMultiCheck, testPath)
if res == "" && autoChange {
res = "Fio test failed, switching to DD for testing.\n"
// res = "Fio test failed, switching to DD for testing.\n"
res += disk.DDTest(language, isMultiCheck, testPath)
realTestMethod = "dd"
} else {
realTestMethod = "fio"
}
case "dd":
res = disk.DDTest(language, isMultiCheck, testPath)
if res == "" && autoChange {
res = "DD test failed, switching to Fio for testing.\n"
// res = "DD test failed, switching to Fio for testing.\n"
res += disk.FioTest(language, isMultiCheck, testPath)
realTestMethod = "fio"
} else {
realTestMethod = "dd"
}
default:
res = "Unsupported test method specified, switching to DD for testing.\n"
// res = "Unsupported test method specified, switching to DD for testing.\n"
res += disk.DDTest(language, isMultiCheck, testPath)
realTestMethod = "dd"
}
}
//fmt.Println("--------------------------------------------------")
if !strings.Contains(res, "\n") && res != "" {
res += "\n"
}
fmt.Printf("%s", res)
//fmt.Println("--------------------------------------------------")
return
}

View File

@@ -1,7 +1,11 @@
package disktest
import "testing"
import (
"fmt"
"testing"
)
func TestDiskIoTest(t *testing.T) {
DiskTest("zh", "sysbench", "", false, false)
_, res := DiskTest("zh", "sysbench", "", false, false)
fmt.Print(res)
}

12
go.mod
View File

@@ -1,24 +1,22 @@
module github.com/oneclickvirt/ecs
go 1.24.1
toolchain go1.24.2
go 1.24.5
require (
github.com/imroc/req/v3 v3.50.0
github.com/oneclickvirt/CommonMediaTests v0.0.4-20250329123841
github.com/oneclickvirt/UnlockTests v0.0.27-20250628125053
github.com/oneclickvirt/backtrace v0.0.5-20250629024536
github.com/oneclickvirt/basics v0.0.13-20250629023612
github.com/oneclickvirt/cputest v0.0.10-20250404151448
github.com/oneclickvirt/basics v0.0.15-20250714163009
github.com/oneclickvirt/cputest v0.0.11-20250717145400
github.com/oneclickvirt/defaultset v0.0.2-20240624082446
github.com/oneclickvirt/disktest v0.0.8-20250701092629
github.com/oneclickvirt/gostun v0.0.3-20250329105202
github.com/oneclickvirt/memorytest v0.0.6-20250630141424.0.20250701113027-9edfc91f68e6
github.com/oneclickvirt/memorytest v0.0.8-20250717152547
github.com/oneclickvirt/nt3 v0.0.5-20250416131047
github.com/oneclickvirt/pingtest v0.0.8-20250701125637
github.com/oneclickvirt/portchecker v0.0.3-20250329125750
github.com/oneclickvirt/security v0.0.4-20250629033626
github.com/oneclickvirt/security v0.0.6-20250715102027
github.com/oneclickvirt/speedtest v0.0.10-20250701123931
)

16
go.sum
View File

@@ -103,10 +103,10 @@ github.com/oneclickvirt/UnlockTests v0.0.27-20250628125053 h1:Ug8kySZR1weRUcsnGO
github.com/oneclickvirt/UnlockTests v0.0.27-20250628125053/go.mod h1:yXWIZB6iLS88pEd9m4QJi1GENn+7I91zA72y5ONz2Oc=
github.com/oneclickvirt/backtrace v0.0.5-20250629024536 h1:caHCa0DHmbYWBFN1bqKxpvPnN0wOxDEqJv1VDvDdLWs=
github.com/oneclickvirt/backtrace v0.0.5-20250629024536/go.mod h1:5AH00bo41hH3d2/JVuCTlBkZUs3AXX4nlKVXb6piZcI=
github.com/oneclickvirt/basics v0.0.13-20250629023612 h1:cQg+cGBt2NMRrjhJPH+CbevZrwtMU8pIZIY2Lp6zmt4=
github.com/oneclickvirt/basics v0.0.13-20250629023612/go.mod h1:yN1IEOXN6v/GJqJSA70Pooo6nXBI/6rq72vTY72wJMQ=
github.com/oneclickvirt/cputest v0.0.10-20250404151448 h1:ovGtCwFXG0qmpyNDRqcNDIiAmhrtemCjIUXTJ1fPH0o=
github.com/oneclickvirt/cputest v0.0.10-20250404151448/go.mod h1:MmaHN9+XMntI3rLycwj8Ne31fG18IfNoa8N2utDK1CY=
github.com/oneclickvirt/basics v0.0.15-20250714163009 h1:7I1lU7N91kClw6Cb6o+vGfScc/HngrjhsaaW10AbBFs=
github.com/oneclickvirt/basics v0.0.15-20250714163009/go.mod h1:yN1IEOXN6v/GJqJSA70Pooo6nXBI/6rq72vTY72wJMQ=
github.com/oneclickvirt/cputest v0.0.11-20250717145400 h1:yExJjBdHQNil37/Ai0SKQB1Dlrq9qmkvoh7Zn68U+t0=
github.com/oneclickvirt/cputest v0.0.11-20250717145400/go.mod h1:vjlH8tkPFft1tlLOpeNskXVvurxkHaJ3+dgFxQGLXY4=
github.com/oneclickvirt/dd v0.0.2-20250701085922 h1:WiWZwcnCPhRc8hLZdvkjD2kOEpnqn1S31z1j0x3V4l0=
github.com/oneclickvirt/dd v0.0.2-20250701085922/go.mod h1:tImu9sPTkLWo2tf1dEN1xQzrylWKauj9hbU8PHfyAeU=
github.com/oneclickvirt/defaultset v0.0.2-20240624082446 h1:5Pg3mK/u/vQvSz7anu0nxzrNdELi/AcDAU1mMsmPzyc=
@@ -119,16 +119,16 @@ github.com/oneclickvirt/gostun v0.0.3-20250329105202 h1:aJ6E91Lp94lq8iWRcCaxpXTj
github.com/oneclickvirt/gostun v0.0.3-20250329105202/go.mod h1:f7DPEXAxbmwXSW33dbxtb0/KzqvOBWhTs2Or5xBerQA=
github.com/oneclickvirt/mbw v0.0.1-20250630140849 h1:p6RMhOPBnQKAm9+VEQ2axAFsidrdSdrhXMyheIyv2a8=
github.com/oneclickvirt/mbw v0.0.1-20250630140849/go.mod h1:0Vq6NRpyLmGUdfHfL3uDcFsuZhi7KlG+OCs5ky2757Y=
github.com/oneclickvirt/memorytest v0.0.6-20250630141424.0.20250701113027-9edfc91f68e6 h1:78/eMk+FGeDxxpKgkTb4GF5KJe76y8UW7Htcwm2hF9I=
github.com/oneclickvirt/memorytest v0.0.6-20250630141424.0.20250701113027-9edfc91f68e6/go.mod h1:7xMacjQobvFAtODht2hxTsB9hM2IFS7vZk3gxx+bsjo=
github.com/oneclickvirt/memorytest v0.0.8-20250717152547 h1:V4n4kkIizrHPpCwU2OECv8wUw4VcwRxZpATDDg9j8dI=
github.com/oneclickvirt/memorytest v0.0.8-20250717152547/go.mod h1:7xMacjQobvFAtODht2hxTsB9hM2IFS7vZk3gxx+bsjo=
github.com/oneclickvirt/nt3 v0.0.5-20250416131047 h1:KL0xowq19cW+FMBGMJxdqpRNoeyR+eEmb+jYSubmlTk=
github.com/oneclickvirt/nt3 v0.0.5-20250416131047/go.mod h1:CVsDJEaIdyyZHn3WKbhU8Wn6GOfmBNvJlC/dDLRqcSQ=
github.com/oneclickvirt/pingtest v0.0.8-20250701125637 h1:J28Ai5miTq1J0I4gdT8rewJSd3LwzD90L/bNiiaKfHM=
github.com/oneclickvirt/pingtest v0.0.8-20250701125637/go.mod h1:d3Ntx5m9lMll3a/k3+2B+5emj//vgDh4/NHTxs2qQE8=
github.com/oneclickvirt/portchecker v0.0.3-20250329125750 h1:TTNL0pnQlRsn046kW59I/9UWRpihttFHWnU7Ixycggk=
github.com/oneclickvirt/portchecker v0.0.3-20250329125750/go.mod h1:HQxSTrqM8/QFqHMTBZ7S8H9eEO5FkUXU1eb7ZX5Mk+k=
github.com/oneclickvirt/security v0.0.4-20250629033626 h1:DEchQ7WKKz4CzQpMlweoqA993BGncvmp1rL1ICNDJ2g=
github.com/oneclickvirt/security v0.0.4-20250629033626/go.mod h1:/5eVnZLvP7RUjwhoI6d8iIMP7msbkHC5So3ZxM+A7Zg=
github.com/oneclickvirt/security v0.0.6-20250715102027 h1:lOaFxORBT/9nBlof7EU36YP+ZIbqkhCLGyOpYQTY1qs=
github.com/oneclickvirt/security v0.0.6-20250715102027/go.mod h1:SDFBXV0sDo8pSIcGaaJ2gfCCW+NKy4pO1q9i4SIX2jc=
github.com/oneclickvirt/speedtest v0.0.10-20250701123931 h1:IMUM0F3trrlCdl9JTO+FBIJ9zc8mbi+oyd66IkO/8mI=
github.com/oneclickvirt/speedtest v0.0.10-20250701123931/go.mod h1:zd5ZgIGslmtQLQehEfRjyumlvgDHTpCSMchKfKXoASI=
github.com/onsi/ginkgo/v2 v2.22.1 h1:QW7tbJAUDyVDVOM5dFa7qaybo+CRfR7bemlQUN6Z8aM=

191
goecs.go
View File

@@ -39,7 +39,7 @@ import (
)
var (
ecsVersion = "v0.1.50"
ecsVersion = "v0.1.62"
menuMode bool
onlyChinaTest bool
input, choice string
@@ -347,6 +347,7 @@ func setUnlockOnlyTestStatus() {
}
func setHardwareOnlyTestStatus(preCheck utils.NetCheckResult) {
_ = preCheck
basicStatus = true
cpuTestStatus = true
memoryTestStatus = true
@@ -395,65 +396,77 @@ func handleSignalInterrupt(sig chan os.Signal, startTime *time.Time, output *str
seconds := int(duration.Seconds()) % 60
currentTime := time.Now().Format("Mon Jan 2 15:04:05 MST 2006")
outputMutex.Lock()
*output = utils.PrintAndCapture(func() {
timeInfo := utils.PrintAndCapture(func() {
utils.PrintCenteredTitle("", width)
fmt.Printf("Cost Time : %d min %d sec\n", minutes, seconds)
fmt.Printf("Current Time : %s\n", currentTime)
if language == "zh" {
fmt.Printf("花费 : %d 分 %d 秒\n", minutes, seconds)
fmt.Printf("时间 : %s\n", currentTime)
} else {
fmt.Printf("Cost Time : %d min %d sec\n", minutes, seconds)
fmt.Printf("Current Time : %s\n", currentTime)
}
utils.PrintCenteredTitle("", width)
}, tempOutput, *output)
}, "", "")
*output += timeInfo
finalOutput := *output
outputMutex.Unlock()
resultChan := make(chan struct {
httpURL string
httpsURL string
}, 1)
go func() {
outputMutex.Lock()
finalOutput := *output
outputMutex.Unlock()
httpURL, httpsURL := utils.ProcessAndUpload(finalOutput, filePath, enabelUpload)
resultChan <- struct {
httpURL string
httpsURL string
}{httpURL, httpsURL}
uploadDone <- true
}()
select {
case result := <-resultChan:
if result.httpURL != "" || result.httpsURL != "" {
if language == "en" {
fmt.Printf("Upload successfully!\nHttp URL: %s\nHttps URL: %s\n", result.httpURL, result.httpsURL)
} else {
fmt.Printf("上传成功!\nHttp URL: %s\nHttps URL: %s\n", result.httpURL, result.httpsURL)
if enabelUpload {
go func() {
httpURL, httpsURL := utils.ProcessAndUpload(finalOutput, filePath, enabelUpload)
resultChan <- struct {
httpURL string
httpsURL string
}{httpURL, httpsURL}
uploadDone <- true
}()
select {
case result := <-resultChan:
if result.httpURL != "" || result.httpsURL != "" {
if language == "en" {
fmt.Printf("Upload successfully!\nHttp URL: %s\nHttps URL: %s\n", result.httpURL, result.httpsURL)
} else {
fmt.Printf("上传成功!\nHttp URL: %s\nHttps URL: %s\n", result.httpURL, result.httpsURL)
}
}
time.Sleep(100 * time.Millisecond)
if runtime.GOOS == "windows" || runtime.GOOS == "darwin" {
fmt.Println("Press Enter to exit...")
fmt.Scanln()
}
os.Exit(0)
case <-time.After(30 * time.Second):
if language == "en" {
fmt.Println("Upload timeout, program exit")
} else {
fmt.Println("上传超时,程序退出")
}
if runtime.GOOS == "windows" || runtime.GOOS == "darwin" {
fmt.Println("Press Enter to exit...")
fmt.Scanln()
}
os.Exit(1)
}
time.Sleep(100 * time.Millisecond)
} else {
if runtime.GOOS == "windows" || runtime.GOOS == "darwin" {
fmt.Println("Press Enter to exit...")
fmt.Scanln()
}
os.Exit(0)
case <-time.After(30 * time.Second):
if language == "en" {
fmt.Println("Upload timeout, program exit")
} else {
fmt.Println("上传超时,程序退出")
}
if runtime.GOOS == "windows" || runtime.GOOS == "darwin" {
fmt.Println("Press Enter to exit...")
fmt.Scanln()
}
os.Exit(1)
}
}
os.Exit(0)
}
}
func runChineseTests(preCheck utils.NetCheckResult, wg1, wg2, wg3 *sync.WaitGroup, basicInfo, securityInfo, emailInfo, mediaInfo, ptInfo *string, output, tempOutput string, startTime time.Time, outputMutex *sync.Mutex) string {
output = runBasicTests(preCheck, basicInfo, securityInfo, output, tempOutput, outputMutex)
output = runCPUTest(output, tempOutput, outputMutex)
output = runMemoryTest(output, tempOutput, outputMutex)
output = runDiskTest(output, tempOutput, outputMutex)
func runChineseTests(preCheck utils.NetCheckResult, wg1, wg2, wg3 *sync.WaitGroup, basicInfo, securityInfo, emailInfo, mediaInfo, ptInfo *string, output *string, tempOutput string, startTime time.Time, outputMutex *sync.Mutex) {
*output = runBasicTests(preCheck, basicInfo, securityInfo, *output, tempOutput, outputMutex)
*output = runCPUTest(*output, tempOutput, outputMutex)
*output = runMemoryTest(*output, tempOutput, outputMutex)
*output = runDiskTest(*output, tempOutput, outputMutex)
if (onlyChinaTest || pingTestStatus) && preCheck.Connected && preCheck.StackType != "" && preCheck.StackType != "None" {
wg3.Add(1)
go func() {
@@ -476,24 +489,24 @@ func runChineseTests(preCheck utils.NetCheckResult, wg1, wg2, wg3 *sync.WaitGrou
}()
}
if preCheck.Connected && preCheck.StackType != "" && preCheck.StackType != "None" {
output = runStreamingTests(wg1, mediaInfo, output, tempOutput, outputMutex)
output = runSecurityTests(*securityInfo, output, tempOutput, outputMutex)
output = runEmailTests(wg2, emailInfo, output, tempOutput, outputMutex)
*output = runStreamingTests(wg1, mediaInfo, *output, tempOutput, outputMutex)
*output = runSecurityTests(*securityInfo, *output, tempOutput, outputMutex)
*output = runEmailTests(wg2, emailInfo, *output, tempOutput, outputMutex)
}
if runtime.GOOS != "windows" && preCheck.Connected && preCheck.StackType != "" && preCheck.StackType != "None" {
output = runNetworkTests(wg3, ptInfo, output, tempOutput, outputMutex)
*output = runNetworkTests(wg3, ptInfo, *output, tempOutput, outputMutex)
}
if preCheck.Connected && preCheck.StackType != "" && preCheck.StackType != "None" {
output = runSpeedTests(output, tempOutput, outputMutex)
*output = runSpeedTests(*output, tempOutput, outputMutex)
}
return appendTimeInfo(output, tempOutput, startTime, outputMutex)
*output = appendTimeInfo(*output, tempOutput, startTime, outputMutex)
}
func runEnglishTests(preCheck utils.NetCheckResult, wg1, wg2 *sync.WaitGroup, basicInfo, securityInfo, emailInfo, mediaInfo *string, output, tempOutput string, startTime time.Time, outputMutex *sync.Mutex) string {
output = runBasicTests(preCheck, basicInfo, securityInfo, output, tempOutput, outputMutex)
output = runCPUTest(output, tempOutput, outputMutex)
output = runMemoryTest(output, tempOutput, outputMutex)
output = runDiskTest(output, tempOutput, outputMutex)
func runEnglishTests(preCheck utils.NetCheckResult, wg1, wg2 *sync.WaitGroup, basicInfo, securityInfo, emailInfo, mediaInfo *string, output *string, tempOutput string, startTime time.Time, outputMutex *sync.Mutex) {
*output = runBasicTests(preCheck, basicInfo, securityInfo, *output, tempOutput, outputMutex)
*output = runCPUTest(*output, tempOutput, outputMutex)
*output = runMemoryTest(*output, tempOutput, outputMutex)
*output = runDiskTest(*output, tempOutput, outputMutex)
if preCheck.Connected && preCheck.StackType != "" && preCheck.StackType != "None" {
if utTestStatus {
wg1.Add(1)
@@ -509,15 +522,17 @@ func runEnglishTests(preCheck utils.NetCheckResult, wg1, wg2 *sync.WaitGroup, ba
*emailInfo = email.EmailCheck()
}()
}
output = runStreamingTests(wg1, mediaInfo, output, tempOutput, outputMutex) // 传递指针
output = runSecurityTests(*securityInfo, output, tempOutput, outputMutex)
output = runEmailTests(wg2, emailInfo, output, tempOutput, outputMutex)
output = runEnglishSpeedTests(output, tempOutput, outputMutex)
*output = runStreamingTests(wg1, mediaInfo, *output, tempOutput, outputMutex)
*output = runSecurityTests(*securityInfo, *output, tempOutput, outputMutex)
*output = runEmailTests(wg2, emailInfo, *output, tempOutput, outputMutex)
*output = runEnglishSpeedTests(*output, tempOutput, outputMutex)
}
return appendTimeInfo(output, tempOutput, startTime, outputMutex)
*output = appendTimeInfo(*output, tempOutput, startTime, outputMutex)
}
func runBasicTests(preCheck utils.NetCheckResult, basicInfo, securityInfo *string, output, tempOutput string, outputMutex *sync.Mutex) string {
outputMutex.Lock()
defer outputMutex.Unlock()
return utils.PrintAndCapture(func() {
utils.PrintHead(language, width, ecsVersion)
if basicStatus || securityTestStatus {
@@ -554,57 +569,72 @@ func runBasicTests(preCheck utils.NetCheckResult, basicInfo, securityInfo *strin
}
func runCPUTest(output, tempOutput string, outputMutex *sync.Mutex) string {
outputMutex.Lock()
defer outputMutex.Unlock()
return utils.PrintAndCapture(func() {
if cpuTestStatus {
realTestMethod, res := cputest.CpuTest(language, cpuTestMethod, cpuTestThreadMode)
if language == "zh" {
utils.PrintCenteredTitle(fmt.Sprintf("CPU测试-通过%s测试", cpuTestMethod), width)
utils.PrintCenteredTitle(fmt.Sprintf("CPU测试-通过%s测试", realTestMethod), width)
} else {
utils.PrintCenteredTitle(fmt.Sprintf("CPU-Test--%s-Method", cpuTestMethod), width)
utils.PrintCenteredTitle(fmt.Sprintf("CPU-Test--%s-Method", realTestMethod), width)
}
cputest.CpuTest(language, cpuTestMethod, cpuTestThreadMode)
fmt.Print(res)
}
}, tempOutput, output)
}
func runMemoryTest(output, tempOutput string, outputMutex *sync.Mutex) string {
outputMutex.Lock()
defer outputMutex.Unlock()
return utils.PrintAndCapture(func() {
if memoryTestStatus {
realTestMethod, res := memorytest.MemoryTest(language, memoryTestMethod)
if language == "zh" {
utils.PrintCenteredTitle(fmt.Sprintf("内存测试-通过%s测试", memoryTestMethod), width)
utils.PrintCenteredTitle(fmt.Sprintf("内存测试-通过%s测试", realTestMethod), width)
} else {
utils.PrintCenteredTitle(fmt.Sprintf("Memory-Test--%s-Method", memoryTestMethod), width)
utils.PrintCenteredTitle(fmt.Sprintf("Memory-Test--%s-Method", realTestMethod), width)
}
memorytest.MemoryTest(language, memoryTestMethod)
fmt.Print(res)
}
}, tempOutput, output)
}
func runDiskTest(output, tempOutput string, outputMutex *sync.Mutex) string {
outputMutex.Lock()
defer outputMutex.Unlock()
return utils.PrintAndCapture(func() {
if diskTestStatus && autoChangeDiskTestMethod {
realTestMethod, res := disktest.DiskTest(language, diskTestMethod, diskTestPath, diskMultiCheck, autoChangeDiskTestMethod)
if language == "zh" {
utils.PrintCenteredTitle(fmt.Sprintf("硬盘测试-通过%s测试", diskTestMethod), width)
utils.PrintCenteredTitle(fmt.Sprintf("硬盘测试-通过%s测试", realTestMethod), width)
} else {
utils.PrintCenteredTitle(fmt.Sprintf("Disk-Test--%s-Method", diskTestMethod), width)
utils.PrintCenteredTitle(fmt.Sprintf("Disk-Test--%s-Method", realTestMethod), width)
}
disktest.DiskTest(language, diskTestMethod, diskTestPath, diskMultiCheck, autoChangeDiskTestMethod)
fmt.Print(res)
} else if diskTestStatus && !autoChangeDiskTestMethod {
if language == "zh" {
utils.PrintCenteredTitle(fmt.Sprintf("硬盘测试-通过%s测试", "dd"), width)
disktest.DiskTest(language, "dd", diskTestPath, diskMultiCheck, autoChangeDiskTestMethod)
_, res := disktest.DiskTest(language, "dd", diskTestPath, diskMultiCheck, autoChangeDiskTestMethod)
fmt.Print(res)
utils.PrintCenteredTitle(fmt.Sprintf("硬盘测试-通过%s测试", "fio"), width)
disktest.DiskTest(language, "fio", diskTestPath, diskMultiCheck, autoChangeDiskTestMethod)
_, res = disktest.DiskTest(language, "fio", diskTestPath, diskMultiCheck, autoChangeDiskTestMethod)
fmt.Print(res)
} else {
utils.PrintCenteredTitle(fmt.Sprintf("Disk-Test--%s-Method", "dd"), width)
disktest.DiskTest(language, "dd", diskTestPath, diskMultiCheck, autoChangeDiskTestMethod)
_, res := disktest.DiskTest(language, "dd", diskTestPath, diskMultiCheck, autoChangeDiskTestMethod)
fmt.Print(res)
utils.PrintCenteredTitle(fmt.Sprintf("Disk-Test--%s-Method", "fio"), width)
disktest.DiskTest(language, "fio", diskTestPath, diskMultiCheck, autoChangeDiskTestMethod)
_, res = disktest.DiskTest(language, "fio", diskTestPath, diskMultiCheck, autoChangeDiskTestMethod)
fmt.Print(res)
}
}
}, tempOutput, output)
}
func runStreamingTests(wg1 *sync.WaitGroup, mediaInfo *string, output, tempOutput string, outputMutex *sync.Mutex) string {
outputMutex.Lock()
defer outputMutex.Unlock()
return utils.PrintAndCapture(func() {
if language == "zh" {
if commTestStatus && !onlyChinaTest {
@@ -625,6 +655,8 @@ func runStreamingTests(wg1 *sync.WaitGroup, mediaInfo *string, output, tempOutpu
}
func runSecurityTests(securityInfo, output, tempOutput string, outputMutex *sync.Mutex) string {
outputMutex.Lock()
defer outputMutex.Unlock()
return utils.PrintAndCapture(func() {
if securityTestStatus {
if language == "zh" {
@@ -638,6 +670,8 @@ func runSecurityTests(securityInfo, output, tempOutput string, outputMutex *sync
}
func runEmailTests(wg2 *sync.WaitGroup, emailInfo *string, output, tempOutput string, outputMutex *sync.Mutex) string {
outputMutex.Lock()
defer outputMutex.Unlock()
return utils.PrintAndCapture(func() {
if emailTestStatus {
wg2.Wait()
@@ -652,6 +686,8 @@ func runEmailTests(wg2 *sync.WaitGroup, emailInfo *string, output, tempOutput st
}
func runNetworkTests(wg3 *sync.WaitGroup, ptInfo *string, output, tempOutput string, outputMutex *sync.Mutex) string {
outputMutex.Lock()
defer outputMutex.Unlock()
output = utils.PrintAndCapture(func() {
if backtraceStatus && !onlyChinaTest {
utils.PrintCenteredTitle("三网回程线路检测", width)
@@ -678,6 +714,8 @@ func runNetworkTests(wg3 *sync.WaitGroup, ptInfo *string, output, tempOutput str
}
func runSpeedTests(output, tempOutput string, outputMutex *sync.Mutex) string {
outputMutex.Lock()
defer outputMutex.Unlock()
return utils.PrintAndCapture(func() {
if speedTestStatus {
utils.PrintCenteredTitle("就近节点测速", width)
@@ -698,6 +736,8 @@ func runSpeedTests(output, tempOutput string, outputMutex *sync.Mutex) string {
}
func runEnglishSpeedTests(output, tempOutput string, outputMutex *sync.Mutex) string {
outputMutex.Lock()
defer outputMutex.Unlock()
return utils.PrintAndCapture(func() {
if speedTestStatus {
utils.PrintCenteredTitle("Speed-Test", width)
@@ -709,6 +749,8 @@ func runEnglishSpeedTests(output, tempOutput string, outputMutex *sync.Mutex) st
}
func appendTimeInfo(output, tempOutput string, startTime time.Time, outputMutex *sync.Mutex) string {
outputMutex.Lock()
defer outputMutex.Unlock()
endTime := time.Now()
duration := endTime.Sub(startTime)
minutes := int(duration.Minutes())
@@ -752,6 +794,9 @@ func main() {
handleMenuMode(preCheck)
}
handleLanguageSpecificSettings()
if !preCheck.Connected {
enabelUpload = false
}
var (
wg1, wg2, wg3 sync.WaitGroup
basicInfo, securityInfo, emailInfo, mediaInfo, ptInfo string
@@ -765,13 +810,15 @@ func main() {
go handleSignalInterrupt(sig, &startTime, &output, tempOutput, uploadDone, &outputMutex)
switch language {
case "zh":
output = runChineseTests(preCheck, &wg1, &wg2, &wg3, &basicInfo, &securityInfo, &emailInfo, &mediaInfo, &ptInfo, output, tempOutput, startTime, &outputMutex)
runChineseTests(preCheck, &wg1, &wg2, &wg3, &basicInfo, &securityInfo, &emailInfo, &mediaInfo, &ptInfo, &output, tempOutput, startTime, &outputMutex)
case "en":
output = runEnglishTests(preCheck, &wg1, &wg2, &basicInfo, &securityInfo, &emailInfo, &mediaInfo, output, tempOutput, startTime, &outputMutex)
runEnglishTests(preCheck, &wg1, &wg2, &basicInfo, &securityInfo, &emailInfo, &mediaInfo, &output, tempOutput, startTime, &outputMutex)
default:
fmt.Println("Unsupported language")
}
handleUploadResults(output)
if preCheck.Connected {
handleUploadResults(output)
}
finish = true
if runtime.GOOS == "windows" || runtime.GOOS == "darwin" {
fmt.Println("Press Enter to exit...")

View File

@@ -143,7 +143,7 @@ goecs_check() {
os=$(uname -s 2>/dev/null || echo "Unknown")
arch=$(uname -m 2>/dev/null || echo "Unknown")
check_china
ECS_VERSION="0.1.49"
ECS_VERSION="0.1.55"
for api in \
"https://api.github.com/repos/oneclickvirt/ecs/releases/latest" \
"https://githubapi.spiritlhl.workers.dev/repos/oneclickvirt/ecs/releases/latest" \
@@ -155,8 +155,8 @@ goecs_check() {
sleep 1
done
if [ -z "$ECS_VERSION" ]; then
_yellow "Unable to get version info, using default version 0.1.49"
ECS_VERSION="0.1.49"
_yellow "Unable to get version info, using default version 0.1.55"
ECS_VERSION="0.1.55"
fi
version_output=""
for cmd_path in "goecs" "./goecs" "/usr/bin/goecs" "/usr/local/bin/goecs"; do

View File

@@ -1,17 +1,17 @@
package memorytest
import (
"fmt"
"github.com/oneclickvirt/memorytest/memory"
"runtime"
"strings"
"github.com/oneclickvirt/memorytest/memory"
)
func MemoryTest(language, testMethod string) {
var res string
func MemoryTest(language, testMethod string) (realTestMethod, res string) {
if runtime.GOOS == "windows" {
if testMethod != "winsat" && testMethod != "" {
res = "Detected host is Windows, using Winsat for testing.\n"
// res = "Detected host is Windows, using Winsat for testing.\n"
realTestMethod = "winsat"
}
res += memory.WinsatTest(language)
} else {
@@ -19,18 +19,23 @@ func MemoryTest(language, testMethod string) {
case "sysbench":
res = memory.SysBenchTest(language)
if res == "" {
res = "sysbench test failed, switch to use dd test.\n"
// res = "sysbench test failed, switch to use dd test.\n"
res += memory.DDTest(language)
realTestMethod = "dd"
} else {
realTestMethod = "sysbench"
}
case "dd":
res = memory.DDTest(language)
realTestMethod = "dd"
default:
res = "Unsupported test method, switch to use dd test.\n"
// res = "Unsupported test method, switch to use dd test.\n"
res += memory.DDTest(language)
realTestMethod = "dd"
}
}
if !strings.Contains(res, "\n") && res != "" {
res += "\n"
}
fmt.Printf("%s", res)
return
}

View File

@@ -1,9 +1,11 @@
package memorytest
import (
"fmt"
"testing"
)
func Test(t *testing.T) {
MemoryTest("zh", "sysbench")
_, res := MemoryTest("zh", "sysbench")
fmt.Print(res)
}