mirror of
				https://github.com/oneclickvirt/ecs.git
				synced 2025-11-01 03:12:44 +08:00 
			
		
		
		
	Compare commits
	
		
			238 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 57e87348d4 | ||
|   | d40bf5a195 | ||
|   | 753738931d | ||
|   | a702c5416a | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | a587d71348 | ||
|   | 110e6d34f9 | ||
|   | 4d18497dd3 | ||
|   | c676cd83cb | ||
|   | 58e1de4487 | ||
|   | 89eecd2acc | ||
|   | 194dee49fd | ||
|   | 1e88513b8e | ||
|   | f84023d18b | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 2cfd5af3c0 | ||
|   | ed66e2804a | ||
|   | 174bf303af | ||
|   | b75f42ffe5 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 56b71ac53f | ||
|   | 1045d3fab8 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 7bd2b59d58 | ||
|   | cc1da7ea7c | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 1a002a1681 | ||
|   | ee2b55e7eb | ||
|   | a55cebf94b | ||
|   | 0571a8df13 | ||
|   | f29a2829f3 | ||
|   | 33b8e0396f | ||
|   | c259073d1b | ||
|   | 07ebc8cab5 | ||
|   | 1824051e53 | ||
|   | 9f93a2e59d | ||
|   | 8cd09182da | ||
|   | 9bb776d411 | ||
|   | 12f2da9da2 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 7aa70ac1fd | ||
|   | 04ce926582 | ||
|   | 73eb38eed1 | ||
|   | 9bc8a934b1 | ||
|   | 7b729e073b | ||
|   | 111126ae90 | ||
|   | 9397f789be | ||
|   | 5a1dda6483 | ||
|   | e322c717c0 | ||
|   | 778b33142b | ||
|   | aa9f361380 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 3236c60359 | ||
|   | 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 | ||
|   | 2a66452f40 | ||
|   | aab6bf197d | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 9206088bad | ||
|   | 48e150036d | ||
|   | 486b767a25 | ||
|   | 5a2e68bf92 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 97d05f4b57 | ||
|   | 4f08a33de8 | ||
|   | ff8712a743 | ||
|   | abd38554b6 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 918a9b3a46 | ||
|   | d9dac50487 | ||
|   | cd65f04433 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 8b5193eca1 | ||
|   | 4797ff0b34 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 9886cad73e | ||
|   | ca0470f01a | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 5a6d6845c1 | ||
|   | 487dd7c1d2 | ||
|   | 2dbf97de8c | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 97e7cae2c2 | ||
|   | d61a1879f5 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 29dd4ac57e | ||
|   | dc3eff1fe3 | ||
|   | 0a0f2199bc | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 91004d87f5 | ||
|   | 8f41c37203 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 12b1ae0702 | ||
|   | 653cd75a97 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | ea36e88c9f | ||
|   | c81ebb3c7a | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 7896b3ead5 | ||
|   | eb98a7b857 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | d4d86229de | ||
|   | 651a183382 | ||
|   | afc313a2a8 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 39ac8d198d | ||
|   | a70dc2bab1 | ||
|   | 5041a16a9a | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 21deb3587e | ||
|   | 3bac30edc2 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 9ef2ec4a9e | ||
|   | ac33e00e0a | ||
|   | 7a439f7095 | ||
|   | e3bfa65f66 | ||
|   | 74e33a212c | ||
|   | bba8595033 | ||
|   | 530181be87 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 7deb986209 | ||
|   | ea8e5efbd3 | ||
|   | db88ee8479 | ||
|   | 67a3bfdaad | ||
|   | e57ce05c0c | ||
|   | 62137f0bb1 | ||
|   | f9d8c9ee4c | ||
|   | 913a1725c1 | ||
|   | f1acbd361b | ||
|   | d6f62f8624 | 
							
								
								
									
										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 | ||||||
							
								
								
									
										14
									
								
								.back/OldFunction.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								.back/OldFunction.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | // 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() | ||||||
|  | } | ||||||
| @@ -12,5 +12,5 @@ func Basic(language string) { | |||||||
| 	ipInfo, _, _ := network.NetworkCheck("both", false, language) | 	ipInfo, _, _ := network.NetworkCheck("both", false, language) | ||||||
| 	systemInfo := system.CheckSystemInfo(language) | 	systemInfo := system.CheckSystemInfo(language) | ||||||
| 	basicInfo := strings.ReplaceAll(systemInfo+ipInfo, "\n\n", "\n") | 	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 }} | ||||||
							
								
								
									
										467
									
								
								.back/build_binary_cgo.old
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										467
									
								
								.back/build_binary_cgo.old
									
									
									
									
									
										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
									
								
								.back/build_binary_musl.old
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										527
									
								
								.back/build_binary_musl.old
									
									
									
									
									
										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 }} | ||||||
| @@ -7,5 +7,5 @@ import ( | |||||||
| 
 | 
 | ||||||
| func ComMediaTest(language string) { | func ComMediaTest(language string) { | ||||||
| 	res := commediatests.MediaTests(language) | 	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") | 	ipInfo, securityInfo, _ := NetworkCheck("both", true, "zh") | ||||||
| 	fmt.Println("--------------------------------------------------") | 	fmt.Println("--------------------------------------------------") | ||||||
| 	fmt.Printf(ipInfo) | 	fmt.Print(ipInfo) | ||||||
| 	fmt.Println("--------------------------------------------------") | 	fmt.Println("--------------------------------------------------") | ||||||
| 	fmt.Printf(securityInfo) | 	fmt.Print(securityInfo) | ||||||
| 	fmt.Println("--------------------------------------------------") | 	fmt.Println("--------------------------------------------------") | ||||||
| } | } | ||||||
							
								
								
									
										74
									
								
								.github/workflows/build_binary.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								.github/workflows/build_binary.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | |||||||
|  | name: Build and Release | ||||||
|  |  | ||||||
|  | on: | ||||||
|  |   workflow_dispatch: | ||||||
|  |     tags: | ||||||
|  |       - "v*.*.*" | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   goreleaser: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     container: | ||||||
|  |       # 1.20 是 Windows 7/8 Server 2008/2012 最后一个支持版本 | ||||||
|  |       image: goreleaser/goreleaser-cross:v1.20 | ||||||
|  |     steps: | ||||||
|  |       - run: | | ||||||
|  |           git config --global --add safe.directory /__w/ecs/ecs | ||||||
|  |       - name: Checkout | ||||||
|  |         uses: actions/checkout@v3 | ||||||
|  |         with: | ||||||
|  |           fetch-depth: 0 | ||||||
|  |  | ||||||
|  |       - name: Set up Go | ||||||
|  |         uses: actions/setup-go@v4 | ||||||
|  |         with: | ||||||
|  |           go-version: 1.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: Run GoReleaser | ||||||
|  |         uses: goreleaser/goreleaser-action@v6 | ||||||
|  |         with: | ||||||
|  |           distribution: goreleaser | ||||||
|  |           # version: latest | ||||||
|  |           version: '~> v2' | ||||||
|  |           args: release | ||||||
|  |         env: | ||||||
|  |           GITHUB_TOKEN: ${{ secrets.GHT }} | ||||||
|  |           GOPRIVATE: github.com/oneclickvirt/security | ||||||
|  |  | ||||||
|  |       - name: Update goecs.sh with new version | ||||||
|  |         run: | | ||||||
|  |           if [[ "$GITHUB_REF" == refs/tags/* ]]; then | ||||||
|  |             VERSION="${GITHUB_REF#refs/tags/v}" | ||||||
|  |           else | ||||||
|  |             VERSION=$(git describe --tags --abbrev=0 2>/dev/null | sed 's/^v//' || echo "0.1.37") | ||||||
|  |           fi | ||||||
|  |           echo "Using version: $VERSION" | ||||||
|  |           FILE="goecs.sh" | ||||||
|  |           BRANCH="master" | ||||||
|  |           git config --global user.name "github-actions[bot]" | ||||||
|  |           git config --global user.email "github-actions[bot]@users.noreply.github.com" | ||||||
|  |           git config --global --unset url."git@github.com:".insteadOf || true | ||||||
|  |           git fetch origin $BRANCH | ||||||
|  |           git checkout $BRANCH | ||||||
|  |           if [ ! -f "$FILE" ]; then | ||||||
|  |             echo "Error: $FILE not found" | ||||||
|  |             exit 1 | ||||||
|  |           fi | ||||||
|  |           sed -i "s/\(_yellow \"Unable to get version info, using default version \).*\(\".*\)/\1$VERSION\2/" "$FILE" | ||||||
|  |           sed -i "s/\(ECS_VERSION=\"\).*\(\"\)/\1$VERSION\2/" "$FILE" | ||||||
|  |           if git diff --quiet "$FILE"; then | ||||||
|  |             echo "No changes detected in $FILE" | ||||||
|  |             exit 0 | ||||||
|  |           fi | ||||||
|  |           git add "$FILE" | ||||||
|  |           git commit -m "chore: update ECS_VERSION to $VERSION in goecs.sh" | ||||||
|  |           git push origin $BRANCH | ||||||
|  |         env: | ||||||
|  |           GITHUB_TOKEN: ${{ secrets.GHT }} | ||||||
							
								
								
									
										45
									
								
								.github/workflows/build_docker.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										45
									
								
								.github/workflows/build_docker.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -1,46 +1,61 @@ | |||||||
| name: Build and Push Docker Image | name: Build and Push Docker Image | ||||||
|  |  | ||||||
| on: | on: | ||||||
|   release: |   workflow_run: | ||||||
|     types: [ published ] |     workflows: ["Build and Release"] | ||||||
|  |     types: | ||||||
|  |       - completed | ||||||
|   workflow_dispatch: |   workflow_dispatch: | ||||||
|  |  | ||||||
| jobs: | jobs: | ||||||
|   build: |   build: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       packages: write | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout repository |       - name: Checkout repository | ||||||
|         uses: actions/checkout@v2 |         uses: actions/checkout@v2 | ||||||
|  |  | ||||||
|       - name: Set up QEMU |       - name: Set up QEMU | ||||||
|         uses: docker/setup-qemu-action@v2 |         uses: docker/setup-qemu-action@v2 | ||||||
|         with: |         with: | ||||||
|           platforms: all |           platforms: all | ||||||
|  |  | ||||||
|       - name: Set up Docker Buildx |       - name: Set up Docker Buildx | ||||||
|         uses: docker/setup-buildx-action@v2 |         uses: docker/setup-buildx-action@v2 | ||||||
|  |  | ||||||
|       - name: Log in to Docker Hub |       - name: Log in to Docker Hub | ||||||
|         uses: docker/login-action@v2 |         uses: docker/login-action@v2 | ||||||
|         with: |         with: | ||||||
|           username: ${{ secrets.DOCKER_USERNAME }} |           username: ${{ secrets.DOCKER_USERNAME }} | ||||||
|           password: ${{ secrets.DOCKER_PASSWORD }} |           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 |         uses: docker/login-action@v2 | ||||||
|         with: |         with: | ||||||
|           registry: ${{ secrets.CNB_DOCKER_REGISTRY }} |           registry: crpi-8tmognxgyb86bm61.cn-guangzhou.personal.cr.aliyuncs.com | ||||||
|           username: ${{ secrets.CNB_USERNAME }} |           username: ${{ secrets.ALIYUN_USERNAME }} | ||||||
|           password: ${{ secrets.CNB_TOKEN }} |           password: ${{ secrets.ALIYUN_PASSWORD }} | ||||||
|  |        | ||||||
|  |       - name: Log in to GitHub Container Registry | ||||||
|  |         uses: docker/login-action@v2 | ||||||
|  |         with: | ||||||
|  |           registry: ghcr.io | ||||||
|  |           username: ${{ github.actor }} | ||||||
|  |           password: ${{ secrets.GITHUB_TOKEN }} | ||||||
|  |        | ||||||
|       - name: Build and push Docker images |       - name: Build and push Docker images | ||||||
|         uses: docker/build-push-action@v4 |         uses: docker/build-push-action@v4 | ||||||
|         with: |         with: | ||||||
|           context: . |           context: . | ||||||
|           file: ./Dockerfile |           file: ./Dockerfile | ||||||
|           platforms: linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/386,linux/riscv64 |           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 |           push: true | ||||||
|           tags: | |           tags: | | ||||||
|             ${{ secrets.DOCKER_USERNAME }}/goecs:latest |             ${{ secrets.DOCKER_USERNAME }}/goecs:latest | ||||||
|             ${{ secrets.CNB_DOCKER_REGISTRY }}/oneclickvirt/ecs:latest |             crpi-8tmognxgyb86bm61.cn-guangzhou.personal.cr.aliyuncs.com/oneclickvirt/ecs:latest | ||||||
|  |             ghcr.io/${{ github.repository_owner }}/goecs:latest | ||||||
|   | |||||||
							
								
								
									
										108
									
								
								.github/workflows/build_public.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								.github/workflows/build_public.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | |||||||
|  | name: Public Build | ||||||
|  | on: | ||||||
|  |   workflow_run: | ||||||
|  |     workflows: ["Build and Release"] | ||||||
|  |     types: | ||||||
|  |       - completed | ||||||
|  |   workflow_dispatch: | ||||||
|  | jobs: | ||||||
|  |   build: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |      | ||||||
|  |     steps: | ||||||
|  |     - uses: actions/checkout@v4 | ||||||
|  |       with: | ||||||
|  |         fetch-depth: 0 | ||||||
|  |     - name: Set up Go | ||||||
|  |       uses: actions/setup-go@v5 | ||||||
|  |       with: | ||||||
|  |         go-version: '1.24.5' | ||||||
|  |          | ||||||
|  |     - name: Update master branch README files | ||||||
|  |       run: | | ||||||
|  |         git config --global user.name 'GitHub Actions' | ||||||
|  |         git config --global user.email 'actions@github.com' | ||||||
|  |          | ||||||
|  |         if [ -f "go.mod" ]; then | ||||||
|  |           GO_VERSION=$(grep "^go " go.mod | head -n 1 | awk '{print $2}') | ||||||
|  |           echo "提取到的 Go 版本: $GO_VERSION" | ||||||
|  |           if [ -n "$GO_VERSION" ] && [[ "$GO_VERSION" =~ ^[0-9]+\.[0-9]+(\.[0-9]+)?$ ]]; then | ||||||
|  |             echo "版本验证成功,开始替换..." | ||||||
|  |             if [ -f "README.md" ]; then | ||||||
|  |               sed -i "s/选择 go [0-9]\+\.[0-9]\+\.[0-9]\+ 的版本进行安装/选择 go $GO_VERSION 的版本进行安装/g" README.md | ||||||
|  |               sed -i 's|但二进制文件编译至 \[securityCheck\].*)|但已开源|g' README.md | ||||||
|  |               sed -i 's|security.*Enable/Disable security test (default true)|security        Enable/Disable security test (default false)|g' README.md | ||||||
|  |               echo "已更新 README.md" | ||||||
|  |             fi | ||||||
|  |             if [ -f "README_EN.md" ]; then | ||||||
|  |               sed -i "s/Select go [0-9]\+\.[0-9]\+\.[0-9]\+ version to install/Select go $GO_VERSION version to install/g" README_EN.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_EN.md | ||||||
|  |               echo "已更新 README_EN.md" | ||||||
|  |             fi | ||||||
|  |             git add README.md README_EN.md | ||||||
|  |             git commit -m "Auto update README files" || echo "No changes to commit" | ||||||
|  |             git push origin ${{ github.ref_name }} | ||||||
|  |           else | ||||||
|  |             echo "错误:未能提取到有效的 Go 版本号或版本号格式不正确" | ||||||
|  |             exit 1 | ||||||
|  |           fi | ||||||
|  |         else | ||||||
|  |           echo "错误:未找到 go.mod 文件" | ||||||
|  |           exit 1 | ||||||
|  |         fi | ||||||
|  |          | ||||||
|  |     - name: Create public branch | ||||||
|  |       run: | | ||||||
|  |         git checkout -b public || git checkout public | ||||||
|  |         git merge ${{ github.ref_name }} --no-edit || true | ||||||
|  |          | ||||||
|  |     - name: Remove security package references | ||||||
|  |       run: | | ||||||
|  |         find . -type f -name "*.go" -exec sed -i 's|"github.com/oneclickvirt/security/network"|"github.com/oneclickvirt/basics/network"|g' {} + | ||||||
|  |         sed -i '/SecurityUploadToken/d' utils/utils.go | ||||||
|  |         sed -i 's|"github.com/oneclickvirt/security/network"|"github.com/oneclickvirt/basics/network"|g' utils/utils.go | ||||||
|  |         sed -i '/^import/,/^)/{/^)/a\'$'\n''const token = "OvwKx5qgJtf7PZgCKbtyojSU.MTcwMTUxNzY1MTgwMw"'$'\n''}' utils/utils.go | ||||||
|  |         sed -i '/github.com\/oneclickvirt\/security/d' go.mod | ||||||
|  |         sed -i 's|var securityFlag = flag.Bool("security", true,|var securityFlag = flag.Bool("security", false,|g' goecs.go | ||||||
|  |         sed -i 's|VPS融合怪测试|VPS融合怪测试(非官方编译)|g' utils/utils.go | ||||||
|  |         sed -i 's|VPS Fusion Monster Test|VPS Fusion Monster Test (Unofficial)|g' utils/utils.go | ||||||
|  |         go mod tidy | ||||||
|  |         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: Update Go version in README files | ||||||
|  |       run: | | ||||||
|  |         if [ -f "go.mod" ]; then | ||||||
|  |           GO_VERSION=$(grep "^go " go.mod | head -n 1 | awk '{print $2}') | ||||||
|  |           echo "提取到的 Go 版本: $GO_VERSION" | ||||||
|  |           if [ -n "$GO_VERSION" ] && [[ "$GO_VERSION" =~ ^[0-9]+\.[0-9]+(\.[0-9]+)?$ ]]; then | ||||||
|  |             echo "版本验证成功,开始替换..." | ||||||
|  |             if [ -f "README.md" ]; then | ||||||
|  |               sed -i "s/选择 go [0-9]\+\.[0-9]\+\.[0-9]\+ 的版本进行安装/选择 go $GO_VERSION 的版本进行安装/g" README.md | ||||||
|  |               echo "已更新 README.md" | ||||||
|  |             fi | ||||||
|  |             if [ -f "README_EN.md" ]; then | ||||||
|  |               sed -i "s/Select go [0-9]\+\.[0-9]\+\.[0-9]\+ version to install/Select go $GO_VERSION version to install/g" README_EN.md | ||||||
|  |               echo "已更新 README_EN.md" | ||||||
|  |             fi | ||||||
|  |           else | ||||||
|  |             echo "错误:未能提取到有效的 Go 版本号或版本号格式不正确" | ||||||
|  |             exit 1 | ||||||
|  |           fi | ||||||
|  |         else | ||||||
|  |           echo "错误:未找到 go.mod 文件" | ||||||
|  |           exit 1 | ||||||
|  |         fi | ||||||
|  |     - name: Build and Test | ||||||
|  |       run: | | ||||||
|  |         go build -o maintest | ||||||
|  |         ./maintest -menu=false -l en -security=false -upload=false || exit 1 | ||||||
|  |         rm -rf maintest | ||||||
|  |          | ||||||
|  |     - name: Commit and push changes | ||||||
|  |       run: | | ||||||
|  |         git add . | ||||||
|  |         git commit -m "Auto update public version (no security package)" || echo "No changes to commit" | ||||||
|  |         git push -f origin public | ||||||
							
								
								
									
										42
									
								
								.github/workflows/main.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								.github/workflows/main.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -1,42 +0,0 @@ | |||||||
| name: goreleaser |  | ||||||
|  |  | ||||||
| on: |  | ||||||
|   workflow_dispatch: |  | ||||||
|     tags: |  | ||||||
|       - "v*.*.*" |  | ||||||
|  |  | ||||||
| jobs: |  | ||||||
|   goreleaser: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     container: |  | ||||||
|       # 1.20 是 Windows 7/8 Server 2008/2012 最后一个支持版本 |  | ||||||
|       image: goreleaser/goreleaser-cross:v1.20 |  | ||||||
|     steps: |  | ||||||
|       - run: | |  | ||||||
|           git config --global --add safe.directory /__w/ecs/ecs |  | ||||||
|       - name: Checkout |  | ||||||
|         uses: actions/checkout@v3 |  | ||||||
|         with: |  | ||||||
|           fetch-depth: 0 |  | ||||||
|  |  | ||||||
|       - name: Set up Go |  | ||||||
|         uses: actions/setup-go@v4 |  | ||||||
|         with: |  | ||||||
|           go-version: 1.23.4 |  | ||||||
|  |  | ||||||
|       - name: Configure Git for Private Modules |  | ||||||
|         run: | |  | ||||||
|           git config --global url."https://${{ secrets.GHT }}@github.com/".insteadOf "https://github.com/" |  | ||||||
|           git config --global url."git@github.com:".insteadOf "https://github.com/" |  | ||||||
|         env: |  | ||||||
|           GITHUB_TOKEN: ${{ secrets.GHT }} |  | ||||||
|  |  | ||||||
|       - name: Run GoReleaser |  | ||||||
|         uses: goreleaser/goreleaser-action@v2 |  | ||||||
|         with: |  | ||||||
|           distribution: goreleaser |  | ||||||
|           version: latest |  | ||||||
|           args: release |  | ||||||
|         env: |  | ||||||
|           GITHUB_TOKEN: ${{ secrets.GHT }} |  | ||||||
|           GOPRIVATE: github.com/oneclickvirt/security |  | ||||||
							
								
								
									
										81
									
								
								.github/workflows/public-build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										81
									
								
								.github/workflows/public-build.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,81 +0,0 @@ | |||||||
| name: Public Build |  | ||||||
|  |  | ||||||
| on: |  | ||||||
|   release: |  | ||||||
|     types: [ published ] |  | ||||||
|   workflow_dispatch: |  | ||||||
|  |  | ||||||
| jobs: |  | ||||||
|   build: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|      |  | ||||||
|     steps: |  | ||||||
|     - uses: actions/checkout@v4 |  | ||||||
|       with: |  | ||||||
|         fetch-depth: 0 |  | ||||||
|  |  | ||||||
|     - name: Set up Go |  | ||||||
|       uses: actions/setup-go@v5 |  | ||||||
|       with: |  | ||||||
|         go-version: '1.23.4' |  | ||||||
|          |  | ||||||
|     - name: Create public branch |  | ||||||
|       run: | |  | ||||||
|         git config --global user.name 'GitHub Actions' |  | ||||||
|         git config --global user.email 'actions@github.com' |  | ||||||
|         git checkout -b public || git checkout public |  | ||||||
|         git merge ${{ github.ref_name }} --no-edit || true |  | ||||||
|          |  | ||||||
|     - 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 |  | ||||||
|          |  | ||||||
|     - name: Commit and push changes |  | ||||||
|       run: | |  | ||||||
|         git add . |  | ||||||
|         git commit -m "Auto update public version (no security package)" || echo "No changes to commit" |  | ||||||
|         git push -f origin public |  | ||||||
							
								
								
									
										6
									
								
								.github/workflows/sync.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/sync.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -1,8 +1,10 @@ | |||||||
| name: Sync Latest Release | name: Sync Latest Release | ||||||
|  |  | ||||||
| on: | on: | ||||||
|   release: |   workflow_run: | ||||||
|     types: [published] |     workflows: ["Build and Release"] | ||||||
|  |     types: | ||||||
|  |       - completed | ||||||
|   workflow_dispatch: |   workflow_dispatch: | ||||||
|  |  | ||||||
| jobs: | jobs: | ||||||
|   | |||||||
| @@ -18,6 +18,10 @@ builds: | |||||||
|       - amd64 |       - amd64 | ||||||
|       - mips |       - mips | ||||||
|       - mipsle |       - mipsle | ||||||
|  |       - mips64 | ||||||
|  |       - mips64le | ||||||
|  |       - ppc64 | ||||||
|  |       - ppc64le | ||||||
|       - s390x |       - s390x | ||||||
|       - riscv64 |       - riscv64 | ||||||
|     gomips: |     gomips: | ||||||
|   | |||||||
							
								
								
									
										101
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,12 +1,14 @@ | |||||||
| # ECS | # ECS | ||||||
|  |  | ||||||
| [](https://github.com/oneclickvirt/ecs/actions/workflows/main.yaml)  | [](https://github.com/oneclickvirt/ecs/actions/workflows/build_binary.yaml) | ||||||
|  |  | ||||||
| [](https://hits.spiritlhl.net) | [](https://app.fossa.com/projects/git%2Bgithub.com%2Foneclickvirt%2Fecs?ref=badge_shield) | ||||||
|  |  | ||||||
|  | [](https://hits.spiritlhl.net) [](https://github.com/oneclickvirt/ecs/releases) | ||||||
|  |  | ||||||
| 融合怪测评项目 - GO版本 | 融合怪测评项目 - GO版本 | ||||||
|  |  | ||||||
| (环境安装[非必须]使用shell外无额外shell文件依赖,环境安装只是为了测的更准,极端情况下无环境依赖安装也可全测项目) | (仅环境安装[非必须]使用shell外无额外shell文件依赖,环境安装只是为了测的更准,极端情况下无环境依赖安装也可全测项目) | ||||||
|  |  | ||||||
| 如有问题请 [issues](https://github.com/oneclickvirt/ecs/issues) 反馈。 | 如有问题请 [issues](https://github.com/oneclickvirt/ecs/issues) 反馈。 | ||||||
|  |  | ||||||
| @@ -25,24 +27,26 @@ Shell 版本:[https://github.com/spiritLHLS/ecs](https://github.com/spiritLHLS | |||||||
| ## **适配系统和架构** | ## **适配系统和架构** | ||||||
|  |  | ||||||
| ### **编译与测试支持情况** | ### **编译与测试支持情况** | ||||||
| | 编译支持的架构 | 测试支持的架构 | 编译支持的系统 | 测试支持的系统 | | | 编译支持的架构             | 测试支持的架构 | 编译支持的系统             | 测试支持的系统 | | ||||||
| |---------------------------|-----------|---------|-----------| | |---------------------------|--------------|---------------------------|---------------| | ||||||
| | amd64                     | amd64     | Linux   | Linux     | | | amd64                     | amd64        | Linux                     | Linux         | | ||||||
| | arm                       | arm       | Windows | Windows   | | | arm64                     | arm64        | Windows                   | Windows       | | ||||||
| | arm64                     | arm64     | FreeBSD | FreeBSD   | | | arm                       |              | MacOS(Darwin)             | MacOS         | | ||||||
| | 386                       | 386       | OpenBSD |           | | | 386                       |              | FreeBSD                   |               | | ||||||
| | mips                      |           | MacOS   |           | | | mips,mipsle               |              | Android                   |               | | ||||||
| | mipsle                    |           |         |           | | | mips64,mips64le           |              |                           |               |  | ||||||
| | s390x                     | s390x     |         |           | | | ppc64,ppc64le             |              |                           |               | | ||||||
| | riscv64                   |           |         |           | | | s390x                     | s390x        |                           |               | | ||||||
|  | | riscv64                   |              |                           |               | | ||||||
|  |  | ||||||
|  | > 更多架构与系统请自行测试或编译,如有问题请开 issues。 | ||||||
| > 更多架构与系统请自行测试,如有问题请开 issues。 |  | ||||||
|  |  | ||||||
| ### **待支持的系统** | ### **待支持的系统** | ||||||
| | 系统 | 说明                       | |  | ||||||
| |-----|--------------------------| | | 系统           | 说明                       | | ||||||
| | MacOS | 存在硬件测试 BUG 未修复,存在环境依赖未修复 | | |----------------|---------------------------| | ||||||
|  | | Android(arm64) | 存在权限问题未修复,非安卓系统的ARM架构无问题      | | ||||||
|  | | OpenBSD/NetBSD | 部分Goalng的官方库未支持本系统(尤其是net相关项目)  | | ||||||
|  |  | ||||||
| --- | --- | ||||||
|  |  | ||||||
| @@ -50,16 +54,17 @@ Shell 版本:[https://github.com/spiritLHLS/ecs](https://github.com/spiritLHLS | |||||||
|  |  | ||||||
| - 系统基础信息查询,IP基础信息并发查询:[basics](https://github.com/oneclickvirt/basics)、[gostun](https://github.com/oneclickvirt/gostun) | - 系统基础信息查询,IP基础信息并发查询:[basics](https://github.com/oneclickvirt/basics)、[gostun](https://github.com/oneclickvirt/gostun) | ||||||
| - CPU 测试:[cputest](https://github.com/oneclickvirt/cputest),支持 sysbench(lua/golang版本)、geekbench、winsat | - CPU 测试:[cputest](https://github.com/oneclickvirt/cputest),支持 sysbench(lua/golang版本)、geekbench、winsat | ||||||
| - 内存测试:[memorytest](https://github.com/oneclickvirt/memorytest),支持 sysbench、dd | - 内存测试:[memorytest](https://github.com/oneclickvirt/memorytest),支持 sysbench、dd、winsat、mbw、stream | ||||||
| - 硬盘测试:[disktest](https://github.com/oneclickvirt/disktest),支持 dd、fio、winsat | - 硬盘测试:[disktest](https://github.com/oneclickvirt/disktest),支持 dd、fio、winsat | ||||||
| - 流媒体解锁信息并发查询:[netflix-verify](https://github.com/sjlleo/netflix-verify) 等逻辑,开发至 [CommonMediaTests](https://github.com/oneclickvirt/CommonMediaTests) | - 流媒体解锁信息并发查询:[netflix-verify](https://github.com/sjlleo/netflix-verify) 等逻辑,开发至 [CommonMediaTests](https://github.com/oneclickvirt/CommonMediaTests) | ||||||
| - 常见流媒体测试并发查询:[UnlockTests](https://github.com/oneclickvirt/UnlockTests),逻辑借鉴 [RegionRestrictionCheck](https://github.com/lmc999/RegionRestrictionCheck) 等 | - 常见流媒体测试并发查询:[UnlockTests](https://github.com/oneclickvirt/UnlockTests),逻辑借鉴 [RegionRestrictionCheck](https://github.com/lmc999/RegionRestrictionCheck) 等 | ||||||
| - IP 质量/安全信息并发查询:二进制文件编译至 [securityCheck](https://github.com/oneclickvirt/securityCheck) | - IP 质量/安全信息并发查询:二进制文件编译至 [securityCheck](https://github.com/oneclickvirt/securityCheck) | ||||||
| - 邮件端口测试:[portchecker](https://github.com/oneclickvirt/portchecker) | - 邮件端口测试:[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) | - 三网路由测试:基于 [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) | - 网速测试:基于 [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) | - 三网 Ping 值测试:借鉴 [ecsspeed](https://github.com/spiritLHLS/ecsspeed),二次开发至 [pingtest](https://github.com/oneclickvirt/pingtest) | ||||||
|  | - 支持root或admin环境下测试,支持非root或非admin环境下测试,支持离线环境下进行测试,**暂未**支持无DNS的在线环境下进行测试 | ||||||
|  |  | ||||||
| **本项目初次使用建议查看说明:[跳转](https://github.com/oneclickvirt/ecs/blob/master/README_NEW_USER.md)** | **本项目初次使用建议查看说明:[跳转](https://github.com/oneclickvirt/ecs/blob/master/README_NEW_USER.md)** | ||||||
|  |  | ||||||
| @@ -67,7 +72,7 @@ Shell 版本:[https://github.com/spiritLHLS/ecs](https://github.com/spiritLHLS | |||||||
|  |  | ||||||
| ## **使用说明** | ## **使用说明** | ||||||
|  |  | ||||||
| ### **Linux/FreeBSD/OpenBSD/MacOS** | ### **Linux/FreeBSD/MacOS** | ||||||
|  |  | ||||||
| #### **一键命令** | #### **一键命令** | ||||||
|  |  | ||||||
| @@ -76,25 +81,25 @@ Shell 版本:[https://github.com/spiritLHLS/ecs](https://github.com/spiritLHLS | |||||||
| - **国际用户无加速:** | - **国际用户无加速:** | ||||||
|  |  | ||||||
|   ```bash |   ```bash | ||||||
|   export noninteractive=true && curl -L https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh -o goecs.sh && chmod +x goecs.sh && bash goecs.sh env && bash goecs.sh install && goecs |   export noninteractive=true && curl -L https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh -o goecs.sh && chmod +x goecs.sh && ./goecs.sh env && ./goecs.sh install && goecs | ||||||
|   ``` |   ``` | ||||||
|  |  | ||||||
| - **国际/国内使用 CDN 加速:** | - **国际/国内使用 CDN 加速:** | ||||||
|  |  | ||||||
|   ```bash |   ```bash | ||||||
|   export noninteractive=true && curl -L https://cdn.spiritlhl.net/https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh -o goecs.sh && chmod +x goecs.sh && bash goecs.sh env && bash goecs.sh install && goecs |   export noninteractive=true && curl -L https://cdn.spiritlhl.net/https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh -o goecs.sh && chmod +x goecs.sh && ./goecs.sh env && ./goecs.sh install && goecs | ||||||
|   ``` |   ``` | ||||||
|  |  | ||||||
| - **国内用户使用 CNB 加速:** | - **国内用户使用 CNB 加速:** | ||||||
|  |  | ||||||
|   ```bash |   ```bash | ||||||
|   export noninteractive=true && curl -L https://cnb.cool/oneclickvirt/ecs/-/git/raw/main/goecs.sh -o goecs.sh && chmod +x goecs.sh && bash goecs.sh env && bash goecs.sh install && goecs |   export noninteractive=true && curl -L https://cnb.cool/oneclickvirt/ecs/-/git/raw/main/goecs.sh -o goecs.sh && chmod +x goecs.sh && ./goecs.sh env && ./goecs.sh install && goecs | ||||||
|   ``` |   ``` | ||||||
|  |  | ||||||
| - **短链接:** | - **短链接:** | ||||||
|  |  | ||||||
|   ```bash |   ```bash | ||||||
|   export noninteractive=true && curl -L https://bash.spiritlhl.net/goecs -o goecs.sh && chmod +x goecs.sh && bash goecs.sh env && bash goecs.sh install && goecs |   export noninteractive=true && curl -L https://bash.spiritlhl.net/goecs -o goecs.sh && chmod +x goecs.sh && ./goecs.sh env && ./goecs.sh install && goecs | ||||||
|   ``` |   ``` | ||||||
|  |  | ||||||
| #### **详细说明** | #### **详细说明** | ||||||
| @@ -136,19 +141,19 @@ Shell 版本:[https://github.com/spiritLHLS/ecs](https://github.com/spiritLHLS | |||||||
|    export noninteractive=true && ./goecs.sh env |    export noninteractive=true && ./goecs.sh env | ||||||
|    ``` |    ``` | ||||||
|  |  | ||||||
| 3. **安装 `goecs`** | 3. **安装 `goecs` 本体(仅下载二进制文件无依赖安装)** | ||||||
|  |  | ||||||
|    ```bash |    ```bash | ||||||
|    ./goecs.sh install |    ./goecs.sh install | ||||||
|    ``` |    ``` | ||||||
|  |  | ||||||
| 4. **升级 `goecs`** | 4. **升级 `goecs` 本体** | ||||||
|  |  | ||||||
|    ```bash |    ```bash | ||||||
|    ./goecs.sh upgrade |    ./goecs.sh upgrade | ||||||
|    ``` |    ``` | ||||||
|  |  | ||||||
| 5. **卸载 `goecs`** | 5. **卸载 `goecs` 本体** | ||||||
|  |  | ||||||
|    ```bash |    ```bash | ||||||
|    ./goecs.sh uninstall |    ./goecs.sh uninstall | ||||||
| @@ -237,6 +242,8 @@ Usage: goecs [options] | |||||||
| 1. 下载带 exe 文件的压缩包:[Releases](https://github.com/oneclickvirt/ecs/releases) | 1. 下载带 exe 文件的压缩包:[Releases](https://github.com/oneclickvirt/ecs/releases) | ||||||
| 2. 解压后,右键以管理员模式运行。 | 2. 解压后,右键以管理员模式运行。 | ||||||
|  |  | ||||||
|  | PS:如果是虚拟机环境,不以管理员模式运行也行,因为虚拟机无原生的测试工具,将自动启用替代方法测试。 | ||||||
|  |  | ||||||
| --- | --- | ||||||
|  |  | ||||||
| ### **Docker** | ### **Docker** | ||||||
| @@ -262,22 +269,24 @@ docker run --rm spiritlhl/goecs:latest -menu=false -l zh | |||||||
|  |  | ||||||
| 使用Docker执行测试,硬件测试会有一些偏差和虚拟化架构判断失效,还是推荐直接测试而不使用Docker测试。 | 使用Docker执行测试,硬件测试会有一些偏差和虚拟化架构判断失效,还是推荐直接测试而不使用Docker测试。 | ||||||
|  |  | ||||||
| 国内镜像地址:https://cnb.cool/oneclickvirt/ecs/-/packages/docker/ecs | 国内阿里云镜像加速 | ||||||
|  |  | ||||||
| 请确保执行下述命令前本机已安装Docker | 请确保执行下述命令前本机已安装Docker | ||||||
|  |  | ||||||
| 特权模式+host网络 | 特权模式+host网络 | ||||||
|  |  | ||||||
| ```shell | ```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网络 | 非特权模式+非host网络 | ||||||
|  |  | ||||||
| ```shell | ```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> | </details> | ||||||
|  |  | ||||||
| --- | --- | ||||||
| @@ -294,11 +303,11 @@ cd ecs | |||||||
| ``` | ``` | ||||||
|  |  | ||||||
| 2. 安装 Go 环境(如已安装可跳过) | 2. 安装 Go 环境(如已安装可跳过) | ||||||
|  |  | ||||||
|  | 选择 go 1.24.5 的版本进行安装 | ||||||
|  |  | ||||||
| ```bash | ```bash | ||||||
| # 下载并安装 Go | curl -L https://cdn.spiritlhl.net/https://raw.githubusercontent.com/spiritLHLS/one-click-installation-script/main/install_scripts/go.sh -o go.sh && chmod +x go.sh && bash go.sh  | ||||||
| wget https://go.dev/dl/go1.23.4.linux-amd64.tar.gz |  | ||||||
| rm -rf /usr/local/go && tar -C /usr/local -xzf go1.23.4.linux-amd64.tar.gz |  | ||||||
| export PATH=$PATH:/usr/local/go/bin |  | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| 3. 编译 | 3. 编译 | ||||||
| @@ -340,6 +349,7 @@ GOOS=darwin GOARCH=amd64 go build -o goecs_darwin | |||||||
| | 测试稳定性       | 核心测试组件10年以上未变 | 每个大版本更新测试项,分数不同版本间难以对比(每个版本对标当前最好的CPU) | | | 测试稳定性       | 核心测试组件10年以上未变 | 每个大版本更新测试项,分数不同版本间难以对比(每个版本对标当前最好的CPU) | | ||||||
| | 测试内容         | 仅测试计算性能 | 覆盖多种性能测试,分数加权计算,但部分测试实际不常用 | | | 测试内容         | 仅测试计算性能 | 覆盖多种性能测试,分数加权计算,但部分测试实际不常用 | | ||||||
| | 适用场景         | 适合快速测试,仅测试计算性能 | 适合综合全面的测试 | | | 适用场景         | 适合快速测试,仅测试计算性能 | 适合综合全面的测试 | | ||||||
|  | | 排行榜         | [sysbench.spiritlhl.net](https://sysbench.spiritlhl.net/) | [browser.geekbench.com](https://browser.geekbench.com/) | | ||||||
|  |  | ||||||
| 且```goecs```测试使用何种CPU测试方式可使用参数指定,默认只是为了更多用户快速测试的需求 | 且```goecs```测试使用何种CPU测试方式可使用参数指定,默认只是为了更多用户快速测试的需求 | ||||||
|  |  | ||||||
| @@ -365,12 +375,12 @@ GOOS=darwin GOARCH=amd64 go build -o goecs_darwin | |||||||
|  |  | ||||||
| ## 致谢 | ## 致谢 | ||||||
|  |  | ||||||
| 感谢 [he.net](https://he.net) [bgp.tools](https://bgp.tools) [ipinfo.io](https://ipinfo.io) [ip.sb](https://ip.sb) [cheervision.co](https://cheervision.co) [scamalytics.com](https://scamalytics.com) [abuseipdb.com](https://www.abuseipdb.com/) [virustotal.com](https://www.virustotal.com/) [ip2location.com](https://ip2location.com/) [ip-api.com](https://ip-api.com) [ipregistry.co](https://ipregistry.co/) [ipdata.co](https://ipdata.co/) [ipgeolocation.io](https://ipgeolocation.io) [ipwhois.io](https://ipwhois.io) [ipapi.com](https://ipapi.com/) [ipapi.is](https://ipapi.is/) [ipqualityscore.com](https://www.ipqualityscore.com/) [bigdatacloud.com](https://www.bigdatacloud.com/) 等网站提供的API进行检测,感谢互联网各网站提供的查询资源 | 感谢 [he.net](https://he.net) [bgp.tools](https://bgp.tools) [ipinfo.io](https://ipinfo.io) [maxmind.com](https://www.maxmind.com/en/home) [cloudflare.com](https://www.cloudflare.com/) [ip.sb](https://ip.sb) [scamalytics.com](https://scamalytics.com) [abuseipdb.com](https://www.abuseipdb.com/) [ip2location.com](https://ip2location.com/) [ip-api.com](https://ip-api.com) [ipregistry.co](https://ipregistry.co/) [ipdata.co](https://ipdata.co/) [ipgeolocation.io](https://ipgeolocation.io) [ipwhois.io](https://ipwhois.io) [ipapi.com](https://ipapi.com/) [ipapi.is](https://ipapi.is/) [ipqualityscore.com](https://www.ipqualityscore.com/) [bigdatacloud.com](https://www.bigdatacloud.com/) [dkly.net](https://data.dkly.net) [virustotal.com](https://www.virustotal.com/) [ipfighter.com](https://ipfighter.com/) [getipintel.net](http://check.getipintel.net/) [fraudlogix.com](https://fraudlogix.com) 等网站提供的API进行检测,感谢互联网各网站提供的查询资源 | ||||||
|  |  | ||||||
| 感谢 | 感谢 | ||||||
|  |  | ||||||
| <a href="https://h501.io/?from=69" target="_blank"> | <a href="https://h501.io/?from=69" target="_blank"> | ||||||
|   <img src="https://github.com/spiritLHLS/ecs/assets/103393591/dfd47230-2747-4112-be69-b5636b34f07f" alt="h501"> |   <img src="https://github.com/spiritLHLS/ecs/assets/103393591/dfd47230-2747-4112-be69-b5636b34f07f" alt="h501" style="height: 50px;"> | ||||||
| </a> | </a> | ||||||
|  |  | ||||||
| 提供的免费托管支持本开源项目的共享测试结果存储 | 提供的免费托管支持本开源项目的共享测试结果存储 | ||||||
| @@ -378,13 +388,24 @@ GOOS=darwin GOARCH=amd64 go build -o goecs_darwin | |||||||
| 同时感谢以下平台提供编辑和测试支持 | 同时感谢以下平台提供编辑和测试支持 | ||||||
|  |  | ||||||
| <a href="https://www.jetbrains.com/go/" target="_blank"> | <a href="https://www.jetbrains.com/go/" target="_blank"> | ||||||
|   <img src="https://resources.jetbrains.com/storage/products/company/brand/logos/GoLand.png" alt="goland"> |   <img src="https://resources.jetbrains.com/storage/products/company/brand/logos/GoLand.png" alt="goland" style="height: 50px;"> | ||||||
| </a> | </a> | ||||||
|  |  | ||||||
| <a href="https://community.ibm.com/zsystems/form/l1cc-oss-vm-request/" target="_blank"> | <a href="https://community.ibm.com/zsystems/form/l1cc-oss-vm-request/" target="_blank"> | ||||||
|   <img src="https://linuxone.cloud.marist.edu/oss/resources/images/linuxonelogo03.png" alt="ibm"> |   <img src="https://linuxone.cloud.marist.edu/oss/resources/images/linuxonelogo03.png" alt="ibm" style="height: 50px;"> | ||||||
| </a> | </a> | ||||||
|  |  | ||||||
|  | <a href="https://console.zmto.com/?affid=1524" target="_blank"> | ||||||
|  |   <img src="https://console.zmto.com/templates/2019/dist/images/logo_dark.svg" alt="zmto" style="height: 50px;"> | ||||||
|  | </a> | ||||||
|  |  | ||||||
|  | ## History Usage | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ## Stargazers over time | ## Stargazers over time | ||||||
|  |  | ||||||
| [](https://starchart.cc/oneclickvirt/ecs) | [](https://www.spiritlhl.net) | ||||||
|  |  | ||||||
|  | ## License | ||||||
|  | [](https://app.fossa.com/projects/git%2Bgithub.com%2Foneclickvirt%2Fecs?ref=badge_large) | ||||||
|   | |||||||
							
								
								
									
										78
									
								
								README_EN.md
									
									
									
									
									
								
							
							
						
						
									
										78
									
								
								README_EN.md
									
									
									
									
									
								
							| @@ -1,8 +1,10 @@ | |||||||
| # ecs | # ECS | ||||||
|  |  | ||||||
| [](https://github.com/oneclickvirt/ecs/actions/workflows/main.yaml)  | [](https://github.com/oneclickvirt/ecs/actions/workflows/build_binary.yaml) | ||||||
|  |  | ||||||
| [](https://hits.spiritlhl.net) | [](https://app.fossa.com/projects/git%2Bgithub.com%2Foneclickvirt%2Fecs?ref=badge_shield) | ||||||
|  |  | ||||||
|  | [](https://hits.spiritlhl.net) [](https://github.com/oneclickvirt/ecs/releases) | ||||||
|  |  | ||||||
| Fusion Monster Evaluation Project - GO Version | Fusion Monster Evaluation Project - GO Version | ||||||
|  |  | ||||||
| @@ -28,20 +30,23 @@ Shell version: [https://github.com/spiritLHLS/ecs/blob/main/README_EN.md](https: | |||||||
| | Supported for Compilation | Tested on | Supported OS for Compilation | Tested OS | | | Supported for Compilation | Tested on | Supported OS for Compilation | Tested OS | | ||||||
| |---------------------------|-----------|------------------------------|-----------| | |---------------------------|-----------|------------------------------|-----------| | ||||||
| | amd64                     | amd64     | Linux                        | Linux     | | | amd64                     | amd64     | Linux                        | Linux     | | ||||||
| | arm                       | arm       | Windows                      | Windows   | | | arm64                     | arm64     | Windows                      | Windows   | | ||||||
| | arm64                     | arm64     | FreeBSD                      | FreeBSD   | | | arm                       |           | MacOS(Darwin)                | MacOS     | | ||||||
| | 386                       | 386       | OpenBSD                      |           | | | 386                       |           | FreeBSD                      |           | | ||||||
| | mips                      |           | MacOS                        |           | | | mips,mipsle               |           | Android                      |           | | ||||||
| | mipsle                    |           |                              |           | | | mips64,mips64le           |           |                              |           |  | ||||||
|  | | ppc64,ppc64le             |           |                              |           | | ||||||
| | s390x                     | s390x     |                              |           | | | s390x                     | s390x     |                              |           | | ||||||
| | riscv64                   |           |                              |           | | | 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** | ### **Systems Pending Support** | ||||||
| | OS     | Notes                                                  | |  | ||||||
| |--------|--------------------------------------------------------| | | OS     | Notes                                                                                           | | ||||||
| | MacOS  | Hardware testing bugs and environment dependencies unresolved | | |--------|-------------------------------------------------------------------------------------------------| | ||||||
|  | | 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) | | ||||||
|  |  | ||||||
| --- | --- | ||||||
|  |  | ||||||
| @@ -49,7 +54,7 @@ Shell version: [https://github.com/spiritLHLS/ecs/blob/main/README_EN.md](https: | |||||||
|  |  | ||||||
| - System basic information query and concurrent IP basic information query: Self-developed [basics](https://github.com/oneclickvirt/basics), [gostun](https://github.com/oneclickvirt/gostun) | - System basic information query and concurrent IP basic information query: Self-developed [basics](https://github.com/oneclickvirt/basics), [gostun](https://github.com/oneclickvirt/gostun) | ||||||
| - CPU test: Self-developed [cputest](https://github.com/oneclickvirt/cputest) supporting sysbench(lua/golang version), geekbench, winsat | - CPU test: Self-developed [cputest](https://github.com/oneclickvirt/cputest) supporting sysbench(lua/golang version), geekbench, winsat | ||||||
| - Memory test: Self-developed [memorytest](https://github.com/oneclickvirt/memorytest) supporting sysbench, dd | - Memory test: Self-developed [memorytest](https://github.com/oneclickvirt/memorytest) supporting sysbench, dd, winsat, mbw, stream | ||||||
| - Disk test: Self-developed [disktest](https://github.com/oneclickvirt/disktest) supporting dd, fio, winsat | - Disk test: Self-developed [disktest](https://github.com/oneclickvirt/disktest) supporting dd, fio, winsat | ||||||
| - Streaming media unlock information concurrent query: Modified from [netflix-verify](https://github.com/sjlleo/netflix-verify) and more to [CommonMediaTests](https://github.com/oneclickvirt/CommonMediaTests) | - Streaming media unlock information concurrent query: Modified from [netflix-verify](https://github.com/sjlleo/netflix-verify) and more to [CommonMediaTests](https://github.com/oneclickvirt/CommonMediaTests) | ||||||
| - Common streaming media tests concurrent query: Self-developed to [UnlockTests](https://github.com/oneclickvirt/UnlockTests), logic modified from [RegionRestrictionCheck](https://github.com/lmc999/RegionRestrictionCheck) and others | - Common streaming media tests concurrent query: Self-developed to [UnlockTests](https://github.com/oneclickvirt/UnlockTests), logic modified from [RegionRestrictionCheck](https://github.com/lmc999/RegionRestrictionCheck) and others | ||||||
| @@ -59,6 +64,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) | - 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) | - 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) | - Three-network Ping test: Modified from [ecsspeed](https://github.com/spiritLHLS/ecsspeed) to [pingtest](https://github.com/oneclickvirt/pingtest) | ||||||
|  | - Support root or admin environment testing, support non-root or non-admin environment testing, support offline environment for testing, **not yet** support no DNS online 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)** | **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 +72,7 @@ Shell version: [https://github.com/spiritLHLS/ecs/blob/main/README_EN.md](https: | |||||||
|  |  | ||||||
| ## **Instructions for Use** | ## **Instructions for Use** | ||||||
|  |  | ||||||
| ### **Linux/FreeBSD/OpenBSD/MacOS** | ### **Linux/FreeBSD/MacOS** | ||||||
|  |  | ||||||
| #### **One-click command** | #### **One-click command** | ||||||
|  |  | ||||||
| @@ -75,21 +81,27 @@ Shell version: [https://github.com/spiritLHLS/ecs/blob/main/README_EN.md](https: | |||||||
| - **International users without acceleration:** | - **International users without acceleration:** | ||||||
|  |  | ||||||
|   ```bash |   ```bash | ||||||
|   export noninteractive=true && curl -L https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh -o goecs.sh && chmod +x goecs.sh && bash goecs.sh env && bash goecs.sh install && goecs -l en |   export noninteractive=true && curl -L https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh -o goecs.sh && chmod +x goecs.sh && ./goecs.sh env && ./goecs.sh install && goecs | ||||||
|   ``` |   ``` | ||||||
|  |  | ||||||
| - **International/domestic users with CDN acceleration:** | - **International/domestic users with CDN acceleration:** | ||||||
|  |  | ||||||
|   ```bash |   ```bash | ||||||
|   export noninteractive=true && curl -L https://cdn.spiritlhl.net/https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh -o goecs.sh && chmod +x goecs.sh && bash goecs.sh env && bash goecs.sh install && goecs -l en |   export noninteractive=true && curl -L https://cdn.spiritlhl.net/https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh -o goecs.sh && chmod +x goecs.sh && ./goecs.sh env && ./goecs.sh install && goecs | ||||||
|   ``` |   ``` | ||||||
|  |  | ||||||
| - **Domestic users with CNB acceleration:** | - **Domestic users with CNB acceleration:** | ||||||
|  |  | ||||||
|   ```bash |   ```bash | ||||||
|   export noninteractive=true && curl -L https://cnb.cool/oneclickvirt/ecs/-/git/raw/main/goecs.sh -o goecs.sh && chmod +x goecs.sh && bash goecs.sh env && bash goecs.sh install && goecs -l en |   export noninteractive=true && curl -L https://cnb.cool/oneclickvirt/ecs/-/git/raw/main/goecs.sh -o goecs.sh && chmod +x goecs.sh && ./goecs.sh env && ./goecs.sh install && goecs | ||||||
|   ``` |   ``` | ||||||
|  |  | ||||||
|  | - **Short Link:** | ||||||
|  |  | ||||||
|  |   ```bash | ||||||
|  |   export noninteractive=true && curl -L https://bash.spiritlhl.net/goecs -o goecs.sh && chmod +x goecs.sh && bash goecs.sh env && bash goecs.sh install && goecs | ||||||
|  |   `` | ||||||
|  |  | ||||||
| #### **Detailed instructions** | #### **Detailed instructions** | ||||||
|  |  | ||||||
| **Detailed description** of the commands in **Command **Controls whether to install dependencies**, **Whether to update the package manager**, **Default interaction mode can be selected*** | **Detailed description** of the commands in **Command **Controls whether to install dependencies**, **Whether to update the package manager**, **Default interaction mode can be selected*** | ||||||
| @@ -229,6 +241,8 @@ Usage: goecs [options] | |||||||
| 1. Download the compressed file with the .exe file: [Releases](https://github.com/oneclickvirt/ecs/releases) | 1. Download the compressed file with the .exe file: [Releases](https://github.com/oneclickvirt/ecs/releases) | ||||||
| 2. After unzipping, right-click and run as administrator. | 2. After unzipping, right-click and run as administrator. | ||||||
|  |  | ||||||
|  | PS: If it's a VM environment, it's OK not to run it in administrator mode, because VMs have no native testing tools and will automatically enable alternative methods for testing. | ||||||
|  |  | ||||||
| --- | --- | ||||||
|  |  | ||||||
| ### **Docker** | ### **Docker** | ||||||
| @@ -286,11 +300,11 @@ cd ecs | |||||||
| ``` | ``` | ||||||
|  |  | ||||||
| 2. Install Go environment (skip if already installed) | 2. Install Go environment (skip if already installed) | ||||||
|  |  | ||||||
|  | Select go 1.24.5 version to install  | ||||||
|  |  | ||||||
| ```bash | ```bash | ||||||
| # Download and install Go | curl -L https://cdn.spiritlhl.net/https://raw.githubusercontent.com/spiritLHLS/one-click-installation-script/main/install_scripts/go.sh -o go.sh && chmod +x go.sh && bash go.sh  | ||||||
| wget https://go.dev/dl/go1.23.4.linux-amd64.tar.gz |  | ||||||
| rm -rf /usr/local/go && tar -C /usr/local -xzf go1.23.4.linux-amd64.tar.gz |  | ||||||
| export PATH=$PATH:/usr/local/go/bin |  | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| 3. Compile | 3. Compile | ||||||
| @@ -332,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 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 | | | 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 | | | 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. | Note that `goecs` allows you to specify CPU test method via parameters. The default is chosen for faster testing across more systems. | ||||||
|  |  | ||||||
| @@ -357,12 +372,12 @@ Note that `goecs` allows you to specify CPU test method via parameters. The defa | |||||||
|  |  | ||||||
| ## Thanks | ## Thanks | ||||||
|  |  | ||||||
| Thank [he.net](https://he.net) [bgp.tools](https://bgp.tools) [ipinfo.io](https://ipinfo.io) [ip.sb](https://ip.sb) [cheervision.co](https://cheervision.co) [scamalytics.com](https://scamalytics.com) [abuseipdb.com](https://www.abuseipdb.com/) [virustotal.com](https://www.virustotal.com/) [ip2location.com](https://ip2location.com/) [ip-api.com](https://ip-api.com) [ipregistry.co](https://ipregistry.co/) [ipdata.co](https://ipdata.co/) [ipgeolocation.io](https://ipgeolocation.io) [ipwhois.io](https://ipwhois.io) [ipapi.com](https://ipapi.com/) [ipapi.is](https://ipapi.is/) [ipqualityscore.com](https://www.ipqualityscore.com/) [bigdatacloud.com](https://www.bigdatacloud.com/) and others for providing APIs for testing, and thanks to various websites on the Internet for providing query resources. | Thank [he.net](https://he.net) [bgp.tools](https://bgp.tools) [ipinfo.io](https://ipinfo.io) [maxmind.com](https://www.maxmind.com/en/home) [cloudflare.com](https://www.cloudflare.com/) [ip.sb](https://ip.sb) [scamalytics.com](https://scamalytics.com) [abuseipdb.com](https://www.abuseipdb.com/) [ip2location.com](https://ip2location.com/) [ip-api.com](https://ip-api.com) [ipregistry.co](https://ipregistry.co/) [ipdata.co](https://ipdata.co/) [ipgeolocation.io](https://ipgeolocation.io) [ipwhois.io](https://ipwhois.io) [ipapi.com](https://ipapi.com/) [ipapi.is](https://ipapi.is/) [ipqualityscore.com](https://www.ipqualityscore.com/) [bigdatacloud.com](https://www.bigdatacloud.com/) [dkly.net](https://data.dkly.net) [virustotal.com](https://www.virustotal.com/) [ipfighter.com](https://ipfighter.com/) [getipintel.net](http://check.getipintel.net/) [fraudlogix.com](https://fraudlogix.com) and others for providing APIs for testing, and thanks to various websites on the Internet for providing query resources. | ||||||
|  |  | ||||||
| Thank | Thank | ||||||
|  |  | ||||||
| <a href="https://h501.io/?from=69" target="_blank"> | <a href="https://h501.io/?from=69" target="_blank"> | ||||||
|   <img src="https://github.com/spiritLHLS/ecs/assets/103393591/dfd47230-2747-4112-be69-b5636b34f07f" alt="h501"> |   <img src="https://github.com/spiritLHLS/ecs/assets/103393591/dfd47230-2747-4112-be69-b5636b34f07f" alt="h501" style="height: 50px;"> | ||||||
| </a> | </a> | ||||||
|  |  | ||||||
| provided free hosting support for this open source project's shared test results storage | provided free hosting support for this open source project's shared test results storage | ||||||
| @@ -370,13 +385,24 @@ provided free hosting support for this open source project's shared test results | |||||||
| Thanks also to the following platforms for editorial and testing support | Thanks also to the following platforms for editorial and testing support | ||||||
|  |  | ||||||
| <a href="https://www.jetbrains.com/go/" target="_blank"> | <a href="https://www.jetbrains.com/go/" target="_blank"> | ||||||
|   <img src="https://resources.jetbrains.com/storage/products/company/brand/logos/GoLand.png" alt="goland"> |   <img src="https://resources.jetbrains.com/storage/products/company/brand/logos/GoLand.png" alt="goland" style="height: 50px;"> | ||||||
| </a> | </a> | ||||||
|  |  | ||||||
| <a href="https://community.ibm.com/zsystems/form/l1cc-oss-vm-request/" target="_blank"> | <a href="https://community.ibm.com/zsystems/form/l1cc-oss-vm-request/" target="_blank"> | ||||||
|   <img src="https://linuxone.cloud.marist.edu/oss/resources/images/linuxonelogo03.png" alt="ibm"> |   <img src="https://linuxone.cloud.marist.edu/oss/resources/images/linuxonelogo03.png" alt="ibm" style="height: 50px;"> | ||||||
| </a> | </a> | ||||||
|  |  | ||||||
|  | <a href="https://console.zmto.com/?affid=1524" target="_blank"> | ||||||
|  |   <img src="https://console.zmto.com/templates/2019/dist/images/logo_dark.svg" alt="zmto" style="height: 50px;"> | ||||||
|  | </a> | ||||||
|  |  | ||||||
|  | ## History Usage | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ## Stargazers over time | ## Stargazers over time | ||||||
|  |  | ||||||
| [](https://starchart.cc/oneclickvirt/ecs) | [](https://www.spiritlhl.net) | ||||||
|  |  | ||||||
|  | ## License | ||||||
|  | [](https://app.fossa.com/projects/git%2Bgithub.com%2Foneclickvirt%2Fecs?ref=badge_large) | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -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") |  | ||||||
| } |  | ||||||
| @@ -1,17 +1,17 @@ | |||||||
| package cputest | package cputest | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" |  | ||||||
| 	"github.com/oneclickvirt/cputest/cpu" |  | ||||||
| 	"runtime" | 	"runtime" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
|  | 	"github.com/oneclickvirt/cputest/cpu" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func CpuTest(language, testMethod, testThread string) { | func CpuTest(language, testMethod, testThread string) (realTestMethod, res string) { | ||||||
| 	var res string |  | ||||||
| 	if runtime.GOOS == "windows" { | 	if runtime.GOOS == "windows" { | ||||||
| 		if testMethod != "winsat" && testMethod != "" { | 		if testMethod != "winsat" && testMethod != "" { | ||||||
| 			res = "Detected host is Windows, using Winsat for testing.\n" | 			// res = "Detected host is Windows, using Winsat for testing.\n" | ||||||
|  | 			realTestMethod = "winsat" | ||||||
| 		} | 		} | ||||||
| 		res += cpu.WinsatTest(language, testThread) | 		res += cpu.WinsatTest(language, testThread) | ||||||
| 	} else { | 	} else { | ||||||
| @@ -19,21 +19,28 @@ func CpuTest(language, testMethod, testThread string) { | |||||||
| 		case "sysbench": | 		case "sysbench": | ||||||
| 			res = cpu.SysBenchTest(language, testThread) | 			res = cpu.SysBenchTest(language, testThread) | ||||||
| 			if res == "" { | 			if res == "" { | ||||||
| 				res = "Sysbench test failed, switching to Geekbench for testing.\n" | 				// res = "Sysbench test failed, switching to Geekbench for testing.\n" | ||||||
|  | 				realTestMethod = "geekbench" | ||||||
| 				res += cpu.GeekBenchTest(language, testThread) | 				res += cpu.GeekBenchTest(language, testThread) | ||||||
|  | 			} else { | ||||||
|  | 				realTestMethod = "sysbench" | ||||||
| 			} | 			} | ||||||
| 		case "geekbench": | 		case "geekbench": | ||||||
| 			res = cpu.GeekBenchTest(language, testThread) | 			res = cpu.GeekBenchTest(language, testThread) | ||||||
| 			if res == "" { | 			if res == "" { | ||||||
| 				res = "Geekbench test failed, switching to Sysbench for testing.\n" | 				// res = "Geekbench test failed, switching to Sysbench for testing.\n" | ||||||
|  | 				realTestMethod = "sysbench" | ||||||
| 				res += cpu.SysBenchTest(language, testThread) | 				res += cpu.SysBenchTest(language, testThread) | ||||||
|  | 			} else { | ||||||
|  | 				realTestMethod = "geekbench" | ||||||
| 			} | 			} | ||||||
| 		default: | 		default: | ||||||
| 			res = "Invalid test method specified.\n" | 			res = "Invalid test method specified.\n" | ||||||
|  | 			realTestMethod = "null" | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	if !strings.Contains(res, "\n") && res != "" { | 	if !strings.Contains(res, "\n") && res != "" { | ||||||
| 		res += "\n" | 		res += "\n" | ||||||
| 	} | 	} | ||||||
| 	fmt.Print(res) | 	return | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,9 +1,11 @@ | |||||||
| package cputest | package cputest | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"fmt" | ||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func Test(t *testing.T) { | func Test(t *testing.T) { | ||||||
| 	CpuTest("zh", "sysbench", "1") | 	_, res := CpuTest("zh", "sysbench", "1") | ||||||
|  | 	fmt.Print(res) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,41 +1,41 @@ | |||||||
| package disktest | package disktest | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" |  | ||||||
| 	"github.com/oneclickvirt/disktest/disk" |  | ||||||
| 	"runtime" | 	"runtime" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
|  | 	"github.com/oneclickvirt/disktest/disk" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func DiskTest(language, testMethod, testPath string, isMultiCheck bool, autoChange bool) { | func DiskTest(language, testMethod, testPath string, isMultiCheck bool, autoChange bool) (realTestMethod, res string) { | ||||||
| 	var res string | 	switch testMethod { | ||||||
| 	if runtime.GOOS == "windows" { | 	case "fio": | ||||||
| 		if testMethod != "winsat" && testMethod != "" { | 		res = disk.FioTest(language, isMultiCheck, testPath) | ||||||
| 			res = "Detected host is Windows, using Winsat for testing.\n" | 		if res == "" && autoChange { | ||||||
|  | 			res += disk.DDTest(language, isMultiCheck, testPath) | ||||||
|  | 			realTestMethod = "dd" | ||||||
|  | 		} else { | ||||||
|  | 			realTestMethod = "fio" | ||||||
| 		} | 		} | ||||||
| 		res = disk.WinsatTest(language, isMultiCheck, testPath) | 	case "dd": | ||||||
| 	} else { | 		res = disk.DDTest(language, isMultiCheck, testPath) | ||||||
| 		switch testMethod { | 		if res == "" && autoChange { | ||||||
| 		case "fio": | 			res += disk.FioTest(language, isMultiCheck, testPath) | ||||||
| 			res = disk.FioTest(language, isMultiCheck, testPath) | 			realTestMethod = "fio" | ||||||
| 			if res == "" && autoChange { | 		} else { | ||||||
| 				res = "Fio test failed, switching to DD for testing.\n" | 			realTestMethod = "dd" | ||||||
| 				res += disk.DDTest(language, isMultiCheck, testPath) | 		} | ||||||
| 			} | 	default: | ||||||
| 		case "dd": | 		if runtime.GOOS == "windows" { | ||||||
|  | 			realTestMethod = "winsat" | ||||||
|  | 			res = disk.WinsatTest(language, isMultiCheck, testPath) | ||||||
|  | 		} else { | ||||||
| 			res = disk.DDTest(language, isMultiCheck, testPath) | 			res = disk.DDTest(language, isMultiCheck, testPath) | ||||||
| 			if res == "" && autoChange { | 			realTestMethod = "dd" | ||||||
| 				res = "DD test failed, switching to Fio for testing.\n" |  | ||||||
| 				res += disk.FioTest(language, isMultiCheck, testPath) |  | ||||||
| 			} |  | ||||||
| 		default: |  | ||||||
| 			res = "Unsupported test method specified.\n" |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	//fmt.Println("--------------------------------------------------") |  | ||||||
| 	if !strings.Contains(res, "\n") && res != "" { | 	if !strings.Contains(res, "\n") && res != "" { | ||||||
| 		res += "\n" | 		res += "\n" | ||||||
| 	} | 	} | ||||||
| 	fmt.Printf(res) | 	return | ||||||
| 	//fmt.Println("--------------------------------------------------") |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,7 +1,11 @@ | |||||||
| package disktest | package disktest | ||||||
|  |  | ||||||
| import "testing" | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"testing" | ||||||
|  | ) | ||||||
|  |  | ||||||
| func TestDiskIoTest(t *testing.T) { | func TestDiskIoTest(t *testing.T) { | ||||||
| 	DiskTest("zh", "sysbench", "", false) | 	_, res := DiskTest("zh", "sysbench", "", false, false) | ||||||
|  | 	fmt.Print(res) | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										89
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										89
									
								
								go.mod
									
									
									
									
									
								
							| @@ -1,52 +1,49 @@ | |||||||
| module github.com/oneclickvirt/ecs | module github.com/oneclickvirt/ecs | ||||||
|  |  | ||||||
| go 1.24.1 | go 1.24.5 | ||||||
|  |  | ||||||
| toolchain go1.24.2 |  | ||||||
|  |  | ||||||
| require ( | 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/CommonMediaTests v0.0.4-20250329123841 | ||||||
| 	github.com/oneclickvirt/UnlockTests v0.0.26-20250329125926 | 	github.com/oneclickvirt/UnlockTests v0.0.29-20251030094944 | ||||||
| 	github.com/oneclickvirt/backtrace v0.0.5-20250517095024 | 	github.com/oneclickvirt/backtrace v0.0.7-20250811023541 | ||||||
| 	github.com/oneclickvirt/basics v0.0.12-20250521031609 | 	github.com/oneclickvirt/basics v0.0.16-20251030093657 | ||||||
| 	github.com/oneclickvirt/cputest v0.0.10-20250404151448 | 	github.com/oneclickvirt/cputest v0.0.12-20250720122317 | ||||||
| 	github.com/oneclickvirt/defaultset v0.0.2-20240624082446 | 	github.com/oneclickvirt/defaultset v0.0.2-20240624082446 | ||||||
| 	github.com/oneclickvirt/disktest v0.0.8-20250425015826 | 	github.com/oneclickvirt/disktest v0.0.10-20250924030424 | ||||||
| 	github.com/oneclickvirt/gostun v0.0.3-20250329105202 | 	github.com/oneclickvirt/gostun v0.0.5-20250727155022 | ||||||
| 	github.com/oneclickvirt/memorytest v0.0.5-20250406063420 | 	github.com/oneclickvirt/memorytest v0.0.10-20250924154648 | ||||||
| 	github.com/oneclickvirt/nt3 v0.0.5-20250416131047 | 	github.com/oneclickvirt/nt3 v0.0.8-20250811123903 | ||||||
| 	github.com/oneclickvirt/pingtest v0.0.7-20250413051539 | 	github.com/oneclickvirt/pingtest v0.0.8-20250728015259 | ||||||
| 	github.com/oneclickvirt/portchecker v0.0.3-20250329125750 | 	github.com/oneclickvirt/portchecker v0.0.3-20250728015900 | ||||||
| 	github.com/oneclickvirt/security v0.0.4-20250522031128 | 	github.com/oneclickvirt/security v0.0.7-20251030094114 | ||||||
| 	github.com/oneclickvirt/speedtest v0.0.9-20250521034111 | 	github.com/oneclickvirt/speedtest v0.0.10-20250728015734 | ||||||
| ) | ) | ||||||
|  |  | ||||||
| require ( | require ( | ||||||
| 	github.com/PuerkitoBio/goquery v1.9.2 // indirect | 	github.com/PuerkitoBio/goquery v1.9.2 // indirect | ||||||
| 	github.com/StackExchange/wmi v1.2.1 // 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/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/fatih/color v1.18.0 // indirect | ||||||
| 	github.com/fsnotify/fsnotify v1.9.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-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.4.0 // indirect | ||||||
| 	github.com/go-viper/mapstructure/v2 v2.2.1 // indirect |  | ||||||
| 	github.com/gofrs/uuid/v5 v5.2.0 // indirect | 	github.com/gofrs/uuid/v5 v5.2.0 // indirect | ||||||
| 	github.com/google/gopacket v1.1.19 // 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/google/uuid v1.6.0 // indirect | ||||||
| 	github.com/gorilla/websocket v1.5.3 // indirect | 	github.com/gorilla/websocket v1.5.3 // indirect | ||||||
| 	github.com/hashicorp/errwrap v1.1.0 // indirect | 	github.com/hashicorp/errwrap v1.1.0 // indirect | ||||||
| 	github.com/hashicorp/go-multierror v1.1.1 // indirect | 	github.com/hashicorp/go-multierror v1.1.1 // indirect | ||||||
| 	github.com/huin/goupnp v1.2.0 // 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/jackpal/go-nat-pmp v1.0.2 // indirect | ||||||
| 	github.com/jaypipes/ghw v0.12.0 // indirect | 	github.com/jaypipes/ghw v0.17.0 // indirect | ||||||
| 	github.com/jaypipes/pcidb v1.0.0 // indirect | 	github.com/jaypipes/pcidb v1.0.1 // indirect | ||||||
| 	github.com/json-iterator/go v1.1.12 // 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/koron/go-ssdp v0.0.4 // indirect | ||||||
| 	github.com/libp2p/go-nat v0.2.0 // indirect | 	github.com/libp2p/go-nat v0.2.0 // indirect | ||||||
| 	github.com/libp2p/go-netroute v0.2.1 // indirect | 	github.com/libp2p/go-netroute v0.2.1 // indirect | ||||||
| @@ -60,10 +57,11 @@ require ( | |||||||
| 	github.com/mitchellh/go-homedir v1.1.0 // indirect | 	github.com/mitchellh/go-homedir v1.1.0 // indirect | ||||||
| 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||||
| 	github.com/modern-go/reflect2 v1.0.2 // indirect | 	github.com/modern-go/reflect2 v1.0.2 // indirect | ||||||
| 	github.com/nxtrace/NTrace-core v1.4.0 // indirect | 	github.com/nxtrace/NTrace-core v1.4.2 // indirect | ||||||
| 	github.com/oneclickvirt/dd v0.0.1-20250406062523 // indirect | 	github.com/oneclickvirt/dd v0.0.2-20250808062818 // indirect | ||||||
| 	github.com/oneclickvirt/fio v0.0.1-20250406060851 // indirect | 	github.com/oneclickvirt/fio v0.0.2-20250808045755 // indirect | ||||||
| 	github.com/onsi/ginkgo/v2 v2.22.1 // indirect | 	github.com/oneclickvirt/mbw v0.0.1-20250808061222 // indirect | ||||||
|  | 	github.com/oneclickvirt/stream v0.0.2-20250924154001 // indirect | ||||||
| 	github.com/oschwald/maxminddb-golang v1.13.1 // indirect | 	github.com/oschwald/maxminddb-golang v1.13.1 // indirect | ||||||
| 	github.com/pelletier/go-toml/v2 v2.2.4 // indirect | 	github.com/pelletier/go-toml/v2 v2.2.4 // indirect | ||||||
| 	github.com/pion/dtls/v2 v2.2.7 // indirect | 	github.com/pion/dtls/v2 v2.2.7 // indirect | ||||||
| @@ -75,20 +73,19 @@ require ( | |||||||
| 	github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect | 	github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect | ||||||
| 	github.com/prometheus-community/pro-bing v0.4.1 // indirect | 	github.com/prometheus-community/pro-bing v0.4.1 // indirect | ||||||
| 	github.com/quic-go/qpack v0.5.1 // indirect | 	github.com/quic-go/qpack v0.5.1 // indirect | ||||||
| 	github.com/quic-go/quic-go v0.48.2 // indirect | 	github.com/quic-go/quic-go v0.53.0 // indirect | ||||||
| 	github.com/refraction-networking/utls v1.6.7 // indirect | 	github.com/refraction-networking/utls v1.7.3 // indirect | ||||||
| 	github.com/rivo/uniseg v0.4.7 // indirect | 	github.com/rivo/uniseg v0.4.7 // indirect | ||||||
| 	github.com/rodaine/table v1.3.0 // indirect | 	github.com/rodaine/table v1.3.0 // indirect | ||||||
| 	github.com/sagikazarmark/locafero v0.9.0 // indirect | 	github.com/sagikazarmark/locafero v0.9.0 // indirect | ||||||
| 	github.com/schollz/progressbar/v3 v3.14.4 // indirect | 	github.com/schollz/progressbar/v3 v3.14.4 // indirect | ||||||
| 	github.com/shirou/gopsutil v3.21.11+incompatible // indirect | 	github.com/shirou/gopsutil v3.21.11+incompatible // indirect | ||||||
| 	github.com/shirou/gopsutil/v4 v4.24.5 // indirect | 	github.com/shirou/gopsutil/v4 v4.25.6 // indirect | ||||||
| 	github.com/shoenig/go-m1cpu v0.1.6 // indirect | 	github.com/showwin/speedtest-go v1.7.10 // indirect | ||||||
| 	github.com/showwin/speedtest-go v1.7.7 // indirect |  | ||||||
| 	github.com/sourcegraph/conc v0.3.0 // indirect | 	github.com/sourcegraph/conc v0.3.0 // indirect | ||||||
| 	github.com/spf13/afero v1.14.0 // indirect | 	github.com/spf13/afero v1.14.0 // indirect | ||||||
| 	github.com/spf13/cast v1.7.1 // indirect | 	github.com/spf13/cast v1.9.2 // indirect | ||||||
| 	github.com/spf13/pflag v1.0.6 // indirect | 	github.com/spf13/pflag v1.0.7 // indirect | ||||||
| 	github.com/spf13/viper v1.20.1 // indirect | 	github.com/spf13/viper v1.20.1 // indirect | ||||||
| 	github.com/subosito/gotenv v1.6.0 // indirect | 	github.com/subosito/gotenv v1.6.0 // indirect | ||||||
| 	github.com/tidwall/gjson v1.18.0 // indirect | 	github.com/tidwall/gjson v1.18.0 // indirect | ||||||
| @@ -98,19 +95,17 @@ require ( | |||||||
| 	github.com/tklauser/numcpus v0.8.0 // indirect | 	github.com/tklauser/numcpus v0.8.0 // indirect | ||||||
| 	github.com/tsosunchia/powclient v0.1.5 // indirect | 	github.com/tsosunchia/powclient v0.1.5 // indirect | ||||||
| 	github.com/yusufpapurcu/wmi v1.2.4 // 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/multierr v1.11.0 // indirect | ||||||
| 	go.uber.org/zap v1.27.0 // indirect | 	go.uber.org/zap v1.27.0 // indirect | ||||||
| 	golang.org/x/crypto v0.37.0 // indirect | 	golang.org/x/crypto v0.40.0 // indirect | ||||||
| 	golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect | 	golang.org/x/mod v0.25.0 // indirect | ||||||
| 	golang.org/x/mod v0.22.0 // indirect | 	golang.org/x/net v0.42.0 // indirect | ||||||
| 	golang.org/x/net v0.39.0 // indirect | 	golang.org/x/sync v0.16.0 // indirect | ||||||
| 	golang.org/x/sync v0.13.0 // indirect | 	golang.org/x/sys v0.34.0 // indirect | ||||||
| 	golang.org/x/sys v0.32.0 // indirect | 	golang.org/x/term v0.33.0 // indirect | ||||||
| 	golang.org/x/term v0.31.0 // indirect | 	golang.org/x/text v0.27.0 // indirect | ||||||
| 	golang.org/x/text v0.24.0 // indirect | 	golang.org/x/tools v0.34.0 // indirect | ||||||
| 	golang.org/x/tools v0.29.0 // indirect |  | ||||||
| 	gopkg.in/yaml.v2 v2.4.0 // indirect |  | ||||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||||
| 	howett.net/plist v1.0.0 // 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/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 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= | ||||||
| github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= | 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.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= | ||||||
| github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= | 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 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= | ||||||
| github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= | 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.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= | ||||||
| github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= | 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.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.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 h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= | ||||||
| github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | 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 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= | ||||||
| github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= | 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 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= | ||||||
| github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= | 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 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= | ||||||
| github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= | 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.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 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= | ||||||
| github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= | 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-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= | ||||||
| github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= | github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= | ||||||
| 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/gofrs/uuid/v5 v5.2.0 h1:qw1GMx6/y8vhVsx626ImfKMuS5CvJmhIKKtuyvfajMM= | 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/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.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.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/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 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= | ||||||
| github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= | 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 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= | ||||||
| github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | 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= | 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/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 h1:uOKW26NG1hsSSbXIZ1IR7XP9Gjd1U8pnLaCMgntmkmY= | ||||||
| github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= | 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/icholy/digest v1.1.0 h1:HfGg9Irj7i+IX1o1QAmPfIBNu/Q5A5Tu3n/MED9k9H4= | ||||||
| github.com/imroc/req/v3 v3.50.0/go.mod h1:tsOk8K7zI6cU4xu/VWCZVtq9Djw9IWm4MslKzme5woU= | 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 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= | ||||||
| github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= | 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.17.0 h1:EVLJeNcy5z6GK/Lqby0EhBpynZo+ayl8iJWY0kbEUJA= | ||||||
| github.com/jaypipes/ghw v0.12.0/go.mod h1:jeJGbkRB2lL3/gxYzNYzEDETV1ZJ56OKr+CSeSEym+g= | github.com/jaypipes/ghw v0.17.0/go.mod h1:In8SsaDqlb1oTyrbmTC14uy+fbBMvp+xdqX51MidlD8= | ||||||
| github.com/jaypipes/pcidb v1.0.0 h1:vtZIfkiCUE42oYbJS0TAq9XSfSmcsgo9IdxSm9qzYU8= | github.com/jaypipes/pcidb v1.0.1 h1:WB2zh27T3nwg8AE8ei81sNRb9yWBii3JGNJtT7K9Oic= | ||||||
| github.com/jaypipes/pcidb v1.0.0/go.mod h1:TnYUvqhPBzCKnH34KrIX22kAeEbDCSRJ9cqLRCuNDfk= | 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/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 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= | ||||||
| github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= | 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/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.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= | ||||||
| github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= | 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 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= | ||||||
| github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= | github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= | ||||||
| github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= | ||||||
| @@ -95,44 +92,44 @@ 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/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 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= | ||||||
| github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= | 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.2 h1:dSRP18Bn3VGf5CZBzKt8gQWW9mDkq62Np9TCF9RAtp0= | ||||||
| github.com/nxtrace/NTrace-core v1.4.0/go.mod h1:0AWqbqiIJbpbFG6W48vtJ6pWM8PPF+lQ1fi2371y+zA= | 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 h1:Zef93z9UiZQwRAKnnZYALmpBKvvuVaq34MEsuWwk6nc= | ||||||
| github.com/oneclickvirt/CommonMediaTests v0.0.4-20250329123841/go.mod h1:DAmFPRjFV5p9fEzUUSml5jJGn2f1NZJQCzTxITHDjc4= | github.com/oneclickvirt/CommonMediaTests v0.0.4-20250329123841/go.mod h1:DAmFPRjFV5p9fEzUUSml5jJGn2f1NZJQCzTxITHDjc4= | ||||||
| github.com/oneclickvirt/UnlockTests v0.0.26-20250329125926 h1:H5//xwVjDR02bQ1hLa3G7LnwccsudPMjBVt7WCx2y/U= | github.com/oneclickvirt/UnlockTests v0.0.29-20251030094944 h1:c81MmwD3yO/7kkKN+j88VfBuRQcr3zKp0wGTu1zjUug= | ||||||
| github.com/oneclickvirt/UnlockTests v0.0.26-20250329125926/go.mod h1:yXWIZB6iLS88pEd9m4QJi1GENn+7I91zA72y5ONz2Oc= | github.com/oneclickvirt/UnlockTests v0.0.29-20251030094944/go.mod h1:oOa6wj/qECtRMxwBO6D7o0L0F0Q/5sQ747OCnFQqoGE= | ||||||
| github.com/oneclickvirt/backtrace v0.0.5-20250517095024 h1:j912aga/17znOqMB2VAxWOQYa4GL6YMFBhv+6c7jkvA= | github.com/oneclickvirt/backtrace v0.0.7-20250811023541 h1:GzkzvUC6U9b6Dkz/Bl4JRPeQ7XBGoW7Qw1aWqzhF+MQ= | ||||||
| github.com/oneclickvirt/backtrace v0.0.5-20250517095024/go.mod h1:5AH00bo41hH3d2/JVuCTlBkZUs3AXX4nlKVXb6piZcI= | github.com/oneclickvirt/backtrace v0.0.7-20250811023541/go.mod h1:/+KUtOWz48TyiTTbhVTsp3D6b5WY+4pCgvFBYtUGtns= | ||||||
| github.com/oneclickvirt/basics v0.0.12-20250521031609 h1:3WxHe+jKrZHF81oa8Xk3IgHCRqTC5GDjv8alR0geamU= | github.com/oneclickvirt/basics v0.0.16-20251030093657 h1:6SWWILNjJfMTXbspqYRpktUEOe/QIVhGonKO8ODC7n4= | ||||||
| github.com/oneclickvirt/basics v0.0.12-20250521031609/go.mod h1:yN1IEOXN6v/GJqJSA70Pooo6nXBI/6rq72vTY72wJMQ= | github.com/oneclickvirt/basics v0.0.16-20251030093657/go.mod h1:2PV+1ge01zb0Sqzj2V2I7P0wAdFSLF1XgAiumchJJbg= | ||||||
| github.com/oneclickvirt/cputest v0.0.10-20250404151448 h1:ovGtCwFXG0qmpyNDRqcNDIiAmhrtemCjIUXTJ1fPH0o= | github.com/oneclickvirt/cputest v0.0.12-20250720122317 h1:toiwAK1hZE5b8klu2mOQ7J4sv5yV9lpPKwgPahfRYBQ= | ||||||
| github.com/oneclickvirt/cputest v0.0.10-20250404151448/go.mod h1:MmaHN9+XMntI3rLycwj8Ne31fG18IfNoa8N2utDK1CY= | github.com/oneclickvirt/cputest v0.0.12-20250720122317/go.mod h1:vjlH8tkPFft1tlLOpeNskXVvurxkHaJ3+dgFxQGLXY4= | ||||||
| github.com/oneclickvirt/dd v0.0.1-20250406062523 h1:jegTww4fuoFEqwFozvGJEqUNI/5ew3QJ0XcKZZ/zuTs= | github.com/oneclickvirt/dd v0.0.2-20250808062818 h1:0KHrKkdpL5oBE1OHsrRd2siRw4/2k6f9LBaP7T4JpOc= | ||||||
| github.com/oneclickvirt/dd v0.0.1-20250406062523/go.mod h1:tImu9sPTkLWo2tf1dEN1xQzrylWKauj9hbU8PHfyAeU= | 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 h1:5Pg3mK/u/vQvSz7anu0nxzrNdELi/AcDAU1mMsmPzyc= | ||||||
| github.com/oneclickvirt/defaultset v0.0.2-20240624082446/go.mod h1:e9Jt4tf2sbemCtc84/XgKcHy9EZ2jkc5x2sW1NiJS+E= | github.com/oneclickvirt/defaultset v0.0.2-20240624082446/go.mod h1:e9Jt4tf2sbemCtc84/XgKcHy9EZ2jkc5x2sW1NiJS+E= | ||||||
| github.com/oneclickvirt/disktest v0.0.8-20250425015826 h1:bwVg0zysB3uCwQV+KIIQpuq2IJXWdIcdjD2+FiKPo5w= | github.com/oneclickvirt/disktest v0.0.10-20250924030424 h1:56Aq2xygO/vA/co5vJ7/MQTNijIDl8eYbVk8uCWN4mI= | ||||||
| github.com/oneclickvirt/disktest v0.0.8-20250425015826/go.mod h1:sqVu6HwbnLmbnRj4389Xn08c301IhLnWCcbaEk2WzEc= | github.com/oneclickvirt/disktest v0.0.10-20250924030424/go.mod h1:Vp3iMVBD4ccReDJz5n5SlzUdq0kDuVhpRklQk21KT+8= | ||||||
| github.com/oneclickvirt/fio v0.0.1-20250406060851 h1:b7xHKpPmU4q0NmvigRCEr3tQuAV/83ZIAGtHycLegw8= | github.com/oneclickvirt/fio v0.0.2-20250808045755 h1:eWihCRWcalJjPIdrF8dMe68ZiPnMkSfHC8ENvElp/xE= | ||||||
| github.com/oneclickvirt/fio v0.0.1-20250406060851/go.mod h1:NIq+XYTey68KNERGIy/oRDlzpwLzBVoHOCiqX8didsE= | github.com/oneclickvirt/fio v0.0.2-20250808045755/go.mod h1:NIq+XYTey68KNERGIy/oRDlzpwLzBVoHOCiqX8didsE= | ||||||
| github.com/oneclickvirt/gostun v0.0.3-20250329105202 h1:aJ6E91Lp94lq8iWRcCaxpXTjqOOaWvufr5oras6cFtM= | github.com/oneclickvirt/gostun v0.0.5-20250727155022 h1:/e3gSUrOp1tg/1NTRx+P8B51OGcP26Q6//5EoSIjOvk= | ||||||
| github.com/oneclickvirt/gostun v0.0.3-20250329105202/go.mod h1:f7DPEXAxbmwXSW33dbxtb0/KzqvOBWhTs2Or5xBerQA= | github.com/oneclickvirt/gostun v0.0.5-20250727155022/go.mod h1:pfp7MFZJK9n/KTLAVqqFcCAns4xqMykmjI+1UeF/vdE= | ||||||
| github.com/oneclickvirt/memorytest v0.0.5-20250406063420 h1:eHqpqFIx8Ss062uyNf7Ruv7FC4AdZbElR7u9vX2Oj3g= | github.com/oneclickvirt/mbw v0.0.1-20250808061222 h1:WGXOe6QvHiDRhPVMI0VcctjzW08kGvJf50yq5YeZCtw= | ||||||
| github.com/oneclickvirt/memorytest v0.0.5-20250406063420/go.mod h1:HTd0sSxRjT4BcV8kcCh4fF2Nia0xgZNaVjhefsnypic= | github.com/oneclickvirt/mbw v0.0.1-20250808061222/go.mod h1:0Vq6NRpyLmGUdfHfL3uDcFsuZhi7KlG+OCs5ky2757Y= | ||||||
| github.com/oneclickvirt/nt3 v0.0.5-20250416131047 h1:KL0xowq19cW+FMBGMJxdqpRNoeyR+eEmb+jYSubmlTk= | github.com/oneclickvirt/memorytest v0.0.10-20250924154648 h1:trk6oZ7xs1eVtr+6oIv5IX8LDVtEMG+E6GVzQ810BtU= | ||||||
| github.com/oneclickvirt/nt3 v0.0.5-20250416131047/go.mod h1:CVsDJEaIdyyZHn3WKbhU8Wn6GOfmBNvJlC/dDLRqcSQ= | github.com/oneclickvirt/memorytest v0.0.10-20250924154648/go.mod h1:4kiHsEWkW9r3/1ZcV5xIweU0smiKP0IRfQj74AUIiVI= | ||||||
| github.com/oneclickvirt/pingtest v0.0.7-20250413051539 h1:mYOsEmMtwKr40hwM2NimVLpnbR2cjwuOh1c/9fQr2Dw= | github.com/oneclickvirt/nt3 v0.0.8-20250811123903 h1:ubSPLh/DSrXj+tOgmRABgi2vrVmbmjjSne+NrVFNmNc= | ||||||
| github.com/oneclickvirt/pingtest v0.0.7-20250413051539/go.mod h1:d3Ntx5m9lMll3a/k3+2B+5emj//vgDh4/NHTxs2qQE8= | github.com/oneclickvirt/nt3 v0.0.8-20250811123903/go.mod h1:F1v+6xInBKnbUa8gV1M40R1HOzxg+obtduNhx3CTnmA= | ||||||
| github.com/oneclickvirt/portchecker v0.0.3-20250329125750 h1:TTNL0pnQlRsn046kW59I/9UWRpihttFHWnU7Ixycggk= | github.com/oneclickvirt/pingtest v0.0.8-20250728015259 h1:egoxZRZBOWN3JqBwqEsULDyRo2/dpGMeWcmV3U87zig= | ||||||
| github.com/oneclickvirt/portchecker v0.0.3-20250329125750/go.mod h1:HQxSTrqM8/QFqHMTBZ7S8H9eEO5FkUXU1eb7ZX5Mk+k= | github.com/oneclickvirt/pingtest v0.0.8-20250728015259/go.mod h1:gxwsxxwitNQiGq2OI0ZogYoOLwc8DtuOdSRe6/EvRqs= | ||||||
| github.com/oneclickvirt/security v0.0.4-20250522031128 h1:k/zpiES/W0lW6Rumlmo4i7zp2ncimfeOUKadrylde8M= | github.com/oneclickvirt/portchecker v0.0.3-20250728015900 h1:AomzdppSOFB70AJESQhlp0IPbsHTTJGimAWDk2TzCWM= | ||||||
| github.com/oneclickvirt/security v0.0.4-20250522031128/go.mod h1:hdCr9UFkJ0tQfFP4mIycZehF5v7VfzSQwNn2qkY0bGo= | github.com/oneclickvirt/portchecker v0.0.3-20250728015900/go.mod h1:9sjMDPCd4Z40wkYB0S9gQPGH8YPtnNE1ZJthVIuHUzA= | ||||||
| github.com/oneclickvirt/speedtest v0.0.9-20250521034111 h1:yygDk+s5qFhPMDRzdMfyopm1xU512peNqY6WYyvYcfY= | github.com/oneclickvirt/security v0.0.7-20251030094114 h1:Ax8J1TYqprXyiWNAIJJ3xhoyGhvBlKw4m9j6va5Q2nM= | ||||||
| github.com/oneclickvirt/speedtest v0.0.9-20250521034111/go.mod h1:zd5ZgIGslmtQLQehEfRjyumlvgDHTpCSMchKfKXoASI= | github.com/oneclickvirt/security v0.0.7-20251030094114/go.mod h1:YfDilPFW22szjdUNgv4VOuSwHnZzsFsdPOfRYiMoc3I= | ||||||
| github.com/onsi/ginkgo/v2 v2.22.1 h1:QW7tbJAUDyVDVOM5dFa7qaybo+CRfR7bemlQUN6Z8aM= | github.com/oneclickvirt/speedtest v0.0.10-20250728015734 h1:HKO7/JQ74ueXA8Wo8NIvcK9DphbEG/YTfAAVz/akSiY= | ||||||
| github.com/onsi/ginkgo/v2 v2.22.1/go.mod h1:S6aTpoRsSq2cZOd+pssHAlKW/Q/jZt6cPrPlnj4a1xM= | github.com/oneclickvirt/speedtest v0.0.10-20250728015734/go.mod h1:0W8vnMbA3iucXLXFdGfe9Ia6RPS0izRO7jvu/SnH1P8= | ||||||
| github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw= | github.com/oneclickvirt/stream v0.0.2-20250924154001 h1:GuJWdiPkoK84+y/+oHKr2Ghl3c/MzS9Z5m1nM+lMmy4= | ||||||
| github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= | github.com/oneclickvirt/stream v0.0.2-20250924154001/go.mod h1:oWaizaHTC2VQciBC9RfaLbAOf8qeR6n20/gY7QxriDE= | ||||||
| github.com/oschwald/maxminddb-golang v1.13.1 h1:G3wwjdN9JmIK2o/ermkHM+98oX5fS+k5MbwsmL4MRQE= | 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/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= | github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= | ||||||
| @@ -158,10 +155,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/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 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= | ||||||
| github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= | 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.53.0 h1:QHX46sISpG2S03dPeZBgVIZp8dGagIaiu2FiVYvpCZI= | ||||||
| github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= | github.com/quic-go/quic-go v0.53.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY= | ||||||
| github.com/refraction-networking/utls v1.6.7 h1:zVJ7sP1dJx/WtVuITug3qYUq034cDq9B2MR1K67ULZM= | github.com/refraction-networking/utls v1.7.3 h1:L0WRhHY7Oq1T0zkdzVZMR6zWZv+sXbHB9zcuvsAEqCo= | ||||||
| github.com/refraction-networking/utls v1.6.7/go.mod h1:BC3O4vQzye5hqpmDTWUqi4P5DDhzJfkV1tdqtawQIH0= | 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.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= | ||||||
| github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= | github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= | ||||||
| github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= | github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= | ||||||
| @@ -175,22 +172,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/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 h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= | ||||||
| github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= | 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.25.6 h1:kLysI2JsKorfaFPcYmcJqbzROzsBWEOAtw6A7dIfqXs= | ||||||
| github.com/shirou/gopsutil/v4 v4.24.5/go.mod h1:aoebb2vxetJ/yIDZISmduFvVNPHqXQ9SEJwRXxkf0RA= | github.com/shirou/gopsutil/v4 v4.25.6/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c= | ||||||
| github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= | github.com/showwin/speedtest-go v1.7.10 h1:9o5zb7KsuzZKn+IE2//z5btLKJ870JwO6ETayUkqRFw= | ||||||
| github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= | github.com/showwin/speedtest-go v1.7.10/go.mod h1:Ei7OCTmNPdWofMadzcfgq1rUO7mvJy9Jycj//G7vyfA= | ||||||
| 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/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= | 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/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 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= | ||||||
| github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= | 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.9.2 h1:SsGfm7M8QOFtEzumm7UZrZdLLquNdzFYfIbEXntcFbE= | ||||||
| github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= | github.com/spf13/cast v1.9.2/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= | ||||||
| github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= | github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M= | ||||||
| github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= | 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 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= | ||||||
| github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= | github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= | ||||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||||
| @@ -227,8 +220,8 @@ github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo | |||||||
| github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= | 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 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= | ||||||
| go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= | 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.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= | ||||||
| go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= | 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 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= | ||||||
| go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= | go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= | ||||||
| go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= | go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= | ||||||
| @@ -238,16 +231,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.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.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.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= | ||||||
| golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= | golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= | ||||||
| golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= | golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= | ||||||
| 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/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= | 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.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.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.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||||
| golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= | golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= | ||||||
| golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= | 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-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-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||||
| golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | ||||||
| @@ -256,14 +247,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.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= | ||||||
| golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= | 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.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= | ||||||
| golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= | golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= | ||||||
| golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= | 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-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-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.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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= | golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= | ||||||
| golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= | 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-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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| @@ -278,8 +269,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.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.11.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.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||||
| golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= | golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= | ||||||
| golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= | 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-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.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||||
| golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= | golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= | ||||||
| @@ -287,38 +278,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.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.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.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= | ||||||
| golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= | golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= | ||||||
| golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= | 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.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.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.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.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.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.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= | ||||||
| golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= | golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= | ||||||
| golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= | golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= | ||||||
| golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= |  | ||||||
| golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= |  | ||||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | golang.org/x/tools v0.0.0-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-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.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.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.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= | ||||||
| golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= | golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= | ||||||
| golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= | 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-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-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/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 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 h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= | ||||||
| gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= | 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.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.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 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | ||||||
| gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | 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 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= | ||||||
| howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= | howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= | ||||||
|   | |||||||
							
								
								
									
										449
									
								
								goecs.sh
									
									
									
									
									
								
							
							
						
						
									
										449
									
								
								goecs.sh
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| #!/bin/bash | #!/bin/sh | ||||||
| # From https://github.com/oneclickvirt/ecs | # From https://github.com/oneclickvirt/ecs | ||||||
| # 2025.04.07 | # 2025.10.08 | ||||||
|  |  | ||||||
| # curl -L https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh -o goecs.sh && chmod +x goecs.sh | # curl -L https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh -o goecs.sh && chmod +x goecs.sh | ||||||
| # 或 | # 或 | ||||||
| @@ -20,22 +20,27 @@ cd /root >/dev/null 2>&1 | |||||||
| if [ ! -d "/usr/bin/" ]; then | if [ ! -d "/usr/bin/" ]; then | ||||||
|     mkdir -p "/usr/bin/" |     mkdir -p "/usr/bin/" | ||||||
| fi | fi | ||||||
| _red() { echo -e "\033[31m\033[01m$@\033[0m"; } | _red() { printf "\033[31m\033[01m%s\033[0m\n" "$*"; } | ||||||
| _green() { echo -e "\033[32m\033[01m$@\033[0m"; } | _green() { printf "\033[32m\033[01m%s\033[0m\n" "$*"; } | ||||||
| _yellow() { echo -e "\033[33m\033[01m$@\033[0m"; } | _yellow() { printf "\033[33m\033[01m%s\033[0m\n" "$*"; } | ||||||
| _blue() { echo -e "\033[36m\033[01m$@\033[0m"; } | _blue() { printf "\033[36m\033[01m%s\033[0m\n" "$*"; } | ||||||
| reading() { read -rp "$(_green "$1")" "$2"; } | reading() {  | ||||||
|  |     printf "\033[32m\033[01m%s\033[0m" "$1" | ||||||
|  |     read "$2" | ||||||
|  | } | ||||||
|  |  | ||||||
| check_cdn() { | check_cdn() { | ||||||
|     local o_url=$1 |     local o_url="$1" | ||||||
|     for cdn_url in "${cdn_urls[@]}"; do |     local cdn_url | ||||||
|         if curl -sL -k "$cdn_url$o_url" --max-time 6 | grep -q "success" >/dev/null 2>&1; then |     for cdn_url in $cdn_urls; do | ||||||
|             export cdn_success_url="$cdn_url" |         if curl -4 -sL -k "$cdn_url$o_url" --max-time 6 | grep -q "success" >/dev/null 2>&1; then | ||||||
|             return |             cdn_success_url="$cdn_url" | ||||||
|  |             return 0 | ||||||
|         fi |         fi | ||||||
|         sleep 0.5 |         sleep 0.5 | ||||||
|     done |     done | ||||||
|     export cdn_success_url="" |     cdn_success_url="" | ||||||
|  |     return 1 | ||||||
| } | } | ||||||
|  |  | ||||||
| check_cdn_file() { | check_cdn_file() { | ||||||
| @@ -50,9 +55,9 @@ check_cdn_file() { | |||||||
| download_file() { | download_file() { | ||||||
|     local url="$1" |     local url="$1" | ||||||
|     local output="$2" |     local output="$2" | ||||||
|     if ! wget -O "$output" "$url"; then |     if ! wget -O "$output" "$url" 2>/dev/null; then | ||||||
|         _yellow "wget failed, trying curl..." |         _yellow "wget failed, trying curl..." | ||||||
|         if ! curl -L -o "$output" "$url"; then |         if ! curl -L -o "$output" "$url" 2>/dev/null; then | ||||||
|             _red "Both wget and curl failed. Unable to download the file." |             _red "Both wget and curl failed. Unable to download the file." | ||||||
|             return 1 |             return 1 | ||||||
|         fi |         fi | ||||||
| @@ -62,8 +67,7 @@ download_file() { | |||||||
|  |  | ||||||
| check_china() { | check_china() { | ||||||
|     _yellow "正在检测IP所在区域......" |     _yellow "正在检测IP所在区域......" | ||||||
|     if [[ -z "${CN}" ]]; then |     if [ -z "${CN}" ]; then | ||||||
|         # 首先尝试通过 ipapi.co 检测 |  | ||||||
|         if curl -m 6 -s https://ipapi.co/json | grep -q 'China'; then |         if curl -m 6 -s https://ipapi.co/json | grep -q 'China'; then | ||||||
|             _yellow "根据ipapi.co提供的信息,当前IP可能在中国" |             _yellow "根据ipapi.co提供的信息,当前IP可能在中国" | ||||||
|             if [ "$noninteractive" != "true" ]; then |             if [ "$noninteractive" != "true" ]; then | ||||||
| @@ -94,38 +98,61 @@ check_china() { | |||||||
|  |  | ||||||
| get_memory_size() { | get_memory_size() { | ||||||
|     if [ -f /proc/meminfo ]; then |     if [ -f /proc/meminfo ]; then | ||||||
|         local mem_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}') |         local mem_kb | ||||||
|  |         mem_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}') | ||||||
|         echo $((mem_kb / 1024)) # Convert to MB |         echo $((mem_kb / 1024)) # Convert to MB | ||||||
|         return |         return 0 | ||||||
|     fi |     fi | ||||||
|     if command -v free >/dev/null 2>&1; then |     if command -v free >/dev/null 2>&1; then | ||||||
|         local mem_kb=$(free -m | awk '/^Mem:/ {print $2}') |         local mem_kb | ||||||
|  |         mem_kb=$(free -m | awk '/^Mem:/ {print $2}') | ||||||
|         echo "$mem_kb" # Already in MB |         echo "$mem_kb" # Already in MB | ||||||
|         return |         return 0 | ||||||
|     fi |     fi | ||||||
|     if command -v sysctl >/dev/null 2>&1; then |     if command -v sysctl >/dev/null 2>&1; then | ||||||
|         local mem_bytes=$(sysctl -n hw.memsize 2>/dev/null || sysctl -n hw.physmem 2>/dev/null) |         local mem_bytes | ||||||
|  |         mem_bytes=$(sysctl -n hw.memsize 2>/dev/null || sysctl -n hw.physmem 2>/dev/null) | ||||||
|         if [ -n "$mem_bytes" ]; then |         if [ -n "$mem_bytes" ]; then | ||||||
|             echo $((mem_bytes / 1024 / 1024)) # Convert to MB |             echo $((mem_bytes / 1024 / 1024)) # Convert to MB | ||||||
|             return |             return 0 | ||||||
|         fi |         fi | ||||||
|     fi |     fi | ||||||
|  |     echo 0 | ||||||
|  |     return 1 | ||||||
| } | } | ||||||
|  |  | ||||||
| cleanup_epel() { | cleanup_epel() { | ||||||
|     _yellow "Cleaning up EPEL repositories..." |     _yellow "Cleaning up EPEL repositories..." | ||||||
|     rm -f /etc/yum.repos.d/*epel* |     rm -f /etc/yum.repos.d/*epel* | ||||||
|     yum clean all |     yum clean all >/dev/null 2>&1 | ||||||
| } | } | ||||||
|  |  | ||||||
| goecs_check() { | goecs_check() { | ||||||
|     # Get system and architecture info with error handling |     if command -v apt-get >/dev/null 2>&1; then | ||||||
|  |         INSTALL_CMD="apt-get -y install" | ||||||
|  |     elif command -v yum >/dev/null 2>&1; then | ||||||
|  |         INSTALL_CMD="yum -y install" | ||||||
|  |     elif command -v dnf >/dev/null 2>&1; then | ||||||
|  |         INSTALL_CMD="dnf -y install" | ||||||
|  |     elif command -v pacman >/dev/null 2>&1; then | ||||||
|  |         INSTALL_CMD="pacman -S --noconfirm" | ||||||
|  |     elif command -v apk >/dev/null 2>&1; then | ||||||
|  |         INSTALL_CMD="apk add" | ||||||
|  |     elif command -v zypper >/dev/null 2>&1; then | ||||||
|  |         INSTALL_CMD="zypper install -y" | ||||||
|  |     fi | ||||||
|  |     if ! command -v unzip >/dev/null 2>&1; then | ||||||
|  |         _green "Installing unzip" | ||||||
|  |         ${INSTALL_CMD} unzip | ||||||
|  |     fi | ||||||
|  |     if ! command -v curl >/dev/null 2>&1; then | ||||||
|  |         _green "Installing curl" | ||||||
|  |         ${INSTALL_CMD} curl | ||||||
|  |     fi | ||||||
|     os=$(uname -s 2>/dev/null || echo "Unknown") |     os=$(uname -s 2>/dev/null || echo "Unknown") | ||||||
|     arch=$(uname -m 2>/dev/null || echo "Unknown") |     arch=$(uname -m 2>/dev/null || echo "Unknown") | ||||||
|     # First check for China IP |  | ||||||
|     check_china |     check_china | ||||||
|     # Get latest version number with multiple backup sources |     ECS_VERSION="0.1.90" | ||||||
|     ECS_VERSION="" |  | ||||||
|     for api in \ |     for api in \ | ||||||
|         "https://api.github.com/repos/oneclickvirt/ecs/releases/latest" \ |         "https://api.github.com/repos/oneclickvirt/ecs/releases/latest" \ | ||||||
|         "https://githubapi.spiritlhl.workers.dev/repos/oneclickvirt/ecs/releases/latest" \ |         "https://githubapi.spiritlhl.workers.dev/repos/oneclickvirt/ecs/releases/latest" \ | ||||||
| @@ -137,24 +164,24 @@ goecs_check() { | |||||||
|         sleep 1 |         sleep 1 | ||||||
|     done |     done | ||||||
|     if [ -z "$ECS_VERSION" ]; then |     if [ -z "$ECS_VERSION" ]; then | ||||||
|         _yellow "Unable to get version info, using default version 0.1.33" |         _yellow "Unable to get version info, using default version 0.1.90" | ||||||
|         ECS_VERSION="0.1.33" |         ECS_VERSION="0.1.90" | ||||||
|     fi |     fi | ||||||
|     # Check if original goecs command exists |  | ||||||
|     version_output="" |     version_output="" | ||||||
|     for cmd_path in "goecs" "./goecs" "/usr/bin/goecs" "/usr/local/bin/goecs"; do |     for cmd_path in "goecs" "./goecs" "/usr/bin/goecs" "/usr/local/bin/goecs"; do | ||||||
|         if [ -x "$(command -v $cmd_path 2>/dev/null)" ]; then |         if command -v "$cmd_path" >/dev/null 2>&1; then | ||||||
|             version_output=$($cmd_path -v command 2>/dev/null) |             version_output=$($cmd_path -v command 2>/dev/null) | ||||||
|             break |             break | ||||||
|         fi |         fi | ||||||
|     done |     done | ||||||
|     if [ -n "$version_output" ]; then |     if [ -n "$version_output" ]; then | ||||||
|         extracted_version=${version_output//v/} |         extracted_version=${version_output#*v} | ||||||
|  |         extracted_version=${extracted_version#v} | ||||||
|         if [ -n "$extracted_version" ]; then |         if [ -n "$extracted_version" ]; then | ||||||
|             ecs_version=$ECS_VERSION |             ecs_version=$ECS_VERSION | ||||||
|             if [[ "$(echo -e "$extracted_version\n$ecs_version" | sort -V | tail -n 1)" == "$extracted_version" ]]; then |             if [ "$(printf '%s\n%s\n' "$extracted_version" "$ecs_version" | sort -V | tail -n 1)" = "$extracted_version" ]; then | ||||||
|                 _green "goecs version ($extracted_version) is up to date, no upgrade needed" |                 _green "goecs version ($extracted_version) is up to date, no upgrade needed" | ||||||
|                 return |                 return 0 | ||||||
|             else |             else | ||||||
|                 _yellow "goecs version ($extracted_version) < $ecs_version, upgrade needed, starting in 5 seconds" |                 _yellow "goecs version ($extracted_version) < $ecs_version, upgrade needed, starting in 5 seconds" | ||||||
|                 rm -rf /usr/bin/goecs /usr/local/bin/goecs ./goecs |                 rm -rf /usr/bin/goecs /usr/local/bin/goecs ./goecs | ||||||
| @@ -164,12 +191,11 @@ goecs_check() { | |||||||
|         _green "goecs not found, installation needed, starting in 5 seconds" |         _green "goecs not found, installation needed, starting in 5 seconds" | ||||||
|     fi |     fi | ||||||
|     sleep 5 |     sleep 5 | ||||||
|     # Download corresponding version with error handling |     if [ "$CN" = "true" ]; then | ||||||
|     if [[ "$CN" == true ]]; then |  | ||||||
|         _yellow "Using China mirror for download..." |         _yellow "Using China mirror for download..." | ||||||
|         base_url="https://cnb.cool/oneclickvirt/ecs/-/git/raw/main" |         base_url="https://cnb.cool/oneclickvirt/ecs/-/git/raw/main" | ||||||
|     else |     else | ||||||
|         cdn_urls=("https://cdn0.spiritlhl.top/" "http://cdn3.spiritlhl.net/" "http://cdn1.spiritlhl.net/" "http://cdn2.spiritlhl.net/") |         cdn_urls="https://cdn0.spiritlhl.top/ http://cdn3.spiritlhl.net/ http://cdn1.spiritlhl.net/ http://cdn2.spiritlhl.net/" | ||||||
|         check_cdn_file |         check_cdn_file | ||||||
|         if [ -n "$cdn_success_url" ]; then |         if [ -n "$cdn_success_url" ]; then | ||||||
|             base_url="${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}" |             base_url="${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}" | ||||||
| @@ -177,7 +203,6 @@ goecs_check() { | |||||||
|             base_url="https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}" |             base_url="https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}" | ||||||
|         fi |         fi | ||||||
|     fi |     fi | ||||||
|     # Build download URL with architecture support |  | ||||||
|     local zip_file="" |     local zip_file="" | ||||||
|     case $os in |     case $os in | ||||||
|         Linux|linux|LINUX) |         Linux|linux|LINUX) | ||||||
| @@ -215,7 +240,6 @@ goecs_check() { | |||||||
|     esac |     esac | ||||||
|     download_url="${base_url}/${zip_file}" |     download_url="${base_url}/${zip_file}" | ||||||
|     _green "Downloading $download_url" |     _green "Downloading $download_url" | ||||||
|     # Download file with retry mechanism |  | ||||||
|     local max_retries=3 |     local max_retries=3 | ||||||
|     local retry_count=0 |     local retry_count=0 | ||||||
|     while [ $retry_count -lt $max_retries ]; do |     while [ $retry_count -lt $max_retries ]; do | ||||||
| @@ -230,29 +254,11 @@ goecs_check() { | |||||||
|         _red "Download failed, please check your network connection or download manually" |         _red "Download failed, please check your network connection or download manually" | ||||||
|         return 1 |         return 1 | ||||||
|     fi |     fi | ||||||
|     if ! command -v unzip >/dev/null 2>&1; then |  | ||||||
|         _green "Installing $cmd" |  | ||||||
|         if command -v apt-get >/dev/null 2>&1; then |  | ||||||
|             INSTALL_CMD="apt-get -y install" |  | ||||||
|         elif command -v yum >/dev/null 2>&1; then |  | ||||||
|             INSTALL_CMD="yum -y install" |  | ||||||
|         elif command -v dnf >/dev/null 2>&1; then |  | ||||||
|             INSTALL_CMD="dnf -y install" |  | ||||||
|         elif command -v pacman >/dev/null 2>&1; then |  | ||||||
|             INSTALL_CMD="pacman -S --noconfirm" |  | ||||||
|         elif command -v apk >/dev/null 2>&1; then |  | ||||||
|             INSTALL_CMD="apk add" |  | ||||||
|         elif command -v zypper >/dev/null 2>&1; then |  | ||||||
|             INSTALL_CMD="zypper install -y" |  | ||||||
|         fi |  | ||||||
|         ${INSTALL_CMD} "$cmd" |  | ||||||
|     fi |  | ||||||
|     if ! unzip -o goecs.zip >/dev/null 2>&1; then |     if ! unzip -o goecs.zip >/dev/null 2>&1; then | ||||||
|         _red "Extraction failed" |         _red "Extraction failed" | ||||||
|         return 1 |         return 1 | ||||||
|     fi |     fi | ||||||
|     rm -f goecs.zip README.md LICENSE README_EN.md |     rm -f goecs.zip README.md LICENSE README_EN.md | ||||||
|     # Set execution permissions and install |  | ||||||
|     chmod 777 goecs |     chmod 777 goecs | ||||||
|     for install_path in "/usr/bin" "/usr/local/bin"; do |     for install_path in "/usr/bin" "/usr/local/bin"; do | ||||||
|         if [ -d "$install_path" ]; then |         if [ -d "$install_path" ]; then | ||||||
| @@ -260,7 +266,6 @@ goecs_check() { | |||||||
|             break |             break | ||||||
|         fi |         fi | ||||||
|     done |     done | ||||||
|     # Set system parameters |  | ||||||
|     if [ "$os" != "Darwin" ]; then |     if [ "$os" != "Darwin" ]; then | ||||||
|         PARAM="net.ipv4.ping_group_range" |         PARAM="net.ipv4.ping_group_range" | ||||||
|         NEW_VALUE="0 2147483647" |         NEW_VALUE="0 2147483647" | ||||||
| @@ -273,7 +278,6 @@ goecs_check() { | |||||||
|             sysctl -p >/dev/null 2>&1 |             sysctl -p >/dev/null 2>&1 | ||||||
|         fi |         fi | ||||||
|     fi |     fi | ||||||
|     # Set special permissions |  | ||||||
|     setcap cap_net_raw=+ep goecs 2>/dev/null |     setcap cap_net_raw=+ep goecs 2>/dev/null | ||||||
|     setcap cap_net_raw=+ep /usr/bin/goecs 2>/dev/null |     setcap cap_net_raw=+ep /usr/bin/goecs 2>/dev/null | ||||||
|     setcap cap_net_raw=+ep /usr/local/bin/goecs 2>/dev/null |     setcap cap_net_raw=+ep /usr/local/bin/goecs 2>/dev/null | ||||||
| @@ -307,172 +311,188 @@ InstallSysbench() { | |||||||
|     else |     else | ||||||
|         Var_OSRelease="unknown" # 未知系统分支 |         Var_OSRelease="unknown" # 未知系统分支 | ||||||
|     fi |     fi | ||||||
|     local mem_size=$(get_memory_size) |     local mem_size | ||||||
|  |     mem_size=$(get_memory_size) | ||||||
|     if [ -z "$mem_size" ] || [ "$mem_size" -eq 0 ]; then |     if [ -z "$mem_size" ] || [ "$mem_size" -eq 0 ]; then | ||||||
|         echo "Error: Unable to determine memory size or memory size is zero." |         echo "Error: Unable to determine memory size or memory size is zero." | ||||||
|     elif [ $mem_size -lt 1024 ]; then |     elif [ "$mem_size" -lt 1024 ]; then | ||||||
|         _red "Warning: Your system has less than 1GB RAM (${mem_size}MB)" |         _red "Warning: Your system has less than 1GB RAM (${mem_size}MB)" | ||||||
|         if [ "$noninteractive" != "true" ]; then |         if [ "$noninteractive" != "true" ]; then | ||||||
|             reading "Do you want to continue with EPEL installation? (y/N): " confirm |             reading "Do you want to continue with EPEL installation? (y/N): " confirm | ||||||
|             if [[ ! $confirm =~ ^[Yy]$ ]]; then |             case "$confirm" in | ||||||
|                 _yellow "Skipping EPEL installation" |                 [Yy]*) | ||||||
|                 return 1 |                     ;; | ||||||
|             fi |                 *) | ||||||
|  |                     _yellow "Skipping EPEL installation" | ||||||
|  |                     return 1 | ||||||
|  |                     ;; | ||||||
|  |             esac | ||||||
|         fi |         fi | ||||||
|         case "$Var_OSRelease" in |         case "$Var_OSRelease" in | ||||||
|         ubuntu | debian | astra)  |         ubuntu | debian | astra) | ||||||
|             ! apt-get install -y sysbench && apt-get --fix-broken install -y && apt-get install --no-install-recommends -y sysbench ;; |             if ! apt-get install -y sysbench; then | ||||||
|         centos | rhel | almalinux | redhat | opencloudos)  |                 apt-get --fix-broken install -y | ||||||
|             (yum -y install epel-release && yum -y install sysbench) || (dnf install epel-release -y && dnf install sysbench -y) ;; |                 apt-get install --no-install-recommends -y sysbench | ||||||
|         fedora)  |             fi | ||||||
|  |             ;; | ||||||
|  |         centos | rhel | almalinux | redhat | opencloudos) | ||||||
|  |             if ! yum -y install epel-release || ! yum -y install sysbench; then | ||||||
|  |                 if command -v dnf >/dev/null 2>&1; then | ||||||
|  |                     dnf install epel-release -y | ||||||
|  |                     dnf install sysbench -y | ||||||
|  |                 fi | ||||||
|  |             fi | ||||||
|  |             ;; | ||||||
|  |         fedora) | ||||||
|             dnf -y install sysbench ;; |             dnf -y install sysbench ;; | ||||||
|         arch)  |         arch) | ||||||
|             pacman -S --needed --noconfirm sysbench && pacman -S --needed --noconfirm libaio && ldconfig ;; |             pacman -S --needed --noconfirm sysbench | ||||||
|         freebsd)  |             pacman -S --needed --noconfirm libaio | ||||||
|  |             ldconfig | ||||||
|  |             ;; | ||||||
|  |         freebsd) | ||||||
|             pkg install -y sysbench ;; |             pkg install -y sysbench ;; | ||||||
|         alpinelinux) |         alpinelinux) | ||||||
|             if [ "$noninteractive" != "true" ]; then |             if [ "$noninteractive" != "true" ]; then | ||||||
|                 reading "Do you want to continue with sysbench installation? (y/N): " confirm |                 reading "Do you want to continue with sysbench installation? (y/N): " confirm | ||||||
|                 if [[ ! $confirm =~ ^[Yy]$ ]]; then |                 case "$confirm" in | ||||||
|                     _yellow "Skipping sysbench installation" |                     [Yy]*) | ||||||
|                     return 1 |                         ;; | ||||||
|                 fi |                     *) | ||||||
|  |                         _yellow "Skipping sysbench installation" | ||||||
|  |                         return 1 | ||||||
|  |                         ;; | ||||||
|  |                 esac | ||||||
|             fi |             fi | ||||||
|             ALPINE_VERSION=$(grep -o '^[0-9]\+\.[0-9]\+' /etc/alpine-release) |             ALPINE_VERSION=$(grep -o '^[0-9]\+\.[0-9]\+' /etc/alpine-release) | ||||||
|             COMMUNITY_REPO="http://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/community" |             COMMUNITY_REPO="http://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/community" | ||||||
|             if grep -q "^${COMMUNITY_REPO}" /etc/apk/repositories; then |             if ! grep -q "^${COMMUNITY_REPO}" /etc/apk/repositories; then | ||||||
|                 echo "Community repository is already enabled." |  | ||||||
|             else |  | ||||||
|                 echo "Enabling community repository..." |                 echo "Enabling community repository..." | ||||||
|                 echo "${COMMUNITY_REPO}" >> /etc/apk/repositories |                 echo "${COMMUNITY_REPO}" >> /etc/apk/repositories | ||||||
|                 echo "Community repository has been added." |                 echo "Community repository has been added." | ||||||
|                 echo "Updating apk package index..." |                 echo "Updating apk package index..." | ||||||
|                 apk update && echo "Package index updated successfully." |                 apk update && echo "Package index updated successfully." | ||||||
|  |             else | ||||||
|  |                 echo "Community repository is already enabled." | ||||||
|             fi |             fi | ||||||
|             if apk info sysbench >/dev/null 2>&1; then |             if apk info sysbench >/dev/null 2>&1; then | ||||||
|                 echo -e "${Msg_Info}Sysbench already installed." |                 echo "Sysbench already installed." | ||||||
|             else |             else | ||||||
|                 apk add --no-cache sysbench |                 if ! apk add --no-cache sysbench; then | ||||||
|                 if [ $? -ne 0 ]; then |                     echo "Sysbench Module not found, installing ..." | ||||||
|                     echo -e "${Msg_Warning}Sysbench Module not found, installing ..." && echo -e "${Msg_Warning}SysBench Current not support Alpine Linux, Skipping..." && Var_Skip_SysBench="1" |                     echo "SysBench Current not support Alpine Linux, Skipping..." | ||||||
|  |                     Var_Skip_SysBench="1" | ||||||
|                 else |                 else | ||||||
|                     echo -e "${Msg_Success}Sysbench installed successfully." |                     echo "Sysbench installed successfully." | ||||||
|                 fi |                 fi | ||||||
|             fi ;; |             fi | ||||||
|         *)  |             ;; | ||||||
|  |         *) | ||||||
|             _red "Sysbench Install Error: Unknown OS release: $Var_OSRelease" ;; |             _red "Sysbench Install Error: Unknown OS release: $Var_OSRelease" ;; | ||||||
|         esac |         esac | ||||||
|         if [[ $SYSTEM =~ ^(CentOS|RHEL|AlmaLinux)$ ]]; then |         case "$SYSTEM" in | ||||||
|         _yellow "Installing EPEL repository..." |             CentOS|RHEL|AlmaLinux) | ||||||
|             if ! yum -y install epel-release; then |                 _yellow "Installing EPEL repository..." | ||||||
|                 _red "EPEL installation failed!" |                 if ! yum -y install epel-release; then | ||||||
|                 cleanup_epel |                     _red "EPEL installation failed!" | ||||||
|                 _yellow "Attempting to continue without EPEL..." |                     cleanup_epel | ||||||
|             fi |                     _yellow "Attempting to continue without EPEL..." | ||||||
|         fi |                 fi | ||||||
|     fi |                 ;; | ||||||
| } |         esac | ||||||
|  |  | ||||||
| Check_SysBench() { |  | ||||||
|     if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then |  | ||||||
|         InstallSysbench |  | ||||||
|     fi |  | ||||||
|     # 尝试编译安装 |  | ||||||
|     if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then |  | ||||||
|         echo -e "${Msg_Warning}Sysbench Module install Failure, trying compile modules ..." |  | ||||||
|         Check_Sysbench_InstantBuild |  | ||||||
|     fi |  | ||||||
|     source ~/.bashrc |  | ||||||
|     # 最终检测 |  | ||||||
|     if [ "$(command -v sysbench)" ] || [ -f "/usr/bin/sysbench" ] || [ -f "/usr/local/bin/sysbench" ]; then |  | ||||||
|         _yellow "Install sysbench successfully!" |  | ||||||
|     else |  | ||||||
|         _red "SysBench Moudle install Failure! Try Restart Bench or Manually install it! (/usr/bin/sysbench)" |  | ||||||
|         _blue "Will try to test with geekbench5 instead later." |  | ||||||
|     fi |  | ||||||
|     sleep 3 |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Check_Sysbench_InstantBuild() { |  | ||||||
|     if [ "${Var_OSRelease}" = "centos" ] || [ "${Var_OSRelease}" = "rhel" ] || [ "${Var_OSRelease}" = "almalinux" ] || [ "${Var_OSRelease}" = "ubuntu" ] || [ "${Var_OSRelease}" = "debian" ] || [ "${Var_OSRelease}" = "fedora" ] || [ "${Var_OSRelease}" = "arch" ] || [ "${Var_OSRelease}" = "astra" ]; then |  | ||||||
|         local os_sysbench=${Var_OSRelease} |  | ||||||
|         if [ "$os_sysbench" = "astra" ]; then |  | ||||||
|             os_sysbench="debian" |  | ||||||
|         fi |  | ||||||
|         if [ "$os_sysbench" = "opencloudos" ]; then |  | ||||||
|             os_sysbench="centos" |  | ||||||
|         fi |  | ||||||
|         echo -e "${Msg_Info}Release Detected: ${os_sysbench}" |  | ||||||
|         echo -e "${Msg_Info}Preparing compile enviorment ..." |  | ||||||
|         prepare_compile_env "${os_sysbench}" |  | ||||||
|         echo -e "${Msg_Info}Downloading Source code (Version 1.0.20)..." |  | ||||||
|         mkdir -p /tmp/sysbench_install/src/ |  | ||||||
|         mv /tmp/sysbench-1.0.20 /tmp/sysbench_install/src/ |  | ||||||
|         echo -e "${Msg_Info}Compiling Sysbench Module ..." |  | ||||||
|         cd /tmp/sysbench_install/src/sysbench-1.0.20 |  | ||||||
|         ./autogen.sh && ./configure --without-mysql && make -j8 && make install |  | ||||||
|         echo -e "${Msg_Info}Cleaning up ..." |  | ||||||
|         cd /tmp && rm -rf /tmp/sysbench_install/src/sysbench* |  | ||||||
|     else |  | ||||||
|         echo -e "${Msg_Warning}Unsupported operating system: ${Var_OSRelease}" |  | ||||||
|     fi |  | ||||||
| } |  | ||||||
|  |  | ||||||
| prepare_compile_env() { |  | ||||||
|     local system="$1" |  | ||||||
|     if [ "${system}" = "centos" ] || [ "${system}" = "rhel" ] || [ "${system}" = "almalinux" ]; then |  | ||||||
|         yum install -y epel-release |  | ||||||
|         yum install -y wget curl make gcc gcc-c++ make automake libtool pkgconfig libaio-devel |  | ||||||
|     elif [ "${system}" = "ubuntu" ] || [ "${system}" = "debian" ]; then |  | ||||||
|         ! apt-get update && apt-get --fix-broken install -y && apt-get update |  | ||||||
|         ! apt-get -y install --no-install-recommends curl wget make automake libtool pkg-config libaio-dev unzip && apt-get --fix-broken install -y && apt-get -y install --no-install-recommends curl wget make automake libtool pkg-config libaio-dev unzip |  | ||||||
|     elif [ "${system}" = "fedora" ]; then |  | ||||||
|         dnf install -y wget curl gcc gcc-c++ make automake libtool pkgconfig libaio-devel |  | ||||||
|     elif [ "${system}" = "arch" ]; then |  | ||||||
|         pacman -S --needed --noconfirm wget curl gcc gcc make automake libtool pkgconfig libaio lib32-libaio |  | ||||||
|     else |  | ||||||
|         echo -e "${Msg_Warning}Unsupported operating system: ${system}" |  | ||||||
|     fi |     fi | ||||||
| } | } | ||||||
|  |  | ||||||
| env_check() { | env_check() { | ||||||
|     REGEX=("debian|astra" "ubuntu" "centos|red hat|kernel|oracle linux|alma|rocky" "'amazon linux'" "fedora" "arch" "freebsd" "alpine" "openbsd" "opencloudos") |     # 检测是否为 macOS 系统 | ||||||
|     RELEASE=("Debian" "Ubuntu" "CentOS" "CentOS" "Fedora" "Arch" "FreeBSD" "Alpine" "OpenBSD" "OpenCloudOS") |     if [ "$(uname -s)" = "Darwin" ]; then | ||||||
|     PACKAGE_UPDATE=("apt-get update" "apt-get update" "yum -y update" "yum -y update" "yum -y update" "pacman -Sy" "pkg update" "apk update" "pkg_add -qu" "yum -y update") |         _green "Detected macOS system" | ||||||
|     PACKAGE_INSTALL=("apt-get -y install" "apt-get -y install" "yum -y install" "yum -y install" "yum -y install" "pacman -Sy --noconfirm --needed" "pkg install -y" "apk add --no-cache" "pkg_add -I" "yum -y install") |         _green "macOS has built-in tools, skipping dependency installation" | ||||||
|     PACKAGE_REMOVE=("apt-get -y remove" "apt-get -y remove" "yum -y remove" "yum -y remove" "yum -y remove" "pacman -Rsc --noconfirm" "pkg delete" "apk del" "pkg_delete -I" "yum -y remove") |         _green "Environment preparation complete." | ||||||
|     PACKAGE_UNINSTALL=("apt-get -y autoremove" "apt-get -y autoremove" "yum -y autoremove" "yum -y autoremove" "yum -y autoremove" "pacman -Rns --noconfirm" "pkg autoremove" "apk autoremove" "pkg_delete -a" "yum -y autoremove") |         _green "Next command is: ./goecs.sh install" | ||||||
|     # Check system information |         return 0 | ||||||
|  |     fi | ||||||
|  |      | ||||||
|     if [ -f /etc/opencloudos-release ]; then |     if [ -f /etc/opencloudos-release ]; then | ||||||
|         SYS="opencloudos" |         SYS="opencloudos" | ||||||
|     elif [ -s /etc/os-release ]; then |     elif [ -s /etc/os-release ]; then | ||||||
|         SYS="$(grep -i pretty_name /etc/os-release | cut -d \" -f2)" |         SYS="$(grep -i pretty_name /etc/os-release | cut -d \" -f2)" | ||||||
|     elif [ -x "$(type -p hostnamectl)" ]; then |     elif command -v hostnamectl >/dev/null 2>&1; then | ||||||
|         SYS="$(hostnamectl | grep -i system | cut -d : -f2 | xargs)" |         SYS="$(hostnamectl | grep -i system | cut -d : -f2 | sed 's/^ *//')" | ||||||
|     elif [ -x "$(type -p lsb_release)" ]; then |     elif command -v lsb_release >/dev/null 2>&1; then | ||||||
|         SYS="$(lsb_release -sd)" |         SYS="$(lsb_release -sd)" | ||||||
|     elif [ -s /etc/lsb-release ]; then |     elif [ -s /etc/lsb-release ]; then | ||||||
|         SYS="$(grep -i description /etc/lsb-release | cut -d \" -f2)" |         SYS="$(grep -i description /etc/lsb-release | cut -d \" -f2)" | ||||||
|     elif [ -s /etc/redhat-release ]; then |     elif [ -s /etc/redhat-release ]; then | ||||||
|         SYS="$(grep . /etc/redhat-release)" |         SYS="$(cat /etc/redhat-release)" | ||||||
|     elif [ -s /etc/issue ]; then |     elif [ -s /etc/issue ]; then | ||||||
|         SYS="$(grep . /etc/issue | cut -d '\' -f1 | sed '/^[ ]*$/d')" |         SYS="$(head -n1 /etc/issue | cut -d '\' -f1 | sed '/^[ ]*$/d')" | ||||||
|     else |     else | ||||||
|         SYS="$(uname -s)" |         SYS="$(uname -s)" | ||||||
|     fi |     fi | ||||||
|     # Match operating system |  | ||||||
|     SYSTEM="" |     SYSTEM="" | ||||||
|     for ((int = 0; int < ${#REGEX[@]}; int++)); do |     sys_lower=$(echo "$SYS" | tr '[:upper:]' '[:lower:]') | ||||||
|         if [[ $(echo "$SYS" | tr '[:upper:]' '[:lower:]') =~ ${REGEX[int]} ]]; then |     if echo "$sys_lower" | grep -E "debian|astra" >/dev/null 2>&1; then | ||||||
|             SYSTEM="${RELEASE[int]}" |         SYSTEM="Debian" | ||||||
|             UPDATE_CMD=${PACKAGE_UPDATE[int]} |         UPDATE_CMD="apt-get update" | ||||||
|             INSTALL_CMD=${PACKAGE_INSTALL[int]} |         INSTALL_CMD="apt-get -y install" | ||||||
|             REMOVE_CMD=${PACKAGE_REMOVE[int]} |         REMOVE_CMD="apt-get -y remove" | ||||||
|             UNINSTALL_CMD=${PACKAGE_UNINSTALL[int]} |         UNINSTALL_CMD="apt-get -y autoremove" | ||||||
|             break |     elif echo "$sys_lower" | grep -E "ubuntu" >/dev/null 2>&1; then | ||||||
|         fi |         SYSTEM="Ubuntu" | ||||||
|     done |         UPDATE_CMD="apt-get update" | ||||||
|     # If system is unrecognized, try common package managers |         INSTALL_CMD="apt-get -y install" | ||||||
|  |         REMOVE_CMD="apt-get -y remove" | ||||||
|  |         UNINSTALL_CMD="apt-get -y autoremove" | ||||||
|  |     elif echo "$sys_lower" | grep -E "centos|red hat|kernel|oracle linux|alma|rocky" >/dev/null 2>&1; then | ||||||
|  |         SYSTEM="CentOS" | ||||||
|  |         UPDATE_CMD="yum -y update" | ||||||
|  |         INSTALL_CMD="yum -y install" | ||||||
|  |         REMOVE_CMD="yum -y remove" | ||||||
|  |         UNINSTALL_CMD="yum -y autoremove" | ||||||
|  |     elif echo "$sys_lower" | grep -E "amazon linux" >/dev/null 2>&1; then | ||||||
|  |         SYSTEM="CentOS" | ||||||
|  |         UPDATE_CMD="yum -y update" | ||||||
|  |         INSTALL_CMD="yum -y install" | ||||||
|  |         REMOVE_CMD="yum -y remove" | ||||||
|  |         UNINSTALL_CMD="yum -y autoremove" | ||||||
|  |     elif echo "$sys_lower" | grep -E "fedora" >/dev/null 2>&1; then | ||||||
|  |         SYSTEM="Fedora" | ||||||
|  |         UPDATE_CMD="yum -y update" | ||||||
|  |         INSTALL_CMD="yum -y install" | ||||||
|  |         REMOVE_CMD="yum -y remove" | ||||||
|  |         UNINSTALL_CMD="yum -y autoremove" | ||||||
|  |     elif echo "$sys_lower" | grep -E "arch" >/dev/null 2>&1; then | ||||||
|  |         SYSTEM="Arch" | ||||||
|  |         UPDATE_CMD="pacman -Sy" | ||||||
|  |         INSTALL_CMD="pacman -Sy --noconfirm --needed" | ||||||
|  |         REMOVE_CMD="pacman -Rsc --noconfirm" | ||||||
|  |         UNINSTALL_CMD="pacman -Rns --noconfirm" | ||||||
|  |     elif echo "$sys_lower" | grep -E "freebsd" >/dev/null 2>&1; then | ||||||
|  |         SYSTEM="FreeBSD" | ||||||
|  |         UPDATE_CMD="pkg update" | ||||||
|  |         INSTALL_CMD="pkg install -y" | ||||||
|  |         REMOVE_CMD="pkg delete" | ||||||
|  |         UNINSTALL_CMD="pkg autoremove" | ||||||
|  |     elif echo "$sys_lower" | grep -E "alpine" >/dev/null 2>&1; then | ||||||
|  |         SYSTEM="Alpine" | ||||||
|  |         UPDATE_CMD="apk update" | ||||||
|  |         INSTALL_CMD="apk add --no-cache" | ||||||
|  |         REMOVE_CMD="apk del" | ||||||
|  |         UNINSTALL_CMD="apk autoremove" | ||||||
|  |     elif echo "$sys_lower" | grep -E "openbsd" >/dev/null 2>&1; then | ||||||
|  |         SYSTEM="OpenBSD" | ||||||
|  |         UPDATE_CMD="pkg_add -qu" | ||||||
|  |         INSTALL_CMD="pkg_add -I" | ||||||
|  |         REMOVE_CMD="pkg_delete -I" | ||||||
|  |         UNINSTALL_CMD="pkg_delete -a" | ||||||
|  |     elif echo "$sys_lower" | grep -E "opencloudos" >/dev/null 2>&1; then | ||||||
|  |         SYSTEM="OpenCloudOS" | ||||||
|  |         UPDATE_CMD="yum -y update" | ||||||
|  |         INSTALL_CMD="yum -y install" | ||||||
|  |         REMOVE_CMD="yum -y remove" | ||||||
|  |         UNINSTALL_CMD="yum -y autoremove" | ||||||
|  |     fi | ||||||
|     if [ -z "$SYSTEM" ]; then |     if [ -z "$SYSTEM" ]; then | ||||||
|         _yellow "Unable to recognize system, trying common package managers..." |         _yellow "Unable to recognize system, trying common package managers..." | ||||||
|         if command -v apt-get >/dev/null 2>&1; then |         if command -v apt-get >/dev/null 2>&1; then | ||||||
| @@ -519,7 +539,7 @@ env_check() { | |||||||
|     _green "System information: $SYSTEM" |     _green "System information: $SYSTEM" | ||||||
|     _green "Update command: $UPDATE_CMD" |     _green "Update command: $UPDATE_CMD" | ||||||
|     _green "Install command: $INSTALL_CMD" |     _green "Install command: $INSTALL_CMD" | ||||||
|     cdn_urls=("https://cdn0.spiritlhl.top/" "http://cdn3.spiritlhl.net/" "http://cdn1.spiritlhl.net/" "http://cdn2.spiritlhl.net/") |     cdn_urls="https://cdn0.spiritlhl.top/ http://cdn3.spiritlhl.net/ http://cdn1.spiritlhl.net/ http://cdn2.spiritlhl.net/" | ||||||
|     check_cdn_file |     check_cdn_file | ||||||
|     _yellow "Warning: System update will be performed" |     _yellow "Warning: System update will be performed" | ||||||
|     _yellow "This operation may:" |     _yellow "This operation may:" | ||||||
| @@ -529,66 +549,52 @@ env_check() { | |||||||
|     _yellow "4. Affect subsequent system startups" |     _yellow "4. Affect subsequent system startups" | ||||||
|     if [ "$noninteractive" != "true" ]; then |     if [ "$noninteractive" != "true" ]; then | ||||||
|         reading "Continue with system update? (y/N): " update_confirm |         reading "Continue with system update? (y/N): " update_confirm | ||||||
|         if [[ ! $update_confirm =~ ^[Yy]$ ]]; then |         case "$update_confirm" in | ||||||
|             _yellow "Skipping system update" |             [Yy]*) | ||||||
|             _yellow "Note: Some packages may fail to install" |                 _green "Updating system package manager..." | ||||||
|         else |                 if ! ${UPDATE_CMD} 2>/dev/null; then | ||||||
|             _green "Updating system package manager..." |                     _red "System update failed!" | ||||||
|             if ! ${UPDATE_CMD} 2>/dev/null; then |                 fi | ||||||
|                 _red "System update failed!" |                 ;; | ||||||
|             fi |             *) | ||||||
|         fi |                 _yellow "Skipping system update" | ||||||
|  |                 _yellow "Note: Some packages may fail to install" | ||||||
|  |                 ;; | ||||||
|  |         esac | ||||||
|     fi |     fi | ||||||
|     # Install necessary commands |  | ||||||
|     for cmd in sudo wget tar unzip iproute2 systemd-detect-virt dd fio; do |     for cmd in sudo wget tar unzip iproute2 systemd-detect-virt dd fio; do | ||||||
|         if ! command -v "$cmd" >/dev/null 2>&1; then |         if ! command -v "$cmd" >/dev/null 2>&1; then | ||||||
|             _green "Installing $cmd" |             _green "Installing $cmd" | ||||||
|             ${INSTALL_CMD} "$cmd" |             ${INSTALL_CMD} "$cmd" | ||||||
|         fi |         fi | ||||||
|     done |     done | ||||||
|     # sysbench installation |  | ||||||
|     if ! command -v sysbench >/dev/null 2>&1; then |     if ! command -v sysbench >/dev/null 2>&1; then | ||||||
|         _green "Installing sysbench" |         _green "Installing sysbench" | ||||||
|         ${INSTALL_CMD} sysbench |         if ! ${INSTALL_CMD} sysbench; then | ||||||
|         if [ $? -ne 0 ]; then |             _red "Unable to install sysbench through package manager" | ||||||
|             echo "Unable to download sysbench through package manager, attempting compilation..." |             _yellow "Sysbench installation skipped" | ||||||
|             wget -O /tmp/sysbench.zip "${cdn_success_url}https://github.com/akopytov/sysbench/archive/1.0.20.zip" || curl -Lk -o /tmp/sysbench.zip "${cdn_success_url}https://github.com/akopytov/sysbench/archive/1.0.20.zip" |  | ||||||
|             if [ ! -f /tmp/sysbench.zip ]; then |  | ||||||
|                 wget -q -O /tmp/sysbench.zip "https://hub.fgit.cf/akopytov/sysbench/archive/1.0.20.zip" |  | ||||||
|             fi |  | ||||||
|             chmod +x /tmp/sysbench.zip |  | ||||||
|             unzip /tmp/sysbench.zip -d /tmp |  | ||||||
|             Check_SysBench |  | ||||||
|         fi |         fi | ||||||
|     fi |     fi | ||||||
|     # geekbench and speedtest installation |  | ||||||
|     if ! command -v geekbench >/dev/null 2>&1; then |     if ! command -v geekbench >/dev/null 2>&1; then | ||||||
|         _green "Installing geekbench" |         _green "Installing geekbench" | ||||||
|         curl -L "${cdn_success_url}https://raw.githubusercontent.com/oneclickvirt/cputest/main/dgb.sh" -o dgb.sh && chmod +x dgb.sh |         curl -L "${cdn_success_url}https://raw.githubusercontent.com/oneclickvirt/cputest/main/dgb.sh" -o dgb.sh && chmod +x dgb.sh | ||||||
|         bash dgb.sh -v gb5 |         sh dgb.sh -v gb5 | ||||||
|         rm -rf dgb.sh |         rm -rf dgb.sh | ||||||
|     fi |     fi | ||||||
|     if ! command -v speedtest >/dev/null 2>&1; then |     if ! command -v speedtest >/dev/null 2>&1; then | ||||||
|         _green "Installing speedtest" |         _green "Installing speedtest" | ||||||
|         curl -L "${cdn_success_url}https://raw.githubusercontent.com/oneclickvirt/speedtest/main/dspt.sh" -o dspt.sh && chmod +x dspt.sh |         curl -L "${cdn_success_url}https://raw.githubusercontent.com/oneclickvirt/speedtest/main/dspt.sh" -o dspt.sh && chmod +x dspt.sh | ||||||
|         bash dspt.sh |         sh dspt.sh | ||||||
|         rm -rf dspt.sh |         rm -rf dspt.sh | ||||||
|         rm -rf speedtest.tar.gz |         rm -rf speedtest.tar.gz | ||||||
|     fi |     fi | ||||||
|     if ! command -v ping >/dev/null 2>&1; then |     if ! command -v ping >/dev/null 2>&1; then | ||||||
|         _green "Installing ping" |         _green "Installing ping" | ||||||
|         ${INSTALL_CMD} iputils-ping >/dev/null 2>&1 |         ${INSTALL_CMD} iputils-ping >/dev/null 2>&1 || ${INSTALL_CMD} ping >/dev/null 2>&1 | ||||||
|         ${INSTALL_CMD} ping >/dev/null 2>&1 |  | ||||||
|     fi |     fi | ||||||
|     # MacOS support |     if ! grep -q "^net.ipv4.ping_group_range = 0 2147483647$" /etc/sysctl.conf 2>/dev/null; then | ||||||
|     if [ "$(uname -s)" = "Darwin" ]; then |         echo "net.ipv4.ping_group_range = 0 2147483647" >> /etc/sysctl.conf 2>/dev/null | ||||||
|         echo "Detected MacOS, installing sysbench iproute2mac..." |         sysctl -p >/dev/null 2>&1 | ||||||
|         brew install --force sysbench iproute2mac |  | ||||||
|     else |  | ||||||
|         if ! grep -q "^net.ipv4.ping_group_range = 0 2147483647$" /etc/sysctl.conf; then |  | ||||||
|             echo "net.ipv4.ping_group_range = 0 2147483647" >> /etc/sysctl.conf |  | ||||||
|             sysctl -p |  | ||||||
|         fi |  | ||||||
|     fi |     fi | ||||||
|     _green "Environment preparation complete." |     _green "Environment preparation complete." | ||||||
|     _green "Next command is: ./goecs.sh install" |     _green "Next command is: ./goecs.sh install" | ||||||
| @@ -605,6 +611,7 @@ show_help() { | |||||||
| 可用命令: | 可用命令: | ||||||
|  |  | ||||||
| ./goecs.sh env            检查并安装依赖包 | ./goecs.sh env            检查并安装依赖包 | ||||||
|  |                           注意: macOS系统会自动跳过依赖安装 | ||||||
|                           警告: 此命令会执行系统更新(可选择),可能: |                           警告: 此命令会执行系统更新(可选择),可能: | ||||||
|                           1. 耗时较长 |                           1. 耗时较长 | ||||||
|                           2. 导致网络短暂中断 |                           2. 导致网络短暂中断 | ||||||
| @@ -616,7 +623,7 @@ show_help() { | |||||||
|                           3. 关键服务失败 |                           3. 关键服务失败 | ||||||
|                           推荐: |                           推荐: | ||||||
|                           环境依赖安装过程中挂起执行 |                           环境依赖安装过程中挂起执行 | ||||||
|                            |  | ||||||
|                           可选组件: |                           可选组件: | ||||||
|                           sysbench/geekbench (CPU性能测试) |                           sysbench/geekbench (CPU性能测试) | ||||||
|                           sudo, tar, unzip, dd, fio |                           sudo, tar, unzip, dd, fio | ||||||
| @@ -632,6 +639,7 @@ show_help() { | |||||||
| Available commands: | Available commands: | ||||||
|  |  | ||||||
| ./goecs.sh env             Check and Install dependencies | ./goecs.sh env             Check and Install dependencies | ||||||
|  |                            Note: macOS systems will skip dependency installation | ||||||
|                            Warning: This command performs system update(optional), which may: |                            Warning: This command performs system update(optional), which may: | ||||||
|                            1. Take considerable time |                            1. Take considerable time | ||||||
|                            2. Cause temporary network interruptions |                            2. Cause temporary network interruptions | ||||||
| @@ -643,7 +651,7 @@ Available commands: | |||||||
|                            3. Critical service failures |                            3. Critical service failures | ||||||
|                            Recommended: |                            Recommended: | ||||||
|                            Hanging execution during environment dependency installation |                            Hanging execution during environment dependency installation | ||||||
|                             |  | ||||||
|                            Optional components: |                            Optional components: | ||||||
|                            sysbench/geekbench (CPU testing) |                            sysbench/geekbench (CPU testing) | ||||||
|                            sudo, tar, unzip, dd, fio |                            sudo, tar, unzip, dd, fio | ||||||
| @@ -677,4 +685,3 @@ case "$1" in | |||||||
|     show_help |     show_help | ||||||
|     ;; |     ;; | ||||||
| esac | esac | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,35 +1,89 @@ | |||||||
| package memorytest | package memorytest | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" |  | ||||||
| 	"github.com/oneclickvirt/memorytest/memory" |  | ||||||
| 	"runtime" | 	"runtime" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
|  | 	"github.com/oneclickvirt/memorytest/memory" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func MemoryTest(language, testMethod string) { | func MemoryTest(language, testMethod string) (realTestMethod, res string) { | ||||||
| 	var res string | 	testMethod = strings.ToLower(testMethod) | ||||||
|  | 	if testMethod == "" { | ||||||
|  | 		testMethod = "auto" | ||||||
|  | 	} | ||||||
| 	if runtime.GOOS == "windows" { | 	if runtime.GOOS == "windows" { | ||||||
| 		if testMethod != "winsat" && testMethod != "" { | 		switch testMethod { | ||||||
| 			res = "Detected host is Windows, using Winsat for testing.\n" | 		case "stream": | ||||||
|  | 			res = memory.WinsatTest(language) | ||||||
|  | 			realTestMethod = "winsat" | ||||||
|  | 		case "dd": | ||||||
|  | 			res = memory.WindowsDDTest(language) | ||||||
|  | 			if res == "" || strings.TrimSpace(res) == "" { | ||||||
|  | 				res += memory.WinsatTest(language) | ||||||
|  | 				realTestMethod = "winsat" | ||||||
|  | 			} else { | ||||||
|  | 				realTestMethod = "dd" | ||||||
|  | 			} | ||||||
|  | 		case "sysbench": | ||||||
|  | 			res = memory.WinsatTest(language) | ||||||
|  | 			realTestMethod = "winsat" | ||||||
|  | 		case "auto", "winsat": | ||||||
|  | 			res = memory.WinsatTest(language) | ||||||
|  | 			realTestMethod = "winsat" | ||||||
|  | 		default: | ||||||
|  | 			res = memory.WinsatTest(language) | ||||||
|  | 			realTestMethod = "winsat" | ||||||
| 		} | 		} | ||||||
| 		res += memory.WinsatTest(language) |  | ||||||
| 	} else { | 	} else { | ||||||
| 		switch testMethod { | 		switch testMethod { | ||||||
| 		case "sysbench": | 		case "stream": | ||||||
| 			res = memory.SysBenchTest(language) | 			res = memory.StreamTest(language) | ||||||
| 			if res == "" { | 			if res == "" || strings.TrimSpace(res) == "" { | ||||||
| 				res = "sysbench test failed, switch to use dd test.\n" |  | ||||||
| 				res += memory.DDTest(language) | 				res += memory.DDTest(language) | ||||||
|  | 				realTestMethod = "dd" | ||||||
|  | 			} else { | ||||||
|  | 				realTestMethod = "stream" | ||||||
| 			} | 			} | ||||||
| 		case "dd": | 		case "dd": | ||||||
| 			res = memory.DDTest(language) | 			res = memory.DDTest(language) | ||||||
|  | 			realTestMethod = "dd" | ||||||
|  | 		case "sysbench": | ||||||
|  | 			res = memory.SysBenchTest(language) | ||||||
|  | 			if res == "" || strings.TrimSpace(res) == "" { | ||||||
|  | 				res += memory.DDTest(language) | ||||||
|  | 				realTestMethod = "dd" | ||||||
|  | 			} else { | ||||||
|  | 				realTestMethod = "sysbench" | ||||||
|  | 			} | ||||||
|  | 		case "auto": | ||||||
|  | 			res = memory.StreamTest(language) | ||||||
|  | 			if res == "" || strings.TrimSpace(res) == "" { | ||||||
|  | 				res = memory.DDTest(language) | ||||||
|  | 				if res == "" || strings.TrimSpace(res) == "" { | ||||||
|  | 					res = memory.SysBenchTest(language) | ||||||
|  | 					if res == "" || strings.TrimSpace(res) == "" { | ||||||
|  | 						realTestMethod = "" | ||||||
|  | 					} else { | ||||||
|  | 						realTestMethod = "sysbench" | ||||||
|  | 					} | ||||||
|  | 				} else { | ||||||
|  | 					realTestMethod = "dd" | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				realTestMethod = "stream" | ||||||
|  | 			} | ||||||
|  | 		case "winsat": | ||||||
|  | 			// winsat 仅 Windows 支持,非 Windows fallback 到 dd | ||||||
|  | 			res = memory.DDTest(language) | ||||||
|  | 			realTestMethod = "dd" | ||||||
| 		default: | 		default: | ||||||
| 			res = "Unsupported test method" | 			res = "Unsupported test method" | ||||||
|  | 			realTestMethod = "" | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	if !strings.Contains(res, "\n") && res != "" { | 	if !strings.Contains(res, "\n") && res != "" { | ||||||
| 		res += "\n" | 		res += "\n" | ||||||
| 	} | 	} | ||||||
| 	fmt.Printf(res) | 	return | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,9 +1,11 @@ | |||||||
| package memorytest | package memorytest | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"fmt" | ||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func Test(t *testing.T) { | func Test(t *testing.T) { | ||||||
| 	MemoryTest("zh", "sysbench") | 	_, res := MemoryTest("zh", "stream") | ||||||
|  | 	fmt.Print(res) | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										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) | ||||||
|  | } | ||||||
| @@ -6,5 +6,5 @@ import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| func Test(t *testing.T) { | func Test(t *testing.T) { | ||||||
| 	fmt.Printf(MediaTest("zh")) | 	fmt.Printf("%s", MediaTest("zh")) | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										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() | ||||||
|  | } | ||||||
							
								
								
									
										308
									
								
								utils/utils.go
									
									
									
									
									
								
							
							
						
						
									
										308
									
								
								utils/utils.go
									
									
									
									
									
								
							| @@ -3,22 +3,44 @@ package utils | |||||||
| import ( | import ( | ||||||
| 	"bufio" | 	"bufio" | ||||||
| 	"bytes" | 	"bytes" | ||||||
|  | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"github.com/imroc/req/v3" |  | ||||||
| 	"github.com/oneclickvirt/UnlockTests/uts" |  | ||||||
| 	"github.com/oneclickvirt/basics/system" |  | ||||||
| 	. "github.com/oneclickvirt/defaultset" |  | ||||||
| 	"github.com/oneclickvirt/security/network" |  | ||||||
| 	"io" | 	"io" | ||||||
|  | 	"net" | ||||||
|  | 	"net/http" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"regexp" | 	"regexp" | ||||||
|  | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
| 	"unicode/utf8" | 	"unicode/utf8" | ||||||
|  |  | ||||||
|  | 	"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 根据指定的宽度打印居中标题 | // PrintCenteredTitle 根据指定的宽度打印居中标题 | ||||||
| func PrintCenteredTitle(title string, width int) { | func PrintCenteredTitle(title string, width int) { | ||||||
| 	// 计算字符串的字符数 | 	// 计算字符串的字符数 | ||||||
| @@ -34,13 +56,13 @@ func PrintHead(language string, width int, ecsVersion string) { | |||||||
| 	if language == "zh" { | 	if language == "zh" { | ||||||
| 		PrintCenteredTitle("VPS融合怪测试", width) | 		PrintCenteredTitle("VPS融合怪测试", width) | ||||||
| 		fmt.Printf("版本:%s\n", ecsVersion) | 		fmt.Printf("版本:%s\n", ecsVersion) | ||||||
| 		fmt.Println("测评频道: https://t.me/vps_reviews\n" + | 		fmt.Println("测评频道: https://t.me/+UHVoo2U4VyA5NTQ1\n" + | ||||||
| 			"Go项目地址:https://github.com/oneclickvirt/ecs\n" + | 			"Go项目地址:https://github.com/oneclickvirt/ecs\n" + | ||||||
| 			"Shell项目地址:https://github.com/spiritLHLS/ecs") | 			"Shell项目地址:https://github.com/spiritLHLS/ecs") | ||||||
| 	} else { | 	} else { | ||||||
| 		PrintCenteredTitle("VPS Fusion Monster Test", width) | 		PrintCenteredTitle("VPS Fusion Monster Test", width) | ||||||
| 		fmt.Printf("Version: %s\n", ecsVersion) | 		fmt.Printf("Version: %s\n", ecsVersion) | ||||||
| 		fmt.Println("Review Channel: https://t.me/vps_reviews\n" + | 		fmt.Println("Review Channel: https://t.me/+UHVoo2U4VyA5NTQ1\n" + | ||||||
| 			"Go Project: https://github.com/oneclickvirt/ecs\n" + | 			"Go Project: https://github.com/oneclickvirt/ecs\n" + | ||||||
| 			"Shell Project: https://github.com/spiritLHLS/ecs") | 			"Shell Project: https://github.com/spiritLHLS/ecs") | ||||||
| 	} | 	} | ||||||
| @@ -94,18 +116,38 @@ func CheckChina(enableLogger bool) bool { | |||||||
| 	return selectChina | 	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 执行安全检查 | // BasicsAndSecurityCheck 执行安全检查 | ||||||
| func BasicsAndSecurityCheck(language, nt3CheckType string, securtyCheckStatus bool) (string, string, string) { | func BasicsAndSecurityCheck(language, nt3CheckType string, securityCheckStatus bool) (string, string, string, string, string) { | ||||||
| 	var wgt sync.WaitGroup | 	var wgt sync.WaitGroup | ||||||
| 	var ipInfo, securityInfo, systemInfo string | 	var ipv4, ipv6, ipInfo, securityInfo, systemInfo string | ||||||
| 	var err error |  | ||||||
| 	wgt.Add(1) | 	wgt.Add(1) | ||||||
| 	go func() { | 	go func() { | ||||||
| 		defer wgt.Done() | 		defer wgt.Done() | ||||||
| 		ipInfo, securityInfo, err = network.NetworkCheck("both", securtyCheckStatus, language) | 		ipv4, ipv6, ipInfo, securityInfo, _ = network.NetworkCheck("both", securityCheckStatus, language) | ||||||
| 		if err != nil { | 		// if err != nil { | ||||||
| 			fmt.Println(err.Error()) | 		// 	fmt.Println(err.Error()) | ||||||
| 		} | 		// } | ||||||
| 	}() | 	}() | ||||||
| 	wgt.Add(1) | 	wgt.Add(1) | ||||||
| 	go func() { | 	go func() { | ||||||
| @@ -114,19 +156,19 @@ func BasicsAndSecurityCheck(language, nt3CheckType string, securtyCheckStatus bo | |||||||
| 	}() | 	}() | ||||||
| 	wgt.Wait() | 	wgt.Wait() | ||||||
| 	basicInfo := systemInfo + ipInfo | 	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.IPV4 = true | ||||||
| 		uts.IPV6 = true | 		uts.IPV6 = true | ||||||
| 		if nt3CheckType == "" { | 		if nt3CheckType == "" { | ||||||
| 			nt3CheckType = "ipv4" | 			nt3CheckType = "ipv4" | ||||||
| 		} | 		} | ||||||
| 	} else if strings.Contains(ipInfo, "IPV4") { | 	} else if strings.Contains(ipInfo, "IPV4") && ipv4 != "" { | ||||||
| 		uts.IPV4 = true | 		uts.IPV4 = true | ||||||
| 		uts.IPV6 = false | 		uts.IPV6 = false | ||||||
| 		if nt3CheckType == "" { | 		if nt3CheckType == "" { | ||||||
| 			nt3CheckType = "ipv4" | 			nt3CheckType = "ipv4" | ||||||
| 		} | 		} | ||||||
| 	} else if strings.Contains(ipInfo, "IPV6") { | 	} else if strings.Contains(ipInfo, "IPV6") && ipv6 != "" { | ||||||
| 		uts.IPV6 = true | 		uts.IPV6 = true | ||||||
| 		uts.IPV4 = false | 		uts.IPV4 = false | ||||||
| 		if nt3CheckType == "" { | 		if nt3CheckType == "" { | ||||||
| @@ -139,7 +181,7 @@ func BasicsAndSecurityCheck(language, nt3CheckType string, securtyCheckStatus bo | |||||||
| 		nt3CheckType = "ipv4" | 		nt3CheckType = "ipv4" | ||||||
| 	} | 	} | ||||||
| 	basicInfo = strings.ReplaceAll(basicInfo, "\n\n", "\n") | 	basicInfo = strings.ReplaceAll(basicInfo, "\n\n", "\n") | ||||||
| 	return basicInfo, securityInfo, nt3CheckType | 	return ipv4, ipv6, basicInfo, securityInfo, nt3CheckType | ||||||
| } | } | ||||||
|  |  | ||||||
| // CaptureOutput 捕获函数输出和错误输出,实时输出,并返回字符串 | // CaptureOutput 捕获函数输出和错误输出,实时输出,并返回字符串 | ||||||
| @@ -330,3 +372,233 @@ func ProcessAndUpload(output string, filePath string, enableUplaod bool) (string | |||||||
| 	} | 	} | ||||||
| 	return "", "" | 	return "", "" | ||||||
| } | } | ||||||
|  |  | ||||||
|  | var StackType string | ||||||
|  |  | ||||||
|  | type NetCheckResult struct { | ||||||
|  | 	HasIPv4   bool | ||||||
|  | 	HasIPv6   bool | ||||||
|  | 	Connected bool | ||||||
|  | 	StackType string // "IPv4", "IPv6", "DualStack", "None" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func makeResolver(proto, dnsAddr string) *net.Resolver { | ||||||
|  | 	return &net.Resolver{ | ||||||
|  | 		PreferGo: true, | ||||||
|  | 		Dial: func(ctx context.Context, network, address string) (net.Conn, error) { | ||||||
|  | 			d := net.Dialer{ | ||||||
|  | 				Timeout: 5 * time.Second, | ||||||
|  | 			} | ||||||
|  | 			return d.DialContext(ctx, proto, dnsAddr) | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 前置联网能力检测 | ||||||
|  | func CheckPublicAccess(timeout time.Duration) NetCheckResult { | ||||||
|  | 	if timeout < 2*time.Second { | ||||||
|  | 		timeout = 2 * time.Second | ||||||
|  | 	} | ||||||
|  | 	var wg sync.WaitGroup | ||||||
|  | 	resultChan := make(chan string, 8) | ||||||
|  | 	ctx, cancel := context.WithTimeout(context.Background(), timeout) | ||||||
|  | 	defer cancel() | ||||||
|  | 	checks := []struct { | ||||||
|  | 		Tag  string | ||||||
|  | 		Addr string | ||||||
|  | 		Kind string // udp4, udp6, http4, http6 | ||||||
|  | 	}{ | ||||||
|  | 		// UDP DNS | ||||||
|  | 		{"IPv4", "223.5.5.5:53", "udp4"},              // 阿里 DNS | ||||||
|  | 		{"IPv4", "8.8.8.8:53", "udp4"},                // Google DNS | ||||||
|  | 		{"IPv6", "[2400:3200::1]:53", "udp6"},         // 阿里 IPv6 DNS | ||||||
|  | 		{"IPv6", "[2001:4860:4860::8888]:53", "udp6"}, // Google IPv6 DNS | ||||||
|  | 		// HTTP HEAD | ||||||
|  | 		{"IPv4", "https://www.baidu.com", "http4"},     // 百度 | ||||||
|  | 		{"IPv4", "https://1.1.1.1", "http4"},           // Cloudflare | ||||||
|  | 		{"IPv6", "https://[2400:3200::1]", "http6"},    // 阿里 IPv6 | ||||||
|  | 		{"IPv6", "https://[2606:4700::1111]", "http6"}, // Cloudflare IPv6 | ||||||
|  | 	} | ||||||
|  | 	for _, check := range checks { | ||||||
|  | 		wg.Add(1) | ||||||
|  | 		go func(tag, addr, kind string) { | ||||||
|  | 			defer wg.Done() | ||||||
|  | 			defer func() { | ||||||
|  | 				if r := recover(); r != nil { | ||||||
|  | 				} | ||||||
|  | 			}() | ||||||
|  | 			switch kind { | ||||||
|  | 			case "udp4", "udp6": | ||||||
|  | 				dialer := &net.Dialer{ | ||||||
|  | 					Timeout: timeout / 4, | ||||||
|  | 				} | ||||||
|  | 				conn, err := dialer.DialContext(ctx, kind, addr) | ||||||
|  | 				if err == nil && conn != nil { | ||||||
|  | 					conn.Close() | ||||||
|  | 					select { | ||||||
|  | 					case resultChan <- tag: | ||||||
|  | 					case <-ctx.Done(): | ||||||
|  | 						return | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			case "http4", "http6": | ||||||
|  | 				var resolver *net.Resolver | ||||||
|  | 				if kind == "http4" { | ||||||
|  | 					resolver = makeResolver("udp4", "223.5.5.5:53") | ||||||
|  | 				} else { | ||||||
|  | 					resolver = makeResolver("udp6", "[2400:3200::1]:53") | ||||||
|  | 				} | ||||||
|  | 				dialer := &net.Dialer{ | ||||||
|  | 					Timeout:  timeout / 4, | ||||||
|  | 					Resolver: resolver, | ||||||
|  | 				} | ||||||
|  | 				transport := &http.Transport{ | ||||||
|  | 					DialContext:           dialer.DialContext, | ||||||
|  | 					MaxIdleConns:          1, | ||||||
|  | 					MaxIdleConnsPerHost:   1, | ||||||
|  | 					IdleConnTimeout:       time.Second, | ||||||
|  | 					TLSHandshakeTimeout:   timeout / 4, | ||||||
|  | 					ResponseHeaderTimeout: timeout / 4, | ||||||
|  | 					DisableKeepAlives:     true, | ||||||
|  | 				} | ||||||
|  | 				client := &http.Client{ | ||||||
|  | 					Timeout:   timeout / 4, | ||||||
|  | 					Transport: transport, | ||||||
|  | 					CheckRedirect: func(req *http.Request, via []*http.Request) error { | ||||||
|  | 						return http.ErrUseLastResponse | ||||||
|  | 					}, | ||||||
|  | 				} | ||||||
|  | 				req, err := http.NewRequestWithContext(ctx, "HEAD", addr, nil) | ||||||
|  | 				if err != nil { | ||||||
|  | 					return | ||||||
|  | 				} | ||||||
|  | 				resp, err := client.Do(req) | ||||||
|  | 				if err == nil && resp != nil { | ||||||
|  | 					if resp.Body != nil { | ||||||
|  | 						resp.Body.Close() | ||||||
|  | 					} | ||||||
|  | 					if resp.StatusCode < 500 { | ||||||
|  | 						select { | ||||||
|  | 						case resultChan <- tag: | ||||||
|  | 						case <-ctx.Done(): | ||||||
|  | 							return | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}(check.Tag, check.Addr, check.Kind) | ||||||
|  | 	} | ||||||
|  | 	go func() { | ||||||
|  | 		wg.Wait() | ||||||
|  | 		close(resultChan) | ||||||
|  | 	}() | ||||||
|  | 	hasV4 := false | ||||||
|  | 	hasV6 := false | ||||||
|  | 	for { | ||||||
|  | 		select { | ||||||
|  | 		case res, ok := <-resultChan: | ||||||
|  | 			if !ok { | ||||||
|  | 				goto result | ||||||
|  | 			} | ||||||
|  | 			if res == "IPv4" { | ||||||
|  | 				hasV4 = true | ||||||
|  | 			} | ||||||
|  | 			if res == "IPv6" { | ||||||
|  | 				hasV6 = true | ||||||
|  | 			} | ||||||
|  | 		case <-ctx.Done(): | ||||||
|  | 			goto result | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | result: | ||||||
|  | 	stack := "None" | ||||||
|  | 	if hasV4 && hasV6 { | ||||||
|  | 		stack = "DualStack" | ||||||
|  | 	} else if hasV4 { | ||||||
|  | 		stack = "IPv4" | ||||||
|  | 	} else if hasV6 { | ||||||
|  | 		stack = "IPv6" | ||||||
|  | 	} | ||||||
|  | 	StackType = stack | ||||||
|  | 	butils.CheckPublicAccess(3 * time.Second) // 设置basics检测,避免部分测试未启用 | ||||||
|  | 	return NetCheckResult{ | ||||||
|  | 		HasIPv4:   hasV4, | ||||||
|  | 		HasIPv6:   hasV6, | ||||||
|  | 		Connected: hasV4 || hasV6, | ||||||
|  | 		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 | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								utils/utils_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								utils/utils_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | package utils | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"testing" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // 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 { | ||||||
|  | 		fmt.Printf("✅ 本机有公网连接,类型: %s\n", result.StackType) | ||||||
|  | 	} 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