mirror of
				https://github.com/oneclickvirt/ecs.git
				synced 2025-10-31 10:56:37 +08:00 
			
		
		
		
	Compare commits
	
		
			134 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 73b0f30ddc | ||
|   | 825da78bd5 | ||
|   | 5d2f3c7f96 | ||
|   | 61247a206e | ||
|   | f0daad1360 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 2d23fb55a0 | ||
|   | a73dbf2d0b | ||
|   | b38dd713d9 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | e66ef1f106 | ||
|   | f6ee1e40ec | ||
|   | cb2bf0a7e5 | ||
|   | ad017db5a6 | ||
|   | a99f58518a | ||
|   | 2e59bac322 | ||
|   | 4132b1daff | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 53296b745a | ||
|   | 74630e9615 | ||
|   | 5ec7924214 | ||
|   | 7a7fdc26a0 | ||
|   | d4c855de92 | ||
|   | 7c22dee443 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 797496b640 | ||
|   | 5b686abdc8 | ||
|   | f99a37edbe | ||
|   | 4ff49c8b90 | ||
|   | 1d9257beb3 | ||
|   | fc6ccb9f92 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 88a2a7fdc9 | ||
|   | 5ff18ed7c7 | ||
|   | df897db244 | ||
|   | 9a8680491c | ||
|   | 33f81fd6aa | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 940703c3f9 | ||
|   | 1c2e9cdab9 | ||
|   | 3e6524fa0e | ||
|   | 026f40dc4c | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 110c58d401 | ||
|   | 06e76a9c33 | ||
|   | 6b88a81c02 | ||
|   | 5482506bab | ||
|   | b7130db8ce | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | dc5e3b7852 | ||
|   | 6937e69a0a | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | a68d33739c | ||
|   | 94e0441801 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 39be183fda | ||
|   | dbc1506518 | ||
|   | 149f5673d2 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | c1b7302485 | ||
|   | bf44ea9324 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 191ddfd668 | ||
|   | 89a99a7428 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | c474c71091 | ||
|   | 43b2c8aca3 | ||
|   | 96117a040e | ||
|   | c5aeda45bd | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 0b2ac51f09 | ||
|   | ffe1b65a2b | ||
|   | a4bfd4d143 | ||
|   | edbcf1c245 | ||
|   | 4c65417ea6 | ||
|   | 2cf7484881 | ||
|   | d5da2a59b6 | ||
|   | 372deb59eb | ||
|   | 8e4c6dfd3e | ||
|   | 8fc828d416 | ||
|   | 8a3fbd79e6 | ||
|   | 5628f1bb9c | ||
|   | cadbb2a45c | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 56d7560471 | ||
|   | 75e7eb1b25 | ||
|   | 24ba56cfa6 | ||
|   | ebefd64a3d | ||
|   | 4d83ffea02 | ||
|   | 01a4084462 | ||
|   | 6674093425 | ||
|   | 6d2e56b1ec | ||
|   | 2a736d3e70 | ||
|   | d02383b8cb | ||
|   | 0caba0ea60 | ||
|   | 6f92b8a994 | ||
|   | cc34baf9e1 | ||
|   | 84d8963684 | ||
|   | a94e9a6284 | ||
|   | 06007c191f | ||
|   | d013b8f90c | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 42002fdae1 | ||
|   | d7628a5a57 | ||
|   | e5f3ca1ec3 | ||
|   | e70a295a5f | ||
|   | 58821f2603 | ||
|   | 33a656304b | ||
|   | 33d9a3ccb0 | ||
|   | 1d5758999c | ||
|   | 94ce394e04 | ||
|   | ede04bd2c2 | ||
|   | 50f6ef1f60 | ||
|   | e5129ab244 | ||
|   | 15b6ba4eb8 | ||
|   | 6c77f74003 | ||
|   | 61a1508b53 | ||
|   | 022284018d | ||
|   | 1d682213fe | ||
|   | 649a09b50a | ||
|   | 0fa2ff9300 | ||
|   | b174e5cfa8 | ||
|   | afd667db59 | ||
|   | d846dcbf4f | ||
|   | f47b1e3023 | ||
|   | 63658bb2dc | ||
|   | b1a8368af3 | ||
|   | df6d1236cc | ||
|   | 7c64102581 | ||
|   | 58cb4f3831 | ||
|   | 20bddae048 | ||
|   | 3c0590ca8d | ||
|   | a752eeeeb0 | ||
|   | 630a28f2f2 | ||
|   | cfd70e100b | ||
|   | 9114f5b97a | ||
|   | 8c0fc16384 | ||
|   | 2ded570639 | ||
|   | 42f0cb3399 | ||
|   | 14adbddeb9 | ||
|   | 27fd06b007 | ||
|   | 88db8df827 | ||
|   | ec728796f4 | ||
|   | 147e8c1113 | ||
|   | b9b1d5ca76 | ||
|   | 1500c8342e | ||
|   | e523ca3c84 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 42943370bb | ||
|   | 7339f0336c | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 54bbe16563 | 
							
								
								
									
										84
									
								
								.back/.goreleaser.old
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								.back/.goreleaser.old
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| before: | ||||
|   hooks: | ||||
|     - go mod tidy -v | ||||
| builds: | ||||
|   - id: universal | ||||
|     env: | ||||
|       - CGO_ENABLED=0 | ||||
|     ldflags: | ||||
|       - -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 -extldflags=-static | ||||
|     flags: | ||||
|       - -trimpath | ||||
|     goos: | ||||
|       - linux | ||||
|       - windows | ||||
|       - freebsd | ||||
|     goarch: | ||||
|       - arm | ||||
|       - arm64 | ||||
|       - 386 | ||||
|       - amd64 | ||||
|       - mips | ||||
|       - mipsle | ||||
|       - s390x | ||||
|       - riscv64 | ||||
|     gomips: | ||||
|       - softfloat | ||||
|     ignore: | ||||
|       - goos: windows | ||||
|         goarch: arm | ||||
|     main: ./ | ||||
|     binary: goecs | ||||
|   - id: darwin-amd64 | ||||
|     env: | ||||
|       - CGO_ENABLED=1 | ||||
|       - CC=o64-clang | ||||
|       - CXX=o64-clang++ | ||||
|     ldflags: | ||||
|       - -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 | ||||
|     flags: | ||||
|       - -trimpath | ||||
|     goos: | ||||
|       - darwin | ||||
|     goarch: | ||||
|       - amd64 | ||||
|     main: ./ | ||||
|     binary: goecs | ||||
|   - id: darwin-arm64 | ||||
|     env: | ||||
|       - CGO_ENABLED=1 | ||||
|       - CC=oa64-clang | ||||
|       - CXX=oa64-clang++ | ||||
|     ldflags: | ||||
|       - -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 | ||||
|     flags: | ||||
|       - -trimpath | ||||
|     goos: | ||||
|       - darwin | ||||
|     goarch: | ||||
|       - arm64 | ||||
|     main: ./ | ||||
|     binary: goecs | ||||
| universal_binaries: | ||||
|   - name_template: "goecs" | ||||
|     replace: false | ||||
| checksum: | ||||
|   name_template: "checksums.txt" | ||||
| snapshot: | ||||
|   name_template: "goecs" | ||||
| archives: | ||||
|   - name_template: "goecs_{{ .Os }}_{{ .Arch }}" | ||||
|     format: zip | ||||
|     files: | ||||
|       - none* | ||||
| changelog: | ||||
|   sort: asc | ||||
|   filters: | ||||
|     exclude: | ||||
|       - "^docs:" | ||||
|       - "^test:" | ||||
|       - "^chore" | ||||
|       - Merge pull request | ||||
|       - Merge branch | ||||
|       - go mod tidy | ||||
|       - New translations | ||||
							
								
								
									
										522
									
								
								.back/.goreleaser.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										522
									
								
								.back/.goreleaser.yaml
									
									
									
									
									
										Normal 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 | ||||
| @@ -12,5 +12,5 @@ func Basic(language string) { | ||||
| 	ipInfo, _, _ := network.NetworkCheck("both", false, language) | ||||
| 	systemInfo := system.CheckSystemInfo(language) | ||||
| 	basicInfo := strings.ReplaceAll(systemInfo+ipInfo, "\n\n", "\n") | ||||
| 	fmt.Printf(basicInfo) | ||||
| 	fmt.Print(basicInfo) | ||||
| } | ||||
							
								
								
									
										132
									
								
								.back/build.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								.back/build.yaml
									
									
									
									
									
										Normal 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 }} | ||||
| @@ -7,5 +7,5 @@ import ( | ||||
| 
 | ||||
| func ComMediaTest(language string) { | ||||
| 	res := commediatests.MediaTests(language) | ||||
| 	fmt.Printf(res) | ||||
| 	fmt.Print(res) | ||||
| } | ||||
| @@ -15,8 +15,8 @@ func TestIpv4SecurityCheck(t *testing.T) { | ||||
| 	// 全项测试 | ||||
| 	ipInfo, securityInfo, _ := NetworkCheck("both", true, "zh") | ||||
| 	fmt.Println("--------------------------------------------------") | ||||
| 	fmt.Printf(ipInfo) | ||||
| 	fmt.Print(ipInfo) | ||||
| 	fmt.Println("--------------------------------------------------") | ||||
| 	fmt.Printf(securityInfo) | ||||
| 	fmt.Print(securityInfo) | ||||
| 	fmt.Println("--------------------------------------------------") | ||||
| } | ||||
| @@ -1,4 +1,4 @@ | ||||
| name: goreleaser | ||||
| name: Build and Release | ||||
| 
 | ||||
| on: | ||||
|   workflow_dispatch: | ||||
| @@ -22,7 +22,7 @@ jobs: | ||||
|       - name: Set up Go | ||||
|         uses: actions/setup-go@v4 | ||||
|         with: | ||||
|           go-version: 1.23.4 | ||||
|           go-version: 1.24.5 | ||||
| 
 | ||||
|       - name: Configure Git for Private Modules | ||||
|         run: | | ||||
| @@ -32,10 +32,11 @@ jobs: | ||||
|           GITHUB_TOKEN: ${{ secrets.GHT }} | ||||
| 
 | ||||
|       - name: Run GoReleaser | ||||
|         uses: goreleaser/goreleaser-action@v2 | ||||
|         uses: goreleaser/goreleaser-action@v6 | ||||
|         with: | ||||
|           distribution: goreleaser | ||||
|           version: latest | ||||
|           # version: latest | ||||
|           version: '~> v2' | ||||
|           args: release | ||||
|         env: | ||||
|           GITHUB_TOKEN: ${{ secrets.GHT }} | ||||
							
								
								
									
										467
									
								
								.github/workflows/build_binary_cgo.old
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										467
									
								
								.github/workflows/build_binary_cgo.old
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,467 @@ | ||||
| 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 or update release | ||||
|         run: | | ||||
|           TAG="${{ steps.tag.outputs.tag }}" | ||||
|           CHANGELOG_BODY=$(cat changelog.txt | jq -Rs .) | ||||
|           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 | ||||
|             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" | ||||
|           else | ||||
|             curl -s -X PATCH -H "Authorization: Bearer ${{ secrets.GHT }}" \ | ||||
|               -H "Content-Type: application/json" \ | ||||
|               -d "{\"body\":$CHANGELOG_BODY}" \ | ||||
|               "https://api.github.com/repos/${{ github.repository }}/releases/$RELEASE_EXISTS" | ||||
|           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: linux | ||||
|             goarch: arm | ||||
|             # goarm: 7 | ||||
|             cgo_enabled: "1" | ||||
|             cc: arm-linux-gnueabihf-gcc | ||||
|             cflags: "-O1 -fno-stack-protector" | ||||
|             ldflags: "-extldflags=-static -s -w" | ||||
|             packages: "build-essential gcc-arm-linux-gnueabihf" | ||||
|             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: windows | ||||
|             goarch: arm64 | ||||
|             cgo_enabled: "0" | ||||
|             ldflags: "-extldflags=-static -s -w" | ||||
|             packages: "build-essential" | ||||
|             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: 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 | ||||
|  | ||||
|     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 ;; | ||||
|             linux-arm) | ||||
|               sudo apt-get install -y build-essential gcc-arm-linux-gnueabihf ;; | ||||
|             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 | ||||
|         env: | ||||
|           CGO_ENABLED: ${{ matrix.cgo_enabled }} | ||||
|           GOOS: ${{ matrix.goos }} | ||||
|           GOARCH: ${{ matrix.goarch }} | ||||
|           CC: ${{ matrix.cc }} | ||||
|           CGO_CFLAGS: ${{ matrix.cflags }} | ||||
|           CGO_LDFLAGS: ${{ matrix.ldflags }} | ||||
|         run: | | ||||
|           go clean -cache -modcache -testcache | ||||
|            | ||||
|           # 设置额外的环境变量 | ||||
|           if [[ -n "${{ matrix.goarm }}" ]]; then | ||||
|             export GOARM=${{ matrix.goarm }} | ||||
|           fi | ||||
|           if [[ -n "${{ matrix.gomips }}" ]]; then | ||||
|             export GOMIPS=${{ matrix.gomips }} | ||||
|           fi | ||||
|            | ||||
|           # 针对 Darwin 的特殊处理 | ||||
|           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 OSXCROSS_ROOT="${OSXCROSS_ROOT}" | ||||
|           elif [[ "${{ matrix.cgo_enabled }}" == "1" && "${{ matrix.runner }}" != "macos-latest" ]]; then | ||||
|             # 对于 Windows 的特殊处理 | ||||
|             if [[ "${{ matrix.goos }}" == "windows" ]]; then | ||||
|               export CGO_LDFLAGS="-static-libgcc -static-libstdc++" | ||||
|             fi | ||||
|           fi | ||||
|            | ||||
|           # 测试编译器(仅在启用 CGO 时) | ||||
|           if [[ "${{ matrix.cgo_enabled }}" == "1" && -n "$CC" ]]; 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 | ||||
|           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 }}" | ||||
|           else | ||||
|             LDFLAGS="${LDFLAGS} -checklinkname=0 ${{ matrix.ldflags }}" | ||||
|           fi | ||||
|            | ||||
|           # 执行构建 | ||||
|           echo "Building for GOOS=$GOOS GOARCH=$GOARCH CGO_ENABLED=$CGO_ENABLED" | ||||
|           go build -a -o bin/$BINARY_NAME -ldflags="$LDFLAGS" -trimpath ./ | ||||
|            | ||||
|           # 验证文件是否存在 | ||||
|           [[ -f "bin/$BINARY_NAME" ]] || exit 1 | ||||
|            | ||||
|           # 显示构建信息 | ||||
|           echo "Built binary: bin/$BINARY_NAME" | ||||
|           ls -la bin/ | ||||
|           if command -v file >/dev/null 2>&1; then | ||||
|             file bin/$BINARY_NAME | ||||
|           fi | ||||
|  | ||||
|       - 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 }} | ||||
							
								
								
									
										527
									
								
								.github/workflows/build_binary_musl.old
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										527
									
								
								.github/workflows/build_binary_musl.old
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,527 @@ | ||||
| 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 or update release | ||||
|         run: | | ||||
|           TAG="${{ steps.tag.outputs.tag }}" | ||||
|           CHANGELOG_BODY=$(cat changelog.txt | jq -Rs .) | ||||
|           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 | ||||
|             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" | ||||
|           else | ||||
|             curl -s -X PATCH -H "Authorization: Bearer ${{ secrets.GHT }}" \ | ||||
|               -H "Content-Type: application/json" \ | ||||
|               -d "{\"body\":$CHANGELOG_BODY}" \ | ||||
|               "https://api.github.com/repos/${{ github.repository }}/releases/$RELEASE_EXISTS" | ||||
|           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 | ||||
|  | ||||
|   build-musl-toolchain: | ||||
|     name: Build musl Cross-Compiler Toolchain | ||||
|     runs-on: ubuntu-latest | ||||
|     strategy: | ||||
|       matrix: | ||||
|         target: | ||||
|           - x86_64-linux-musl | ||||
|           - i686-linux-musl | ||||
|           - aarch64-linux-musl | ||||
|           - riscv64-linux-musl | ||||
|           - mips64-linux-musl | ||||
|           - mips64el-linux-musl | ||||
|           - powerpc64le-linux-musl | ||||
|           - arm-linux-musleabihf | ||||
|     steps: | ||||
|       - name: Install build dependencies | ||||
|         run: | | ||||
|           sudo apt-get update -qq | ||||
|           sudo apt-get install -y build-essential curl | ||||
|  | ||||
|       - name: Cache musl toolchain | ||||
|         id: cache-musl | ||||
|         uses: actions/cache@v3 | ||||
|         with: | ||||
|           path: /opt/musl-${{ matrix.target }} | ||||
|           key: musl-toolchain-${{ matrix.target }}-v2 | ||||
|  | ||||
|       - name: Build musl cross-compiler | ||||
|         if: steps.cache-musl.outputs.cache-hit != 'true' | ||||
|         run: | | ||||
|           # Clone musl-cross-make | ||||
|           git clone https://github.com/richfelker/musl-cross-make.git | ||||
|           cd musl-cross-make | ||||
|            | ||||
|           # Create config for target | ||||
|           cat > config.mak << EOF | ||||
|           TARGET = ${{ matrix.target }} | ||||
|           OUTPUT = /opt/musl-${{ matrix.target }} | ||||
|           COMMON_CONFIG += --disable-nls | ||||
|           GCC_CONFIG += --enable-languages=c,c++ | ||||
|           GCC_CONFIG += --disable-libquadmath --disable-decimal-float | ||||
|           GCC_CONFIG += --disable-libitm --disable-fixed-point | ||||
|           EOF | ||||
|            | ||||
|           # Build the toolchain | ||||
|           make -j$(nproc) | ||||
|           sudo make install | ||||
|            | ||||
|           # Verify installation | ||||
|           ls -la /opt/musl-${{ matrix.target }}/bin/ | ||||
|           /opt/musl-${{ matrix.target }}/bin/${{ matrix.target }}-gcc --version | ||||
|  | ||||
|       - name: Create toolchain artifact | ||||
|         run: | | ||||
|           sudo tar -czf musl-${{ matrix.target }}-toolchain.tar.gz -C /opt musl-${{ matrix.target }} | ||||
|  | ||||
|       - name: Upload toolchain artifact | ||||
|         uses: actions/upload-artifact@v4 | ||||
|         with: | ||||
|           name: musl-${{ matrix.target }}-toolchain | ||||
|           path: musl-${{ matrix.target }}-toolchain.tar.gz | ||||
|           retention-days: 1 | ||||
|  | ||||
|   release-binary: | ||||
|     name: Release Go Binary | ||||
|     needs: [build, build-musl-toolchain] | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         include: | ||||
|           - goos: linux | ||||
|             goarch: amd64 | ||||
|             cgo_enabled: "1" | ||||
|             musl_target: x86_64-linux-musl | ||||
|             cflags: "-O2 -static -fno-stack-protector" | ||||
|             ldflags: "-extldflags=-static" | ||||
|             runner: ubuntu-latest | ||||
|  | ||||
|           - goos: linux | ||||
|             goarch: 386 | ||||
|             cgo_enabled: "1" | ||||
|             musl_target: i686-linux-musl | ||||
|             cflags: "-O1 -march=i686 -mtune=generic -fno-stack-protector" | ||||
|             ldflags: "-extldflags=-static" | ||||
|             runner: ubuntu-latest | ||||
|  | ||||
|           - goos: linux | ||||
|             goarch: arm64 | ||||
|             cgo_enabled: "1" | ||||
|             musl_target: aarch64-linux-musl | ||||
|             cflags: "-O1 -fno-stack-protector" | ||||
|             ldflags: "-extldflags=-static" | ||||
|             runner: ubuntu-latest | ||||
|  | ||||
|           - goos: linux | ||||
|             goarch: riscv64 | ||||
|             cgo_enabled: "1" | ||||
|             musl_target: riscv64-linux-musl | ||||
|             cflags: "-O1 -fno-stack-protector" | ||||
|             ldflags: "-extldflags=-static" | ||||
|             runner: ubuntu-latest | ||||
|  | ||||
|           - goos: linux | ||||
|             goarch: mips64 | ||||
|             cgo_enabled: "1" | ||||
|             musl_target: mips64-linux-musl | ||||
|             cflags: "-O1 -fno-stack-protector" | ||||
|             ldflags: "-extldflags=-static" | ||||
|             runner: ubuntu-latest | ||||
|  | ||||
|           - goos: linux | ||||
|             goarch: mips64le | ||||
|             cgo_enabled: "1" | ||||
|             musl_target: mips64el-linux-musl | ||||
|             cflags: "-O1 -fno-stack-protector" | ||||
|             ldflags: "-extldflags=-static" | ||||
|             runner: ubuntu-latest | ||||
|  | ||||
|           - goos: linux | ||||
|             goarch: ppc64le | ||||
|             cgo_enabled: "1" | ||||
|             musl_target: powerpc64le-linux-musl | ||||
|             cflags: "-O1 -fno-stack-protector" | ||||
|             ldflags: "-extldflags=-static" | ||||
|             runner: ubuntu-latest | ||||
|            | ||||
|           - goos: linux | ||||
|             goarch: arm | ||||
|             cgo_enabled: "1" | ||||
|             musl_target: arm-linux-musleabihf | ||||
|             cflags: "-O1 -fno-stack-protector" | ||||
|             ldflags: "-extldflags=-latomic -static" | ||||
|             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" | ||||
|             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" | ||||
|             packages: "build-essential gcc-mingw-w64-i686" | ||||
|             runner: ubuntu-latest | ||||
|  | ||||
|           - goos: windows | ||||
|             goarch: arm64 | ||||
|             cgo_enabled: "0" | ||||
|             ldflags: "-s -w" | ||||
|             packages: "build-essential" | ||||
|             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: 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: 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 | ||||
|  | ||||
|     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: Download musl toolchain | ||||
|         if: matrix.musl_target != '' | ||||
|         uses: actions/download-artifact@v4 | ||||
|         with: | ||||
|           name: musl-${{ matrix.musl_target }}-toolchain | ||||
|  | ||||
|       - name: Setup musl toolchain | ||||
|         if: matrix.musl_target != '' | ||||
|         run: | | ||||
|           sudo tar -xzf musl-${{ matrix.musl_target }}-toolchain.tar.gz -C /opt/ | ||||
|           echo "/opt/musl-${{ matrix.musl_target }}/bin" >> $GITHUB_PATH | ||||
|            | ||||
|           # Verify toolchain is working | ||||
|           /opt/musl-${{ matrix.musl_target }}/bin/${{ matrix.musl_target }}-gcc --version | ||||
|            | ||||
|           # Test compiler | ||||
|           echo 'int main() { return 0; }' > test.c | ||||
|           /opt/musl-${{ matrix.musl_target }}/bin/${{ matrix.musl_target }}-gcc ${{ matrix.cflags }} test.c -o test | ||||
|           rm -f test.c test | ||||
|  | ||||
|       - name: Install cross-compilation tools (non-musl) | ||||
|         if: matrix.runner != 'macos-latest' && matrix.musl_target == '' | ||||
|         run: | | ||||
|           sudo systemctl restart systemd-resolved || true | ||||
|           sudo apt-get update -qq || (sleep 10 && sudo apt-get update -qq) | ||||
|            | ||||
|           case "${{ matrix.goos }}-${{ matrix.goarch }}" in | ||||
|             windows-amd64|windows-386) | ||||
|               for i in 1 2 3; do | ||||
|                 sudo apt-get install -y build-essential gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 && break || sleep 10 | ||||
|               done ;; | ||||
|             *) | ||||
|               sudo systemctl restart systemd-resolved || true | ||||
|               for i in 1 2 3; do | ||||
|                 sudo apt-get install -y build-essential && break || sleep 10 | ||||
|               done ;; | ||||
|           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 | ||||
|         env: | ||||
|           CGO_ENABLED: ${{ matrix.cgo_enabled }} | ||||
|           GOOS: ${{ matrix.goos }} | ||||
|           GOARCH: ${{ matrix.goarch }} | ||||
|           CGO_CFLAGS: ${{ matrix.cflags }} | ||||
|           CGO_LDFLAGS: ${{ matrix.ldflags }} | ||||
|         run: | | ||||
|           go clean -cache -modcache -testcache | ||||
|            | ||||
|           # Set CC based on target | ||||
|           if [[ "${{ matrix.musl_target }}" != "" ]]; then | ||||
|             export CC="/opt/musl-${{ matrix.musl_target }}/bin/${{ matrix.musl_target }}-gcc" | ||||
|             export CXX="/opt/musl-${{ matrix.musl_target }}/bin/${{ matrix.musl_target }}-g++" | ||||
|           elif [[ "${{ matrix.cc }}" != "" ]]; then | ||||
|             export CC="${{ matrix.cc }}" | ||||
|           fi | ||||
|            | ||||
|           # 设置额外的环境变量 | ||||
|           if [[ -n "${{ matrix.goarm }}" ]]; then | ||||
|             export GOARM=${{ matrix.goarm }} | ||||
|           fi | ||||
|           if [[ -n "${{ matrix.gomips }}" ]]; then | ||||
|             export GOMIPS=${{ matrix.gomips }} | ||||
|           fi | ||||
|            | ||||
|           # 针对 Darwin 的特殊处理 | ||||
|           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 OSXCROSS_ROOT="${OSXCROSS_ROOT}" | ||||
|           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 | ||||
|           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 }}" | ||||
|           else | ||||
|             LDFLAGS="${LDFLAGS} -checklinkname=0 ${{ matrix.ldflags }}" | ||||
|           fi | ||||
|            | ||||
|           # 执行构建 | ||||
|           echo "Building for GOOS=$GOOS GOARCH=$GOARCH CGO_ENABLED=$CGO_ENABLED" | ||||
|           if [[ -n "$CC" ]]; then | ||||
|             echo "Using CC=$CC" | ||||
|           fi | ||||
|            | ||||
|           go build -a -o bin/$BINARY_NAME -ldflags="$LDFLAGS" -trimpath ./ | ||||
|            | ||||
|           # 验证文件是否存在 | ||||
|           [[ -f "bin/$BINARY_NAME" ]] || exit 1 | ||||
|            | ||||
|           # 显示构建信息 | ||||
|           echo "Built binary: bin/$BINARY_NAME" | ||||
|           ls -la bin/ | ||||
|           if command -v file >/dev/null 2>&1; then | ||||
|             file bin/$BINARY_NAME | ||||
|           fi | ||||
|  | ||||
|       - 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 }} | ||||
							
								
								
									
										26
									
								
								.github/workflows/build_docker.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								.github/workflows/build_docker.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -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: | ||||
| @@ -26,12 +28,19 @@ jobs: | ||||
|           username: ${{ secrets.DOCKER_USERNAME }} | ||||
|           password: ${{ secrets.DOCKER_PASSWORD }} | ||||
|  | ||||
|       - name: Login to CNB Registry | ||||
|       # - name: Login to CNB Registry | ||||
|       #   uses: docker/login-action@v2 | ||||
|       #   with: | ||||
|       #     registry: ${{ secrets.CNB_DOCKER_REGISTRY }} | ||||
|       #     username: ${{ secrets.CNB_USERNAME }} | ||||
|       #     password: ${{ secrets.CNB_TOKEN }} | ||||
|        | ||||
|       - name: Login to Aliyun Container Registry | ||||
|         uses: docker/login-action@v2 | ||||
|         with: | ||||
|           registry: ${{ secrets.CNB_DOCKER_REGISTRY }} | ||||
|           username: ${{ secrets.CNB_USERNAME }} | ||||
|           password: ${{ secrets.CNB_TOKEN }} | ||||
|           registry: crpi-8tmognxgyb86bm61.cn-guangzhou.personal.cr.aliyuncs.com | ||||
|           username: ${{ secrets.ALIYUN_USERNAME }} | ||||
|           password: ${{ secrets.ALIYUN_PASSWORD }} | ||||
|  | ||||
|       - name: Build and push Docker images | ||||
|         uses: docker/build-push-action@v4 | ||||
| @@ -39,8 +48,9 @@ jobs: | ||||
|           context: . | ||||
|           file: ./Dockerfile | ||||
|           platforms: linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/386,linux/riscv64 | ||||
|           # linux/mips,linux/mipsle 暂不支持 alpine, linux/s390x 编译卡死 | ||||
|           # linux/mips,linux/mipsle 暂不支持 alpine, linux/s390x 编译卡死,cnb组织空间不足无法推送 | ||||
|           # ${{ secrets.CNB_DOCKER_REGISTRY }}/oneclickvirt/ecs:latest | ||||
|           push: true | ||||
|           tags: | | ||||
|             ${{ secrets.DOCKER_USERNAME }}/goecs:latest | ||||
|             ${{ secrets.CNB_DOCKER_REGISTRY }}/oneclickvirt/ecs:latest | ||||
|             crpi-8tmognxgyb86bm61.cn-guangzhou.personal.cr.aliyuncs.com/oneclickvirt/ecs:latest | ||||
|   | ||||
| @@ -1,8 +1,10 @@ | ||||
| name: Public Build | ||||
| 
 | ||||
| on: | ||||
|   release: | ||||
|     types: [ published ] | ||||
|   workflow_run: | ||||
|     workflows: ["Build and Release"] | ||||
|     types: | ||||
|       - completed | ||||
|   workflow_dispatch: | ||||
| 
 | ||||
| jobs: | ||||
| @@ -17,7 +19,7 @@ jobs: | ||||
|     - name: Set up Go | ||||
|       uses: actions/setup-go@v5 | ||||
|       with: | ||||
|         go-version: '1.23.4' | ||||
|         go-version: '1.24.5' | ||||
|          | ||||
|     - name: Create public branch | ||||
|       run: | | ||||
| @@ -28,49 +30,21 @@ jobs: | ||||
|          | ||||
|     - name: Remove security package references | ||||
|       run: | | ||||
|         # 移除 network 包中对 security 的引用 | ||||
|         find . -type f -name "*.go" -exec sed -i 's|"github.com/oneclickvirt/security/network"|"github.com/oneclickvirt/basics/network"|g' {} + | ||||
|         # 修改 back/network/network.go | ||||
|         cat > back/network/network.go << 'EOF' | ||||
|         package network1 | ||||
| 
 | ||||
|         import "github.com/oneclickvirt/basics/network" | ||||
| 
 | ||||
|         func NetworkCheck(checkType string, enableSecurityCheck bool, language string) (string, string, error) { | ||||
|             ipInfo, _, err := network.NetworkCheck(checkType, false, language) | ||||
|             return ipInfo, "", err | ||||
|         } | ||||
|         EOF | ||||
|          | ||||
|         # 修改 utils/utils.go 中的 BasicsAndSecurityCheck 函数 | ||||
|         sed -i '/SecurityUploadToken/d' utils/utils.go | ||||
|         sed -i 's|"github.com/oneclickvirt/security/network"|"github.com/oneclickvirt/basics/network"|g' utils/utils.go | ||||
|          | ||||
|         # 在 utils/utils.go 中添加 token 常量(在 import 语句之后) | ||||
|         sed -i '/^import/,/^)/{/^)/a\'$'\n''const token = "OvwKx5qgJtf7PZgCKbtyojSU.MTcwMTUxNzY1MTgwMw"'$'\n''}' utils/utils.go | ||||
|          | ||||
|         # 修改 go.mod,移除私有仓库依赖 | ||||
|         sed -i '/github.com\/oneclickvirt\/security/d' go.mod | ||||
|          | ||||
|         # 修改 goecs.go,禁用 security 检测 | ||||
|         sed -i 's|var securityFlag = flag.Bool("security", true,|var securityFlag = flag.Bool("security", false,|g' goecs.go | ||||
|          | ||||
|         # 更新依赖 | ||||
|         go mod tidy | ||||
|          | ||||
|         # 修改 README.md 和 README_EN.md 中的敏感信息 | ||||
|         sed -i 's|但二进制文件编译至 \[securityCheck\].*)|但已开源|g' README.md | ||||
|         sed -i 's|but binary files compiled in \[securityCheck\].*)|but open sourced|g' README_EN.md | ||||
|          | ||||
|         # 修改命令行帮助信息 | ||||
|         sed -i 's|security.*Enable/Disable security test (default true)|security        Enable/Disable security test (default false)|g' README.md | ||||
|         sed -i 's|security.*Enable/Disable security test (default true)|security        Enable/Disable security test (default false)|g' README_EN.md | ||||
| 
 | ||||
|     - name: Build and Test | ||||
|       run: | | ||||
|         # 构建二进制文件 | ||||
|         go build -o maintest | ||||
|         # 测试无菜单模式是否正常运行(禁用 security 检测) | ||||
|         ./maintest -menu=false -l en -security=false -upload=false || exit 1 | ||||
|         rm -rf maintest | ||||
|          | ||||
							
								
								
									
										6
									
								
								.github/workflows/sync.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/sync.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -1,8 +1,10 @@ | ||||
| name: Sync Latest Release | ||||
|  | ||||
| on: | ||||
|   release: | ||||
|     types: [published] | ||||
|   workflow_run: | ||||
|     workflows: ["Build and Release"] | ||||
|     types: | ||||
|       - completed | ||||
|   workflow_dispatch: | ||||
|  | ||||
| jobs: | ||||
|   | ||||
| @@ -6,9 +6,7 @@ builds: | ||||
|     env: | ||||
|       - CGO_ENABLED=0 | ||||
|     ldflags: | ||||
|       - -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 -extldflags=-static | ||||
|     flags: | ||||
|       - -trimpath | ||||
|       - -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 | ||||
|     goos: | ||||
|       - linux | ||||
|       - windows | ||||
| @@ -20,6 +18,10 @@ builds: | ||||
|       - amd64 | ||||
|       - mips | ||||
|       - mipsle | ||||
|       - mips64 | ||||
|       - mips64le | ||||
|       - ppc64 | ||||
|       - ppc64le | ||||
|       - s390x | ||||
|       - riscv64 | ||||
|     gomips: | ||||
| @@ -36,8 +38,6 @@ builds: | ||||
|       - CXX=o64-clang++ | ||||
|     ldflags: | ||||
|       - -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 | ||||
|     flags: | ||||
|       - -trimpath | ||||
|     goos: | ||||
|       - darwin | ||||
|     goarch: | ||||
| @@ -51,8 +51,6 @@ builds: | ||||
|       - CXX=oa64-clang++ | ||||
|     ldflags: | ||||
|       - -s -w -X main.version={{.Version}} -X main.arch={{.Arch}} -checklinkname=0 | ||||
|     flags: | ||||
|       - -trimpath | ||||
|     goos: | ||||
|       - darwin | ||||
|     goarch: | ||||
|   | ||||
							
								
								
									
										47
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| # ECS | ||||
|  | ||||
| [](https://github.com/oneclickvirt/ecs/actions/workflows/main.yaml) | ||||
| [](https://github.com/oneclickvirt/ecs/actions/workflows/build_binary.yaml) | ||||
|  | ||||
| [](https://app.fossa.com/projects/git%2Bgithub.com%2Foneclickvirt%2Fecs?ref=badge_shield) | ||||
|  | ||||
| @@ -8,7 +8,7 @@ | ||||
|  | ||||
| 融合怪测评项目 - GO版本 | ||||
|  | ||||
| (环境安装[非必须]使用shell外无额外shell文件依赖,环境安装只是为了测的更准,极端情况下无环境依赖安装也可全测项目) | ||||
| (仅环境安装[非必须]使用shell外无额外shell文件依赖,环境安装只是为了测的更准,极端情况下无环境依赖安装也可全测项目) | ||||
|  | ||||
| 如有问题请 [issues](https://github.com/oneclickvirt/ecs/issues) 反馈。 | ||||
|  | ||||
| @@ -28,24 +28,27 @@ 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 |           | | ||||
| | mips                      |           | MacOS   | MacOS     | | ||||
| | mipsle                    |           |         |           | | ||||
| | arm64                     | arm64        | Windows                   | Windows       | | ||||
| | arm                       |              | MacOS(Darwin)             | MacOS         | | ||||
| | 386                       |              | FreeBSD                   |               | | ||||
| | mips,mipsle               |              | Android                   |               | | ||||
| | mips64,mips64le           |              |                           |               |  | ||||
| | ppc64,ppc64le             |              |                           |               | | ||||
| | s390x                     | s390x        |                           |               | | ||||
| | riscv64                   |              |                           |               | | ||||
|  | ||||
|  | ||||
| > 更多架构与系统请自行测试,如有问题请开 issues。 | ||||
| > 更多架构与系统请自行测试或编译,如有问题请开 issues。 | ||||
|  | ||||
| ### **待支持的系统** | ||||
| | 系统 | 说明                        | | ||||
| |-----|---------------------------| | ||||
| | Android(arm64) | 存在权限问题未修复,非安卓系统的ARM架构无问题  | | ||||
|  | ||||
| | 系统           | 说明                       | | ||||
| |----------------|---------------------------| | ||||
| | Android(arm64) | 存在权限问题未修复,非安卓系统的ARM架构无问题      | | ||||
| | OpenBSD/NetBSD | 部分Goalng的官方库未支持本系统(尤其是net相关项目)  | | ||||
| | Windows虚拟机   | 无Admin权限的mbw测试性能不准确(内存测试) | | ||||
| | Windows物理机(非Admin下)   | 无Admin权限的mbw测试性能不准确(内存测试) | | ||||
| --- | ||||
|  | ||||
| ## **功能** | ||||
| @@ -58,11 +61,11 @@ Shell 版本:[https://github.com/spiritLHLS/ecs](https://github.com/spiritLHLS | ||||
| - 常见流媒体测试并发查询:[UnlockTests](https://github.com/oneclickvirt/UnlockTests),逻辑借鉴 [RegionRestrictionCheck](https://github.com/lmc999/RegionRestrictionCheck) 等 | ||||
| - IP 质量/安全信息并发查询:二进制文件编译至 [securityCheck](https://github.com/oneclickvirt/securityCheck) | ||||
| - 邮件端口测试:[portchecker](https://github.com/oneclickvirt/portchecker) | ||||
| - 三网回程测试:借鉴 [zhanghanyun/backtrace](https://github.com/zhanghanyun/backtrace),二次开发至 [oneclickvirt/backtrace](https://github.com/oneclickvirt/backtrace) | ||||
| - 上游及回程路由线路检测:借鉴 [zhanghanyun/backtrace](https://github.com/zhanghanyun/backtrace),二次开发至 [oneclickvirt/backtrace](https://github.com/oneclickvirt/backtrace) | ||||
| - 三网路由测试:基于 [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环境下进行测试 | ||||
| - 支持root或admin环境下测试,支持非root或非admin环境下测试,支持离线环境下进行测试,**暂未**支持无DNS环境下进行测试 | ||||
|  | ||||
| **本项目初次使用建议查看说明:[跳转](https://github.com/oneclickvirt/ecs/blob/master/README_NEW_USER.md)** | ||||
|  | ||||
| @@ -70,7 +73,7 @@ Shell 版本:[https://github.com/spiritLHLS/ecs](https://github.com/spiritLHLS | ||||
|  | ||||
| ## **使用说明** | ||||
|  | ||||
| ### **Linux/FreeBSD/OpenBSD/MacOS** | ||||
| ### **Linux/FreeBSD/MacOS** | ||||
|  | ||||
| #### **一键命令** | ||||
|  | ||||
| @@ -265,22 +268,24 @@ docker run --rm spiritlhl/goecs:latest -menu=false -l zh | ||||
|  | ||||
| 使用Docker执行测试,硬件测试会有一些偏差和虚拟化架构判断失效,还是推荐直接测试而不使用Docker测试。 | ||||
|  | ||||
| 国内镜像地址:https://cnb.cool/oneclickvirt/ecs/-/packages/docker/ecs | ||||
| 国内阿里云镜像加速 | ||||
|  | ||||
| 请确保执行下述命令前本机已安装Docker | ||||
|  | ||||
| 特权模式+host网络 | ||||
|  | ||||
| ```shell | ||||
| docker run --rm --privileged --network host docker.cnb.cool/oneclickvirt/ecs:latest -menu=false -l zh | ||||
| docker run --rm --privileged --network host crpi-8tmognxgyb86bm61.cn-guangzhou.personal.cr.aliyuncs.com/oneclickvirt/ecs:latest -menu=false -l zh | ||||
| ``` | ||||
|  | ||||
| 非特权模式+非host网络 | ||||
|  | ||||
| ```shell | ||||
| docker run --rm docker.cnb.cool/oneclickvirt/ecs:latest -menu=false -l zh | ||||
| docker run --rm crpi-8tmognxgyb86bm61.cn-guangzhou.personal.cr.aliyuncs.com/oneclickvirt/ecs:latest -menu=false -l zh | ||||
| ``` | ||||
|  | ||||
| 实际上还有CNB镜像地址 https://cnb.cool/oneclickvirt/ecs/-/packages/docker/ecs 但很可惜组织空间不足无法推送了,更推荐使用阿里云镜像加速 | ||||
|  | ||||
| </details> | ||||
|  | ||||
| --- | ||||
| @@ -393,6 +398,10 @@ GOOS=darwin GOARCH=amd64 go build -o goecs_darwin | ||||
|   <img src="https://console.zmto.com/templates/2019/dist/images/logo_dark.svg" alt="zmto" style="height: 50px;"> | ||||
| </a> | ||||
|  | ||||
| ## History Usage | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Stargazers over time | ||||
|  | ||||
| [](https://www.spiritlhl.net) | ||||
|   | ||||
							
								
								
									
										36
									
								
								README_EN.md
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								README_EN.md
									
									
									
									
									
								
							| @@ -1,6 +1,8 @@ | ||||
| # ecs | ||||
| # ECS | ||||
|  | ||||
| [](https://github.com/oneclickvirt/ecs/actions/workflows/main.yaml)  | ||||
| [](https://github.com/oneclickvirt/ecs/actions/workflows/build_binary.yaml) | ||||
|  | ||||
| [](https://app.fossa.com/projects/git%2Bgithub.com%2Foneclickvirt%2Fecs?ref=badge_shield) | ||||
|  | ||||
| [](https://hits.spiritlhl.net) | ||||
|  | ||||
| @@ -28,20 +30,26 @@ 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     | | ||||
| | mipsle                    |           |                              |           | | ||||
| | arm64                     | arm64     | Windows                      | Windows   | | ||||
| | arm                       |           | MacOS(Darwin)                | MacOS     | | ||||
| | 386                       |           | FreeBSD                      |           | | ||||
| | mips,mipsle               |           | Android                      |           | | ||||
| | mips64,mips64le           |           |                              |           |  | ||||
| | ppc64,ppc64le             |           |                              |           | | ||||
| | s390x                     | s390x     |                              |           | | ||||
| | riscv64                   |           |                              |           | | ||||
|  | ||||
| > Please test additional architectures and systems yourself. If you encounter any issues, please open an issue. | ||||
| > For more information about the architecture and system, please test or compile it yourself, and open issues if you have any questions. | ||||
|  | ||||
| ### **Systems Pending Support** | ||||
|  | ||||
| | OS     | Notes                                                                                           | | ||||
| |--------|-------------------------------------------------------------------------------------------------| | ||||
| | Android(arm64) | Permission issues that are not fixed, no problems with ARM architecture for non-Android systems    | | ||||
| | OpenBSD/NetBSD | Some of Goalng's official libraries do not support this system (especially net-related items) | | ||||
| | Windows(Virtual Machines) | Inaccurate mbw test performance without Admin rights (memory tests) |  | ||||
| | Windows(Physical Machines)(not under Admin) | Inaccurate mbw test performance without Admin rights (memory tests) | | ||||
|  | ||||
| --- | ||||
|  | ||||
| ## **Features** | ||||
| @@ -58,7 +66,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, also support non-root or non-admin environment testing, semi-support offline environment for testing, not support no DNS environment for testing | ||||
| - 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)** | ||||
|  | ||||
| @@ -66,7 +74,7 @@ Shell version: [https://github.com/spiritLHLS/ecs/blob/main/README_EN.md](https: | ||||
|  | ||||
| ## **Instructions for Use** | ||||
|  | ||||
| ### **Linux/FreeBSD/OpenBSD/MacOS** | ||||
| ### **Linux/FreeBSD/MacOS** | ||||
|  | ||||
| #### **One-click command** | ||||
|  | ||||
| @@ -338,6 +346,7 @@ GOOS=darwin GOARCH=amd64 go build -o goecs_darwin | ||||
| | Test stability | Core test components unchanged for 10+ years | Each major version updates test items, making scores hard to compare between versions (each version benchmarks against current best CPUs) | | ||||
| | Test content | Only tests computing performance | Covers multiple performance aspects with weighted scores, though some tests aren't commonly used | | ||||
| | Suitable scenarios | Good for quick tests, focuses on computing performance | Good for comprehensive testing | | ||||
| | Ranking         | [sysbench.spiritlhl.net](https://sysbench.spiritlhl.net/) | [browser.geekbench.com](https://browser.geekbench.com/) | | ||||
|  | ||||
| Note that `goecs` allows you to specify CPU test method via parameters. The default is chosen for faster testing across more systems. | ||||
|  | ||||
| @@ -387,6 +396,13 @@ Thanks also to the following platforms for editorial and testing support | ||||
|   <img src="https://console.zmto.com/templates/2019/dist/images/logo_dark.svg" alt="zmto" style="height: 50px;"> | ||||
| </a> | ||||
|  | ||||
| ## History Usage | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Stargazers over time | ||||
|  | ||||
| [](https://www.spiritlhl.net) | ||||
|  | ||||
| ## License | ||||
| [](https://app.fossa.com/projects/git%2Bgithub.com%2Foneclickvirt%2Fecs?ref=badge_large) | ||||
|   | ||||
| @@ -15,7 +15,7 @@ | ||||
| - [流媒体解锁](#流媒体解锁) | ||||
| - [IP质量检测](#IP质量检测) | ||||
| - [邮件端口检测](#邮件端口检测) | ||||
| - [三网回城线路检测](#三网回城线路检测) | ||||
| - [上游及回程线路检测](#上游及回程线路检测) | ||||
| - [三网回程路由检测](#三网回程路由检测) | ||||
| - [就近测速](#就近测速) | ||||
|  | ||||
| @@ -101,6 +101,7 @@ IPV6 子网掩码:根据宿主机信息查询的本机IPV6子网大小 | ||||
| | 测试稳定性       | 核心测试组件10年以上未变 | 每个大版本更新测试项,分数不同版本间难以对比(每个版本对标当前最好的CPU) | | ||||
| | 测试内容         | 仅测试计算性能,基于素数计算 | 覆盖多种性能测试,分数加权计算,但部分测试实际不常用 | | ||||
| | 适用场景         | 适合快速测试,仅测试计算性能 | 适合综合全面的测试 | | ||||
| | 排行榜         | [sysbench.spiritlhl.net](https://sysbench.spiritlhl.net/) | [browser.geekbench.com](https://browser.geekbench.com/) | | ||||
|  | ||||
| 默认使用```Sysbench```进行测试,基准大致如下: | ||||
|  | ||||
| @@ -186,11 +187,39 @@ AMD的7950x单核满血性能得分在6500左右,AMD的5950x单核满血性能 | ||||
|  | ||||
| 具体当前宿主机不做邮局或者不收电子邮件,那么该项目指标不用理会。 | ||||
|  | ||||
| ### **三网回程线路检测** | ||||
| ### **上游及回程线路检测** | ||||
|  | ||||
| 检测当前的宿主机的IP地址 到 四个主要POP点城市的三个主要运营商的接入点的IP地址 的线路,具体来说 | ||||
| #### 上游类型与运营商等级说明 | ||||
|  | ||||
| 电信163、联通4837、移动CMI 是常见的线路 | ||||
| - **直接上游(Direct Upstream)**   | ||||
|   当前运营商直接购买网络服务的上级运营商,通常是 BGP 邻居。 | ||||
|  | ||||
| - **间接上游(Indirect Upstream)**   | ||||
|   直接上游的上级,形成层层向上的关系链。可通过 BGP 路由路径中的多跳信息识别。 | ||||
|  | ||||
| | 等级 | 描述 | | ||||
| |------|------| | ||||
| | **Tier 1 Global** | 全球顶级运营商(如 AT&T、Verizon、NTT、Telia 等),之间免费互联(Settlement-Free Peering),不依赖他人即可访问全球任意网络。 | | ||||
| | **Tier 1 Regional** | 区域性顶级运营商,在特定区域具有一级能力,但在全球范围互联性稍弱。 | | ||||
| | **Tier 1 Indirect** | 间接连接的 Tier 1(非直接购买),通过中间上游间接接入 Tier 1 网络。 | | ||||
| | **Tier 2** | 需要向 Tier 1 付费购买上网能力的二级运营商,通常是各国主流电信商或 ISP。 | | ||||
| | **CDN Provider** | 内容分发网络提供商,如 Cloudflare、Akamai、Fastly 等,主要用于内容加速而非传统上游。 | | ||||
| | **Direct/Indirect Others** | 其他类型的直接或间接连接,如 IX(Internet Exchange)成员、私有对等互联等。 | | ||||
|  | ||||
| 上游质量判断:直接接入的高等级上游(特别是 Tier 1 Global)越多,通常网络连通性越好。但实际网络质量也受到以下因素影响: | ||||
|  | ||||
|   - 上下游之间的商业结算关系; | ||||
|   - 购买的带宽套餐和服务质量; | ||||
|   - 对等端口(Peering Ports)大小和负载; | ||||
|   - 网络拥塞、路由策略、延迟路径等。 | ||||
|  | ||||
| 无法完全从 BGP 路由中判断。 | ||||
|  | ||||
| 一般来说,**接入高质量上游越多,网络连通性越优**。但由于存在诸多不可见的商业和技术因素,**无法仅凭上游等级准确判断网络质量**,上游检测约等于图一乐,实际得看对应的路由情况和长时间Ping的情况。 | ||||
|  | ||||
| 然后是检测当前的宿主机的IP地址 到 四个主要POP点城市的三个主要运营商的接入点的IP地址 的线路,具体来说 | ||||
|  | ||||
| 电信163、联通4837、移动CMI 是常见的线路,移动CMI对两广地区的移动运营商特供延迟低,也能算优质,仅限两广移动。 | ||||
|  | ||||
| 电信CN2GIA > 电信CN2GT 移动CMIN2 联通9929 算优质的线路 | ||||
|  | ||||
| @@ -198,9 +227,9 @@ AMD的7950x单核满血性能得分在6500左右,AMD的5950x单核满血性能 | ||||
|  | ||||
| ### **三网回程路由检测** | ||||
|  | ||||
| 默认检测广州为目的地,实际可使用命令行参数指定目的地,见对应的说明。 | ||||
| 默认检测广州为目的地,实际可使用命令行参数指定目的地,见对应的参数说明。 | ||||
|  | ||||
| 主要就是看是不是直连,是不是延迟低,是不是没有隐藏路由信息。如果路由全球跑,延迟起飞,那么线路自然不会好到哪里去。 | ||||
| 主要就是看是不是直连,是不是延迟低,是不是没有隐藏路由信息。如果路由全球跑,延迟起飞,那么线路自然不会好到哪里去。有时候路由信息完全藏起来了,只知道实际使用的延迟低,实际可能也是优质线路只是查不到信息,这就没办法直接识别了。 | ||||
|  | ||||
| ### **就近测速** | ||||
|  | ||||
| @@ -272,6 +301,7 @@ Supports selecting `GeekBench` and `Sysbench` for testing through command line p | ||||
| | Test Stability | Core test components unchanged for over 10 years | Test items updated with each major version, scores difficult to compare between different versions (each version benchmarks against current best CPUs) | | ||||
| | 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 | | ||||
| | Ranking         | [sysbench.spiritlhl.net](https://sysbench.spiritlhl.net/) | [browser.geekbench.com](https://browser.geekbench.com/) | | ||||
|  | ||||
| By default, ```Sysbench``` is used for testing, with the baseline roughly as follows: | ||||
|  | ||||
|   | ||||
| @@ -1,9 +0,0 @@ | ||||
| package backtrace | ||||
|  | ||||
| import ( | ||||
| 	"github.com/oneclickvirt/backtrace/bk" | ||||
| ) | ||||
|  | ||||
| func BackTrace(enableIpv6 bool) { | ||||
| 	backtrace.BackTrace(enableIpv6) | ||||
| } | ||||
| @@ -1,21 +0,0 @@ | ||||
| package backtrace | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| //func TestGeneratePrefixMap(t *testing.T) { | ||||
| //	prefix := "223.119.8.0/21" | ||||
| //	prefixList := GeneratePrefixList(prefix) | ||||
| //	if prefixList != nil { | ||||
| //		// 打印生成的IP地址前缀列表 | ||||
| //		for _, ip := range prefixList { | ||||
| //			fmt.Println(ip) | ||||
| //		} | ||||
| //	} | ||||
| //} | ||||
|  | ||||
| // 本包仅测试,无实际使用 | ||||
| func TestBackTrace(t *testing.T) { | ||||
| 	BackTrace(false) | ||||
| } | ||||
| @@ -1,9 +0,0 @@ | ||||
| package ntrace | ||||
|  | ||||
| import ( | ||||
| 	"github.com/oneclickvirt/nt3/nt" | ||||
| ) | ||||
|  | ||||
| func TraceRoute3(language, location, checkType string) { | ||||
| 	nt.TraceRoute(language, location, checkType) | ||||
| } | ||||
| @@ -1,9 +0,0 @@ | ||||
| package ntrace | ||||
|  | ||||
| import "testing" | ||||
|  | ||||
| // https://github.com/nxtrace/NTrace-core/blob/main/fast_trace/fast_trace.go | ||||
| // 本包仅测试无实际使用 | ||||
| func TestTraceRoute(t *testing.T) { | ||||
| 	TraceRoute3("en", "GZ", "ipv4") | ||||
| } | ||||
| @@ -8,18 +8,10 @@ import ( | ||||
| ) | ||||
|  | ||||
| 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" | ||||
| 			realTestMethod = "winsat" | ||||
| 		} | ||||
| 		res = disk.WinsatTest(language, isMultiCheck, testPath) | ||||
| 	} else { | ||||
| 	switch testMethod { | ||||
| 	case "fio": | ||||
| 		res = disk.FioTest(language, isMultiCheck, testPath) | ||||
| 		if res == "" && autoChange { | ||||
| 				// res = "Fio test failed, switching to DD for testing.\n" | ||||
| 			res += disk.DDTest(language, isMultiCheck, testPath) | ||||
| 			realTestMethod = "dd" | ||||
| 		} else { | ||||
| @@ -28,15 +20,17 @@ func DiskTest(language, testMethod, testPath string, isMultiCheck bool, autoChan | ||||
| 	case "dd": | ||||
| 		res = disk.DDTest(language, isMultiCheck, testPath) | ||||
| 		if res == "" && autoChange { | ||||
| 				// 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 += disk.DDTest(language, isMultiCheck, testPath) | ||||
| 		if runtime.GOOS == "windows" { | ||||
| 			realTestMethod = "winsat" | ||||
| 			res = disk.WinsatTest(language, isMultiCheck, testPath) | ||||
| 		} else { | ||||
| 			res = disk.DDTest(language, isMultiCheck, testPath) | ||||
| 			realTestMethod = "dd" | ||||
| 		} | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										89
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										89
									
								
								go.mod
									
									
									
									
									
								
							| @@ -1,52 +1,49 @@ | ||||
| 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/imroc/req/v3 v3.54.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.15-20250714163009 | ||||
| 	github.com/oneclickvirt/cputest v0.0.10-20250404151448 | ||||
| 	github.com/oneclickvirt/UnlockTests v0.0.28-20250727155204 | ||||
| 	github.com/oneclickvirt/backtrace v0.0.7-20250811023541 | ||||
| 	github.com/oneclickvirt/basics v0.0.15-20250805084236 | ||||
| 	github.com/oneclickvirt/cputest v0.0.12-20250720122317 | ||||
| 	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/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.6-20250715102027 | ||||
| 	github.com/oneclickvirt/speedtest v0.0.10-20250701123931 | ||||
| 	github.com/oneclickvirt/disktest v0.0.10-20250808140407 | ||||
| 	github.com/oneclickvirt/gostun v0.0.5-20250727155022 | ||||
| 	github.com/oneclickvirt/memorytest v0.0.9-20250808065154 | ||||
| 	github.com/oneclickvirt/nt3 v0.0.8-20250811123903 | ||||
| 	github.com/oneclickvirt/pingtest v0.0.8-20250728015259 | ||||
| 	github.com/oneclickvirt/portchecker v0.0.3-20250728015900 | ||||
| 	github.com/oneclickvirt/security v0.0.6-20250805090112 | ||||
| 	github.com/oneclickvirt/speedtest v0.0.10-20250728015734 | ||||
| ) | ||||
|  | ||||
| require ( | ||||
| 	github.com/PuerkitoBio/goquery v1.9.2 // indirect | ||||
| 	github.com/StackExchange/wmi v1.2.1 // indirect | ||||
| 	github.com/andybalholm/brotli v1.1.1 // indirect | ||||
| 	github.com/andybalholm/brotli v1.2.0 // indirect | ||||
| 	github.com/andybalholm/cascadia v1.3.2 // indirect | ||||
| 	github.com/cloudflare/circl v1.5.0 // indirect | ||||
| 	github.com/cloudflare/circl v1.6.1 // indirect | ||||
| 	github.com/ebitengine/purego v0.8.4 // indirect | ||||
| 	github.com/fatih/color v1.18.0 // indirect | ||||
| 	github.com/fsnotify/fsnotify v1.9.0 // indirect | ||||
| 	github.com/ghodss/yaml v1.0.0 // indirect | ||||
| 	github.com/go-ole/go-ole v1.2.6 // indirect | ||||
| 	github.com/go-task/slim-sprig/v3 v3.0.0 // indirect | ||||
| 	github.com/go-viper/mapstructure/v2 v2.2.1 // indirect | ||||
| 	github.com/go-viper/mapstructure/v2 v2.4.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-20241210010833-40e02aabc2ad // indirect | ||||
| 	github.com/google/uuid v1.6.0 // indirect | ||||
| 	github.com/gorilla/websocket v1.5.3 // indirect | ||||
| 	github.com/hashicorp/errwrap v1.1.0 // indirect | ||||
| 	github.com/hashicorp/go-multierror v1.1.1 // indirect | ||||
| 	github.com/huin/goupnp v1.2.0 // indirect | ||||
| 	github.com/icholy/digest v1.1.0 // indirect | ||||
| 	github.com/jackpal/go-nat-pmp v1.0.2 // indirect | ||||
| 	github.com/jaypipes/ghw v0.12.0 // indirect | ||||
| 	github.com/jaypipes/pcidb v1.0.0 // indirect | ||||
| 	github.com/jaypipes/ghw v0.17.0 // indirect | ||||
| 	github.com/jaypipes/pcidb v1.0.1 // indirect | ||||
| 	github.com/json-iterator/go v1.1.12 // indirect | ||||
| 	github.com/klauspost/compress v1.17.11 // indirect | ||||
| 	github.com/klauspost/compress v1.18.0 // 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 | ||||
| @@ -60,11 +57,10 @@ require ( | ||||
| 	github.com/mitchellh/go-homedir v1.1.0 // indirect | ||||
| 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||
| 	github.com/modern-go/reflect2 v1.0.2 // indirect | ||||
| 	github.com/nxtrace/NTrace-core v1.4.0 // indirect | ||||
| 	github.com/oneclickvirt/dd v0.0.2-20250701085922 // indirect | ||||
| 	github.com/oneclickvirt/fio v0.0.2-20250701085933 // indirect | ||||
| 	github.com/oneclickvirt/mbw v0.0.1-20250630140849 // indirect | ||||
| 	github.com/onsi/ginkgo/v2 v2.22.1 // indirect | ||||
| 	github.com/nxtrace/NTrace-core v1.4.2 // indirect | ||||
| 	github.com/oneclickvirt/dd v0.0.2-20250808062818 // indirect | ||||
| 	github.com/oneclickvirt/fio v0.0.2-20250808045755 // indirect | ||||
| 	github.com/oneclickvirt/mbw v0.0.1-20250808061222 // indirect | ||||
| 	github.com/oschwald/maxminddb-golang v1.13.1 // indirect | ||||
| 	github.com/pelletier/go-toml/v2 v2.2.4 // indirect | ||||
| 	github.com/pion/dtls/v2 v2.2.7 // indirect | ||||
| @@ -76,20 +72,19 @@ require ( | ||||
| 	github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect | ||||
| 	github.com/prometheus-community/pro-bing v0.4.1 // indirect | ||||
| 	github.com/quic-go/qpack v0.5.1 // indirect | ||||
| 	github.com/quic-go/quic-go v0.48.2 // indirect | ||||
| 	github.com/refraction-networking/utls v1.6.7 // indirect | ||||
| 	github.com/quic-go/quic-go v0.53.0 // indirect | ||||
| 	github.com/refraction-networking/utls v1.7.3 // indirect | ||||
| 	github.com/rivo/uniseg v0.4.7 // indirect | ||||
| 	github.com/rodaine/table v1.3.0 // indirect | ||||
| 	github.com/sagikazarmark/locafero v0.9.0 // indirect | ||||
| 	github.com/schollz/progressbar/v3 v3.14.4 // indirect | ||||
| 	github.com/shirou/gopsutil v3.21.11+incompatible // indirect | ||||
| 	github.com/shirou/gopsutil/v4 v4.24.5 // indirect | ||||
| 	github.com/shoenig/go-m1cpu v0.1.6 // indirect | ||||
| 	github.com/showwin/speedtest-go v1.7.7 // indirect | ||||
| 	github.com/shirou/gopsutil/v4 v4.25.6 // indirect | ||||
| 	github.com/showwin/speedtest-go v1.7.10 // indirect | ||||
| 	github.com/sourcegraph/conc v0.3.0 // indirect | ||||
| 	github.com/spf13/afero v1.14.0 // indirect | ||||
| 	github.com/spf13/cast v1.7.1 // indirect | ||||
| 	github.com/spf13/pflag v1.0.6 // indirect | ||||
| 	github.com/spf13/cast v1.9.2 // indirect | ||||
| 	github.com/spf13/pflag v1.0.7 // indirect | ||||
| 	github.com/spf13/viper v1.20.1 // indirect | ||||
| 	github.com/subosito/gotenv v1.6.0 // indirect | ||||
| 	github.com/tidwall/gjson v1.18.0 // indirect | ||||
| @@ -99,19 +94,17 @@ require ( | ||||
| 	github.com/tklauser/numcpus v0.8.0 // indirect | ||||
| 	github.com/tsosunchia/powclient v0.1.5 // indirect | ||||
| 	github.com/yusufpapurcu/wmi v1.2.4 // indirect | ||||
| 	go.uber.org/mock v0.5.0 // indirect | ||||
| 	go.uber.org/mock v0.5.2 // indirect | ||||
| 	go.uber.org/multierr v1.11.0 // indirect | ||||
| 	go.uber.org/zap v1.27.0 // indirect | ||||
| 	golang.org/x/crypto v0.37.0 // indirect | ||||
| 	golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect | ||||
| 	golang.org/x/mod v0.22.0 // indirect | ||||
| 	golang.org/x/net v0.39.0 // indirect | ||||
| 	golang.org/x/sync v0.13.0 // indirect | ||||
| 	golang.org/x/sys v0.33.0 // indirect | ||||
| 	golang.org/x/term v0.31.0 // indirect | ||||
| 	golang.org/x/text v0.24.0 // indirect | ||||
| 	golang.org/x/tools v0.29.0 // indirect | ||||
| 	gopkg.in/yaml.v2 v2.4.0 // indirect | ||||
| 	golang.org/x/crypto v0.40.0 // indirect | ||||
| 	golang.org/x/mod v0.25.0 // indirect | ||||
| 	golang.org/x/net v0.42.0 // indirect | ||||
| 	golang.org/x/sync v0.16.0 // indirect | ||||
| 	golang.org/x/sys v0.34.0 // indirect | ||||
| 	golang.org/x/term v0.33.0 // indirect | ||||
| 	golang.org/x/text v0.27.0 // indirect | ||||
| 	golang.org/x/tools v0.34.0 // indirect | ||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||
| 	howett.net/plist v1.0.0 // indirect | ||||
| ) | ||||
|   | ||||
							
								
								
									
										185
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										185
									
								
								go.sum
									
									
									
									
									
								
							| @@ -2,43 +2,38 @@ github.com/PuerkitoBio/goquery v1.9.2 h1:4/wZksC3KgkQw7SQgkKotmKljk0M6V8TUvA8Wb4 | ||||
| github.com/PuerkitoBio/goquery v1.9.2/go.mod h1:GHPCaP0ODyyxqcNoFGYlAprUFH81NuRPd0GX3Zu2Mvk= | ||||
| github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= | ||||
| github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= | ||||
| github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= | ||||
| github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= | ||||
| github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= | ||||
| github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= | ||||
| 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.5.0 h1:hxIWksrX6XN5a1L2TI/h53AGPhNHoUBo+TD1ms9+pys= | ||||
| github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= | ||||
| github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= | ||||
| github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= | ||||
| 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/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= | ||||
| github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= | ||||
| github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= | ||||
| github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= | ||||
| github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= | ||||
| github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= | ||||
| github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= | ||||
| github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= | ||||
| github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= | ||||
| github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= | ||||
| github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= | ||||
| github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= | ||||
| github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= | ||||
| 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/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= | ||||
| github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= | ||||
| github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= | ||||
| github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= | ||||
| github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= | ||||
| github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= | ||||
| 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/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| 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/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= | ||||
| github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= | ||||
| github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||
| 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-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= | ||||
| github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= | ||||
| github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= | ||||
| github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= | ||||
| @@ -50,20 +45,22 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l | ||||
| github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= | ||||
| github.com/huin/goupnp v1.2.0 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY= | ||||
| github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= | ||||
| github.com/imroc/req/v3 v3.50.0 h1:n3BVnZiTRpvkN5T1IB79LC/THhFU9iXksNRMH4ZNVaY= | ||||
| github.com/imroc/req/v3 v3.50.0/go.mod h1:tsOk8K7zI6cU4xu/VWCZVtq9Djw9IWm4MslKzme5woU= | ||||
| github.com/icholy/digest v1.1.0 h1:HfGg9Irj7i+IX1o1QAmPfIBNu/Q5A5Tu3n/MED9k9H4= | ||||
| github.com/icholy/digest v1.1.0/go.mod h1:QNrsSGQ5v7v9cReDI0+eyjsXGUoRSUZQHeQ5C4XLa0Y= | ||||
| github.com/imroc/req/v3 v3.54.0 h1:kwWJSpT7OvjJ/Q8ykp+69Ye5H486RKDcgEoepw1Ren4= | ||||
| github.com/imroc/req/v3 v3.54.0/go.mod h1:P8gCJjG/XNUFeP6WOi40VAXfYwT+uPM00xvoBWiwzUQ= | ||||
| 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/jaypipes/ghw v0.12.0 h1:xU2/MDJfWmBhJnujHY9qwXQLs3DBsf0/Xa9vECY0Tho= | ||||
| github.com/jaypipes/ghw v0.12.0/go.mod h1:jeJGbkRB2lL3/gxYzNYzEDETV1ZJ56OKr+CSeSEym+g= | ||||
| github.com/jaypipes/pcidb v1.0.0 h1:vtZIfkiCUE42oYbJS0TAq9XSfSmcsgo9IdxSm9qzYU8= | ||||
| github.com/jaypipes/pcidb v1.0.0/go.mod h1:TnYUvqhPBzCKnH34KrIX22kAeEbDCSRJ9cqLRCuNDfk= | ||||
| github.com/jaypipes/ghw v0.17.0 h1:EVLJeNcy5z6GK/Lqby0EhBpynZo+ayl8iJWY0kbEUJA= | ||||
| github.com/jaypipes/ghw v0.17.0/go.mod h1:In8SsaDqlb1oTyrbmTC14uy+fbBMvp+xdqX51MidlD8= | ||||
| github.com/jaypipes/pcidb v1.0.1 h1:WB2zh27T3nwg8AE8ei81sNRb9yWBii3JGNJtT7K9Oic= | ||||
| github.com/jaypipes/pcidb v1.0.1/go.mod h1:6xYUz/yYEyOkIkUt2t2J2folIuZ4Yg6uByCGFXMCeE4= | ||||
| github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= | ||||
| github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= | ||||
| github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= | ||||
| github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= | ||||
| github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= | ||||
| github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= | ||||
| github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= | ||||
| github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= | ||||
| 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= | ||||
| @@ -95,46 +92,42 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w | ||||
| github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | ||||
| github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= | ||||
| github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= | ||||
| github.com/nxtrace/NTrace-core v1.4.0 h1:pDN2BqxIYjedDKCDDOFBcDNOBnavGcx+4wbiG65Xqiw= | ||||
| github.com/nxtrace/NTrace-core v1.4.0/go.mod h1:0AWqbqiIJbpbFG6W48vtJ6pWM8PPF+lQ1fi2371y+zA= | ||||
| github.com/nxtrace/NTrace-core v1.4.2 h1:dSRP18Bn3VGf5CZBzKt8gQWW9mDkq62Np9TCF9RAtp0= | ||||
| github.com/nxtrace/NTrace-core v1.4.2/go.mod h1:wIDOlccuYzY3wBqU89pv2KGHT41i3JA0eRqJU/x9eX4= | ||||
| github.com/oneclickvirt/CommonMediaTests v0.0.4-20250329123841 h1:Zef93z9UiZQwRAKnnZYALmpBKvvuVaq34MEsuWwk6nc= | ||||
| github.com/oneclickvirt/CommonMediaTests v0.0.4-20250329123841/go.mod h1:DAmFPRjFV5p9fEzUUSml5jJGn2f1NZJQCzTxITHDjc4= | ||||
| github.com/oneclickvirt/UnlockTests v0.0.27-20250628125053 h1:Ug8kySZR1weRUcsnGOv+f3HAl791AfkA7EWV3JmiMQA= | ||||
| 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.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.10-20250404151448 h1:ovGtCwFXG0qmpyNDRqcNDIiAmhrtemCjIUXTJ1fPH0o= | ||||
| github.com/oneclickvirt/cputest v0.0.10-20250404151448/go.mod h1:MmaHN9+XMntI3rLycwj8Ne31fG18IfNoa8N2utDK1CY= | ||||
| 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/UnlockTests v0.0.28-20250727155204 h1:apFaEbHGKflYMZzK17nXzEai4GG873mTd+d9hCO/KdY= | ||||
| github.com/oneclickvirt/UnlockTests v0.0.28-20250727155204/go.mod h1:oOa6wj/qECtRMxwBO6D7o0L0F0Q/5sQ747OCnFQqoGE= | ||||
| github.com/oneclickvirt/backtrace v0.0.7-20250811023541 h1:GzkzvUC6U9b6Dkz/Bl4JRPeQ7XBGoW7Qw1aWqzhF+MQ= | ||||
| github.com/oneclickvirt/backtrace v0.0.7-20250811023541/go.mod h1:/+KUtOWz48TyiTTbhVTsp3D6b5WY+4pCgvFBYtUGtns= | ||||
| github.com/oneclickvirt/basics v0.0.15-20250805084236 h1:guYO6wGooSIOAIutuy/zfJ4sXj525nBITw8cjEPRaK8= | ||||
| github.com/oneclickvirt/basics v0.0.15-20250805084236/go.mod h1:2PV+1ge01zb0Sqzj2V2I7P0wAdFSLF1XgAiumchJJbg= | ||||
| github.com/oneclickvirt/cputest v0.0.12-20250720122317 h1:toiwAK1hZE5b8klu2mOQ7J4sv5yV9lpPKwgPahfRYBQ= | ||||
| github.com/oneclickvirt/cputest v0.0.12-20250720122317/go.mod h1:vjlH8tkPFft1tlLOpeNskXVvurxkHaJ3+dgFxQGLXY4= | ||||
| github.com/oneclickvirt/dd v0.0.2-20250808062818 h1:0KHrKkdpL5oBE1OHsrRd2siRw4/2k6f9LBaP7T4JpOc= | ||||
| github.com/oneclickvirt/dd v0.0.2-20250808062818/go.mod h1:tImu9sPTkLWo2tf1dEN1xQzrylWKauj9hbU8PHfyAeU= | ||||
| 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.8-20250701092629 h1:B/gA6SOr4qL5pQmVpHl9m5bn3paDcL7wJ1SZ7aY66M8= | ||||
| github.com/oneclickvirt/disktest v0.0.8-20250701092629/go.mod h1:6YCvGr+Z0tvcP4Ue8bezZqm/GqS/dSyEnSUhvS3Q03o= | ||||
| github.com/oneclickvirt/fio v0.0.2-20250701085933 h1:4P7QcOTxbqyx5DhHdFvyeRSsdNajSo9l/H2XK0vICIc= | ||||
| github.com/oneclickvirt/fio v0.0.2-20250701085933/go.mod h1:NIq+XYTey68KNERGIy/oRDlzpwLzBVoHOCiqX8didsE= | ||||
| github.com/oneclickvirt/gostun v0.0.3-20250329105202 h1:aJ6E91Lp94lq8iWRcCaxpXTjqOOaWvufr5oras6cFtM= | ||||
| 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/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.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= | ||||
| github.com/onsi/ginkgo/v2 v2.22.1/go.mod h1:S6aTpoRsSq2cZOd+pssHAlKW/Q/jZt6cPrPlnj4a1xM= | ||||
| github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw= | ||||
| github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= | ||||
| github.com/oneclickvirt/disktest v0.0.10-20250808140407 h1:oUfi5zF3htUTB1ZJuClmK0o74ufP7icbu8LYCnxEOxE= | ||||
| github.com/oneclickvirt/disktest v0.0.10-20250808140407/go.mod h1:Vp3iMVBD4ccReDJz5n5SlzUdq0kDuVhpRklQk21KT+8= | ||||
| github.com/oneclickvirt/fio v0.0.2-20250808045755 h1:eWihCRWcalJjPIdrF8dMe68ZiPnMkSfHC8ENvElp/xE= | ||||
| github.com/oneclickvirt/fio v0.0.2-20250808045755/go.mod h1:NIq+XYTey68KNERGIy/oRDlzpwLzBVoHOCiqX8didsE= | ||||
| github.com/oneclickvirt/gostun v0.0.5-20250727155022 h1:/e3gSUrOp1tg/1NTRx+P8B51OGcP26Q6//5EoSIjOvk= | ||||
| github.com/oneclickvirt/gostun v0.0.5-20250727155022/go.mod h1:pfp7MFZJK9n/KTLAVqqFcCAns4xqMykmjI+1UeF/vdE= | ||||
| github.com/oneclickvirt/mbw v0.0.1-20250808061222 h1:WGXOe6QvHiDRhPVMI0VcctjzW08kGvJf50yq5YeZCtw= | ||||
| github.com/oneclickvirt/mbw v0.0.1-20250808061222/go.mod h1:0Vq6NRpyLmGUdfHfL3uDcFsuZhi7KlG+OCs5ky2757Y= | ||||
| github.com/oneclickvirt/memorytest v0.0.9-20250808065154 h1:mjYOvpFz2mpDU9MNjj66oIDcc2r6+zoW8veP616/+4Q= | ||||
| github.com/oneclickvirt/memorytest v0.0.9-20250808065154/go.mod h1:DBxiVZX7mWCe0Fy+qu57ENheLo00sLfjKzvxiICrUtU= | ||||
| github.com/oneclickvirt/nt3 v0.0.8-20250811123903 h1:ubSPLh/DSrXj+tOgmRABgi2vrVmbmjjSne+NrVFNmNc= | ||||
| github.com/oneclickvirt/nt3 v0.0.8-20250811123903/go.mod h1:F1v+6xInBKnbUa8gV1M40R1HOzxg+obtduNhx3CTnmA= | ||||
| github.com/oneclickvirt/pingtest v0.0.8-20250728015259 h1:egoxZRZBOWN3JqBwqEsULDyRo2/dpGMeWcmV3U87zig= | ||||
| github.com/oneclickvirt/pingtest v0.0.8-20250728015259/go.mod h1:gxwsxxwitNQiGq2OI0ZogYoOLwc8DtuOdSRe6/EvRqs= | ||||
| github.com/oneclickvirt/portchecker v0.0.3-20250728015900 h1:AomzdppSOFB70AJESQhlp0IPbsHTTJGimAWDk2TzCWM= | ||||
| github.com/oneclickvirt/portchecker v0.0.3-20250728015900/go.mod h1:9sjMDPCd4Z40wkYB0S9gQPGH8YPtnNE1ZJthVIuHUzA= | ||||
| github.com/oneclickvirt/security v0.0.6-20250805090112 h1:lUNtsnpZ3JNLS4xxjFGGECaxA46yNyxbYjdust9W0M4= | ||||
| github.com/oneclickvirt/security v0.0.6-20250805090112/go.mod h1:JB6SJWm5pbrngCgSTYLd2m4Hj8mHO6mJua1WgHMZOcE= | ||||
| github.com/oneclickvirt/speedtest v0.0.10-20250728015734 h1:HKO7/JQ74ueXA8Wo8NIvcK9DphbEG/YTfAAVz/akSiY= | ||||
| github.com/oneclickvirt/speedtest v0.0.10-20250728015734/go.mod h1:0W8vnMbA3iucXLXFdGfe9Ia6RPS0izRO7jvu/SnH1P8= | ||||
| github.com/oschwald/maxminddb-golang v1.13.1 h1:G3wwjdN9JmIK2o/ermkHM+98oX5fS+k5MbwsmL4MRQE= | ||||
| github.com/oschwald/maxminddb-golang v1.13.1/go.mod h1:K4pgV9N/GcK694KSTmVSDTODk4IsCNThNdTmnaBZ/F8= | ||||
| github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= | ||||
| @@ -160,10 +153,10 @@ github.com/prometheus-community/pro-bing v0.4.1 h1:aMaJwyifHZO0y+h8+icUz0xbToHbi | ||||
| github.com/prometheus-community/pro-bing v0.4.1/go.mod h1:aLsw+zqCaDoa2RLVVSX3+UiCkBBXTMtZC3c7EkfWnAE= | ||||
| github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= | ||||
| github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= | ||||
| github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= | ||||
| github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= | ||||
| github.com/refraction-networking/utls v1.6.7 h1:zVJ7sP1dJx/WtVuITug3qYUq034cDq9B2MR1K67ULZM= | ||||
| github.com/refraction-networking/utls v1.6.7/go.mod h1:BC3O4vQzye5hqpmDTWUqi4P5DDhzJfkV1tdqtawQIH0= | ||||
| github.com/quic-go/quic-go v0.53.0 h1:QHX46sISpG2S03dPeZBgVIZp8dGagIaiu2FiVYvpCZI= | ||||
| github.com/quic-go/quic-go v0.53.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY= | ||||
| github.com/refraction-networking/utls v1.7.3 h1:L0WRhHY7Oq1T0zkdzVZMR6zWZv+sXbHB9zcuvsAEqCo= | ||||
| github.com/refraction-networking/utls v1.7.3/go.mod h1:TUhh27RHMGtQvjQq+RyO11P6ZNQNBb3N0v7wsEjKAIQ= | ||||
| 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= | ||||
| @@ -177,22 +170,18 @@ github.com/schollz/progressbar/v3 v3.14.4 h1:W9ZrDSJk7eqmQhd3uxFNNcTr0QL+xuGNI9d | ||||
| github.com/schollz/progressbar/v3 v3.14.4/go.mod h1:aT3UQ7yGm+2ZjeXPqsjTenwL3ddUiuZ0kfQ/2tHlyNI= | ||||
| github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= | ||||
| github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= | ||||
| github.com/shirou/gopsutil/v4 v4.24.5 h1:gGsArG5K6vmsh5hcFOHaPm87UD003CaDMkAOweSQjhM= | ||||
| github.com/shirou/gopsutil/v4 v4.24.5/go.mod h1:aoebb2vxetJ/yIDZISmduFvVNPHqXQ9SEJwRXxkf0RA= | ||||
| github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= | ||||
| github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= | ||||
| github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= | ||||
| github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= | ||||
| 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/shirou/gopsutil/v4 v4.25.6 h1:kLysI2JsKorfaFPcYmcJqbzROzsBWEOAtw6A7dIfqXs= | ||||
| github.com/shirou/gopsutil/v4 v4.25.6/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c= | ||||
| github.com/showwin/speedtest-go v1.7.10 h1:9o5zb7KsuzZKn+IE2//z5btLKJ870JwO6ETayUkqRFw= | ||||
| github.com/showwin/speedtest-go v1.7.10/go.mod h1:Ei7OCTmNPdWofMadzcfgq1rUO7mvJy9Jycj//G7vyfA= | ||||
| 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.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= | ||||
| github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= | ||||
| github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= | ||||
| github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= | ||||
| github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= | ||||
| github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= | ||||
| github.com/spf13/cast v1.9.2 h1:SsGfm7M8QOFtEzumm7UZrZdLLquNdzFYfIbEXntcFbE= | ||||
| github.com/spf13/cast v1.9.2/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= | ||||
| github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M= | ||||
| github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= | ||||
| github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= | ||||
| github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= | ||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| @@ -229,8 +218,8 @@ github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo | ||||
| github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= | ||||
| go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= | ||||
| go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= | ||||
| go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= | ||||
| go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= | ||||
| go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= | ||||
| go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= | ||||
| go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= | ||||
| go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= | ||||
| go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= | ||||
| @@ -240,16 +229,14 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U | ||||
| golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||
| 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.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= | ||||
| golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= | ||||
| golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA= | ||||
| golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= | ||||
| golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= | ||||
| golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= | ||||
| 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.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= | ||||
| golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= | ||||
| golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= | ||||
| golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= | ||||
| 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= | ||||
| @@ -258,14 +245,14 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= | ||||
| golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= | ||||
| golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= | ||||
| golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= | ||||
| golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= | ||||
| golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= | ||||
| golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= | ||||
| golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= | ||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= | ||||
| golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= | ||||
| golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= | ||||
| golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= | ||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| @@ -280,8 +267,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= | ||||
| golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= | ||||
| golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= | ||||
| golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= | ||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||
| golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||
| golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= | ||||
| @@ -289,38 +276,34 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= | ||||
| golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= | ||||
| golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= | ||||
| golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= | ||||
| golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= | ||||
| golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= | ||||
| golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= | ||||
| golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||
| golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | ||||
| golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= | ||||
| 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.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= | ||||
| golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= | ||||
| 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/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= | ||||
| golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= | ||||
| 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.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= | ||||
| golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= | ||||
| golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= | ||||
| golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= | ||||
| 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= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= | ||||
| google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= | ||||
| 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= | ||||
| gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= | ||||
| gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= | ||||
| gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= | ||||
| gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||
| gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | ||||
| gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||
| gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= | ||||
| gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= | ||||
| howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= | ||||
| howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= | ||||
|   | ||||
							
								
								
									
										244
									
								
								goecs.go
									
									
									
									
									
								
							
							
						
						
									
										244
									
								
								goecs.go
									
									
									
									
									
								
							| @@ -7,6 +7,7 @@ import ( | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
| 	"os/signal" | ||||
| 	"regexp" | ||||
| 	"runtime" | ||||
| @@ -17,7 +18,6 @@ import ( | ||||
|  | ||||
| 	"github.com/oneclickvirt/CommonMediaTests/commediatests" | ||||
| 	unlocktestmodel "github.com/oneclickvirt/UnlockTests/model" | ||||
| 	backtrace "github.com/oneclickvirt/backtrace/bk" | ||||
| 	backtracemodel "github.com/oneclickvirt/backtrace/model" | ||||
| 	basicmodel "github.com/oneclickvirt/basics/model" | ||||
| 	cputestmodel "github.com/oneclickvirt/cputest/model" | ||||
| @@ -25,13 +25,14 @@ import ( | ||||
| 	"github.com/oneclickvirt/ecs/cputest" | ||||
| 	"github.com/oneclickvirt/ecs/disktest" | ||||
| 	"github.com/oneclickvirt/ecs/memorytest" | ||||
| 	"github.com/oneclickvirt/ecs/nexttrace" | ||||
| 	"github.com/oneclickvirt/ecs/speedtest" | ||||
| 	"github.com/oneclickvirt/ecs/unlocktest" | ||||
| 	"github.com/oneclickvirt/ecs/upstreams" | ||||
| 	"github.com/oneclickvirt/ecs/utils" | ||||
| 	gostunmodel "github.com/oneclickvirt/gostun/model" | ||||
| 	memorytestmodel "github.com/oneclickvirt/memorytest/memory" | ||||
| 	nt3model "github.com/oneclickvirt/nt3/model" | ||||
| 	"github.com/oneclickvirt/nt3/nt" | ||||
| 	ptmodel "github.com/oneclickvirt/pingtest/model" | ||||
| 	"github.com/oneclickvirt/pingtest/pt" | ||||
| 	"github.com/oneclickvirt/portchecker/email" | ||||
| @@ -39,7 +40,7 @@ import ( | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	ecsVersion                                                        = "v0.1.54" | ||||
| 	ecsVersion                                                        = "v0.1.83" | ||||
| 	menuMode                                                          bool | ||||
| 	onlyChinaTest                                                     bool | ||||
| 	input, choice                                                     string | ||||
| @@ -59,7 +60,7 @@ var ( | ||||
| 	autoChangeDiskTestMethod                                          = true | ||||
| 	filePath                                                          = "goecs.txt" | ||||
| 	enabelUpload                                                      = true | ||||
| 	help                                                              bool | ||||
| 	onlyIpInfoCheckStatus, help                                       bool | ||||
| 	goecsFlag                                                         = flag.NewFlagSet("goecs", flag.ContinueOnError) | ||||
| 	finish                                                            bool | ||||
| ) | ||||
| @@ -99,7 +100,7 @@ func getMenuChoice(language string) string { | ||||
| 			if re.MatchString(input) { | ||||
| 				inChoice := input | ||||
| 				switch inChoice { | ||||
| 				case "1", "2", "3", "4", "5", "6", "7", "8", "9", "10": | ||||
| 				case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10": | ||||
| 					return inChoice | ||||
| 				default: | ||||
| 					if language == "zh" { | ||||
| @@ -143,7 +144,7 @@ func parseFlags() { | ||||
| 	goecsFlag.StringVar(&diskTestMethod, "diskm", "fio", "Set disk test method (supported: fio, dd, winsat)") | ||||
| 	goecsFlag.StringVar(&diskTestPath, "diskp", "", "Set disk test path, e.g., -diskp /root") | ||||
| 	goecsFlag.BoolVar(&diskMultiCheck, "diskmc", false, "Enable/Disable multiple disk checks, e.g., -diskmc=false") | ||||
| 	goecsFlag.StringVar(&nt3Location, "nt3loc", "GZ", "Specify NT3 test location (supported: GZ, SH, BJ, CD for Guangzhou, Shanghai, Beijing, Chengdu)") | ||||
| 	goecsFlag.StringVar(&nt3Location, "nt3loc", "GZ", "Specify NT3 test location (supported: GZ, SH, BJ, CD, ALL for Guangzhou, Shanghai, Beijing, Chengdu and all)") | ||||
| 	goecsFlag.StringVar(&nt3CheckType, "nt3t", "ipv4", "Set NT3 test type (supported: both, ipv4, ipv6)") | ||||
| 	goecsFlag.IntVar(&spNum, "spnum", 2, "Set the number of servers per operator for speed test") | ||||
| 	goecsFlag.BoolVar(&enableLogger, "log", false, "Enable/Disable logging in the current path") | ||||
| @@ -185,11 +186,13 @@ func handleMenuMode(preCheck utils.NetCheckResult) { | ||||
| 	commTestStatus, utTestStatus, securityTestStatus, emailTestStatus = false, false, false, false | ||||
| 	backtraceStatus, nt3Status, speedTestStatus = false, false, false | ||||
| 	autoChangeDiskTestMethod = true | ||||
| 	printMenuOptions() | ||||
| 	printMenuOptions(preCheck) | ||||
| Loop: | ||||
| 	for { | ||||
| 		choice = getMenuChoice(language) | ||||
| 		switch choice { | ||||
| 		case "0": | ||||
| 			os.Exit(0) | ||||
| 		case "1": | ||||
| 			setFullTestStatus(preCheck) | ||||
| 			onlyChinaTest = utils.CheckChina(enableLogger) | ||||
| @@ -235,6 +238,7 @@ Loop: | ||||
| 				fmt.Println("Can not test without network connection!") | ||||
| 				return | ||||
| 			} | ||||
| 			nt3Location = "ALL" | ||||
| 			setRouteTestStatus() | ||||
| 			break Loop | ||||
| 		default: | ||||
| @@ -243,23 +247,99 @@ Loop: | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func printMenuOptions() { | ||||
| // clearScreen 清屏 | ||||
| func clearScreen() { | ||||
| 	var cmd *exec.Cmd | ||||
| 	switch runtime.GOOS { | ||||
| 	case "windows": | ||||
| 		cmd = exec.Command("cmd", "/c", "cls") | ||||
| 	case "darwin": | ||||
| 		cmd = exec.Command("clear") | ||||
| 	default: | ||||
| 		cmd = exec.Command("clear") | ||||
| 	} | ||||
| 	cmd.Stdout = os.Stdout | ||||
| 	_ = cmd.Run() | ||||
| } | ||||
|  | ||||
| func printMenuOptions(preCheck utils.NetCheckResult) { | ||||
| 	clearScreen() // 清屏 | ||||
| 	var stats *utils.StatsResponse | ||||
| 	var statsErr error | ||||
| 	var githubInfo *utils.GitHubRelease | ||||
| 	var githubErr error | ||||
| 	// 只有在网络连接正常时才获取统计信息和版本信息 | ||||
| 	if preCheck.Connected { | ||||
| 		var pwg sync.WaitGroup | ||||
| 		pwg.Add(2) | ||||
| 		go func() { | ||||
| 			defer pwg.Done() | ||||
| 			stats, statsErr = utils.GetGoescStats() | ||||
| 		}() | ||||
| 		go func() { | ||||
| 			defer pwg.Done() | ||||
| 			githubInfo, githubErr = utils.GetLatestEcsRelease() | ||||
| 		}() | ||||
| 		pwg.Wait() | ||||
| 	} else { | ||||
| 		statsErr = fmt.Errorf("network not connected") | ||||
| 		githubErr = fmt.Errorf("network not connected") | ||||
| 	} | ||||
| 	var statsInfo string | ||||
| 	var cmp int | ||||
| 	if preCheck.Connected { | ||||
| 		// 网络连接正常时处理统计信息和版本比较 | ||||
| 		if statsErr != nil { | ||||
| 			statsInfo = "NULL" | ||||
| 		} else { | ||||
| 			switch language { | ||||
| 			case "zh": | ||||
| 		fmt.Println("VPS融合怪版本: ", ecsVersion) | ||||
| 		fmt.Println("1. 融合怪完全体") | ||||
| 				statsInfo = fmt.Sprintf("总使用量: %s | 今日使用: %s", | ||||
| 					utils.FormatGoecsNumber(stats.Total), | ||||
| 					utils.FormatGoecsNumber(stats.Daily)) | ||||
| 			case "en": | ||||
| 				statsInfo = fmt.Sprintf("Total Usage: %s | Daily Usage: %s", | ||||
| 					utils.FormatGoecsNumber(stats.Total), | ||||
| 					utils.FormatGoecsNumber(stats.Daily)) | ||||
| 			} | ||||
| 		} | ||||
| 		if githubErr == nil { | ||||
| 			cmp = utils.CompareVersions(ecsVersion, githubInfo.TagName) | ||||
| 		} else { | ||||
| 			cmp = 0 | ||||
| 		} | ||||
| 	} | ||||
| 	switch language { | ||||
| 	case "zh": | ||||
| 		fmt.Printf("VPS融合怪版本: %s\n", ecsVersion) | ||||
| 		if preCheck.Connected { | ||||
| 			switch cmp { | ||||
| 			case -1: | ||||
| 				fmt.Printf("检测到新版本 %s 如有必要请更新!\n", githubInfo.TagName) | ||||
| 			} | ||||
| 			fmt.Printf("使用统计: %s\n", statsInfo) | ||||
| 		} | ||||
| 		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("6. 网络单项(IP质量检测+上游及三网回程+广州三网回程详细路由+全国延迟+测速节点11个)") | ||||
| 		fmt.Println("7. 解锁单项(御三家解锁+常用流媒体解锁)") | ||||
| 		fmt.Println("8. 硬件单项(系统信息+CPU+内存+dd磁盘测试+fio磁盘测试)") | ||||
| 		fmt.Println("9. IP质量检测(15个数据库的IP检测+邮件端口检测)") | ||||
| 		fmt.Println("10. 三网回程线路+广州三网路由+全国三网延迟") | ||||
| 		fmt.Println("8. 硬件单项(系统信息+CPU+dd磁盘测试+fio磁盘测试)") | ||||
| 		fmt.Println("9. IP质量检测(15个数据库的IP质量检测+邮件端口检测)") | ||||
| 		fmt.Println("10. 三网回程线路检测+三网回程详细路由(北京上海广州成都)+三网延迟测试(全国)") | ||||
| 		fmt.Println("0. 退出程序") | ||||
| 	case "en": | ||||
| 		fmt.Println("VPS Fusion Monster Test Version: ", ecsVersion) | ||||
| 		fmt.Println("1. VPS Fusion Monster Test Comprehensive Test Suite") | ||||
| 		fmt.Printf("VPS Fusion Monster Test Version: %s\n", ecsVersion) | ||||
| 		if preCheck.Connected { | ||||
| 			switch cmp { | ||||
| 			case -1: | ||||
| 				fmt.Printf("New version detected %s update if necessary!\n", githubInfo.TagName) | ||||
| 			} | ||||
| 			fmt.Printf("%s\n", statsInfo) | ||||
| 		} | ||||
| 		fmt.Println("1. VPS Fusion Monster Test (Full Test)") | ||||
| 		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 + 5 Speed Test Nodes)") | ||||
| 		fmt.Println("4. Network-Focused Test Suite (System Info + CPU + Memory + Disk + 5 Speed Test Nodes)") | ||||
| @@ -268,6 +348,7 @@ func printMenuOptions() { | ||||
| 		fmt.Println("7. Unlock-Only Test (Basic Unlock Tests + Common Streaming Services Unlock)") | ||||
| 		fmt.Println("8. Hardware-Only Test (System Info + CPU + Memory + dd Disk Test + fio Disk Test)") | ||||
| 		fmt.Println("9. IP Quality Test (IP Test with 15 Databases + Email Port Test)") | ||||
| 		fmt.Println("0. Exit Program") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -334,16 +415,18 @@ func setUnlockFocusedTestStatus(preCheck utils.NetCheckResult) { | ||||
| } | ||||
|  | ||||
| func setNetworkOnlyTestStatus() { | ||||
| 	onlyIpInfoCheckStatus = true | ||||
| 	securityTestStatus = true | ||||
| 	speedTestStatus = true | ||||
| 	backtraceStatus = true | ||||
| 	nt3Status = true | ||||
| 	pingTestStatus = true | ||||
| } | ||||
|  | ||||
| func setUnlockOnlyTestStatus() { | ||||
| 	onlyIpInfoCheckStatus = true | ||||
| 	commTestStatus = true | ||||
| 	utTestStatus = true | ||||
| 	enabelUpload = false | ||||
| } | ||||
|  | ||||
| func setHardwareOnlyTestStatus(preCheck utils.NetCheckResult) { | ||||
| @@ -357,15 +440,16 @@ func setHardwareOnlyTestStatus(preCheck utils.NetCheckResult) { | ||||
| } | ||||
|  | ||||
| func setIPQualityTestStatus() { | ||||
| 	onlyIpInfoCheckStatus = true | ||||
| 	securityTestStatus = true | ||||
| 	emailTestStatus = true | ||||
| } | ||||
|  | ||||
| func setRouteTestStatus() { | ||||
| 	onlyIpInfoCheckStatus = true | ||||
| 	backtraceStatus = true | ||||
| 	nt3Status = true | ||||
| 	pingTestStatus = true | ||||
| 	enabelUpload = false | ||||
| } | ||||
|  | ||||
| func printInvalidChoice() { | ||||
| @@ -386,7 +470,7 @@ func handleLanguageSpecificSettings() { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func handleSignalInterrupt(sig chan os.Signal, startTime *time.Time, output *string, tempOutput string, uploadDone chan bool, outputMutex *sync.Mutex) { | ||||
| func handleSignalInterrupt(sig chan os.Signal, startTime *time.Time, output *string, _ string, uploadDone chan bool, outputMutex *sync.Mutex) { | ||||
| 	select { | ||||
| 	case <-sig: | ||||
| 		if !finish { | ||||
| @@ -462,16 +546,19 @@ func handleSignalInterrupt(sig chan os.Signal, startTime *time.Time, output *str | ||||
| 	} | ||||
| } | ||||
|  | ||||
| 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) | ||||
| 	if (onlyChinaTest || pingTestStatus) && preCheck.Connected && preCheck.StackType != "" && preCheck.StackType != "None" { | ||||
| 		wg3.Add(1) | ||||
| 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 onlyIpInfoCheckStatus && !basicStatus && preCheck.Connected && preCheck.StackType != "" && preCheck.StackType != "None" { | ||||
| 		*output = runIpInfoCheck(*output, tempOutput, outputMutex) | ||||
| 	} | ||||
| 	if utTestStatus && preCheck.Connected && preCheck.StackType != "" && preCheck.StackType != "None" && !onlyChinaTest { | ||||
| 		wg1.Add(1) | ||||
| 		go func() { | ||||
| 			defer wg3.Done() | ||||
| 			*ptInfo = pt.PingTest() | ||||
| 			defer wg1.Done() | ||||
| 			*mediaInfo = unlocktest.MediaTest(language) | ||||
| 		}() | ||||
| 	} | ||||
| 	if emailTestStatus && preCheck.Connected && preCheck.StackType != "" && preCheck.StackType != "None" { | ||||
| @@ -481,32 +568,35 @@ func runChineseTests(preCheck utils.NetCheckResult, wg1, wg2, wg3 *sync.WaitGrou | ||||
| 			*emailInfo = email.EmailCheck() | ||||
| 		}() | ||||
| 	} | ||||
| 	if utTestStatus && preCheck.Connected && preCheck.StackType != "" && preCheck.StackType != "None" && !onlyChinaTest { | ||||
| 		wg1.Add(1) | ||||
| 	if (onlyChinaTest || pingTestStatus) && preCheck.Connected && preCheck.StackType != "" && preCheck.StackType != "None" { | ||||
| 		wg3.Add(1) | ||||
| 		go func() { | ||||
| 			defer wg1.Done() | ||||
| 			*mediaInfo = unlocktest.MediaTest(language) | ||||
| 			defer wg3.Done() | ||||
| 			*ptInfo = pt.PingTest() | ||||
| 		}() | ||||
| 	} | ||||
| 	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 onlyIpInfoCheckStatus && !basicStatus && preCheck.Connected && preCheck.StackType != "" && preCheck.StackType != "None" { | ||||
| 		*output = runIpInfoCheck(*output, tempOutput, outputMutex) | ||||
| 	} | ||||
| 	if preCheck.Connected && preCheck.StackType != "" && preCheck.StackType != "None" { | ||||
| 		if utTestStatus { | ||||
| 			wg1.Add(1) | ||||
| @@ -522,12 +612,30 @@ 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) | ||||
| } | ||||
|  | ||||
| // runIpInfoCheck 系统和网络基础信息检测不进行测试的时候,该函数检测取得本机IP信息并显示(单项测试中输出) | ||||
| func runIpInfoCheck(output, tempOutput string, outputMutex *sync.Mutex) string { | ||||
| 	outputMutex.Lock() | ||||
| 	defer outputMutex.Unlock() | ||||
| 	return utils.PrintAndCapture(func() { | ||||
| 		var ipinfo string | ||||
| 		upstreams.IPV4, upstreams.IPV6, ipinfo = utils.OnlyBasicsIpInfo(language) | ||||
| 		if ipinfo != "" { | ||||
| 			if language == "zh" { | ||||
| 				utils.PrintCenteredTitle("IP信息", width) | ||||
| 			} else { | ||||
| 				utils.PrintCenteredTitle("IP-Information", width) | ||||
| 			} | ||||
| 			fmt.Printf("%s", ipinfo) | ||||
| 		} | ||||
| 	}, tempOutput, output) | ||||
| } | ||||
|  | ||||
| func runBasicTests(preCheck utils.NetCheckResult, basicInfo, securityInfo *string, output, tempOutput string, outputMutex *sync.Mutex) string { | ||||
| @@ -544,13 +652,13 @@ func runBasicTests(preCheck utils.NetCheckResult, basicInfo, securityInfo *strin | ||||
| 				} | ||||
| 			} | ||||
| 			if preCheck.Connected && preCheck.StackType == "DualStack" { | ||||
| 				*basicInfo, *securityInfo, nt3CheckType = utils.BasicsAndSecurityCheck(language, nt3CheckType, securityTestStatus) | ||||
| 				upstreams.IPV4, upstreams.IPV6, *basicInfo, *securityInfo, nt3CheckType = utils.BasicsAndSecurityCheck(language, nt3CheckType, securityTestStatus) | ||||
| 			} else if preCheck.Connected && preCheck.StackType == "IPv4" { | ||||
| 				*basicInfo, *securityInfo, nt3CheckType = utils.BasicsAndSecurityCheck(language, "ipv4", securityTestStatus) | ||||
| 				upstreams.IPV4, upstreams.IPV6, *basicInfo, *securityInfo, nt3CheckType = utils.BasicsAndSecurityCheck(language, "ipv4", securityTestStatus) | ||||
| 			} else if preCheck.Connected && preCheck.StackType == "IPv6" { | ||||
| 				*basicInfo, *securityInfo, nt3CheckType = utils.BasicsAndSecurityCheck(language, "ipv6", securityTestStatus) | ||||
| 				upstreams.IPV4, upstreams.IPV6, *basicInfo, *securityInfo, nt3CheckType = utils.BasicsAndSecurityCheck(language, "ipv6", securityTestStatus) | ||||
| 			} else { | ||||
| 				*basicInfo, *securityInfo, nt3CheckType = utils.BasicsAndSecurityCheck(language, "", false) | ||||
| 				upstreams.IPV4, upstreams.IPV6, *basicInfo, *securityInfo, nt3CheckType = utils.BasicsAndSecurityCheck(language, "", false) | ||||
| 				securityTestStatus = false | ||||
| 			} | ||||
| 			if basicStatus { | ||||
| @@ -688,24 +796,16 @@ 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() { | ||||
| 	return utils.PrintAndCapture(func() { | ||||
| 		if backtraceStatus && !onlyChinaTest { | ||||
| 			utils.PrintCenteredTitle("三网回程线路检测", width) | ||||
| 			if strings.Contains(output, "IPV6") { | ||||
| 				backtrace.BackTrace(true) | ||||
| 			} else { | ||||
| 				backtrace.BackTrace(false) | ||||
| 			utils.PrintCenteredTitle("上游及回程线路检测", width) | ||||
| 			upstreams.UpstreamsCheck() // 不能在重定向的同时外部并发,此处仅可以顺序执行 | ||||
| 		} | ||||
| 		} | ||||
| 	}, tempOutput, output) | ||||
| 	output = utils.PrintAndCapture(func() { | ||||
| 		if nt3Status && !onlyChinaTest { | ||||
| 			utils.PrintCenteredTitle("三网回程路由检测", width) | ||||
| 			nt.TraceRoute(language, nt3Location, nt3CheckType) | ||||
| 			nexttrace.NextTrace3Check(language, nt3Location, nt3CheckType) // 不能在重定向的同时外部并发,此处仅可以顺序执行 | ||||
| 		} | ||||
| 	}, tempOutput, output) | ||||
| 	return utils.PrintAndCapture(func() { | ||||
| 		if onlyChinaTest || pingTestStatus { | ||||
| 		if (onlyChinaTest || pingTestStatus) && *ptInfo != "" { | ||||
| 			wg3.Wait() | ||||
| 			utils.PrintCenteredTitle("三网ICMP的PING值检测", width) | ||||
| 			fmt.Println(*ptInfo) | ||||
| @@ -786,12 +886,16 @@ func main() { | ||||
| 		return | ||||
| 	} | ||||
| 	initLogger() | ||||
| 	go func() { | ||||
| 		http.Get("https://hits.spiritlhl.net/goecs.svg?action=hit&title=Hits&title_bg=%23555555&count_bg=%230eecf8&edge_flat=false") | ||||
| 	}() | ||||
| 	preCheck := utils.CheckPublicAccess(3 * time.Second) | ||||
| 	go func() { | ||||
| 		if preCheck.Connected { | ||||
| 			http.Get("https://hits.spiritlhl.net/goecs.svg?action=hit&title=Hits&title_bg=%23555555&count_bg=%230eecf8&edge_flat=false") | ||||
| 		} | ||||
| 	}() | ||||
| 	if menuMode { | ||||
| 		handleMenuMode(preCheck) | ||||
| 	} else { | ||||
| 		onlyIpInfoCheckStatus = true | ||||
| 	} | ||||
| 	handleLanguageSpecificSettings() | ||||
| 	if !preCheck.Connected { | ||||
| @@ -810,9 +914,9 @@ 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") | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										6
									
								
								goecs.sh
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								goecs.sh
									
									
									
									
									
								
							| @@ -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.53" | ||||
|     ECS_VERSION="0.1.79" | ||||
|     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.53" | ||||
|         ECS_VERSION="0.1.53" | ||||
|         _yellow "Unable to get version info, using default version 0.1.79" | ||||
|         ECS_VERSION="0.1.79" | ||||
|     fi | ||||
|     version_output="" | ||||
|     for cmd_path in "goecs" "./goecs" "/usr/bin/goecs" "/usr/local/bin/goecs"; do | ||||
|   | ||||
| @@ -10,7 +10,6 @@ import ( | ||||
| 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" | ||||
| 			realTestMethod = "winsat" | ||||
| 		} | ||||
| 		res += memory.WinsatTest(language) | ||||
| @@ -19,7 +18,6 @@ func MemoryTest(language, testMethod string) (realTestMethod, res string) { | ||||
| 		case "sysbench": | ||||
| 			res = memory.SysBenchTest(language) | ||||
| 			if res == "" { | ||||
| 				// res = "sysbench test failed, switch to use dd test.\n" | ||||
| 				res += memory.DDTest(language) | ||||
| 				realTestMethod = "dd" | ||||
| 			} else { | ||||
| @@ -29,7 +27,6 @@ func MemoryTest(language, testMethod string) (realTestMethod, res string) { | ||||
| 			res = memory.DDTest(language) | ||||
| 			realTestMethod = "dd" | ||||
| 		default: | ||||
| 			// res = "Unsupported test method, switch to use dd test.\n" | ||||
| 			res += memory.DDTest(language) | ||||
| 			realTestMethod = "dd" | ||||
| 		} | ||||
|   | ||||
							
								
								
									
										44
									
								
								nexttrace/nexttrace.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								nexttrace/nexttrace.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| package nexttrace | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/oneclickvirt/nt3/nt" | ||||
| ) | ||||
|  | ||||
| func NextTrace3Check(language, nt3Location, nt3CheckType string) { | ||||
| 	resultChan := make(chan nt.TraceResult, 100) | ||||
| 	go nt.TraceRoute(language, nt3Location, nt3CheckType, resultChan) | ||||
| 	for result := range resultChan { | ||||
| 		if result.Index == -1 { | ||||
| 			for index, res := range result.Output { | ||||
| 				res = strings.TrimSpace(res) | ||||
| 				if res != "" && index == 0 { | ||||
| 					fmt.Println(res) | ||||
| 				} | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
| 		if result.ISPName == "Error" { | ||||
| 			for _, res := range result.Output { | ||||
| 				res = strings.TrimSpace(res) | ||||
| 				if res != "" { | ||||
| 					fmt.Println(res) | ||||
| 				} | ||||
| 			} | ||||
| 			return | ||||
| 		} | ||||
| 		for _, res := range result.Output { | ||||
| 			res = strings.TrimSpace(res) | ||||
| 			if res == "" { | ||||
| 				continue | ||||
| 			} | ||||
| 			if strings.Contains(res, "ICMP") { | ||||
| 				fmt.Print(res) | ||||
| 			} else { | ||||
| 				fmt.Println(res) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										13
									
								
								nexttrace/nexttrace_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								nexttrace/nexttrace_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| package nexttrace | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| func TestNextTrace3Check(t *testing.T) { | ||||
| 	start := time.Now() | ||||
| 	NextTrace3Check("zh", "ALL", "ipv4") | ||||
| 	duration := time.Since(start) | ||||
| 	t.Logf("执行耗时: %s", duration) | ||||
| } | ||||
							
								
								
									
										66
									
								
								upstreams/upstreams.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								upstreams/upstreams.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| package upstreams | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"sync" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/oneclickvirt/UnlockTests/uts" | ||||
| 	bgptools "github.com/oneclickvirt/backtrace/bgptools" | ||||
| 	backtrace "github.com/oneclickvirt/backtrace/bk" | ||||
| 	. "github.com/oneclickvirt/defaultset" | ||||
| ) | ||||
|  | ||||
| type IpInfo struct { | ||||
| 	Ip      string `json:"ip"` | ||||
| 	City    string `json:"city"` | ||||
| 	Region  string `json:"region"` | ||||
| 	Country string `json:"country"` | ||||
| 	Org     string `json:"org"` | ||||
| } | ||||
|  | ||||
| type ConcurrentResults struct { | ||||
| 	bgpResult       string | ||||
| 	backtraceResult string | ||||
| 	bgpError        error | ||||
| 	// backtraceError  error | ||||
| } | ||||
|  | ||||
| var IPV4, IPV6 string | ||||
|  | ||||
| func UpstreamsCheck() { | ||||
| 	results := ConcurrentResults{} | ||||
| 	var wg sync.WaitGroup | ||||
| 	if IPV4 != "" { | ||||
| 		wg.Add(1) | ||||
| 		go func() { | ||||
| 			defer wg.Done() | ||||
| 			for i := 0; i < 2; i++ { | ||||
| 				result, err := bgptools.GetPoPInfo(IPV4) | ||||
| 				results.bgpError = err | ||||
| 				if err == nil && result.Result != "" { | ||||
| 					results.bgpResult = result.Result | ||||
| 					return | ||||
| 				} | ||||
| 				if i == 0 { | ||||
| 					time.Sleep(3 * time.Second) | ||||
| 				} | ||||
| 			} | ||||
| 		}() | ||||
| 	} | ||||
| 	wg.Add(1) | ||||
| 	go func() { | ||||
| 		defer wg.Done() | ||||
| 		result := backtrace.BackTrace(uts.IPV6) | ||||
| 		results.backtraceResult = result | ||||
| 	}() | ||||
| 	wg.Wait() | ||||
| 	if results.bgpResult != "" { | ||||
| 		fmt.Print(results.bgpResult) | ||||
| 	} | ||||
| 	if results.backtraceResult != "" { | ||||
| 		fmt.Printf("%s\n", results.backtraceResult) | ||||
| 	} | ||||
| 	fmt.Println(Yellow("准确线路自行查看详细路由,本测试结果仅作参考")) | ||||
| 	fmt.Println(Yellow("同一目标地址多个线路时,检测可能已越过汇聚层,除第一个线路外,后续信息可能无效")) | ||||
| } | ||||
							
								
								
									
										8
									
								
								upstreams/uptreams_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								upstreams/uptreams_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| package upstreams | ||||
|  | ||||
| import "testing" | ||||
|  | ||||
| func TestUpstreamsCheck(t *testing.T) { | ||||
| 	IPV4 = "148.100.85.25" | ||||
| 	UpstreamsCheck() | ||||
| } | ||||
							
								
								
									
										138
									
								
								utils/utils.go
									
									
									
									
									
								
							
							
						
						
									
										138
									
								
								utils/utils.go
									
									
									
									
									
								
							| @@ -11,6 +11,7 @@ import ( | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"regexp" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 	"time" | ||||
| @@ -18,11 +19,28 @@ import ( | ||||
|  | ||||
| 	"github.com/imroc/req/v3" | ||||
| 	"github.com/oneclickvirt/UnlockTests/uts" | ||||
| 	bnetwork "github.com/oneclickvirt/basics/network" | ||||
| 	"github.com/oneclickvirt/basics/system" | ||||
| 	butils "github.com/oneclickvirt/basics/utils" | ||||
| 	. "github.com/oneclickvirt/defaultset" | ||||
| 	"github.com/oneclickvirt/security/network" | ||||
| ) | ||||
|  | ||||
| // 获取本程序本日及总执行的统计信息 | ||||
| type StatsResponse struct { | ||||
| 	Counter   string `json:"counter"` | ||||
| 	Action    string `json:"action"` | ||||
| 	Total     int    `json:"total"` | ||||
| 	Daily     int    `json:"daily"` | ||||
| 	Date      string `json:"date"` | ||||
| 	Timestamp string `json:"timestamp"` | ||||
| } | ||||
|  | ||||
| // 获取最新的Github的仓库中的版本 | ||||
| type GitHubRelease struct { | ||||
| 	TagName string `json:"tag_name"` | ||||
| } | ||||
|  | ||||
| // PrintCenteredTitle 根据指定的宽度打印居中标题 | ||||
| func PrintCenteredTitle(title string, width int) { | ||||
| 	// 计算字符串的字符数 | ||||
| @@ -98,18 +116,38 @@ func CheckChina(enableLogger bool) bool { | ||||
| 	return selectChina | ||||
| } | ||||
|  | ||||
| // OnlyBasicsIpInfo 仅检查和输出IP信息 | ||||
| func OnlyBasicsIpInfo(language string) (string, string, string) { | ||||
| 	ipv4, ipv6, ipInfo, _, err := bnetwork.NetworkCheck("both", false, language) | ||||
| 	if err != nil { | ||||
| 		return "", "", "" | ||||
| 	} | ||||
| 	basicInfo := ipInfo | ||||
| 	if strings.Contains(ipInfo, "IPV4") && strings.Contains(ipInfo, "IPV6") && ipv4 != "" && ipv6 != "" { | ||||
| 		uts.IPV4 = true | ||||
| 		uts.IPV6 = true | ||||
| 	} else if strings.Contains(ipInfo, "IPV4") && ipv4 != "" { | ||||
| 		uts.IPV4 = true | ||||
| 		uts.IPV6 = false | ||||
| 	} else if strings.Contains(ipInfo, "IPV6") && ipv6 != "" { | ||||
| 		uts.IPV6 = true | ||||
| 		uts.IPV4 = false | ||||
| 	} | ||||
| 	basicInfo = strings.ReplaceAll(basicInfo, "\n\n", "\n") | ||||
| 	return ipv4, ipv6, basicInfo | ||||
| } | ||||
|  | ||||
| // BasicsAndSecurityCheck 执行安全检查 | ||||
| func BasicsAndSecurityCheck(language, nt3CheckType string, securityCheckStatus bool) (string, string, string) { | ||||
| func BasicsAndSecurityCheck(language, nt3CheckType string, securityCheckStatus bool) (string, string, string, string, string) { | ||||
| 	var wgt sync.WaitGroup | ||||
| 	var ipInfo, securityInfo, systemInfo string | ||||
| 	var err error | ||||
| 	var ipv4, ipv6, ipInfo, securityInfo, systemInfo string | ||||
| 	wgt.Add(1) | ||||
| 	go func() { | ||||
| 		defer wgt.Done() | ||||
| 		ipInfo, securityInfo, err = network.NetworkCheck("both", securityCheckStatus, language) | ||||
| 		if err != nil { | ||||
| 			fmt.Println(err.Error()) | ||||
| 		} | ||||
| 		ipv4, ipv6, ipInfo, securityInfo, _ = network.NetworkCheck("both", securityCheckStatus, language) | ||||
| 		// if err != nil { | ||||
| 		// 	fmt.Println(err.Error()) | ||||
| 		// } | ||||
| 	}() | ||||
| 	wgt.Add(1) | ||||
| 	go func() { | ||||
| @@ -118,19 +156,19 @@ func BasicsAndSecurityCheck(language, nt3CheckType string, securityCheckStatus b | ||||
| 	}() | ||||
| 	wgt.Wait() | ||||
| 	basicInfo := systemInfo + ipInfo | ||||
| 	if strings.Contains(ipInfo, "IPV4") && strings.Contains(ipInfo, "IPV6") { | ||||
| 	if strings.Contains(ipInfo, "IPV4") && strings.Contains(ipInfo, "IPV6") && ipv4 != "" && ipv6 != "" { | ||||
| 		uts.IPV4 = true | ||||
| 		uts.IPV6 = true | ||||
| 		if nt3CheckType == "" { | ||||
| 			nt3CheckType = "ipv4" | ||||
| 		} | ||||
| 	} else if strings.Contains(ipInfo, "IPV4") { | ||||
| 	} else if strings.Contains(ipInfo, "IPV4") && ipv4 != "" { | ||||
| 		uts.IPV4 = true | ||||
| 		uts.IPV6 = false | ||||
| 		if nt3CheckType == "" { | ||||
| 			nt3CheckType = "ipv4" | ||||
| 		} | ||||
| 	} else if strings.Contains(ipInfo, "IPV6") { | ||||
| 	} else if strings.Contains(ipInfo, "IPV6") && ipv6 != "" { | ||||
| 		uts.IPV6 = true | ||||
| 		uts.IPV4 = false | ||||
| 		if nt3CheckType == "" { | ||||
| @@ -143,7 +181,7 @@ func BasicsAndSecurityCheck(language, nt3CheckType string, securityCheckStatus b | ||||
| 		nt3CheckType = "ipv4" | ||||
| 	} | ||||
| 	basicInfo = strings.ReplaceAll(basicInfo, "\n\n", "\n") | ||||
| 	return basicInfo, securityInfo, nt3CheckType | ||||
| 	return ipv4, ipv6, basicInfo, securityInfo, nt3CheckType | ||||
| } | ||||
|  | ||||
| // CaptureOutput 捕获函数输出和错误输出,实时输出,并返回字符串 | ||||
| @@ -335,8 +373,6 @@ func ProcessAndUpload(output string, filePath string, enableUplaod bool) (string | ||||
| 	return "", "" | ||||
| } | ||||
|  | ||||
| // ============================= 前置联网能力检测 ============================= | ||||
|  | ||||
| var StackType string | ||||
|  | ||||
| type NetCheckResult struct { | ||||
| @@ -358,6 +394,7 @@ func makeResolver(proto, dnsAddr string) *net.Resolver { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // 前置联网能力检测 | ||||
| func CheckPublicAccess(timeout time.Duration) NetCheckResult { | ||||
| 	if timeout < 2*time.Second { | ||||
| 		timeout = 2 * time.Second | ||||
| @@ -483,6 +520,7 @@ result: | ||||
| 		stack = "IPv6" | ||||
| 	} | ||||
| 	StackType = stack | ||||
| 	butils.CheckPublicAccess(3 * time.Second) // 设置basics检测,避免部分测试未启用 | ||||
| 	return NetCheckResult{ | ||||
| 		HasIPv4:   hasV4, | ||||
| 		HasIPv6:   hasV6, | ||||
| @@ -490,3 +528,77 @@ result: | ||||
| 		StackType: stack, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // 获取每日/总的程序执行统计信息 | ||||
| func GetGoescStats() (*StatsResponse, error) { | ||||
| 	client := req.C().SetTimeout(5 * time.Second) | ||||
| 	var stats StatsResponse | ||||
| 	resp, err := client.R(). | ||||
| 		SetSuccessResult(&stats). | ||||
| 		Get("https://hits.spiritlhl.net/goecs") | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if !resp.IsSuccessState() { | ||||
| 		return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode) | ||||
| 	} | ||||
| 	return &stats, nil | ||||
| } | ||||
|  | ||||
| // 统计结果单位转换 | ||||
| func FormatGoecsNumber(num int) string { | ||||
| 	if num >= 1000000 { | ||||
| 		return fmt.Sprintf("%.1fM", float64(num)/1000000) | ||||
| 	} else if num >= 1000 { | ||||
| 		return fmt.Sprintf("%.1fK", float64(num)/1000) | ||||
| 	} | ||||
| 	return fmt.Sprintf("%d", num) | ||||
| } | ||||
|  | ||||
| // 通过Github的API检索仓库最新TAG的版本 | ||||
| func GetLatestEcsRelease() (*GitHubRelease, error) { | ||||
| 	urls := []string{ | ||||
| 		"https://api.github.com/repos/oneclickvirt/ecs/releases/latest", | ||||
| 		"https://fd.spiritlhl.top/https://api.github.com/repos/oneclickvirt/ecs/releases/latest", | ||||
| 		"https://githubapi.spiritlhl.top/repos/oneclickvirt/ecs/releases/latest", | ||||
| 		"https://githubapi.spiritlhl.workers.dev/repos/oneclickvirt/ecs/releases/latest", | ||||
| 	} | ||||
| 	client := req.C().SetTimeout(3 * time.Second) | ||||
| 	for _, url := range urls { | ||||
| 		var release GitHubRelease | ||||
| 		resp, err := client.R(). | ||||
| 			SetSuccessResult(&release). | ||||
| 			Get(url) | ||||
| 		if err != nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		if resp.IsSuccessState() && release.TagName != "" { | ||||
| 			return &release, nil | ||||
| 		} | ||||
| 	} | ||||
| 	return nil, fmt.Errorf("failed to fetch release from all sources") | ||||
| } | ||||
|  | ||||
| // 比较程序版本是否需要升级 | ||||
| func CompareVersions(v1, v2 string) int { | ||||
| 	normalize := func(s string) []int { | ||||
| 		s = strings.TrimPrefix(strings.ToLower(s), "v") | ||||
| 		parts := strings.Split(s, ".") | ||||
| 		result := make([]int, 3) | ||||
| 		for i := 0; i < 3 && i < len(parts); i++ { | ||||
| 			n, _ := strconv.Atoi(parts[i]) | ||||
| 			result[i] = n | ||||
| 		} | ||||
| 		return result | ||||
| 	} | ||||
| 	a := normalize(v1) | ||||
| 	b := normalize(v2) | ||||
| 	for i := 0; i < 3; i++ { | ||||
| 		if a[i] < b[i] { | ||||
| 			return -1 | ||||
| 		} else if a[i] > b[i] { | ||||
| 			return 1 | ||||
| 		} | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|   | ||||
| @@ -6,7 +6,17 @@ import ( | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| func TestCheckPublicAccess(t *testing.T) { | ||||
| // func TestCheckPublicAccess(t *testing.T) { | ||||
| // 	timeout := 3 * time.Second | ||||
| // 	result := CheckPublicAccess(timeout) | ||||
| // 	if result.Connected { | ||||
| // 		fmt.Print("✅ 本机有公网连接,类型: %s\n", result.StackType) | ||||
| // 	} else { | ||||
| // 		fmt.Println("❌ 本机未检测到公网连接") | ||||
| // 	} | ||||
| // } | ||||
|  | ||||
| func TestBasicsAndSecurityCheck(t *testing.T) { | ||||
| 	timeout := 3 * time.Second | ||||
| 	result := CheckPublicAccess(timeout) | ||||
| 	if result.Connected { | ||||
| @@ -14,4 +24,8 @@ func TestCheckPublicAccess(t *testing.T) { | ||||
| 	} else { | ||||
| 		fmt.Println("❌ 本机未检测到公网连接") | ||||
| 	} | ||||
| 	_, _, basicInfo, securityInfo, nt3CheckType := BasicsAndSecurityCheck("zh", "ipv4", false) | ||||
| 	fmt.Println(basicInfo) | ||||
| 	fmt.Println(securityInfo) | ||||
| 	fmt.Println(nt3CheckType) | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user