Files
shell-scripts/Public/lib/wdd-lib-env.sh
2023-10-20 14:10:20 +08:00

526 lines
13 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
. ./wdd-lib-log.sh
. ./wdd-lib-sys.sh
host_arch_version=""
host_arch=""
#### CollectSystemInfo ####
server_name=""
server_ip_pb_v4=""
server_ip_in_v4=""
server_ip_pb_v6=""
server_ip_in_v6=""
location=""
provider=""
manage_port=""
cpu_brand=""
cpu_core=""
memory_total=""
disk_total=""
disk_usage=""
os_info=""
os_kernel_info=""
tcp_control=""
virtualization=""
io_speed=""
machine_id=""
arch_info=""
agent_version=""
### tmp usage
io_avg=""
public_ipv4=""
inner_ipv4=""
public_ipv6=""
inner_ipv6=""
country=""
region=""
city=""
org=""
manage_port=""
machine_number=""
l_bit=""
#### CollectSystemInfo ####
#######################################
# description
# Arguments:
# 1
#######################################
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]*$//'
}
#######################################
# description
# Arguments:
# 1
# Returns:
# <unknown> ...
#######################################
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}"
}
#######################################
# description
# Arguments:
# None
# Returns:
# <unknown> ...
#######################################
get_host_arch_info() {
FunctionStart "开始获取系统架构信息!"
[ -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
FunctionEnd
}
#######################################
# description
# Globals:
# freespace
# io1
# io2
# io3
# ioall
# ioavg
# ioraw1
# ioraw2
# ioraw3
# writemb
# Arguments:
# None
#######################################
start_io_test() {
FunctionStart "开始测试IO速度"
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=$(go_iotest ${writemb})
log "I/O Speed(1st run) : $io1)"
io2=$(go_iotest ${writemb})
log "I/O Speed(2st run) : $io2)"
io3=$(go_iotest ${writemb})
log "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'}')
io_avg=$(awk 'BEGIN{printf "%.1f", '$ioall' / 3}')
log "I/O Speed(average) : $io_avg MB/s)"
else
echo " $(_red "Not enough space for I/O Speed test!")"
fi
FunctionEnd
}
#######################################
# description
# Globals:
# cpu_name
# sys_manu
# sys_product
# sys_ver
# virt
# virtual_x
# Arguments:
# None
#######################################
check_virtualization() {
FunctionStart "开始收集服务器虚拟化信息!"
local virtual_x
if command_exists "dmesg"; then
virtual_x="$(dmesg 2>/dev/null)"
fi
local sys_manu
local sys_product
local sys_ver
if command_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 [[ ${virtual_x} == *kvm-clock* ]]; then
virt="KVM"
elif [[ ${sys_product} == *KVM* ]]; then
virt="KVM"
elif [[ ${cpu_name} == *KVM* ]]; then
virt="KVM"
elif [[ ${cpu_name} == *QEMU* ]]; then
virt="KVM"
elif [[ ${virtual_x} == *"VMware Virtual Platform"* ]]; then
virt="VMware"
elif [[ ${sys_product} == *"VMware Virtual Platform"* ]]; then
virt="VMware"
elif [[ ${virtual_x} == *"Parallels Software International"* ]]; then
virt="Parallels"
elif [[ ${virtual_x} == *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
FunctionEnd
}
#######################################
# description
# Globals:
# manage_port
# tmp_manage_ports
# Arguments:
# None
#######################################
get_manage_port() {
FunctionStart "开始收集服务器 管理端口 信息!"
local tmp_manage_ports
tmp_manage_ports=$(netstat -ntulp | grep sshd | grep -w tcp | grep -v "127.0.0.1" | awk '{print$4}' | cut -d":" -f2)
manage_port=$(echo "$tmp_manage_ports" | tr '\n' ' ')
log "manage Port is => $manage_port"
FunctionEnd
}
#######################################
# description
# Globals:
# city
# country
# org
# public_ipv4
# region
# Arguments:
# None
#######################################
get_ipv4_info() {
FunctionStart "开始收集服务器IP信息"
# public ip info
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)"
public_ipv6="$(curl -q --max-time 5 -6 https://ifconfig.co/ip)"
if [ -z "$public_ipv4" ]; then
public_ipv4=" "
fi
if [ -z "$public_ipv6" ]; then
public_ipv6=" "
fi
# inner ipinfo
local interface_prefix=("[[:space:]]eth[0-9]{1,2}" "[[:space:]]ens[0-9]{1,3}" "[[:space:]]eno[0-9]{1,3}" "[[:space:]]enp[0-9]{1,2}")
local real_interface="eth90"
local interface
for interface in "${interface_prefix[@]}"; do
if ip link show | grep -oE "${interface}" | head -1; then
real_interface=$(ip link show | grep -oE "${interface}" | head -1 | cut -d" " -f2)
echo "当前主机的真实内网网卡为 => [$real_interface]"
break
fi
done
# 提取IPv4地址CIDR格式
local ipv4_regex="inet[[:space:]](25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/[0-9]{1,2}"
# 提取IPv6地址CIDR格式
local ipv6_regex="inet6[[:space:]]([0-9a-fA-F]{0,4}(:[0-9a-fA-F]{0,4}){1,7})\/[0-9]{1,3}"
# 查找IPv4地址
inner_ipv4=$(ip addr show "$real_interface" | grep -oE "$ipv4_regex" | cut -d" " -f2)
echo "Interface: $real_interface, IPv4 Address: $inner_ipv4"
# 查找IPv6地址
inner_ipv6=$(ip addr show "$real_interface" | grep -oE "$ipv6_regex" | cut -d" " -f2)
echo "Interface: $real_interface, IPv4 Address: $inner_ipv6"
FunctionEnd
}
#######################################
# description
# Globals:
# LANG
# arch
# c_cache
# cores
# cpu_aes
# cpu_name
# cpu_virt
# disk_total_size
# disk_used_size
# freq
# kern
# lbit
# load
# opsy
# swap
# tcp_ctrl
# tram
# unused_ram
# unused_swap
# up
# Arguments:
# None
#######################################
collect_system_info() {
FunctionStart "开始收集系统信息!"
check_sys
cpu_name=$(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)
local c_cache
local cpu_aes
local cpu_virt
c_cache=$(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")
local unused_ram
unused_ram=$(
LANG=C
free | awk '/Mem/ {print $3}'
)
unused_ram=$(calc_size "$unused_ram")
local swap
swap=$(
LANG=C
free | awk '/Swap/ {print $2}'
)
swap=$(calc_size "$swap")
local unused_swap
unused_swap=$(
LANG=C
free | awk '/Swap/ {print $3}'
)
unused_swap=$(calc_size "$unused_swap")
local up
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)
local load
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_host_arch_info)
arch=$(uname -m)
local l_bit
if command_exists "getconf"; then
l_bit=$(getconf LONG_BIT)
else
echo "${arch}" | grep -q "64" && l_bit="64" || l_bit="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")
tcp_ctrl=$(sysctl net.ipv4.tcp_congestion_control | awk -F ' ' '{print $3}')
local machine_number=""
if [[ $(cut -d"-" -f 3 </etc/hostname | grep -c '^[0-9][0-9]') -gt 0 ]]; then
machine_number=$(cut -d"-" -f 3 </etc/hostname)
else
machine_number=99
fi
FunctionEnd
}
#######################################
# description
# Arguments:
# None
#######################################
#######################################
# description
# Globals:
# agent_version
# octopus_agent_path
# Arguments:
# None
#######################################
get_agent_version() {
FunctionStart "获取Agent的版本信息"
local file
for file in ${octopus_agent_path}; do
if grep -q "octopus-agent_" <"${file}"; then
agent_version=$(cut -d "_" -f4- <"${file}")
log "获取到的Agent版本信息为 => ${agent_version}"
fi
done
FunctionEnd
}
#######################################
# description
# Globals:
# agent_server_info_file
# arch
# city
# cores
# country
# cpu_name
# disk_total_size
# disk_used_size
# freq
# host_arch
# inner_ipv4
# inner_ipv6
# io_avg
# kern
# lbit
# machine_number
# manage_port
# opsy
# org
# public_ipv4
# public_ipv6
# region
# tcp_ctrl
# tram
# virt
# Arguments:
# None
#######################################
main() {
# todo
# start_iotest
get_manage_port
collect_system_info
get_ipv4_info
check_virtualization
get_agent_version
local agent_server_info_file="/octopus-agent/octopus-agent.conf"
touch "$agent_server_info_file"
cat >"$agent_server_info_file" <<EOF
serverName: ${city}-${host_arch}-${machine_number}
serverIpPbV4: $public_ipv4
serverIpInV4: $inner_ipv4
serverIpPbV6: $public_ipv6
serverIpInV6: $inner_ipv6
location: "$city $region $country"
provider: $org
managePort: $manage_port
cpuCore: "$cores @ $freq MHz"
cpuBrand: "$cpu_name"
memoryTotal: $tram
diskTotal: $disk_total_size
diskUsage: $disk_used_size
archInfo: "$arch ($l_bit Bit)"
osInfo: "$opsy"
osKernelInfo: $kern
tcpControl: $tcp_ctrl
virtualization: $virt
ioSpeed: "$io_avg MB/s"
machineId: $(cat /etc/machine-id)
agentVersion: ${agent_version}
EOF
log "agent server info has collect complete!"
log "file is => $agent_server_info_file"
}
main