-
Notifications
You must be signed in to change notification settings - Fork 149
Expand file tree
/
Copy pathgoecs.sh
More file actions
814 lines (784 loc) · 30.3 KB
/
Copy pathgoecs.sh
File metadata and controls
814 lines (784 loc) · 30.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
#!/bin/sh
# From https://github.com/oneclickvirt/ecs
# 2026.05.27
# curl -L https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh -o goecs.sh && chmod +x goecs.sh
# 或
# curl -L https://cnb.cool/oneclickvirt/ecs/-/git/raw/main/goecs.sh -o goecs.sh && chmod +x goecs.sh
cat <<"EOF"
,ad8888ba, ,ad8888ba, 88888888888 ,ad8888ba, ad88888ba
d8"' `"8b d8"' `"8b 88 d8"' `"8b d8" "8b
d8' d8' `8b 88 d8' Y8a
88 88 88 88aaaaa 88 `"Y8aaaaa,
88 88888 88 88 88""""" 88 `"""""8b,
Y8, 88 Y8, ,8P 88 Y8, `8b
Y8a. .a88 Y8a. .a8P 88 Y8a. .a8P Y8a a8P
`"Y88888P" `"Y8888Y"' 88888888888 `"Y8888Y"' "Y88888P"
EOF
cd /root >/dev/null 2>&1
if [ ! -d "/usr/bin/" ]; then
mkdir -p "/usr/bin/"
fi
_red() { printf "\033[31m\033[01m%s\033[0m\n" "$*"; }
_green() { printf "\033[32m\033[01m%s\033[0m\n" "$*"; }
_yellow() { printf "\033[33m\033[01m%s\033[0m\n" "$*"; }
_blue() { printf "\033[36m\033[01m%s\033[0m\n" "$*"; }
reading() {
printf "\033[32m\033[01m%s\033[0m" "$1"
read "$2"
}
# curl can bootstrap Cloudflare DoH with fixed public addresses, so downloads
# still work when the host is online but has no usable local DNS resolver.
DOH_URL="https://cloudflare-dns.com/dns-query"
DOH_RESOLVE="cloudflare-dns.com:443:1.1.1.1,1.0.0.1"
curl_supports_doh() {
command -v curl >/dev/null 2>&1 && curl --help all 2>/dev/null | grep -q -- "--doh-url"
}
# A single failed download does not prove DNS is missing: CDN, TLS, HTTP, and
# routing failures must retain their original behavior. curl exit code 6 is the
# only DNS-specific signal considered here, and it must recur against the known
# bootstrap hostname before a process-local DoH retry is allowed.
system_dns_stably_unavailable() {
local attempt=1
local probe_status
if command -v getent >/dev/null 2>&1 && getent ahosts cloudflare-dns.com >/dev/null 2>&1; then
return 1
fi
while [ "$attempt" -le 2 ]; do
curl -sS --head --connect-timeout 2 --max-time 4 "$DOH_URL" >/dev/null 2>&1
probe_status=$?
if [ "$probe_status" -ne 6 ]; then
return 1
fi
attempt=$((attempt + 1))
if [ "$attempt" -le 2 ]; then
sleep 1
fi
done
return 0
}
curl_fetch() {
curl "$@"
local curl_status=$?
if [ "$curl_status" -eq 0 ]; then
return 0
fi
if [ "$curl_status" -eq 6 ] && curl_supports_doh && system_dns_stably_unavailable; then
curl --doh-url "$DOH_URL" --resolve "$DOH_RESOLVE" "$@"
return $?
fi
return "$curl_status"
}
# Unified HTTP GET to stdout. Use ordinary curl first; only a repeatedly
# confirmed resolver failure may use the fixed-address DoH bootstrap.
# wget remains available.
# Usage: http_fetch URL [timeout_seconds]
http_fetch() {
local url="$1"
local timeout="${2:-10}"
if command -v curl >/dev/null 2>&1; then
curl_fetch -sL --max-time "$timeout" "$url" 2>/dev/null
elif command -v wget >/dev/null 2>&1; then
wget -qO- --timeout="$timeout" "$url" 2>/dev/null
else
_red "No download tool available (curl/wget) / 无可用下载工具 (curl/wget)"
return 1
fi
}
# Ensure at least one of curl/wget is available; try to install if missing
check_download_tools() {
if command -v curl >/dev/null 2>&1 || command -v wget >/dev/null 2>&1; then
return 0
fi
_yellow "Neither curl nor wget found, attempting to install curl..."
_yellow "未检测到 curl 或 wget,尝试安装 curl..."
local _icmd=""
if command -v apt-get >/dev/null 2>&1; then _icmd="apt-get -y install"
elif command -v yum >/dev/null 2>&1; then _icmd="yum -y install"
elif command -v dnf >/dev/null 2>&1; then _icmd="dnf -y install"
elif command -v pacman >/dev/null 2>&1; then _icmd="pacman -S --noconfirm"
elif command -v apk >/dev/null 2>&1; then _icmd="apk add"
elif command -v zypper >/dev/null 2>&1; then _icmd="zypper install -y"
fi
if [ -n "$_icmd" ]; then
if ${_icmd} curl 2>/dev/null && command -v curl >/dev/null 2>&1; then
_green "curl installed successfully / curl 安装成功"
return 0
fi
_yellow "curl installation failed, trying wget... / curl 安装失败,尝试安装 wget..."
if ${_icmd} wget 2>/dev/null && command -v wget >/dev/null 2>&1; then
_green "wget installed successfully / wget 安装成功"
return 0
fi
fi
_red "Failed to install curl or wget. Cannot proceed."
_red "curl 和 wget 均安装失败,无法继续执行。"
return 1
}
check_cdn() {
local o_url="$1"
local cdn_url
for cdn_url in $cdn_urls; do
if command -v curl >/dev/null 2>&1; then
if curl_fetch -4 -sL -k "$cdn_url$o_url" --max-time 6 2>/dev/null | grep -q "success"; then
cdn_success_url="$cdn_url"
return 0
fi
elif command -v wget >/dev/null 2>&1; then
if wget -4 -qO- --no-check-certificate --timeout=6 "$cdn_url$o_url" 2>/dev/null | grep -q "success"; then
cdn_success_url="$cdn_url"
return 0
fi
fi
sleep 0.5
done
cdn_success_url=""
return 1
}
check_cdn_file() {
check_cdn "https://raw.githubusercontent.com/spiritLHLS/ecs/main/back/test"
if [ -n "$cdn_success_url" ]; then
_green "CDN available, using CDN"
else
_yellow "No CDN available, no use CDN"
fi
}
download_file() {
local url="$1"
local output="$2"
if ! check_download_tools; then
return 1
fi
if command -v wget >/dev/null 2>&1; then
if wget -O "$output" "$url" 2>/dev/null; then
return 0
fi
_yellow "wget failed, falling back to curl... / wget 失败,回退到 curl..."
fi
if command -v curl >/dev/null 2>&1; then
if curl_fetch -L -o "$output" "$url" 2>/dev/null; then
return 0
fi
_yellow "curl failed / curl 失败"
fi
_red "Both wget and curl failed. Unable to download the file."
_red "wget 和 curl 均失败,无法下载文件。"
return 1
}
check_china() {
_yellow "Detecting IP region......"
if [ -z "${CN}" ]; then
if http_fetch "https://ipapi.co/json" 6 | grep -q 'China'; then
_yellow "According to ipapi.co, this IP may be located in China"
if [ "$noninteractive" != "true" ]; then
reading "Use China mirror for installation? ([y]/n) " input
case $input in
[yY][eE][sS] | [yY] | "")
_green "China mirror selected"
CN=true
;;
[nN][oO] | [nN])
_yellow "China mirror not selected"
CN=false
;;
*)
_green "China mirror selected"
CN=true
;;
esac
else
# In non-interactive mode, default to not using China mirror
CN=false
fi
else
CN=false
fi
fi
}
get_memory_size() {
if [ -f /proc/meminfo ]; then
local mem_kb
mem_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
echo $((mem_kb / 1024)) # Convert to MB
return 0
fi
if command -v free >/dev/null 2>&1; then
local mem_kb
mem_kb=$(free -m | awk '/^Mem:/ {print $2}')
echo "$mem_kb" # Already in MB
return 0
fi
if command -v sysctl >/dev/null 2>&1; then
local mem_bytes
mem_bytes=$(sysctl -n hw.memsize 2>/dev/null || sysctl -n hw.physmem 2>/dev/null)
if [ -n "$mem_bytes" ]; then
echo $((mem_bytes / 1024 / 1024)) # Convert to MB
return 0
fi
fi
echo 0
return 1
}
cleanup_epel() {
_yellow "Cleaning up EPEL repositories..."
rm -f /etc/yum.repos.d/*epel*
yum clean all >/dev/null 2>&1
}
goecs_check() {
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 / 安装 unzip"
${INSTALL_CMD} unzip
fi
if ! check_download_tools; then
return 1
fi
os=$(uname -s 2>/dev/null || echo "Unknown")
arch=$(uname -m 2>/dev/null || echo "Unknown")
check_china
ECS_VERSION="0.1.198"
for api in \
"https://api.github.com/repos/oneclickvirt/ecs/releases/latest" \
"https://githubapi.spiritlhl.workers.dev/repos/oneclickvirt/ecs/releases/latest" \
"https://githubapi.spiritlhl.top/repos/oneclickvirt/ecs/releases/latest"; do
ECS_VERSION=$(http_fetch "$api" 6 | awk -F '"' '/tag_name/{gsub(/^v/,"",$4); print $4}')
if [ -n "$ECS_VERSION" ]; then
break
fi
sleep 1
done
if [ -z "$ECS_VERSION" ]; then
_yellow "Unable to get version info, using default version 0.1.198"
ECS_VERSION="0.1.198"
fi
version_output=""
for cmd_path in "goecs" "./goecs" "/usr/bin/goecs" "/usr/local/bin/goecs"; do
if command -v "$cmd_path" >/dev/null 2>&1; then
version_output=$($cmd_path -v command 2>/dev/null)
break
fi
done
if [ -n "$version_output" ]; then
extracted_version=${version_output#*v}
extracted_version=${extracted_version#v}
if [ -n "$extracted_version" ]; then
ecs_version=$ECS_VERSION
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"
return 0
else
_yellow "goecs version ($extracted_version) < $ecs_version, upgrade needed, starting in 5 seconds"
rm -rf /usr/bin/goecs /usr/local/bin/goecs ./goecs
fi
fi
else
_green "goecs not found, installation needed, starting in 5 seconds"
fi
sleep 5
if [ "$CN" = "true" ]; then
_yellow "Using China mirror for download..."
base_url="https://cnb.cool/oneclickvirt/ecs/-/git/raw/main"
else
cdn_urls="https://cdn0.spiritlhl.top/ http://cdn3.spiritlhl.net/ http://cdn1.spiritlhl.net/ http://cdn2.spiritlhl.net/"
check_cdn_file
if [ -n "$cdn_success_url" ]; then
base_url="${cdn_success_url}https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}"
else
base_url="https://github.com/oneclickvirt/ecs/releases/download/v${ECS_VERSION}"
fi
fi
local zip_file=""
case $os in
Linux|linux|LINUX)
case $arch in
x86_64|amd64|x64) zip_file="goecs_linux_amd64.zip" ;;
i386|i686) zip_file="goecs_linux_386.zip" ;;
aarch64|arm64|armv8|armv8l) zip_file="goecs_linux_arm64.zip" ;;
arm|armv7l) zip_file="goecs_linux_arm.zip" ;;
mips) zip_file="goecs_linux_mips.zip" ;;
mipsle) zip_file="goecs_linux_mipsle.zip" ;;
s390x) zip_file="goecs_linux_s390x.zip" ;;
riscv64) zip_file="goecs_linux_riscv64.zip" ;;
*) zip_file="goecs_linux_amd64.zip" ;;
esac
;;
FreeBSD|freebsd)
case $arch in
x86_64|amd64) zip_file="goecs_freebsd_amd64.zip" ;;
i386|i686) zip_file="goecs_freebsd_386.zip" ;;
arm64|aarch64) zip_file="goecs_freebsd_arm64.zip" ;;
*) zip_file="goecs_freebsd_amd64.zip" ;;
esac
;;
Darwin|darwin)
case $arch in
x86_64|amd64) zip_file="goecs_darwin_amd64.zip" ;;
arm64|aarch64) zip_file="goecs_darwin_arm64.zip" ;;
*) zip_file="goecs_darwin_amd64.zip" ;;
esac
;;
*)
_yellow "Unknown system $os, trying amd64 version"
zip_file="goecs_linux_amd64.zip"
;;
esac
download_url="${base_url}/${zip_file}"
_green "Downloading $download_url"
local max_retries=3
local retry_count=0
while [ $retry_count -lt $max_retries ]; do
if download_file "$download_url" "goecs.zip"; then
break
fi
_yellow "Download failed, retrying (${retry_count}/${max_retries})..."
retry_count=$((retry_count + 1))
sleep 2
done
if [ $retry_count -eq $max_retries ]; then
_red "Download failed, please check your network connection or download manually"
return 1
fi
if ! unzip -o goecs.zip >/dev/null 2>&1; then
_red "Extraction failed"
return 1
fi
rm -f goecs.zip README.md LICENSE README_EN.md
chmod 777 goecs
installed_to_system=false
for install_path in "/usr/bin" "/usr/local/bin"; do
if [ -d "$install_path" ]; then
if cp -f goecs "$install_path/" 2>/dev/null; then
installed_to_system=true
break
fi
fi
done
if [ "$installed_to_system" = "false" ]; then
_yellow "Insufficient permissions to install to system path, goecs is kept in the current directory"
_yellow "Please use the following command to run: ./goecs"
fi
if [ "$os" != "Darwin" ]; then
PARAM="net.ipv4.ping_group_range"
NEW_VALUE="0 2147483647"
if [ -f /etc/sysctl.conf ]; then
if grep -q "^$PARAM" /etc/sysctl.conf 2>/dev/null; then
sed -i "s/^$PARAM.*/$PARAM = $NEW_VALUE/" /etc/sysctl.conf 2>/dev/null || true
else
echo "$PARAM = $NEW_VALUE" >> /etc/sysctl.conf 2>/dev/null || true
fi
sysctl -p >/dev/null 2>&1 || true
fi
fi
setcap cap_net_raw=+ep goecs 2>/dev/null || true
setcap cap_net_raw=+ep /usr/bin/goecs 2>/dev/null || true
setcap cap_net_raw=+ep /usr/local/bin/goecs 2>/dev/null || true
_green "goecs installation complete, current version:"
goecs -v 2>/dev/null || ./goecs -v
}
InstallSysbench() {
if [ -f "/etc/opencloudos-release" ]; then # OpenCloudOS
Var_OSRelease="opencloudos"
elif [ -f "/etc/centos-release" ]; then # CentOS
Var_OSRelease="centos"
elif [ -f "/etc/fedora-release" ]; then # Fedora
Var_OSRelease="fedora"
elif [ -f "/etc/redhat-release" ]; then # RedHat
Var_OSRelease="rhel"
elif [ -f "/etc/astra_version" ]; then # Astra
Var_OSRelease="astra"
elif [ -f "/etc/lsb-release" ]; then # Ubuntu
Var_OSRelease="ubuntu"
elif [ -f "/etc/debian_version" ]; then # Debian
Var_OSRelease="debian"
elif [ -f "/etc/alpine-release" ]; then # Alpine Linux
Var_OSRelease="alpinelinux"
elif [ -f "/etc/almalinux-release" ]; then # almalinux
Var_OSRelease="almalinux"
elif [ -f "/etc/arch-release" ]; then # archlinux
Var_OSRelease="arch"
elif [ -f "/etc/freebsd-update.conf" ]; then # freebsd
Var_OSRelease="freebsd"
else
Var_OSRelease="unknown" # 未知系统分支
fi
local mem_size
mem_size=$(get_memory_size)
if [ -z "$mem_size" ] || [ "$mem_size" -eq 0 ]; then
echo "Error: Unable to determine memory size or memory size is zero."
elif [ "$mem_size" -lt 1024 ]; then
_red "Warning: Your system has less than 1GB RAM (${mem_size}MB)"
if [ "$noninteractive" != "true" ]; then
reading "Do you want to continue with EPEL installation? (y/N): " confirm
case "$confirm" in
[Yy]*)
;;
*)
_yellow "Skipping EPEL installation"
return 1
;;
esac
fi
case "$Var_OSRelease" in
ubuntu | debian | astra)
if ! apt-get install -y sysbench; then
apt-get --fix-broken install -y
apt-get install --no-install-recommends -y sysbench
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 ;;
arch)
pacman -S --needed --noconfirm sysbench
pacman -S --needed --noconfirm libaio
ldconfig
;;
freebsd)
pkg install -y sysbench ;;
alpinelinux)
if [ "$noninteractive" != "true" ]; then
reading "Do you want to continue with sysbench installation? (y/N): " confirm
case "$confirm" in
[Yy]*)
;;
*)
_yellow "Skipping sysbench installation"
return 1
;;
esac
fi
ALPINE_VERSION=$(grep -o '^[0-9]\+\.[0-9]\+' /etc/alpine-release)
COMMUNITY_REPO="http://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/community"
if ! grep -q "^${COMMUNITY_REPO}" /etc/apk/repositories; then
echo "Enabling community repository..."
echo "${COMMUNITY_REPO}" >> /etc/apk/repositories
echo "Community repository has been added."
echo "Updating apk package index..."
apk update && echo "Package index updated successfully."
else
echo "Community repository is already enabled."
fi
if apk info sysbench >/dev/null 2>&1; then
echo "Sysbench already installed."
else
if ! apk add --no-cache sysbench; then
echo "Sysbench Module not found, installing ..."
echo "SysBench Current not support Alpine Linux, Skipping..."
Var_Skip_SysBench="1"
else
echo "Sysbench installed successfully."
fi
fi
;;
*)
_red "Sysbench Install Error: Unknown OS release: $Var_OSRelease" ;;
esac
case "$SYSTEM" in
CentOS|RHEL|AlmaLinux)
_yellow "Installing EPEL repository..."
if ! yum -y install epel-release; then
_red "EPEL installation failed!"
cleanup_epel
_yellow "Attempting to continue without EPEL..."
fi
;;
esac
fi
}
env_check() {
# 检测是否为 macOS 系统
if [ "$(uname -s)" = "Darwin" ]; then
_green "Detected macOS system"
_green "macOS has built-in tools, skipping dependency installation"
_green "Environment preparation complete."
_green "Next command is: ./goecs.sh install"
return 0
fi
if [ -f /etc/opencloudos-release ]; then
SYS="opencloudos"
elif [ -s /etc/os-release ]; then
SYS="$(grep -i pretty_name /etc/os-release | cut -d \" -f2)"
elif command -v hostnamectl >/dev/null 2>&1; then
SYS="$(hostnamectl | grep -i system | cut -d : -f2 | sed 's/^ *//')"
elif command -v lsb_release >/dev/null 2>&1; then
SYS="$(lsb_release -sd)"
elif [ -s /etc/lsb-release ]; then
SYS="$(grep -i description /etc/lsb-release | cut -d \" -f2)"
elif [ -s /etc/redhat-release ]; then
SYS="$(cat /etc/redhat-release)"
elif [ -s /etc/issue ]; then
SYS="$(head -n1 /etc/issue | cut -d '\' -f1 | sed '/^[ ]*$/d')"
else
SYS="$(uname -s)"
fi
SYSTEM=""
sys_lower=$(echo "$SYS" | tr '[:upper:]' '[:lower:]')
if echo "$sys_lower" | grep -E "debian|astra" >/dev/null 2>&1; then
SYSTEM="Debian"
UPDATE_CMD="apt-get update"
INSTALL_CMD="apt-get -y install"
REMOVE_CMD="apt-get -y remove"
UNINSTALL_CMD="apt-get -y autoremove"
elif echo "$sys_lower" | grep -E "ubuntu" >/dev/null 2>&1; then
SYSTEM="Ubuntu"
UPDATE_CMD="apt-get update"
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
_yellow "Unable to recognize system, trying common package managers..."
if command -v apt-get >/dev/null 2>&1; then
SYSTEM="Unknown-Debian"
UPDATE_CMD="apt-get update"
INSTALL_CMD="apt-get -y install"
REMOVE_CMD="apt-get -y remove"
UNINSTALL_CMD="apt-get -y autoremove"
elif command -v yum >/dev/null 2>&1; then
SYSTEM="Unknown-RHEL"
UPDATE_CMD="yum -y update"
INSTALL_CMD="yum -y install"
REMOVE_CMD="yum -y remove"
UNINSTALL_CMD="yum -y autoremove"
elif command -v dnf >/dev/null 2>&1; then
SYSTEM="Unknown-Fedora"
UPDATE_CMD="dnf -y update"
INSTALL_CMD="dnf -y install"
REMOVE_CMD="dnf -y remove"
UNINSTALL_CMD="dnf -y autoremove"
elif command -v pacman >/dev/null 2>&1; then
SYSTEM="Unknown-Arch"
UPDATE_CMD="pacman -Sy"
INSTALL_CMD="pacman -S --noconfirm"
REMOVE_CMD="pacman -R --noconfirm"
UNINSTALL_CMD="pacman -Rns --noconfirm"
elif command -v apk >/dev/null 2>&1; then
SYSTEM="Unknown-Alpine"
UPDATE_CMD="apk update"
INSTALL_CMD="apk add"
REMOVE_CMD="apk del"
UNINSTALL_CMD="apk del"
elif command -v zypper >/dev/null 2>&1; then
SYSTEM="Unknown-SLES"
UPDATE_CMD="zypper refresh"
INSTALL_CMD="zypper install -y"
REMOVE_CMD="zypper remove -y"
UNINSTALL_CMD="zypper remove -y"
else
_red "Unable to recognize package manager, exiting installation"
exit 1
fi
fi
_green "System information: $SYSTEM"
_green "Update command: $UPDATE_CMD"
_green "Install command: $INSTALL_CMD"
cdn_urls="https://cdn0.spiritlhl.top/ http://cdn3.spiritlhl.net/ http://cdn1.spiritlhl.net/ http://cdn2.spiritlhl.net/"
check_cdn_file
_yellow "Warning: System update will be performed"
_yellow "This operation may:"
_yellow "1. Take considerable time"
_yellow "2. Cause temporary network interruptions"
_yellow "3. Impact system stability"
_yellow "4. Affect subsequent system startups"
if [ "$noninteractive" != "true" ]; then
reading "Continue with system update? (y/N): " update_confirm
case "$update_confirm" in
[Yy]*)
_green "Updating system package manager..."
if ! ${UPDATE_CMD} 2>/dev/null; then
_red "System update failed!"
fi
;;
*)
_yellow "Skipping system update"
_yellow "Note: Some packages may fail to install"
;;
esac
fi
for cmd in sudo wget tar unzip iproute2 systemd-detect-virt dd fio; do
if ! command -v "$cmd" >/dev/null 2>&1; then
_green "Installing $cmd"
${INSTALL_CMD} "$cmd"
fi
done
if ! command -v sysbench >/dev/null 2>&1; then
_green "Installing sysbench"
if ! ${INSTALL_CMD} sysbench; then
_red "Unable to install sysbench through package manager"
_yellow "Sysbench installation skipped"
fi
fi
if ! command -v geekbench >/dev/null 2>&1; then
_green "Installing geekbench / 安装 geekbench"
if download_file "${cdn_success_url}https://raw.githubusercontent.com/oneclickvirt/cputest/main/dgb.sh" "dgb.sh"; then
chmod +x dgb.sh
sh dgb.sh -v gb6
rm -rf dgb.sh
else
_red "Failed to download geekbench installer / geekbench 安装脚本下载失败"
fi
fi
if ! command -v speedtest >/dev/null 2>&1; then
_green "Installing speedtest / 安装 speedtest"
if download_file "${cdn_success_url}https://raw.githubusercontent.com/oneclickvirt/speedtest/main/dspt.sh" "dspt.sh"; then
chmod +x dspt.sh
sh dspt.sh
rm -rf dspt.sh
rm -rf speedtest.tar.gz
else
_red "Failed to download speedtest installer / speedtest 安装脚本下载失败"
fi
fi
if ! command -v ping >/dev/null 2>&1; then
_green "Installing ping"
${INSTALL_CMD} iputils-ping >/dev/null 2>&1 || ${INSTALL_CMD} ping >/dev/null 2>&1
fi
if ! grep -q "^net.ipv4.ping_group_range = 0 2147483647$" /etc/sysctl.conf 2>/dev/null; then
echo "net.ipv4.ping_group_range = 0 2147483647" >> /etc/sysctl.conf 2>/dev/null
sysctl -p >/dev/null 2>&1
fi
_green "Environment preparation complete."
_green "Next command is: ./goecs.sh install"
}
uninstall_goecs() {
rm -rf /root/goecs
rm -rf /usr/bin/goecs
_green "The command (goecs) has been uninstalled."
}
show_help() {
cat <<"EOF"
可用命令:
./goecs.sh env 检查并安装依赖包
注意: macOS系统会自动跳过依赖安装
警告: 此命令会执行系统更新(可选择),可能:
1. 耗时较长
2. 导致网络短暂中断
3. 影响系统稳定性
4. 影响后续系统启动
对于内存小于1GB的系统,还可能导致:
1. 系统卡死
2. SSH连接中断
3. 关键服务失败
推荐:
环境依赖安装过程中挂起执行
可选组件:
sysbench/geekbench (CPU性能测试)
sudo, tar, unzip, dd, fio
speedtest (网络测试)
ping (网络连通性测试)
systemd-detect-virt/dmidecode (系统信息检测)
./goecs.sh install 安装 goecs 命令
./goecs.sh upgrade 升级 goecs 命令
./goecs.sh uninstall 卸载 goecs 命令
./goecs.sh help 显示此消息
Available commands:
./goecs.sh env Check and Install dependencies
Note: macOS systems will skip dependency installation
Warning: This command performs system update(optional), which may:
1. Take considerable time
2. Cause temporary network interruptions
3. Impact system stability
4. Affect subsequent system startups
For systems with less than 1GB RAM, additional risks:
1. System freeze
2. SSH connection loss
3. Critical service failures
Recommended:
Hanging execution during environment dependency installation
Optional components:
sysbench/geekbench (CPU testing)
sudo, tar, unzip, dd, fio
speedtest (Network testing)
ping (Network connectivity)
systemd-detect-virt/dmidecode (System info detection)
./goecs.sh install Install goecs command
./goecs.sh upgrade Upgrade goecs command
./goecs.sh uninstall Uninstall goecs command
./goecs.sh help Show this message
EOF
}
case "$1" in
"help")
show_help
;;
"env")
env_check
;;
"install" | "upgrade")
goecs_check
;;
"uninstall")
uninstall_goecs
;;
*)
echo "No command found."
echo
show_help
;;
esac