diff --git a/agent/Dockerfile b/agent/Dockerfile index 530e009..53460a8 100644 --- a/agent/Dockerfile +++ b/agent/Dockerfile @@ -3,7 +3,7 @@ FROM icederce/eclipse-temurin-11-jre-focal # Set environment variables -ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms2028m -Xmx2048m" +ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms2028m -Xmx2048m" ServerName="" serverIpPbV4="" serverIpInV4="" serverIpPbV6="" serverIpInV6="" location="" provider="" managePort="" cpuBrand="" cpuCore="" memoryTotal="" diskTotal="" diskUsage="" osInfo="" osKernelInfo="" tcpControl="" virtualization="" ioSpeed="" # Set time zone RUN set -eux; \ diff --git a/agent/src/main/java/io/wdd/agent/initial/beans/ServerInfo.java b/agent/src/main/java/io/wdd/agent/initial/beans/ServerInfo.java index b329c59..2ad768f 100644 --- a/agent/src/main/java/io/wdd/agent/initial/beans/ServerInfo.java +++ b/agent/src/main/java/io/wdd/agent/initial/beans/ServerInfo.java @@ -18,25 +18,21 @@ public class ServerInfo { /** * server public ipv4 - */ private String serverIpPbV4; /** * server inner ipv4 - */ private String serverIpInV4; /** * server public ipv6 - */ private String serverIpPbV6; /** * server inner ipv6 - */ private String serverIpInV6; @@ -75,6 +71,21 @@ public class ServerInfo { */ private String osKernelInfo; + + private String tcpControl; + + + private String virtualization; + + + private String ioSpeed; + + private String memoryTotal; + + private String diskTotal; + + private String diskUsage; + /** * */ diff --git a/agent/src/main/java/io/wdd/agent/initial/bootup/AutoDeployOctopusAgent.sh b/agent/src/main/java/io/wdd/agent/initial/bootup/AutoDeployOctopusAgent.sh new file mode 100644 index 0000000..db0fed9 --- /dev/null +++ b/agent/src/main/java/io/wdd/agent/initial/bootup/AutoDeployOctopusAgent.sh @@ -0,0 +1,894 @@ +#!/usr/bin/env bash + +## https://github.com/teddysun/across/blob/master/bench.sh +## Author IceDerce +## For Project Octopus Agent Automate Deployment + +### 需要修改以下的内容 ### +KUBERNETES_VERSION=1.18.9 +DOCKER_VERSION=20.10.5 +### 需要修改以上的内容 ### + +CMD_INSTALL="" +CMD_UPDATE="" +CMD_REMOVE="" +SOFTWARE_UPDATED=0 +LinuxReleaseVersion="" +LinuxRelease="" + +RED="31m" ## 姨妈红 +GREEN="32m" ## 水鸭青 +YELLOW="33m" ## 鸭屎黄 +PURPLE="35m" ## 基佬紫 +BLUE="36m" ## 天依蓝 +BlinkGreen="32;5m" ##闪烁的绿色 +BlinkRed="31;5m" ##闪烁的红色 +BackRed="41m" ## 背景红色 +SplitLine="----------------------" #会被sys函数中的方法重写 + +#### CollectSystemInfo #### +ServerName="" +serverIpPbV4="" +serverIpInV4="" +serverIpPbV6="" +serverIpInV6="" +location="" +provider="" +managePort="" +cpuBrand="" +cpuCore="" +memoryTotal="" +diskTotal="" +diskUsage="" +osInfo="" +osKernelInfo="" +tcpControl="" +virtualization="" +ioSpeed="" + +### tmp usage +ioavg="" +public_ipv4="" +country="" +region="" +city="" +org="" +#### CollectSystemInfo #### + +######## 颜色函数方法很精妙 ############ +colorEcho() { + echo -e "\033[${1}${@:2}\033[0m" 1>&2 +} + +check_root() { + if [[ $EUID != 0 ]]; then + colorEcho ${RED} "当前非root账号(或没有root权限),无法继续操作,请更换root账号!" + colorEcho ${YELLOW} "使用sudo -命令获取临时root权限(执行后可能会提示输入root密码)" + exit 1 + fi +} + +FunctionStart() { + colorEcho ${PURPLE} ${SplitLine} + colorEcho ${PURPLE} ${SplitLine} + echo "" +} + +FunctionSuccess() { + colorEcho ${GREEN} ${SplitLine} + echo "" +} + +FunctionEnd() { + echo "" + colorEcho ${BlinkGreen} ${SplitLine} + echo "" + echo "" +} +# 判断命令是否存在 +command_exists() { + local cmd="$1" + if eval type type > /dev/null 2>&1; then + eval type "$cmd" > /dev/null 2>&1 + elif command > /dev/null 2>&1; then + command -v "$cmd" > /dev/null 2>&1 + else + which "$cmd" > /dev/null 2>&1 + fi + local rt=$? + return ${rt} +} + +####### 获取系统版本及64位或32位信息 +check_sys() { + # 获取当前终端的宽度,动态调整分割线的长度 + shellwidth=$(stty size | awk '{print $2}') + SplitLine=$(yes "-" | sed ${shellwidth}'q' | tr -d '\n') + + sys_bit=$(uname -m) + case $sys_bit in + i[36]86) + os_bit="32" + LinuxRelease="386" + ;; + x86_64) + os_bit="64" + LinuxRelease="amd64" + ;; + *armv6*) + os_bit="arm" + LinuxRelease="arm6" + ;; + *armv7*) + os_bit="arm" + LinuxRelease="arm7" + ;; + *aarch64* | *armv8*) + os_bit="arm64" + LinuxRelease="arm64" + ;; + *) + colorEcho ${RED} " + 哈哈……这个 辣鸡脚本 不支持你的系统。 (-_-) \n + 备注: 仅支持 Ubuntu 16+ / Debian 8+ / CentOS 7+ 系统 + " && exit 1 + ;; + esac + ## 判定Linux的发行版本 + if [ -f /etc/redhat-release ]; then + LinuxReleaseVersion="centos" + elif cat /etc/issue | grep -Eqi "debian"; then + LinuxReleaseVersion="debian" + elif cat /etc/issue | grep -Eqi "ubuntu"; then + LinuxReleaseVersion="ubuntu" + elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then + LinuxReleaseVersion="centos" + elif cat /proc/version | grep -Eqi "debian"; then + LinuxReleaseVersion="debian" + elif cat /proc/version | grep -Eqi "ubuntu"; then + LinuxReleaseVersion="ubuntu" + elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then + LinuxReleaseVersion="centos" + else + LinuxReleaseVersion="" + fi + + # 判断系统的包管理工具 apt, yum, or zypper + getPackageManageTool() { + if [[ -n $(command -v apt-get) ]]; then + CMD_INSTALL="apt-get -y -qq install" + CMD_UPDATE="apt-get -qq update" + CMD_REMOVE="apt-get -y remove" + elif [[ -n $(command -v yum) ]]; then + CMD_INSTALL="yum -y -q install" + CMD_UPDATE="yum -q makecache" + CMD_REMOVE="yum -y remove" + elif [[ -n $(command -v zypper) ]]; then + CMD_INSTALL="zypper -y install" + CMD_UPDATE="zypper ref" + CMD_REMOVE="zypper -y remove" + else + return 1 + fi + return 0 + } + + # 检查系统包管理方式,更新包 + getPackageManageTool + if [[ $? -eq 1 ]]; then + colorEcho ${RED} "系统的包管理不是 APT or YUM, 请手动安装所需要的软件." + return 1 + fi + + ### 更新程序引索 + if [[ $SOFTWARE_UPDATED -eq 0 ]]; then + colorEcho ${BLUE} "正在更新软件包管理...可能花费较长时间…………" + $CMD_UPDATE + SOFTWARE_UPDATED=1 + fi + return 0 +} + +## 安装所需要的程序,及依赖程序 +installDemandSoftwares() { + for software in $@; do + ## 安装该软件 + if [[ -n $(command -v ${software}) ]]; then + colorEcho ${GREEN} "${software}已经安装了...跳过..." + echo "" + else + colorEcho ${BLUE} "正在安装 ${software}..." + $CMD_INSTALL ${software} + ## 判断该软件是否安装成功 + if [[ $? -ne 0 ]]; then + colorEcho ${RED} "安装 ${software} 失败。" + colorEcho ${RED} "如果是重要软件,本脚本会自动终止!!" + colorEcho ${PURPLE} "一般软件,本脚本会忽略错误并继续运行,请之后手动安装该程序。" + return 1 + else + colorEcho ${GREEN} "已经成功安装 ${software}" + FunctionSuccess + echo "" + fi + fi + done + return 0 +} + +shutdownFirewall() { + ## 关闭防火墙、SElinux、Swap + FunctionStart + colorEcho ${BLUE} "开始关闭系统的防火墙…………" + systemctl stop firewalld + systemctl disable firewalld + echo "" + + if [ ${LinuxReleaseVersion} = "centos" ]; then + colorEcho ${GREEN} "当前系统的发行版为-- ${LinuxReleaseVersion}!!" + FunctionSuccess + colorEcho ${BLUE} "开始关闭SELinux……" + setenforce 0 + sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config + colorEcho ${GREEN} " SELinux关闭完成 " + else + colorEcho ${GREEN} "当前系统的发行版为-- ${LinuxReleaseVersion}!!" + colorEcho ${GREEN} "无需关闭SELinux,现在 跳过" + fi + echo "" +} + +disableSwap() { + FunctionStart + colorEcho ${BLUE} "开始关闭系统的虚拟内存…………" + swapoff -a + colorEcho ${GREEN} " 虚拟内存关闭完成 " + echo "" + colorEcho ${BLUE} "正在备份系统的文件系统表……" + cp -f /etc/fstab /etc/fstab_bak + colorEcho ${GREEN} " 备份完成 " + echo "" + colorEcho ${BLUE} "正在修改文件系统表,去除虚拟内存的部分……" + cat /etc/fstab_bak | grep -v swap >/etc/fstab + colorEcho ${GREEN} " 修改完成 " + echo "" + FunctionSuccess + echo "" +} + +## 安装docker时,修改系统的配置文件 +modifySystemConfig_Docker() { + FunctionStart + colorEcho ${BLUE} "开始修改系统内核参数…………" + ## 配置内核参数 + cat >/etc/sysctl.d/k8s.conf </dev/null + colorEcho ${GREEN} " 添加成功 " + echo "" + fi + + colorEcho ${BLUE} "正在执行更新操作!!" + apt-get update + colorEcho ${GREEN} "----------更新完成----------" + FunctionSuccess + colorEcho ${BLUE} "可以安装的docker-ce的版本为:" + colorEcho ${GREEN} "--------------------------------------------------------------" + apt-cache madison docker-ce | grep -w ${DOCKER_VERSION:0:4} | awk '{print$3}' + colorEcho ${GREEN} "--------------------------------------------------------------" + echo "" + + colorEcho ${GREEN} "开始安装docker-ce,版本为${DOCKER_VERSION}" + realDockerSTag=$(apt-cache madison docker-ce | grep -w ${DOCKER_VERSION:0:4} | awk '{print$3}' | grep ${DOCKER_VERSION}) + installDemandSoftwares docker-ce=${realDockerSTag} || return $? + fi + echo "" + + colorEcho ${GREEN} "----------安装完成----------" + FunctionSuccess + colorEcho ${BLUE} "正在启动docker的服务进程…………" + systemctl enable docker.service + systemctl start docker.service + colorEcho ${GREEN} "----------启动完成----------" + echo "" + FunctionEnd +} + +InstallDockerCompose() { + FunctionStart + colorEcho ${PURPLE} "正在下载 +++++++++++++ docker-compose文件 ++++++++++++++" + # curl -L "https://github.com.cnpmjs.org/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" \ + # -o /usr/local/bin/docker-compose + curl -L "https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnk8d6fazu16/b/seoul/o/docker-compose-Linux-x86_64" \ + -o /usr/local/bin/docker-compose + if [[ -e /usr/local/bin/docker-compose ]]; then + colorEcho ${BLUE} "docker-compose文件下载成功!!" + echo "" + chmod +x /usr/local/bin/docker-compose + docker-compose --version &>/dev/null + if [[ $? -eq 0 ]]; then + colorEcho ${GREEN} "docker-compose安装成功!!版本为$(docker-compose --version | cut -d" " -f3)尽情享用" + else + ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose + fi + else + colorEcho ${RED} "docker-compose文件下载失败!! 无法访问github的资源。。" + colorEcho ${RED} "请手动下载docker-compose的安装文件!" + fi + FunctionEnd +} + +InstallZSH() { + FunctionStart + + ZSH_SOURCE="cn" + + if [[ "$1" -ne " " ]]; then + ZSH_SOURCE="$1" + echo "zsh install source = ${ZSH_SOURCE}" + fi + + colorEcho ${BLUE} "开始安装宇宙第一shell工具zsh……" + echo "" + installDemandSoftwares zsh git || return $? + # 脚本会自动更换默认的shell + if [[ "${ZSH_SOURCE}" -eq "cn" ]]; then + echo y | REMOTE=https://gitee.com/mirrors/oh-my-zsh.git sh -c "$(curl -fsSL https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh)" + else + echo y | sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" + fi + #echo y | sh -c "$(curl -fsSL https://cdn.jsdelivr.net/gh/robbyrussell/oh-my-zsh@master/tools/install.sh)" + echo "" + modifyZSH ${ZSH_SOURCE} + if [[ $? -eq 0 ]]; then + colorEcho ${BLUE} "开始修改默认shell为zsh……" + for i in {6..1..-1}; do + colorEcho ${BLUE} "倒计时开始 ->> $i 秒 <<-,准备切换shell,上文的日志输出将会消失!!" + sleep 2 + done + chsh -s /bin/zsh + zsh + else + colorEcho ${RED} "zsh 安装失败,大概率是已经安装!!小概率是无法连接GitHub服务器~~" + fi + FunctionEnd +} + +modifyZSH() { + FunctionStart + + ZSH_SOURCE="cn" + + if [[ "$1" -ne " " ]]; then + ZSH_SOURCE="$1" + echo "zsh install source = ${ZSH_SOURCE}" + fi + + colorEcho ${GREEN} "zsh应该已经安装成功!!!" + colorEcho ${BLUE} "开始修改zsh的相关配置信息,使其更加好用…………" + echo "" + cat >~/oh-my-zsh-plugins-list.txt <>/etc/hosts + colorEcho ${BLUE} "正在写入docker的daemon配置文件……" + cat >>/etc/docker/daemon.json <&1 | awk -F, '{io=$NF} END { print io}' | sed 's/^[ \t]*//;s/[ \t]*$//' +} + +calc_size() { + local raw=$1 + local total_size=0 + local num=1 + local unit="KB" + if ! [[ ${raw} =~ ^[0-9]+$ ]] ; then + echo "" + return + fi + if [ "${raw}" -ge 1073741824 ]; then + num=1073741824 + unit="TB" + elif [ "${raw}" -ge 1048576 ]; then + num=1048576 + unit="GB" + elif [ "${raw}" -ge 1024 ]; then + num=1024 + unit="MB" + elif [ "${raw}" -eq 0 ]; then + echo "${total_size}" + return + fi + total_size=$( awk 'BEGIN{printf "%.1f", '$raw' / '$num'}' ) + echo "${total_size} ${unit}" +} + +get_opsy() { + [ -f /etc/redhat-release ] && awk '{print $0}' /etc/redhat-release && return + [ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return + [ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return +} + +print_GoIOTest() { + FunctionStart + freespace=$(df -m . | awk 'NR==2 {print $4}') + if [ -z "${freespace}" ]; then + freespace=$(df -m . | awk 'NR==3 {print $3}') + fi + if [ ${freespace} -gt 1024 ]; then + writemb=2048 + io1=$(GoIOTest ${writemb}) + colorEcho $YELLOW "I/O Speed(1st run) : $io1)" + io2=$(GoIOTest ${writemb}) + colorEcho $YELLOW "I/O Speed(2st run) : $io2)" + io3=$(GoIOTest ${writemb}) + colorEcho $YELLOW "I/O Speed(3st run) : $io3)" + ioraw1=$(echo $io1 | awk 'NR==1 {print $1}') + [ "$(echo $io1 | awk 'NR==1 {print $2}')" == "GB/s" ] && ioraw1=$(awk 'BEGIN{print '$ioraw1' * 1024}') + ioraw2=$(echo $io2 | awk 'NR==1 {print $1}') + [ "$(echo $io2 | awk 'NR==1 {print $2}')" == "GB/s" ] && ioraw2=$(awk 'BEGIN{print '$ioraw2' * 1024}') + ioraw3=$(echo $io3 | awk 'NR==1 {print $1}') + [ "$(echo $io3 | awk 'NR==1 {print $2}')" == "GB/s" ] && ioraw3=$(awk 'BEGIN{print '$ioraw3' * 1024}') + ioall=$(awk 'BEGIN{print '$ioraw1' + '$ioraw2' + '$ioraw3'}') + ioavg=$(awk 'BEGIN{printf "%.1f", '$ioall' / 3}') + colorEcho $YELLOW "I/O Speed(average) : $ioavg MB/s)" + else + echo " $(_red "Not enough space for I/O Speed test!")" + fi + + FunctionSuccess + FunctionEnd +} + +GetIpv4Info() { + org="$(wget -q -T10 -O- ipinfo.io/org)" + city="$(wget -q -T10 -O- ipinfo.io/city)" + country="$(wget -q -T10 -O- ipinfo.io/country)" + region="$(wget -q -T10 -O- ipinfo.io/region)" + public_ipv4="$(wget -q -T10 -O- ipinfo.io/ip)" +} + +generateSystemInfo() { + FunctionStart + colorEcho $BLUE "start to collect system info !" + + cname=$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') + cores=$(awk -F: '/processor/ {core++} END {print core}' /proc/cpuinfo) + freq=$(awk -F'[ :]' '/cpu MHz/ {print $4;exit}' /proc/cpuinfo) + ccache=$(awk -F: '/cache size/ {cache=$2} END {print cache}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') + cpu_aes=$(grep -i 'aes' /proc/cpuinfo) + cpu_virt=$(grep -Ei 'vmx|svm' /proc/cpuinfo) + tram=$( + LANG=C + free | awk '/Mem/ {print $2}' + ) + tram=$(calc_size $tram) + uram=$( + LANG=C + free | awk '/Mem/ {print $3}' + ) + uram=$(calc_size $uram) + swap=$( + LANG=C + free | awk '/Swap/ {print $2}' + ) + swap=$(calc_size $swap) + uswap=$( + LANG=C + free | awk '/Swap/ {print $3}' + ) + uswap=$(calc_size $uswap) + up=$(awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60} {printf("%d days, %d hour %d min\n",a,b,c)}' /proc/uptime) + if command_exists "w"; then + load=$( + LANG=C + w | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//' + ) + elif command_exists "uptime"; then + load=$( + LANG=C + uptime | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//' + ) + fi + opsy=$(get_opsy) + arch=$(uname -m) + if command_exists "getconf"; then + lbit=$(getconf LONG_BIT) + else + echo ${arch} | grep -q "64" && lbit="64" || lbit="32" + fi + kern=$(uname -r) + disk_total_size=$( + LANG=C + df -t simfs -t ext2 -t ext3 -t ext4 -t btrfs -t xfs -t vfat -t ntfs -t swap --total 2>/dev/null | grep total | awk '{ print $2 }' + ) + disk_total_size=$(calc_size $disk_total_size) + disk_used_size=$( + LANG=C + df -t simfs -t ext2 -t ext3 -t ext4 -t btrfs -t xfs -t vfat -t ntfs -t swap --total 2>/dev/null | grep total | awk '{ print $3 }' + ) + disk_used_size=$(calc_size $disk_used_size) + tcpctrl=$(sysctl net.ipv4.tcp_congestion_control | awk -F ' ' '{print $3}') + + FunctionSuccess + print_GoIOTest + FunctionSuccess + GetIpv4Info + FunctionSuccess + + ServerName="$(cat /etc/hostname)" + serverIpPbV4="$public_ipv4" + serverIpInV4="" + serverIpPbV6="" + serverIpInV6="" + location="$city $region $country" + provider="$org" + managePort="netstat -ntulp | grep sshd | grep -w tcp | awk '{print$4}' | cut -d":" -f2" + cpuCore="$cname" + cpuBrand="$cores @ $freq MHz" + memoryTotal="$tram" + diskTotal="$disk_total_size" + diskUsage="$disk_used_size" + archInfo="$arch ($lbit Bit)" + osInfo="$opsy" + osKernelInfo="$kern" + tcpControl="$tcpctrl" + virtualization="$virt" + ioSpeed="$ioavg MB/s" + + FunctionEnd +} + +deployOctopusAgent() { + FunctionStart + + # get the latest version of Octopus agent + # poll the start up shell + + docker run -d \ + -e ServerName="${ServerName}" \ + -e serverIpPbV4="$serverIpPbV4" \ + -e serverIpInV4="$serverIpInV4" \ + -e serverIpPbV6="$serverIpPbV6" \ + -e serverIpInV6="$serverIpInV6" \ + -e location="$location" \ + -e provider="$provider" \ + -e managePort="$managePort" \ + -e cpuBrand="$cpuBrand" \ + -e cpuCore="$cpuCore" \ + -e memoryTotal="$memoryTotal" \ + -e diskTotal="$diskTotal" \ + -e diskUsage="$diskUsage" \ + -e osInfo="$osInfo" \ + -e osKernelInfo="$osKernelInfo" \ + -e tcpControl="$tcpControl" \ + -e virtualization="$virtualization" \ + -e ioSpeed="$ioSpeed" \ + icederce/wdd-octopus-agent:latest + + FunctionSuccess + + FunctionEnd + +} + +main() { + check_root + check_sys +# shutdownFirewall + # 关闭虚拟缓存,k8s安装的时候才需要 + # disableSwap + + # 安装一些常用的小工具 +# commonToolInstall + + # 安装docker,版本信息在本脚本的开头处修改~~ +# InstallDocker || return $? +# InstallDockerCompose || return $? + +# modifySystemConfig_Docker +# modifySystemConfig_Forwarding + + # 使用timedatactl修改时间与时区【推荐】 +# changeTimeZoneAndNTP || return $? + + generateSystemInfo || return $? + + deployOctopusAgent || return $? + + # 安装宇宙第一shell的zsh + #InstallZSH cn || return $? + + # 使用chrony进行NTP时间同步--包含下面的设置 + # TimeSyncToAliByChrony || return $? + +} + +main diff --git a/agent/src/main/java/io/wdd/agent/initial/bootup/BootUpAgent.sh b/agent/src/main/java/io/wdd/agent/initial/bootup/BootUpAgent.sh new file mode 100644 index 0000000..27079d4 --- /dev/null +++ b/agent/src/main/java/io/wdd/agent/initial/bootup/BootUpAgent.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + + +docker run -d \ + -e ServerName: "${ServerName}" \ + -e serverIpPbV4: "$serverIpPbV4" \ + -e serverIpInV4: "$serverIpInV4" \ + -e serverIpPbV6: "$serverIpPbV6" \ + -e serverIpInV6: "$serverIpInV6" \ + -e location: "$location" \ + -e provider: "$provider" \ + -e managePort: "$managePort" \ + -e cpuBrand: "$cpuBrand" \ + -e cpuCore: "$cpuCore" \ + -e memoryTotal: "$memoryTotal" \ + -e diskTotal: "$diskTotal" \ + -e diskUsage: "$diskUsage" \ + -e osInfo: "$osInfo" \ + -e osKernelInfo: "$osKernelInfo" \ + -e tcpControl: "$tcpControl" \ + -e virtualization: "$virtualization" \ + -e ioSpeed: "$ioSpeed" \ + icederce/wdd-octopus-agent:latest \ No newline at end of file diff --git a/agent/src/main/java/io/wdd/agent/initial/bootup/linux-init-LapPro.sh b/agent/src/main/java/io/wdd/agent/initial/bootup/linux-init-LapPro.sh new file mode 100644 index 0000000..320d17c --- /dev/null +++ b/agent/src/main/java/io/wdd/agent/initial/bootup/linux-init-LapPro.sh @@ -0,0 +1,1173 @@ +#!/bin/bash + +# 本脚本意在一键初始化Linux服务器的环境 + +### 需要修改以下的内容 ### +KUBERNETES_VERSION=1.18.9 +DOCKER_VERSION=19.03.15 +### 需要修改以上的内容 ### + +CMD_INSTALL="" +CMD_UPDATE="" +CMD_REMOVE="" +SOFTWARE_UPDATED=0 +LinuxReleaseVersion="" +LinuxRelease="" + +RED="31m" ## 姨妈红 +GREEN="32m" ## 水鸭青 +YELLOW="33m" ## 鸭屎黄 +PURPLE="35m" ## 基佬紫 +BLUE="36m" ## 天依蓝 +BlinkGreen="32;5m" ##闪烁的绿色 +BlinkRed="31;5m" ##闪烁的红色 +BackRed="41m" ## 背景红色 +SplitLine="----------------------" #会被sys函数中的方法重写 + +######## 颜色函数方法很精妙 ############ +colorEcho() { + echo -e "\033[${1}${@:2}\033[0m" 1>&2 +} + +check_root() { + if [[ $EUID != 0 ]]; then + colorEcho ${RED} "当前非root账号(或没有root权限),无法继续操作,请更换root账号!" + colorEcho ${YELLOW} "使用sudo -命令获取临时root权限(执行后可能会提示输入root密码)" + exit 1 + fi +} + +FunctionStart() { + colorEcho ${PURPLE} ${SplitLine} + colorEcho ${PURPLE} ${SplitLine} + echo "" +} + +FunctionSuccess() { + colorEcho ${GREEN} ${SplitLine} + echo "" +} + +FunctionEnd() { + echo "" + colorEcho ${BlinkGreen} ${SplitLine} + echo "" + echo "" +} +# 判断命令是否存在 +command_exists() { + command -v "$@" >/dev/null 2>&1 +} + +####### 获取系统版本及64位或32位信息 +check_sys() { + # 获取当前终端的宽度,动态调整分割线的长度 + shellwidth=$(stty size|awk '{print $2}') + SplitLine=$(yes "-" | sed ${shellwidth}'q' | tr -d '\n') + + sys_bit=$(uname -m) + case $sys_bit in + i[36]86) + os_bit="32" + LinuxRelease="386" + ;; + x86_64) + os_bit="64" + LinuxRelease="amd64" + ;; + *armv6*) + os_bit="arm" + LinuxRelease="arm6" + ;; + *armv7*) + os_bit="arm" + LinuxRelease="arm7" + ;; + *aarch64* | *armv8*) + os_bit="arm64" + LinuxRelease="arm64" + ;; + *) + colorEcho ${RED} " + 哈哈……这个 辣鸡脚本 不支持你的系统。 (-_-) \n + 备注: 仅支持 Ubuntu 16+ / Debian 8+ / CentOS 7+ 系统 + " && exit 1 + ;; + esac + ## 判定Linux的发行版本 + if [ -f /etc/redhat-release ]; then + LinuxReleaseVersion="centos" + elif cat /etc/issue | grep -Eqi "debian"; then + LinuxReleaseVersion="debian" + elif cat /etc/issue | grep -Eqi "ubuntu"; then + LinuxReleaseVersion="ubuntu" + elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then + LinuxReleaseVersion="centos" + elif cat /proc/version | grep -Eqi "debian"; then + LinuxReleaseVersion="debian" + elif cat /proc/version | grep -Eqi "ubuntu"; then + LinuxReleaseVersion="ubuntu" + elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then + LinuxReleaseVersion="centos" + else + LinuxReleaseVersion="" + fi + + # 判断系统的包管理工具 apt, yum, or zypper + getPackageManageTool() { + if [[ -n $(command -v apt-get) ]]; then + CMD_INSTALL="apt-get -y -qq install" + CMD_UPDATE="apt-get -qq update" + CMD_REMOVE="apt-get -y remove" + elif [[ -n $(command -v yum) ]]; then + CMD_INSTALL="yum -y -q install" + CMD_UPDATE="yum -q makecache" + CMD_REMOVE="yum -y remove" + elif [[ -n $(command -v zypper) ]]; then + CMD_INSTALL="zypper -y install" + CMD_UPDATE="zypper ref" + CMD_REMOVE="zypper -y remove" + else + return 1 + fi + return 0 + } + + # 检查系统包管理方式,更新包 + getPackageManageTool + if [[ $? -eq 1 ]]; then + colorEcho ${RED} "系统的包管理不是 APT or YUM, 请手动安装所需要的软件." + return 1 + fi + + ### 更新程序引索 + if [[ $SOFTWARE_UPDATED -eq 0 ]]; then + colorEcho ${BLUE} "正在更新软件包管理...可能花费较长时间…………" + $CMD_UPDATE + SOFTWARE_UPDATED=1 + fi + return 0 +} + +## 安装所需要的程序,及依赖程序 +installDemandSoftwares() { + for software in $@; do + ## 安装该软件 + if [[ -n $(command -v ${software}) ]]; then + colorEcho ${GREEN} "${software}已经安装了...跳过..." + echo "" + else + colorEcho ${BLUE} "正在安装 ${software}..." + $CMD_INSTALL ${software} + ## 判断该软件是否安装成功 + if [[ $? -ne 0 ]]; then + colorEcho ${RED} "安装 ${software} 失败。" + colorEcho ${RED} "如果是重要软件,本脚本会自动终止!!" + colorEcho ${PURPLE} "一般软件,本脚本会忽略错误并继续运行,请之后手动安装该程序。" + return 1 + else + colorEcho ${GREEN} "已经成功安装 ${software}" + FunctionSuccess + echo "" + fi + fi + done + return 0 +} + +shutdownFirewall() { + ## 关闭防火墙、SElinux、Swap + FunctionStart + colorEcho ${BLUE} "开始关闭系统的防火墙…………" + systemctl stop firewalld + systemctl disable firewalld + echo "" + + if [ ${LinuxReleaseVersion} = "centos" ]; then + colorEcho ${GREEN} "当前系统的发行版为-- ${LinuxReleaseVersion}!!" + FunctionSuccess + colorEcho ${BLUE} "开始关闭SELinux……" + setenforce 0 + sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config + colorEcho ${GREEN} " SELinux关闭完成 " + else + colorEcho ${GREEN} "当前系统的发行版为-- ${LinuxReleaseVersion}!!" + colorEcho ${GREEN} "无需关闭SELinux,现在 跳过" + fi + echo "" +} + +disableSwap() { + FunctionStart + colorEcho ${BLUE} "开始关闭系统的虚拟内存…………" + swapoff -a + colorEcho ${GREEN} " 虚拟内存关闭完成 " + echo "" + colorEcho ${BLUE} "正在备份系统的文件系统表……" + cp -f /etc/fstab /etc/fstab_bak + colorEcho ${GREEN} " 备份完成 " + echo "" + colorEcho ${BLUE} "正在修改文件系统表,去除虚拟内存的部分……" + cat /etc/fstab_bak | grep -v swap >/etc/fstab + colorEcho ${GREEN} " 修改完成 " + echo "" + FunctionSuccess + echo "" +} + +## 安装docker时,修改系统的配置文件 +modifySystemConfig_Docker() { + FunctionStart + colorEcho ${BLUE} "开始修改系统内核参数…………" + ## 配置内核参数 + cat >/etc/sysctl.d/k8s.conf <>/etc/sysctl.d/k8s.conf < /dev/null + colorEcho ${GREEN} " 添加成功 " + echo "" + fi + + colorEcho ${BLUE} "正在执行更新操作!!" + apt-get update + colorEcho ${GREEN} "----------更新完成----------" + FunctionSuccess + colorEcho ${BLUE} "可以安装的docker-ce的19.03版本为:" + colorEcho ${GREEN} "--------------------------------------------------------------" + apt-cache madison docker-ce | grep -w 19.03 | awk '{print$3}' + colorEcho ${GREEN} "--------------------------------------------------------------" + echo "" + + colorEcho ${GREEN} "开始安装docker-ce,版本为${DOCKER_VERSION}" + realDockerSTag=$(apt-cache madison docker-ce | grep -w 19.03 | awk '{print$3}' | grep ${DOCKER_VERSION}) + installDemandSoftwares docker-ce=${realDockerSTag} || return $? + fi + echo "" + + colorEcho ${GREEN} "----------安装完成----------" + FunctionSuccess + colorEcho ${BLUE} "正在启动docker的服务进程…………" + systemctl enable docker.service + systemctl start docker.service + colorEcho ${GREEN} "----------启动完成----------" + echo "" + FunctionEnd +} + +InstallDockerCompose() { + FunctionStart + colorEcho ${PURPLE} "正在下载 +++++++++++++ docker-compose文件 ++++++++++++++" + # curl -L "https://github.com.cnpmjs.org/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" \ + # -o /usr/local/bin/docker-compose + curl -L "https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnk8d6fazu16/b/seoul/o/docker-compose-Linux-x86_64" \ + -o /usr/local/bin/docker-compose + if [[ -e /usr/local/bin/docker-compose ]]; then + colorEcho ${BLUE} "docker-compose文件下载成功!!" + echo "" + chmod +x /usr/local/bin/docker-compose + docker-compose --version &>/dev/null + if [[ $? -eq 0 ]]; then + colorEcho ${GREEN} "docker-compose安装成功!!版本为$(docker-compose --version | cut -d" " -f3)尽情享用" + else + ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose + fi + else + colorEcho ${RED} "docker-compose文件下载失败!! 无法访问github的资源。。" + colorEcho ${RED} "请手动下载docker-compose的安装文件!" + fi + FunctionEnd +} + +installKubernetes() { + ### 国内的环境 ### + ## 添加kubernetes的yum源 + FunctionStart + colorEcho ${BLUE} "开始安装kubernetes的相关组件…………" + echo "" + colorEcho ${GREEN} "当前系统的发行版为-- ${LinuxReleaseVersion}!!" + echo "" + if [[ ${LinuxReleaseVersion} == "centos" ]]; then + colorEcho ${BLUE} "添加kubepernetes的yum源--国内的阿里云源!!" + cat </etc/yum.repos.d/kubernetes.repo +[kubernetes] +name=Kubernetes +baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 +enabled=1 +gpgcheck=0 +repo_gpgcheck=0 +gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg + http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg +EOF + colorEcho ${GREEN} "----------添加完成----------" + else + installDemandSoftwares apt-transport-https curl + colorEcho ${BLUE} "开始添加国内的阿里云源的kubernetes的apt-key……" + curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add + echo "" + colorEcho ${BLUE} "开始添加国内的阿里云源的kubernetes的apt源……" + cat </etc/apt/sources.list.d/kubernetes.list +deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main +EOF + colorEcho ${GREEN} "----------添加完成----------" + colorEcho ${BLUE} "开始添加国内的阿里云源的kubernetes的apt源……" + colorEcho ${BLUE} "开始执行apt update 操作……" + apt-get update + colorEcho ${GREEN} "--------------------------------------------------------------" + fi + echo "" + + colorEcho ${BLUE} "开始安装 kubelet-${KUBERNETES_VERSION} kubeadm-${KUBERNETES_VERSION} kubectl-${KUBERNETES_VERSION}" + installDemandSoftwares kubelet-${KUBERNETES_VERSION} kubeadm-${KUBERNETES_VERSION} kubectl-${KUBERNETES_VERSION} || return $? + colorEcho ${GREEN} "----------k8s的相关组件安装完成----------" + FunctionSuccess + FunctionEnd +} + +## 对外暴露的安装Redis的主函数 +InstallRedis(){ + FunctionStart + RedisPort="6379" + RedisInstallMethod="binary" + RedisInstallHelp="0" + + while [[ $# > 0 ]]; do + case "$1" in + -p|--port) + RedisPort="${2}" + shift # past argument + ;; + -m|--method) + RedisInstallMethod="${2}" + shift # past argument + ;; + -h|--help) + RedisInstallHelp="1" + ;; + *) + echo "输入的内容有误,请检查!" + # unknown option + ;; + esac + shift # past argument or value + done + + if [ "${RedisInstallHelp}" -eq "1" ]; then + cat - 1>& 2 << EOF +./install-release.sh [-h] [-p|--port 6379] [-m|--method binary|docker] + -h, --help 打印此安装帮助说明 + -p, --port 安装Redis的端口,如果不指定此参数,则默为6379 + -m, --method 安装Redis的方式,binary == 源码编译安装,docker == 使用docker安装;不指定则使用binary +EOF + fi + +# echo $RedisPort +# echo $RedisInstallMethod + + if [[ ${RedisInstallMethod} == "binary" ]]; then + installRedisBinary ${RedisPort} + else + installRedisDocker ${RedisPort} + fi + FunctionEnd +} + +installRedisBinary() { + RedisPort="" + if [[ "$1" -ne " " ]]; then + RedisPort="$1" + echo "Redis Port = ${RedisPort}" + fi + + echo "InstallRedisBinary" + + CMD_REMOVE gcc + installDemandSoftwares gcc wget + + echo "开始下载 Redis 6.2.6 的二进制包!" + wget https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnk8d6fazu16/b/seoul/o/redis-6.2.6.tar.gz + + if [ -e redis-6.2.6.tar.gz ]; then + echo "redis源码包下载完成!" + echo "" + echo "开始解压缩redis的安装包!" + tar -zvxf redis-6.2.6.tar.gz + cd redis-6.2.6 + clear + echo "" + echo "" + echo "开始执行编译安装过程!!" + echo "开始执行编译安装过程!!" + echo "开始执行编译安装过程!!" + echo "取决于服务器的性能,可能花费较长的时间!!!" + sleep 3 + echo "" + ./configure + make && make install + cd redis-6.2.6 + + echo "Redis已经安装成功!!" + ehco "开始进行redis的配置修改!!" + wget https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnk8d6fazu16/b/seoul/o/redis-6.2.6.conf + wget https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnk8d6fazu16/b/seoul/o/redis-server-6.2.6.service + + if [ -e redis-6.2.6.conf ] && [ -e redis-server-6.2.6.service ]; then + echo "redis配置文件下载成功,开始进行修改!!" + echo "" + touch /var/log/redis_${RedisPort}.log + mkdir -p /var/redis/${RedisPort} + mkdir -p /etc/redis/ + + sed -i "s/RedisPort/${RedisPort}/g" redis-6.2.6.conf + cp redis-6.2.6.conf /etc/redis/${RedisPort}.conf + + sed -i "s/RedisPort/${RedisPort}/g" redis-server-6.2.6.service + cp redis-server-6.2.6.service /etc/init.d/redisd + + cd /etc/init.d + chmod +x /etc/init.d/redisd + + if [ command_exists chkconfig ]; then + chkconfig redisd on + elif [ command_exists update-rc.d ]; then + update-rc.d redisd defaults + else + echo "所需要的守护程序未安装,请手动设置!!" + fi + + # 启动程序 + echo "" + echo "开始启动redis-server服务……" + service redisd start + + service redisd status + + netstat -ntlp | grep redis + + else + echo "redis配置文件下载失败!!请手动进行修改!!" + return 3 + fi + else + echo "redis源码包下载失败!" + return 3 + fi + +} + +installRedisDocker(){ + RedisPort="" + if [[ "$1" -ne " " ]]; then + RedisPort="$1" + echo "Redis Port = ${RedisPort}" + fi + + echo "InstallRedisDocker" + echo "" + + if [ ! command_exists "docker info" ]; then + colorEcho ${RED} "docker 未安装!! 无法使用docker的方式安装 redis!" + return 3 + fi + + echo "## 为redis配置添加 ">>/etc/sysctl.conf + echo "vm.overcommit_memory = 1">>/etc/sysctl.conf + sysctl -p /etc/sysctl.conf + + echo "开始启动docker-redis !!" + # https://hub.docker.com/r/bitnami/redis#configuration + + # 为redis设置密码 -e REDIS_PASSWORD=v2ryStr@ngPa.ss \ + docker run -d \ + -e ALLOW_EMPTY_PASSWORD=yes \ + -e REDIS_AOF_ENABLED=no \ + -e REDIS_PORT_NUMBER=${RedisPort} \ + --name redis-server \ + --network host \ + bitnami/redis:6.2.6 +} + +InstallMysql(){ + FunctionStart + MysqlPort="3306" + MysqlInstallMethod="binary" + MysqlInstallHelp="0" + MysqlPersistData="/var/lib/docker/mysql-data" + + colorEcho ${BLUE} "本脚本默认安装版本为 8.0.27 的MySQL !!" + colorEcho ${BLUE} "本脚本默认安装版本为 8.0.27 的MySQL !!" + colorEcho ${BLUE} "本脚本默认安装版本为 8.0.27 的MySQL !!" + + + while [[ $# > 0 ]]; do + case "$1" in + -p|--port) + MysqlPort="${2}" + shift # past argument + ;; + -m|--method) + MysqlInstallMethod="${2}" + shift # past argument + ;; + -d|--data) + MysqlPersistData="${2}" + shift # past argument + ;; + -h|--help) + MysqlInstallHelp="1" + ;; + *) + echo "输入的内容有误,请检查!" + # unknown option + ;; + esac + shift # past argument or value + done + + if [ "${MysqlInstallHelp}" -eq "1" ]; then + cat - 1>& 2 << EOF +./install-release.sh [-h] [-p|--port 3306] [-m|--method binary|docker] + -h, --help 打印此安装帮助说明 + -p, --port 安装Mysql的端口,如果不指定此参数,则默为3306 + -m, --method 安装Mysql的方式,binary == 源码编译安装,docker == 使用docker安装;不指定则使用binary +EOF + return 0 + fi + +# echo $MysqlPort +# echo $MysqlInstallMethod + + if [[ ${MysqlInstallMethod} == "binary" ]]; then + installMysqlBinary ${MysqlPort} + else + installMysqlDocker ${MysqlPort} ${MysqlPersistData} + fi + + FunctionEnd +} + +installMysqlBinary() { + MysqlPort="" + Latest_Mysql_Version="" + + if [[ "$1" -ne " " ]]; then + MysqlPort="$1" + echo "mysql Port = ${MysqlPort}" + fi + + echo "InstallMysqlBinary" + + if [[ "${LinuxReleaseVersion}" == "centos" ]]; then + colorEcho ${BLUE} "当前系统发行版为 centos !" + colorEcho ${BLUE} "开始安装mysql官方的yum源!!" + echo "" + rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm + + colorEcho ${BLUE} "可以安装的 mysql-server 版本为:" + yum list mysql-community-server | grep mysql-community-server + echo "" + Latest_Mysql_Version=$(yum list mysql-community-server | grep mysql-community-server | awk '{print $2}' ) + colorEcho ${BLUE} "开始安装最新版本:" + installDemandSoftwares mysql-community-server-${Latest_Mysql_Version} mysql-community-server-${Latest_Mysql_Version} + else + colorEcho ${BLUE} "当前系统发行版为 ubuntu/debain !" + colorEcho ${BLUE} "可以安装的 mysql-server 版本为:" + apt-cache madison mysql-server | awk '{print$3}' + echo "" + Latest_Mysql_Version=$(apt-cache madison mysql-server | head -n 1 | awk '{print$3}') + colorEcho ${BLUE} "开始安装最新版本:${Latest_Mysql_Version}" + + installDemandSoftwares mysql-server=${Latest_Mysql_Version} mysql-client=${Latest_Mysql_Version} + fi + + FunctionSuccess + colorEcho ${BLUE} "准备启动Mysql Server的服务 !!!" + systemctl start mysqld + FunctionSuccess + colorEcho ${BLUE} "准备配置Mysql 服务的开机启动 !!!" + systemctl enable mysqld + FunctionSuccess +} + +installMysqlDocker(){ + MysqlPort="" + MysqlPersistData="" + + MysqlPort="$1" + echo "mysql Port = ${MysqlPort}" + + MysqlPersistData="$2" + echo "mysql persist data path = ${MysqlPersistData}" + + echo "InstallMysqlDocker" + echo "" + + echo "开始启动docker-mysql !!" + # https://hub.docker.com/r/bitnami/mysql#configuration + # 需要准备一个目录方式 mysql.conf文件 + # 目录权限需要处理 + mkdir -p ${MysqlPersistData} + chown -R 1001:1001 ${MysqlPersistData} + + docker run -d \ + -e MYSQL_ROOT_USER=root \ + -e MYSQL_ROOT_PASSWORD=v2ryStr@ngPa.ss \ + -e MYSQL_CHARACTER_SET=utf8mb4 \ + -e MYSQL_COLLATE=utf8mb4_bin \ + -e MYSQL_DATABASE=demo \ + -e MYSQL_USER=wdd \ + -e MYSQL_PASSWORD=wdd14Fk@Clever \ + -e MYSQL_PORT_NUMBER=${MysqlPort} \ + -e MYSQL_AUTHENTICATION_PLUGIN=mysql_native_password \ + -v ${MysqlPersistData}:/bitnami/mysql/data \ + --name mysql-server \ + --network host \ + bitnami/mysql:8.0.27-debian-10-r40 + +} + +## 对外暴露的安装JDK的主函数 +InstallJDK(){ + FunctionStart + JDK_VERSION="11" + JDK_Install_Method="binary" + JDKInstallHelp="0" + + while [[ $# > 0 ]]; do + case "$1" in + -v|--version) + JDK_VERSION="${2}" + shift # past argument + ;; + -m|--method) + JDK_Install_Method="${2}" + shift # past argument + ;; + -h|--help) + JDKInstallHelp="1" + ;; + *) + echo "输入的内容有误,请检查!" + # unknown option + ;; + esac + shift # past argument or value + done + + if [ "${JDKInstallHelp}" -eq "1" ]; then + cat - 1>& 2 << EOF +./install-release.sh [-h] [-p|--Version 6379] [-m|--method binary|docker] + -h, --help 打印此安装帮助说明 + -v, --version 安装JDK的版本,如果不指定此参数,则默为11 + -m, --method 安装JDK的方式,binary == 源码编译安装,package == 使用源,package安装;不指定则使用binary +EOF + return 0 + fi + +# echo $JDKVersion +# echo $JDKInstallMethod + + if [[ ${JDK_Install_Method} == "binary" ]]; then + installJDKBinary ${JDK_VERSION} + else + installJDKPackage ${JDK_VERSION} + fi + FunctionEnd +} + +installJDKBinary() { + JDK_VERSION="" + JDK_FILENAME="" + if [[ "$1" -ne " " ]]; then + JDK_VERSION="$1" + echo "JDK Version = ${JDK_VERSION}" + fi + + echo "InstallJDKBinary" + echo "" + + echo "开始下载 JDK 的源码包!!" + + mkdir -p /usr/local/java/ + + + if [ "${JDK_VERSION}" -eq "11" ]; then + JDK_FILENAME="jdk-11.0.9" + wget https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnk8d6fazu16/b/seoul/o/jdk-11.0.9_linux-x64_bin.tar.gz + echo "JDK 二进制文件下载成功,开始解压缩!!" + tar -zxvf jdk-11.0.9_linux-x64_bin.tar.gz -C /usr/local/java/ + + else + JDK_FILENAME="jdk1.8.0_271" + wget https://objectstorage.ap-seoul-1.oraclecloud.com/n/cnk8d6fazu16/b/seoul/o/jdk-8u271-linux-x64.tar.gz + echo "JDK 二进制文件下载成功,开始解压缩!!" + tar -zxvf jdk-8u271-linux-x64.tar.gz -C /usr/local/java/ + fi + + echo "" + echo "开始配置JDK的环境变量!!!" + if [ -e /etc/profile.d/jdk-env.sh ]; then + echo "jdk的配置文件已经存在!,将会进行覆盖操作!" + cp /etc/profile.d/jdk-env.sh .jdk-env-backup.sh + + rm /usr/bin/java + fi + + cat >/etc/profile.d/jdk-env.sh <> $i 秒 <<-,准备切换shell,上文的日志输出将会消失!!" + sleep 2 + done + chsh -s /bin/zsh + zsh + else + colorEcho ${RED} "zsh 安装失败,大概率是已经安装!!小概率是无法连接GitHub服务器~~" + fi + FunctionEnd +} + +modifyZSH() { + FunctionStart + + ZSH_SOURCE="cn" + + if [[ "$1" -ne " " ]]; then + ZSH_SOURCE="$1" + echo "zsh install source = ${ZSH_SOURCE}" + fi + + colorEcho ${GREEN} "zsh应该已经安装成功!!!" + colorEcho ${BLUE} "开始修改zsh的相关配置信息,使其更加好用…………" + echo "" + cat >~/oh-my-zsh-plugins-list.txt <>/etc/hosts + colorEcho ${BLUE} "正在写入docker的daemon配置文件……" + cat >>/etc/docker/daemon.json < +# Thanks: LookBack +# URL: https://teddysun.com/444.html +# https://github.com/teddysun/across/blob/master/bench.sh +# +trap _exit INT QUIT TERM + +_red() { + printf '\033[0;31;31m%b\033[0m' "$1" +} + +_green() { + printf '\033[0;31;32m%b\033[0m' "$1" +} + +_yellow() { + printf '\033[0;31;33m%b\033[0m' "$1" +} + +_blue() { + printf '\033[0;31;36m%b\033[0m' "$1" +} + +_exists() { + local cmd="$1" + if eval type type > /dev/null 2>&1; then + eval type "$cmd" > /dev/null 2>&1 + elif command > /dev/null 2>&1; then + command -v "$cmd" > /dev/null 2>&1 + else + which "$cmd" > /dev/null 2>&1 + fi + local rt=$? + return ${rt} +} + +_exit() { + _red "\nThe script has been terminated.\n" + # clean up + rm -fr speedtest.tgz speedtest-cli benchtest_* + exit 1 +} + +get_opsy() { + [ -f /etc/redhat-release ] && awk '{print $0}' /etc/redhat-release && return + [ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return + [ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return +} + +next() { + printf "%-70s\n" "-" | sed 's/\s/-/g' +} + +speed_test() { + local nodeName="$2" + [ -z "$1" ] && ./speedtest-cli/speedtest --progress=no --accept-license --accept-gdpr > ./speedtest-cli/speedtest.log 2>&1 || \ + ./speedtest-cli/speedtest --progress=no --server-id=$1 --accept-license --accept-gdpr > ./speedtest-cli/speedtest.log 2>&1 + if [ $? -eq 0 ]; then + local dl_speed=$(awk '/Download/{print $3" "$4}' ./speedtest-cli/speedtest.log) + local up_speed=$(awk '/Upload/{print $3" "$4}' ./speedtest-cli/speedtest.log) + local latency=$(awk '/Latency/{print $2" "$3}' ./speedtest-cli/speedtest.log) + if [[ -n "${dl_speed}" && -n "${up_speed}" && -n "${latency}" ]]; then + printf "\033[0;33m%-18s\033[0;32m%-18s\033[0;31m%-20s\033[0;36m%-12s\033[0m\n" " ${nodeName}" "${up_speed}" "${dl_speed}" "${latency}" + fi + fi +} + +speed() { + speed_test '' 'Speedtest.net' + speed_test '21541' 'Los Angeles, US' + speed_test '43860' 'Dallas, US' + speed_test '40879' 'Montreal, CA' + speed_test '24215' 'Paris, FR' + speed_test '28922' 'Amsterdam, NL' + speed_test '24447' 'Shanghai, CN' + speed_test '26352' 'Nanjing, CN' + speed_test '27594' 'Guangzhou, CN' + speed_test '32155' 'Hongkong, CN' + speed_test '6527' 'Seoul, KR' + speed_test '7311' 'Singapore, SG' + speed_test '21569' 'Tokyo, JP' +} + +io_test() { + (LANG=C dd if=/dev/zero of=benchtest_$$ bs=512k count=$1 conv=fdatasync && rm -f benchtest_$$ ) 2>&1 | awk -F, '{io=$NF} END { print io}' | sed 's/^[ \t]*//;s/[ \t]*$//' +} + +calc_size() { + local raw=$1 + local total_size=0 + local num=1 + local unit="KB" + if ! [[ ${raw} =~ ^[0-9]+$ ]] ; then + echo "" + return + fi + if [ "${raw}" -ge 1073741824 ]; then + num=1073741824 + unit="TB" + elif [ "${raw}" -ge 1048576 ]; then + num=1048576 + unit="GB" + elif [ "${raw}" -ge 1024 ]; then + num=1024 + unit="MB" + elif [ "${raw}" -eq 0 ]; then + echo "${total_size}" + return + fi + total_size=$( awk 'BEGIN{printf "%.1f", '$raw' / '$num'}' ) + echo "${total_size} ${unit}" +} + +check_virt(){ + _exists "dmesg" && virtualx="$(dmesg 2>/dev/null)" + if _exists "dmidecode"; then + sys_manu="$(dmidecode -s system-manufacturer 2>/dev/null)" + sys_product="$(dmidecode -s system-product-name 2>/dev/null)" + sys_ver="$(dmidecode -s system-version 2>/dev/null)" + else + sys_manu="" + sys_product="" + sys_ver="" + fi + if grep -qa docker /proc/1/cgroup; then + virt="Docker" + elif grep -qa lxc /proc/1/cgroup; then + virt="LXC" + elif grep -qa container=lxc /proc/1/environ; then + virt="LXC" + elif [[ -f /proc/user_beancounters ]]; then + virt="OpenVZ" + elif [[ "${virtualx}" == *kvm-clock* ]]; then + virt="KVM" + elif [[ "${sys_product}" == *KVM* ]]; then + virt="KVM" + elif [[ "${cname}" == *KVM* ]]; then + virt="KVM" + elif [[ "${cname}" == *QEMU* ]]; then + virt="KVM" + elif [[ "${virtualx}" == *"VMware Virtual Platform"* ]]; then + virt="VMware" + elif [[ "${sys_product}" == *"VMware Virtual Platform"* ]]; then + virt="VMware" + elif [[ "${virtualx}" == *"Parallels Software International"* ]]; then + virt="Parallels" + elif [[ "${virtualx}" == *VirtualBox* ]]; then + virt="VirtualBox" + elif [[ -e /proc/xen ]]; then + if grep -q "control_d" "/proc/xen/capabilities" 2>/dev/null; then + virt="Xen-Dom0" + else + virt="Xen-DomU" + fi + elif [ -f "/sys/hypervisor/type" ] && grep -q "xen" "/sys/hypervisor/type"; then + virt="Xen" + elif [[ "${sys_manu}" == *"Microsoft Corporation"* ]]; then + if [[ "${sys_product}" == *"Virtual Machine"* ]]; then + if [[ "${sys_ver}" == *"7.0"* || "${sys_ver}" == *"Hyper-V" ]]; then + virt="Hyper-V" + else + virt="Microsoft Virtual Machine" + fi + fi + else + virt="Dedicated" + fi +} + +ipv4_info() { + local org="$(wget -q -T10 -O- ipinfo.io/org)" + local city="$(wget -q -T10 -O- ipinfo.io/city)" + local country="$(wget -q -T10 -O- ipinfo.io/country)" + local region="$(wget -q -T10 -O- ipinfo.io/region)" + if [[ -n "$org" ]]; then + echo " Organization : $(_blue "$org")" + fi + if [[ -n "$city" && -n "country" ]]; then + echo " Location : $(_blue "$city / $country")" + fi + if [[ -n "$region" ]]; then + echo " Region : $(_yellow "$region")" + fi + if [[ -z "$org" ]]; then + echo " Region : $(_red "No ISP detected")" + fi +} + +install_speedtest() { + if [ ! -e "./speedtest-cli/speedtest" ]; then + sys_bit="" + local sysarch="$(uname -m)" + if [ "${sysarch}" = "unknown" ] || [ "${sysarch}" = "" ]; then + local sysarch="$(arch)" + fi + if [ "${sysarch}" = "x86_64" ]; then + sys_bit="x86_64" + fi + if [ "${sysarch}" = "i386" ] || [ "${sysarch}" = "i686" ]; then + sys_bit="i386" + fi + if [ "${sysarch}" = "armv8" ] || [ "${sysarch}" = "armv8l" ] || [ "${sysarch}" = "aarch64" ] || [ "${sysarch}" = "arm64" ]; then + sys_bit="aarch64" + fi + if [ "${sysarch}" = "armv7" ] || [ "${sysarch}" = "armv7l" ]; then + sys_bit="armhf" + fi + if [ "${sysarch}" = "armv6" ]; then + sys_bit="armel" + fi + [ -z "${sys_bit}" ] && _red "Error: Unsupported system architecture (${sysarch}).\n" && exit 1 + url1="https://install.speedtest.net/app/cli/ookla-speedtest-1.1.1-linux-${sys_bit}.tgz" + url2="https://dl.lamp.sh/files/ookla-speedtest-1.1.1-linux-${sys_bit}.tgz" + wget --no-check-certificate -q -T10 -O speedtest.tgz ${url1} + if [ $? -ne 0 ]; then + wget --no-check-certificate -q -T10 -O speedtest.tgz ${url2} + [ $? -ne 0 ] && _red "Error: Failed to download speedtest-cli.\n" && exit 1 + fi + mkdir -p speedtest-cli && tar zxf speedtest.tgz -C ./speedtest-cli && chmod +x ./speedtest-cli/speedtest + rm -f speedtest.tgz + fi + printf "%-18s%-18s%-20s%-12s\n" " Node Name" "Upload Speed" "Download Speed" "Latency" +} + +print_intro() { + echo "-------------------- A Bench.sh Script By Teddysun -------------------" + echo " Version : $(_green v2022-06-01)" + echo " Usage : $(_red "wget -qO- bench.sh | bash")" +} + +# Get System information +get_system_info() { + cname=$( awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' ) + cores=$( awk -F: '/processor/ {core++} END {print core}' /proc/cpuinfo ) + freq=$( awk -F'[ :]' '/cpu MHz/ {print $4;exit}' /proc/cpuinfo ) + ccache=$( awk -F: '/cache size/ {cache=$2} END {print cache}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' ) + cpu_aes=$( grep -i 'aes' /proc/cpuinfo ) + cpu_virt=$( grep -Ei 'vmx|svm' /proc/cpuinfo ) + tram=$( LANG=C; free | awk '/Mem/ {print $2}' ) + tram=$( calc_size $tram ) + uram=$( LANG=C; free | awk '/Mem/ {print $3}' ) + uram=$( calc_size $uram ) + swap=$( LANG=C; free | awk '/Swap/ {print $2}' ) + swap=$( calc_size $swap ) + uswap=$( LANG=C; free | awk '/Swap/ {print $3}' ) + uswap=$( calc_size $uswap ) + up=$( awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60} {printf("%d days, %d hour %d min\n",a,b,c)}' /proc/uptime ) + if _exists "w"; then + load=$( LANG=C; w | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//' ) + elif _exists "uptime"; then + load=$( LANG=C; uptime | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//' ) + fi + opsy=$( get_opsy ) + arch=$( uname -m ) + if _exists "getconf"; then + lbit=$( getconf LONG_BIT ) + else + echo ${arch} | grep -q "64" && lbit="64" || lbit="32" + fi + kern=$( uname -r ) + disk_total_size=$( LANG=C; df -t simfs -t ext2 -t ext3 -t ext4 -t btrfs -t xfs -t vfat -t ntfs -t swap --total 2>/dev/null | grep total | awk '{ print $2 }' ) + disk_total_size=$( calc_size $disk_total_size ) + disk_used_size=$( LANG=C; df -t simfs -t ext2 -t ext3 -t ext4 -t btrfs -t xfs -t vfat -t ntfs -t swap --total 2>/dev/null | grep total | awk '{ print $3 }' ) + disk_used_size=$( calc_size $disk_used_size ) + tcpctrl=$( sysctl net.ipv4.tcp_congestion_control | awk -F ' ' '{print $3}' ) +} +# Print System information +print_system_info() { + if [ -n "$cname" ]; then + echo " CPU Model : $(_blue "$cname")" + else + echo " CPU Model : $(_blue "CPU model not detected")" + fi + if [ -n "$freq" ]; then + echo " CPU Cores : $(_blue "$cores @ $freq MHz")" + else + echo " CPU Cores : $(_blue "$cores")" + fi + if [ -n "$ccache" ]; then + echo " CPU Cache : $(_blue "$ccache")" + fi + if [ -n "$cpu_aes" ]; then + echo " AES-NI : $(_green "Enabled")" + else + echo " AES-NI : $(_red "Disabled")" + fi + if [ -n "$cpu_virt" ]; then + echo " VM-x/AMD-V : $(_green "Enabled")" + else + echo " VM-x/AMD-V : $(_red "Disabled")" + fi + echo " Total Disk : $(_yellow "$disk_total_size") $(_blue "($disk_used_size Used)")" + echo " Total Mem : $(_yellow "$tram") $(_blue "($uram Used)")" + if [ "$swap" != "0" ]; then + echo " Total Swap : $(_blue "$swap ($uswap Used)")" + fi + echo " System uptime : $(_blue "$up")" + echo " Load average : $(_blue "$load")" + echo " OS : $(_blue "$opsy")" + echo " Arch : $(_blue "$arch ($lbit Bit)")" + echo " Kernel : $(_blue "$kern")" + echo " TCP CC : $(_yellow "$tcpctrl")" + echo " Virtualization : $(_blue "$virt")" +} + +print_io_test() { + freespace=$( df -m . | awk 'NR==2 {print $4}' ) + if [ -z "${freespace}" ]; then + freespace=$( df -m . | awk 'NR==3 {print $3}' ) + fi + if [ ${freespace} -gt 1024 ]; then + writemb=2048 + io1=$( io_test ${writemb} ) + echo " I/O Speed(1st run) : $(_yellow "$io1")" + io2=$( io_test ${writemb} ) + echo " I/O Speed(2nd run) : $(_yellow "$io2")" + io3=$( io_test ${writemb} ) + echo " I/O Speed(3rd run) : $(_yellow "$io3")" + ioraw1=$( echo $io1 | awk 'NR==1 {print $1}' ) + [ "`echo $io1 | awk 'NR==1 {print $2}'`" == "GB/s" ] && ioraw1=$( awk 'BEGIN{print '$ioraw1' * 1024}' ) + ioraw2=$( echo $io2 | awk 'NR==1 {print $1}' ) + [ "`echo $io2 | awk 'NR==1 {print $2}'`" == "GB/s" ] && ioraw2=$( awk 'BEGIN{print '$ioraw2' * 1024}' ) + ioraw3=$( echo $io3 | awk 'NR==1 {print $1}' ) + [ "`echo $io3 | awk 'NR==1 {print $2}'`" == "GB/s" ] && ioraw3=$( awk 'BEGIN{print '$ioraw3' * 1024}' ) + ioall=$( awk 'BEGIN{print '$ioraw1' + '$ioraw2' + '$ioraw3'}' ) + ioavg=$( awk 'BEGIN{printf "%.1f", '$ioall' / 3}' ) + echo " I/O Speed(average) : $(_yellow "$ioavg MB/s")" + else + echo " $(_red "Not enough space for I/O Speed test!")" + fi +} + +print_end_time() { + end_time=$(date +%s) + time=$(( ${end_time} - ${start_time} )) + if [ ${time} -gt 60 ]; then + min=$(expr $time / 60) + sec=$(expr $time % 60) + echo " Finished in : ${min} min ${sec} sec" + else + echo " Finished in : ${time} sec" + fi + date_time=$(date '+%Y-%m-%d %H:%M:%S %Z') + echo " Timestamp : $date_time" +} + +! _exists "wget" && _red "Error: wget command not found.\n" && exit 1 +! _exists "free" && _red "Error: free command not found.\n" && exit 1 +start_time=$(date +%s) +get_system_info +check_virt +clear +print_intro +next +print_system_info +ipv4_info +next +print_io_test +next +install_speedtest && speed && rm -fr speedtest-cli +next +print_end_time +next \ No newline at end of file