File size: 25,184 Bytes
0e9297b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9bfc889
0e9297b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13a8b8c
0e9297b
13a8b8c
0e9297b
 
 
13a8b8c
0e9297b
13a8b8c
0e9297b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13a8b8c
 
0e9297b
13a8b8c
 
 
 
 
 
 
0e9297b
13a8b8c
 
 
 
 
 
 
0e9297b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
LANG=en_US.UTF-8

STRIPE_LINE="----------------------------------------------------"
DOUBLE_STRIPE_LINE="============================================"

HTTP_STR="http"

XP_VERSION="v1.1.12"

API_HOST="https://api.xp.cn"
DL_HOST="https://dl.xp.cn"

current_dir=$(pwd)
INSTALL_LOG_PATH="${current_dir}/xp-install.log"

start_time=`date +%s`

IDC_CODE=""

if [ $(whoami) != "root" ];then
    echo "xp面板安装命令需要root权限执行"
    exit 1;
fi

is64bit=$(getconf LONG_BIT)
if [ "${is64bit}" != '64' ];then
    echo "xp面板仅支持64位系统安装";
fi

arch_check=$(uname -m)
if [ "${arch_check}" != "x86_64" ] && [ "${arch_check}" != "amd64" ]; then
    echo "xp面板仅支持x86_64或者amd64架构CPU的系统安装";
fi

# Centos6不支持安装
centos6_check=$(cat /etc/redhat-release | grep ' 6.' | grep -iE 'centos|Red Hat')
if [ "${centos6_check}" ];then
    echo "xp面板不支持Centos6,请更换Centos7/8或更高版本的系统"
    exit 1
fi

# ubuntu16以下不支持安装
ubuntu_check=$(cat /etc/issue|grep Ubuntu|awk '{print $2}'|cut -f 1 -d '.')
if [ "${ubuntu_check}" ] && [ "${ubuntu_check}" -lt "16" ];then
    echo "xp面板不支持Ubuntu ${ubuntu_check},请更换Ubuntu18/20或更高版本的系统"
    exit 1
fi

hostname_check=$(cat /etc/hostname)
if [ -z "${hostname_check}" ];then
    echo "无法安装xp面板,因为当前主机名hostname为空,请设置hostname后重新安装"
    exit 1
fi

Get_LocalInfo(){
    if [ -s "/etc/redhat-release" ];then
        SYS_VERSION=$(cat /etc/redhat-release | sed 's/\\n//g' | sed 's/\\l//g')
    elif [ -s "/etc/issue" ]; then
        SYS_VERSION=$(cat /etc/issue | sed 's/\\n//g' | sed 's/\\l//g' | tr -d '\n' | tr -d '\n')
    fi
    SYS_INFO=$(uname -a)
    SYS_BIT=$(getconf LONG_BIT)
    MEM_TOTAL=$(free -m|grep Mem|awk '{print $2}')
    CPU_INFO=$(getconf _NPROCESSORS_ONLN)
    DISK_USE=$(df -h / | tail -n 1 | awk '{printf "size:%s;used:%s;avil:%s;percent:%s", $2, $3, $4, $5}')
}

cd ~
SETUP_PATH="/xp"

Get_Sysinfo(){
    Get_LocalInfo
    
    echo -e ${SYS_VERSION}
    echo -e Bit:${SYS_BIT} Mem:${MEM_TOTAL}M Core:${CPU_INFO}
    echo -e ${SYS_INFO}
    echo -e "${DOUBLE_STRIPE_LINE}"
    echo -e "请截图以上报错信息发给客服人员"
    echo -e "${DOUBLE_STRIPE_LINE}"
    if [ -f "/usr/bin/qrencode" ];then
        echo -e "微信扫码联系企业微信技术求助"
        echo -e "${DOUBLE_STRIPE_LINE}"
        qrencode -t ANSIUTF8 "https://work.weixin.qq.com/kfid/kfc8e99c5e9fb4761c6"
        echo -e "${DOUBLE_STRIPE_LINE}"
    else
        echo -e "手机访问以下链接、扫码联系企业微信技术求助"
        echo -e "${DOUBLE_STRIPE_LINE}"
        echo -e "联系链接:https://work.weixin.qq.com/kfid/kfc8e99c5e9fb4761c6"
        echo -e "${DOUBLE_STRIPE_LINE}"
    fi
}

Red_Err(){
    echo "${DOUBLE_STRIPE_LINE}";
    printf '\033[1;31;40m%b\033[0m\n' "$@";
    Get_Sysinfo
    Analysis_Log
    exit 1;
}

# 检测是否装了别的环境
Env_Check(){
    mysqld_exists=$(ps -ef |grep mysqld|grep -v grep|grep -v /www/server/mysql)
    php_exists=$(ps -ef|grep php-fpm|grep master|grep -v /www/server/php)
    nginx_exists=$(ps -ef|grep nginx|grep master|grep -v /www/server/nginx)
    httpd_exists=$(ps -ef |grep -E 'httpd|apache'|grep -v /www/server/apache|grep -v grep)
    if [ "${php_exists}" ] || [ "${mysqld_exists}" ] || [ "${nginx_exists}" ] || [ "${httpd_exists}" ];then
        Force_Install_Confirm
    fi
}

# 强制安装确认
Force_Install_Confirm(){
    if [ "${INSTALL_FORCE}" ];then
        return
    fi
    echo -e "${STRIPE_LINE}"
    echo -e "检查已有其他Web/mysql环境,继续安装可能影响现有站点及数据"
    echo -e "Web/mysql service is alreday installed,Can't install panel"
    echo -e "${STRIPE_LINE}"
    echo -e "已知风险/Enter yes to force installation"
    read -p "输入yes强制安装: " yes;
    if [ "$yes" != "yes" ];then
        echo -e "------------"
        echo "取消安装"
        exit;
    fi
    start_time=`date +%s`
    INSTALL_FORCE="true"
}

# 获取包管理器
Get_PM(){
    if [ -f "/usr/bin/yum" ] && [ -d "/etc/yum.repos.d" ]; then
        PM="yum"
        elif [ -f "/usr/bin/apt-get" ] && [ -f "/usr/bin/dpkg" ]; then
        PM="apt-get"
    fi
}

# 自动挂载Swap
Auto_Swap_Mem(){
    MEM_TOTAL=$(free -g|grep Mem|awk '{print $2}')
    if [ "${MEM_TOTAL}" -le "1" ];then
        swap=$(free |grep Swap|awk '{print $2}')
        if [ "${swap}" -gt 1 ];then
            echo "Swap total sizse: $swap";
            return;
        fi
        if [ ! -d /www ];then
            mkdir /www
        fi
        swap_file="/www/swap"
        dd if=/dev/zero of=$swap_file bs=1M count=1025
        mkswap -f $swap_file
        swapon $swap_file
        echo "$swap_file    swap    swap    defaults    0 0" >> /etc/fstab
        swap=`free |grep Swap|awk '{print $2}'`
        if [ $swap -gt 1 ];then
            echo "Swap total sizse: $swap";
            return;
        fi
        
        sed -i "/\/www\/swap/d" /etc/fstab
        rm -f $swap_file
    fi    
}

Add_Service(){
    if [ "${PM}" == "yum" ] || [ "${PM}" == "dnf" ]; then
        chkconfig --add xpd
        chkconfig --level 2345 xpd on
        sudo cp ${SETUP_PATH}/init/xpd.service /usr/lib/systemd/system/xpd.service
        sudo chmod +x /usr/lib/systemd/system/xpd.service
        sudo systemctl enable xpd
    elif [ "${PM}" == "apt-get" ]; then
        sudo update-rc.d xpd defaults
    fi
}

# 设置软件源
Set_Centos_Repo(){
    huawei_check=$(cat /etc/motd |grep "Huawei Cloud")
    if [ "${huawei_check}" ] && [ "${is64bit}" == "64" ];then
        \cp -rpa /etc/yum.repos.d/ /etc/yumBak
        sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*.repo
        sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.epel.cloud|g' /etc/yum.repos.d/CentOS-*.repo
        rm -f /etc/yum.repos.d/epel.repo
        rm -f /etc/yum.repos.d/epel-*
    fi
    aliyun_check=$(cat /etc/motd|grep "Alibaba Cloud ")
    if [  "${aliyun_check}" ] && [ "${is64bit}" == "64" ] && [ ! -f "/etc/yum.repos.d/Centos-vault-8.5.2111.repo" ];then
        rename '.repo' '.repo.bak' /etc/yum.repos.d/*.repo
        wget https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo -O /etc/yum.repos.d/Centos-vault-8.5.2111.repo
        wget https://mirrors.aliyun.com/repo/epel-archive-8.repo -O /etc/yum.repos.d/epel-archive-8.repo
        sed -i 's/mirrors.cloud.aliyuncs.com/url_tmp/g'  /etc/yum.repos.d/Centos-vault-8.5.2111.repo &&  sed -i 's/mirrors.aliyun.com/mirrors.cloud.aliyuncs.com/g' /etc/yum.repos.d/Centos-vault-8.5.2111.repo && sed -i 's/url_tmp/mirrors.aliyun.com/g' /etc/yum.repos.d/Centos-vault-8.5.2111.repo
        sed -i 's/mirrors.aliyun.com/mirrors.cloud.aliyuncs.com/g' /etc/yum.repos.d/epel-archive-8.repo
    fi
    mirror_check=$(cat /etc/yum.repos.d/CentOS-Linux-AppStream.repo |grep "[^#]mirror.centos.org")
    if [ "${mirror_check}" ] && [ "${is64bit}" == "64" ];then
        \cp -rpa /etc/yum.repos.d/ /etc/yumBak
        sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*.repo
        sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.epel.cloud|g' /etc/yum.repos.d/CentOS-*.repo
    fi
}

# 安装rpm的基础包
Install_RPM_Base_Pkg(){
    yum_path=/etc/yum.conf
    centos8_check=$(cat /etc/redhat-release | grep ' 8.' | grep -iE 'centos|Red Hat')
    if [ "${centos8_check}" ];then
        Set_Centos_Repo
    fi
    is_exc=$(cat $yum_path|grep httpd)
    if [ "$is_exc" = "" ];then
        echo "exclude=httpd nginx php mysql mairadb python-psutil python2-psutil" >> $yum_path
    fi
    
    if [ -f "/etc/redhat-release" ] && [ $(cat /etc/os-release|grep PLATFORM_ID|grep -oE "el8") ];then
        yum config-manager --set-enabled powertools
        yum config-manager --set-enabled PowerTools
    fi
    
    if [ -f "/etc/redhat-release" ] && [ $(cat /etc/os-release|grep PLATFORM_ID|grep -oE "el9") ];then
        dnf config-manager --set-enabled crb -y
    fi
    
    # 同步服务器时间
    echo 'Synchronizing system time...'
    get_server_time=$(curl -sS --connect-timeout 3 -m 60 ${API_HOST}/api/getTime)
    if [ "${get_server_time}" ];then
        date -s "$(date -d @$get_server_time +"%Y-%m-%d %H:%M:%S")"
    fi
    
    if [ -z "${centos8_check}" ]; then
        yum install ntp -y
        rm -rf /etc/localtime
        ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
        
        # 尝试同步国际时间(从ntp服务器)
        ntpdate 0.asia.pool.ntp.org
        setenforce 0
    fi
        
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    yum_packs="libcurl-devel wget tar gcc make zip unzip openssl openssl-devel libxml2 libxml2-devel libxslt* zlib zlib-devel libjpeg-devel libpng-devel libwebp libwebp-devel freetype freetype-devel lsof pcre pcre-devel vixie-cron crontabs icu libicu-devel c-ares libffi-devel bzip2-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel qrencode clang libaio ncurses-compat-libs"
    echo "下列软件将被安装:${yum_packs}"
    yum install -y --skip-broken ${yum_packs}
    
    for yum_pack in ${yum_packs}
    do
        rpm_pack=$(rpm -q ${yum_pack})
        pack_check=$(echo ${rpm_pack}|grep not)
        if [ "${pack_check}" ]; then
            yum install ${yum_pack} -y
        fi
    done

    echo "安装必备软件:iptables"
    yum install -y iptables

    if [ -f "/usr/bin/dnf" ]; then
        dnf install -y redhat-rpm-config
    fi
    
    ali_os=$(cat /etc/redhat-release |grep "Alibaba Cloud Linux release 3")
    if [ -z "${ali_os}" ];then
        yum install epel-release -y
    fi
}

# 安装deb基础包
Install_Deb_Base_Pkg(){
    # 如果apt存在锁,则手动删除释放锁文件
    lf_pid=$(sudo lsof /var/lib/dpkg/lock-frontend | awk 'NR==2{print $2}')
    if [ -n "$lf_pid" ]; then
        sudo kill -9 $lf_pid
    fi
    l_pid=$(sudo lsof /var/lib/dpkg/lock | awk 'NR==2{print $2}')
    if [ -n "$l_pid" ]; then
        sudo kill -9 $l_pid
    fi
    
    ln -sf bash /bin/sh
    ubuntu_22=$(cat /etc/issue|grep "Ubuntu 22")
    if [ "${ubuntu_22}" ];then
        apt-get remove needrestart -y
    fi
    aliyun_check=$(cat /etc/motd|grep "Alibaba Cloud ")
    if [ "${aliyun_check}" ] && [ "${ubuntu_22}" ];then
        apt-get remove libicu70 -y
    fi
    apt-get update -y
    apt-get install bash -y
    if [ -f "/usr/bin/bash" ];then
        ln -sf /usr/bin/bash /bin/sh
    fi
    apt-get install ruby -y
    apt-get install lsb-release -y

    libcurl_ver=$(dpkg -l|grep libcurl4|awk '{print $3}')
    if [ "${libcurl_ver}" == "7.68.0-1ubuntu2.8" ];then
        apt-get remove libcurl4 -y
        apt-get install curl -y
    fi

    deb_packs="wget curl libcurl4-openssl-dev gcc make zip unzip tar openssl libssl-dev libxml2 libxml2-dev zlib1g zlib1g-dev libjpeg-dev libpng-dev lsof libpcre3 libpcre3-dev cron net-tools swig build-essential libffi-dev libbz2-dev libncurses-dev libsqlite3-dev iptables libreadline-dev tk-dev libgdbm-dev libdb-dev libdb++-dev libpcap-dev xz-utils git qrencode libwebp-dev libsodium-dev clang libaio1 libncurses5"
    echo "下列软件将被安装:${deb_packs}"
    apt-get install -y -m $deb_packs --force-yes

    for deb_pack in ${deb_packs}
    do
        pack_check=$(dpkg -l|grep ${deb_pack})
        if [ "$?" -ne "0" ] ;then
            apt-get install -y $deb_pack
        fi
    done

    echo "安装必备软件:iptables"
    apt-get install -y iptables

    if [ ! -d '/etc/letsencrypt' ];then
        mkdir -p /etc/letsencryp
        mkdir -p /var/spool/cron
        if [ ! -f '/var/spool/cron/crontabs/root' ];then
            echo '' > /var/spool/cron/crontabs/root
            chmod 600 /var/spool/cron/crontabs/root
        fi
    fi
}

Init_DB(){
    if [ ! -d "${SETUP_PATH}/db" ];then
        Red_Err "数据库文件缺失,请检查安装包"
        exit 1
    fi
    if [ ! -f "${SETUP_PATH}/init/init.sql" ];then
        Red_Err "初始化数据文件缺失,请检查安装包"
        exit 1
    fi
    
    chmod -R 0777 ${SETUP_PATH}/db

    time_now_str=$(date "+%Y-%m-%d %H:%M:%S")
    sed -i -e "s/{port}/${panel_port}/g" -e "s/{account}/${panel_user}/g" -e "s/{pwd}/${panel_pwd}/g" -e "s/{pwdMd5}/${panel_pwd_md5}/g" -e "s/{safeEntry}/${safe_entry}/g" -e "s/{time}/${time_now_str}/g" -e "s/{xpVersion}/${XP_VERSION}/g" -e "s/{idcCode}/${IDC_CODE}/g" ${SETUP_PATH}/init/init.sql

    msg=$(sqlite3 ${SETUP_PATH}/db/app.db < ${SETUP_PATH}/init/init.sql 2>&1)
    if [ $? -ne 0 ];then
        Red_Err "数据库初始化失败,错误信息:${msg}"
        exit 1
    fi
}

Down_Deps(){
    for pkg in $@
    do
        dl_url="${DL_HOST}/deps/${pkg}.tar.gz"
        cd ${SETUP_PATH}/download
        wget -O ./${pkg}.tar.gz "${dl_url}"
        mkdir -p ./${pkg}
        tar -zxvf ./${pkg}.tar.gz -C ./${pkg}
        sudo bash ./${pkg}/${pkg}_install.sh
        cd $current_dir
    done
}

Check_CMD(){
    for cmd in $@
    do
        if ! command -v "$cmd" &> /dev/null; then
            Red_Err "Error: Command '$cmd' not found."
            exit 1
        fi
    done
}

Down_XP(){
    mkdir -p $SETUP_PATH/download
    wget -O ${SETUP_PATH}/download/xp-panel.tar.gz "${DL_HOST}/dl/xp/xp-panel.tar.gz"
}

Init_Tools(){
    xp_tools_dir="/xp/tools"
 
    if [ -d "$xp_tools_dir" ]; then
        for tool in "$xp_tools_dir"/*.sh; do
            filename=$(basename "$tool" .sh)
            if [ -L "/usr/bin/$filename" ]; then
                rm "/usr/bin/$filename"
            fi
            ln -s "$tool" "/usr/bin/$filename"
        done
    fi
}

Init_XP(){
    Check_CMD sqlite3 iptables vsftpd

    mkdir -p $SETUP_PATH/server
    mkdir -p $SETUP_PATH/panel
    mkdir -p $SETUP_PATH/wwwlogs
    mkdir -p $SETUP_PATH/applogs
    mkdir -p $SETUP_PATH/www
    mkdir -p $SETUP_PATH/backup
    mkdir -p $SETUP_PATH/db
    mkdir -p $SETUP_PATH/init

    cd $SETUP_PATH
    sudo tar -zxvf $SETUP_PATH/download/xp-panel.tar.gz -C $SETUP_PATH > /dev/null 2>&1

    sudo chown -R root /xp/*
    sudo chmod -R 0777 /xp/*

    # 给程序执行权限
    sudo chmod +x /xp/panel/app
    sudo chmod +x /xp/tasks/xp-tasks
    sudo chmod +x /xp/*.sh
    
    if [ ! -d "/etc/init.d" ];then
        mkdir -p /etc/init.d
    fi
    
    if [ -f "/etc/init.d/xpd" ]; then
        /etc/init.d/xpd stop
        sleep 1
    fi 

    # 添加一个www用户
    run_user="www"
    www_user=$(cat /etc/passwd|cut -d ":" -f 1|grep ^www$)
    if [ "${www_user}" != "www" ];then
        groupadd ${run_user}
        useradd -s /sbin/nologin -g ${run_user} ${run_user}
    fi
    
    # 设置面板端口
    panel_port="6860"
    # if [ "${PANEL_PORT}" ];then 
    #     # 检查端口是否被占用
    #     result=$(netstat -tln | grep ":${PANEL_PORT}")
    #     if [ -n "$result" ]; then
    #         Red_Err "安装面板失败,指定的端口 ${PANEL_PORT} 已被占用"
    #     fi
    #     panel_port=$PANEL_PORT
    # else
    #     # 随机生成端口号
    #     panel_port=$(expr $RANDOM % 55535 + 10000)
    #     # 检查端口是否被占用
    #     result=$(netstat -tln | grep ":$panel_port")
    #     while [ -n "$result" ]; do
    #         panel_port=$(expr $RANDOM % 55535 + 10000)
    #         result=$(netstat -tln | grep ":$panel_port")
    #     done
    # fi

    # 设置面板用户名
    panel_user="1"
    if [ "$PANEL_USER" ];then
        panel_user="1"
    fi

    # 生成面板默认密码
    panel_pwd="1"
    if [ "$PANEL_PWD" ];then
        panel_pwd="1"
    fi
    sleep 1
    panel_pwd_md5=$(echo -n $panel_pwd | md5sum | cut -d ' ' -f 1)

    # 生成安全入口
    if [ -z "$SAFE_ENTRY" ];then
        safe_entry="1"
    else
        safe_entry="1"
    fi
    
    # 安装xp服务
    sudo cp ${SETUP_PATH}/init/xpd /etc/init.d/xpd
    sudo chmod +x /etc/init.d/xpd

    # 给xp脚本创建软连接
    sudo chmod 777 /xp/xp.sh
    if [ -f "/usr/bin/xp" ];then
        sudo rm -f /usr/bin/xp
    fi
    sudo ln -s /xp/xp.sh /usr/bin/xp
    
    # 给tools目录下的脚本创建软连接
    Init_Tools
    
    Init_DB

    # 配置vsftpd
    sudo touch /var/log/vsftpd.log
    sudo chmod 777 /var/log/vsftpd.log
    sudo touch /var/log/vsftpd_xfer.log
    sudo chmod 777 /var/log/vsftpd_xfer.log
    sudo setsid /usr/local/bin/vsftpd /etc/vsftpd.conf &
}

Get_IP_Info(){
	IP_ADDR=""
	IP_ADDR=$(curl -sS --connect-timeout 10 -m 60 ${API_HOST}/api/myIP)

	LOCAL_IP=$(ip addr | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -E -v "^127\.|^255\.|^0\." | head -n 1)
}

Kill_Old_XP(){
    sudo pkill -f /xp/panel/app
    sudo pkill -f /xp/tasks/xp-task
}

End(){
    # # sudo bash $SETUP_PATH/run.sh
    # echo -e "\033[32m小皮面板启动中\033[0m"

    # Panel_Pid=$(ps -ef | grep /xp/panel/app | grep -v grep | awk '{print $2}')
    # Panel_Status="面板状态:未知"
    # if [ -n "${Panel_Pid}" ]; then
    #     Panel_Status="\033[32m面板状态:运行中\033[0m"
    # else
    #     Panel_Status="\033[31m面板状态:未运行\033[0m"
    # fi

    # Task_Pid=$(sudo ps -ef | grep /xp/tasks/xp-tasks | grep -v grep | awk '{print $2}')
    # Task_Status="面板状态:未知"
    # if [ -n "${Task_Pid}" ]; then
    #     Task_Status="\033[32m队列状态:运行中\033[0m"
    # else
    #     Task_Status="\033[31m队列状态:未运行\033[0m"
    # fi
    echo -e "================================================================"
    echo -e " \033[32m小皮面板安装成功\033[0m"
    echo -e "=========================面板状态==============================="
    echo -e " ${Panel_Status}"
    echo -e " ${Task_Status}"
    echo -e "=========================面板账户信息==========================="
    echo -e ""
    echo -e " 面板版本: ${XP_VERSION}"
    echo -e " 外网面板地址: ${HTTP_STR}://${IP_ADDR}:${panel_port}/${safe_entry}"
    echo -e " 内网面板地址: ${HTTP_STR}://${LOCAL_IP}:${panel_port}/${safe_entry}"
    echo -e " username: ${panel_user}"
    echo -e " password: ${panel_pwd}"
    echo -e ""
    echo -e "=========================面板注意事项==========================="
    echo -e ""
    echo -e " 【云服务器】请在安全组放行 $panel_port 端口"
    echo -e " 面板工具命令: xp"
    echo -e ""
    echo -e "================================================================"
    end_time=`date +%s`
    ((out_time=($end_time-$start_time)))
    echo -e "安装花费时间:\033[32m $out_time \033[0m秒"
    echo -e "安装日志路径:\033[32m $INSTALL_LOG_PATH \033[0m"
    
    echo -e "安装花费时间:\033[32m $out_time \033[0m秒"
}

Install_Tip(){
    echo "+${STRIPE_LINE}${STRIPE_LINE}"
    echo "| xp-panel for CentOS/Ubuntu/Debian"
    echo "+${STRIPE_LINE}${STRIPE_LINE}"
    echo "| Copyright © 2015-2050 XP-SOFT(https://xp.cn) All rights reserved."
    echo "+${STRIPE_LINE}${STRIPE_LINE}"
    echo "| The WebPanel URL will be http://SERVER_IP:${PANEL_PORT} when installed."
    echo "+${STRIPE_LINE}${STRIPE_LINE}"
    echo "| 为了您的正常使用,请确保使用全新或纯净的系统安装小皮面板"
    echo "+${STRIPE_LINE}${STRIPE_LINE}"
    echo "| 安装后可能会影响您系统原有的防火墙、ftp、数据库、开发环境等"
    echo "+${STRIPE_LINE}${STRIPE_LINE}"
    echo "| 开始安装后将会停止系统正在运行的小皮面板,并覆盖之前面板的数据,请注意备份"
    echo "+${STRIPE_LINE}${STRIPE_LINE}"
}

Open_Log(){
    touch $INSTALL_LOG_PATH
    exec 4>$INSTALL_LOG_PATH
    exec > >(tee >(cat >&4)) 2>&1
}

Analysis_Log(){
    exec 4>&-
    err_end=$(grep -n "请截图以上报错信息发给客服人员" $INSTALL_LOG_PATH | cut -d: -f1 | tail -n 1)
    if [ -n "$err_end" ]; then
        err_start=$(($err_end - 50))
        if [ $err_start -lt 0 ]; then
            err_start=1
        fi
        err=$(sed 's/\x1B\[[0-9;]*[JKmsu]//g' $INSTALL_LOG_PATH | sed -n "${err_start},${err_end}p" | tr '\n' ';')
        d='{"ver": "'${XP_VERSION}'", "err": "'${err}'","sysInfo": "'${SYS_INFO}'", "ip":"", "idc":"'${IDC_CODE}'"}'
        curl -s -X POST -H "Content-Type: application/json" -d "${d}" "${API_HOST}/api/installErr" 2>&1 >/dev/null
    fi
    
    err_end=$(grep -n "状态:未运行" $INSTALL_LOG_PATH | cut -d: -f1 | tail -n 1)
    if [ -n "$err_end" ]; then
        err_start=$(($err_end - 50))
        if [ $err_start -lt 0 ]; then
            err_start=1
        fi
        err=$(sed 's/\x1B\[[0-9;]*[JKmsu]//g' $INSTALL_LOG_PATH | sed -n "${err_start},${err_end}p" | tr '\n' ';')
        d='{"ver": "'${XP_VERSION}'", "err": "'${err}'","sysInfo": "'${SYS_INFO}'"}'
        curl -s -X POST -H "Content-Type: application/json" -d "${d}" "${API_HOST}/api/installErr" 2>&1 >/dev/null
    fi
}

Disable_Sudo_TTY(){
    if [ -f "/etc/sudoers" ]; then
        tty_mode=$(grep '^Default.*requiretty' /etc/sudoers)
        if [ -n "$tty_mode" ]; then
            sed -i 's/^Default.*requiretty/#&/' /etc/sudoers
        fi
    fi
}

Select_DlNode(){
    echo "select download node..."
    json_str=$(curl -s "${API_HOST}/api/dlNodes")
    if ! echo $json_str | grep -q '"ip":'; then
        echo "get download nodes failed, use default node"
        return
    fi
    ips=$(echo $json_str | grep -oP '"ip"\s*:\s*"\K[^"]+')
    min_delay_sec=5.0
    fasted_ip=""
    for ip in $ips
    do
        delay_sec=$(timeout 5 curl -o /dev/null -s -w "%{time_total}" ${ip} || echo 999.0)
        comp_result=$(echo "${delay_sec} < ${min_delay_sec}" | awk '{print ($1 < $3) ? "1" : "0"}')
        if [ $comp_result -eq 1 ]; then
            min_delay_sec=$delay_sec
            fasted_ip=$ip
        fi
    done
    if [ -z "$fasted_ip" ]; then
        echo "test download nodes error, use default node"
        return
    fi

    if grep -q "dl.xp.cn" /etc/hosts; then
        sed -i "s/.*dl.xp.cn.*/${fasted_ip} dl.xp.cn/g" /etc/hosts
    else
        echo -e "\n${fasted_ip} dl.xp.cn\n" >> /etc/hosts
    fi
    echo "select fasted download node finish"
}

Set_Cent_Repo_Source() {
    distro=$(cat /etc/centos-release | awk '{print $1}')
    version=$(cat /etc/centos-release | awk '{print $4}' | cut -d '.' -f1)
    if [ "$distro" == "CentOS" ]; then
        echo "开始替换 CentOS 的源为阿里源..."
        if [ "$version" == "7" ]; then
            echo "正在替换为 CentOS 7 的阿里源..."
            sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
            sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
            sudo yum clean all && sudo yum makecache
            echo "替换完成!"
        elif [ "$version" == "8" ]; then
            echo "正在替换为 CentOS 8 的阿里源..."
            sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
            sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
            sudo yum clean all && sudo yum makecache
            echo "替换完成!"
        else
            echo "不支持替换阿里源的 CentOS 版本:$version"
        fi
    fi
}

Install_Main(){
    Kill_Old_XP
    Env_Check
    Get_PM
    
    Auto_Swap_Mem

    Set_Cent_Repo_Source
    
    if [ "${PM}" = "yum" ]; then
        Install_RPM_Base_Pkg
        elif [ "${PM}" = "apt-get" ]; then
        Install_Deb_Base_Pkg
    fi

    Get_IP_Info

    Select_DlNode
    
    Down_XP
    Down_Deps sqlite3 vsftpd

    Open_Log

    Disable_Sudo_TTY
    
    Init_XP
    Add_Service
    End
    exit 0
    Analysis_Log
    exit 0
}

Install_Tip

# go="wait" # 确认安装的等待
# while [ ${#} -gt 0 ]; do
#     case $1 in
#         -u|--user)
#             PANEL_USER=$2
#             shift 1
#         ;;
#         -p|--password)
#             PANEL_PWD=$2
#             shift 1
#         ;;
#         -P|--port)
#             PANEL_PORT=$2
#             shift 1
#         ;;
#         --safe-entry)
#             SAFE_ENTRY=$2
#             shift 1
#         ;;
#         --ssl-disable)
#             SSL_PL="disable"
#         ;;
#         -y)
#             go="y"
#         ;;
#         *)
#             IDC_CODE=$1
#         ;;
#     esac
#     shift 1
# done

# while [ "$go" != 'Y' ] && [ "$go" != 'y' ] && [ "$go" != 'n' ] && [ "$go" != '' ]
# do
#     read -p "Do you want to install xp-panel to the $SETUP_PATH directory now?(Y/n): " go;
# done

# if [ "$go" == 'n' ];then
#     exit;
# fi

# Get_LocalInfo

# d='{"hostname": "'${hostname_check}'", "cpu": "'${CPU_INFO}'", "memory": "'${MEM_TOTAL}'", "diskUsage": "'${DISK_USE}'", "sysInfo": "'${SYS_INFO}'", "os": "'${SYS_VERSION}'", "idc": "'${IDC_CODE}'"}'
# curl -s -X POST -H "Content-Type: application/json" -d "${d}" "${API_HOST}/api/addInstallInfo" 2>&1 >/dev/null

Install_Main
echo -e "666666666666666666666666666666666666666666"
exit 0
# 安装完成删除安装包
rm -f $SETUP_PATH/download/xp-panel.tar.gz