#!/bin/bash
##封装函数

systeminfo() {
#++++++++++++++++++++++++++++++
##################整体介绍
####需要的预先安装的组件
####	awk	cat	virt-what
#软件包检查并安装
rpm --help >/dev/null 2>&1 && rpm -qa |grep virt-what >/dev/null 2>&1 ||yum install -y virt-what >/dev/null 2>&1 
dpkg --help >/dev/null 2>&1 && dpkg -l |grep virt-what >/dev/null 2>&1 ||apt-get install virt-what -y >/dev/null 2>&1


#+++++++++++++++++++++++++++++++
####自定义函数部分
#获取系统分支及版本
get_opsy() {
    [ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /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
}

#查看CPU是否支持64
cpu_64() {
	[ `cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l` -gt 0 ] && echo "支持" || echo "不支持"
}

#磁盘信息
disk() {

	#检查并安装smartmontools软件包
        rpm --help >/dev/null 2>&1 && rpm -qa |grep smartmontools >/dev/null 2>&1 ||yum install smartmontools -y >/dev/null 2>&1
	dpkg --help >/dev/null 2>&1 && dpkg -l |grep smartmontools >/dev/null 2>&1 ||apt-get install smartmontools -y >/dev/null 2>&1

        ls /dev/[sh]d[a-z] | while read line
        do
                #smartctl -a $line | grep "Model Family" | awk -F: '{printf "制造商:%s\n",$2}' |sed 's/^[ \t]*//;s/[ \t]*$//' >> 10
                smartctl -a $line |grep "Model Family" | awk -F: '{print $2}' |sed 's/^[ \t]*//;s/[ \t]*$//' | awk -F: '{printf " 制造商:%s \n", $0}' >> 10
                smartctl -a $line | grep "Rotation Rate" | awk -F: '{print $2}' |sed 's/^[ \t]*//;s/[ \t]*$//' |  awk -F: '{printf " 转  速:%s \n",$0}' >> 20
                smartctl -a $line | grep "Sector Size" | awk -F: '{print $2}' |sed 's/^[ \t]*//;s/[ \t]*$//' | awk -F: '{printf " 扇  区:%s \n",$0}' >> 30
                smartctl -a $line | grep "User Capacity" | awk -F: '{print $2}' |sed 's/^[ \t]*//;s/[ \t]*$//' | awk -F: '{printf " 容  量:%s \n",$0}' >> 40
                smartctl -a $line | grep "Serial Number" | awk -F: '{print $2}' |sed 's/^[ \t]*//;s/[ \t]*$//' | awk -F: '{printf " 序列号:%s \n",$0}' >> 50
                echo "$line " >> 60
		lsblk  >> 70
        done

        paste -d"|" 60 10 20 30 40 50
	echo -e "\t"
	cat 70
	rm -f 60 10 20 30 40 50 70
}

#网卡信息
net() {

	pcinetsl=$( lspci | egrep -i --color 'network|ethernet' |wc -l )

	ip address |grep ^[0-9] |awk -F: '{print $2}' |sed "s/ //g" |grep '^[ebp]' | while read line1
	do
		echo -e "$line1 " >> a
		ethtool $line1 | grep "Speed" |awk -F: '{printf " 速率:%s \n",$2}' >> b
		ethtool $line1 | grep "Duplex" |awk -F: '{printf " 双工模式:%s \n",$2}' >> c
		ethtool $line1 | grep "Supports auto-negotiation" | awk -F: '{printf " 自动协商:%s \n",$2}' >> d
		ethtool $line1 | grep "Port" |awk -F: '{printf " 网口类型:%s \n",$2}' >> e
		ethtool $line1 | grep "Link detected" |awk -F: '{printf " 链接状态:%s \n",$2}' >> f
		ip address show $line1 | grep -E "UP|DOWN" | awk -F" " '{printf " 工作状态:%s \n",$9}' >> g
		ip address show $line1 | grep "mtu" | awk -F" " '{printf " MTU:%s \n",$5}' >> h
		ip address show $line1 | grep "link/" | sed 's/^[ \t]*//;s/[ \t]*$//' | awk -F" " '{printf " MAC值:%s \n",$2}' >> i
		ip add show $line1 | grep -w "inet" |sed "s/^[ \t]*//g" |awk -F" " '{printf " %s  ",$2}'  |sed "s/ /IP地址:/1" >> j
	done

	echo -e "pci网卡数量    : $pcinetsl 张"
	paste -d"|" a b c d e f g h i j
	rm -f a b c d e f g h i j
}

#++++++++++++++++++++++++++++++
cpus=$( cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l )
cpuname=$( awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' )
cpucores=$( cat /proc/cpuinfo |grep "cores"|uniq | awk -F: '{print $2}' )
cputhread=$( cat /proc/cpuinfo |grep "processor"|wc -l )
cpuvm=$( cat /proc/cpuinfo | grep -E '(vmx|svm)'  >/dev/null 2>&1 && echo "open" || echo "close"  )
freq=$( awk -F: '/cpu MHz/ {freq=$2} END {print freq}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' )
tram=$( free -m | awk '/Mem/ {print $2}' )
uram=$( free -m | awk '/Mem/ {print $3}' )
swap=$( free -m | awk '/Swap/ {print $2}' )
uswap=$( free -m | awk '/Swap/ {print $3}' )
arch=$( uname -m )
lbit=$( getconf LONG_BIT )
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 )
load=$( w | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//' )
system=$( uname -a | awk '{print $1}')
kern=$( uname -r )
hostname=$( hostname )
#ip=$( curl -s myip.ipip.net )
ipv4=$( curl -s myip.ipip.net | awk -F ' ' '{print $2}' | awk -F ':' '{print $2}' )
ipgs=$( curl -s myip.ipip.net | awk -F ':' '{print $3}' )
opsy=$( get_opsy )
cpu64=$( cpu_64 )
vm=$( virt-what )

memmax=$( dmidecode -t 16 |grep -P 'Maximum\s+Capacity' | awk -F: '{print $2}' )
memcao=$( dmidecode -t 16 |grep "Number Of Devices" | awk -F: '{print $2}' )
memz=$( dmidecode -t 19 |grep "Range Size" |awk -F: '{print $2}' )

#内存信息
#内存厂商
memoe=$( dmidecode -t 17 |grep "Manufacturer" | sed 's/^[ \t]*//;s/[ \t]*$//' | awk -F: '{printf "厂商:%s\n" ,$2}' >12 )
memsn=$( dmidecode -t 17 |grep "Serial Number" | sed 's/^[ \t]*//;s/[ \t]*$//' | awk -F: '{printf "序列号:%s\n" ,$2}' > 23)

#内存类型
memfactor=$( dmidecode -t 17 |grep "Form Factor" | sed 's/^[ \t]*//;s/[ \t]*$//' | awk -F: '{printf "Factor:%s\n" ,$2}' > 34 )
memddr=$( dmidecode -t 17 |grep "Type:" | sed 's/^[ \t]*//;s/[ \t]*$//' | awk -F: '{printf "Type:%s\n" ,$2}' > 45 )

memhz=$( dmidecode -t 17 |grep "Configured Clock Speed:"| sed 's/^[ \t]*//;s/[ \t]*$//' | awk -F: '{printf "真实频率:%s\n" ,$2}' > 56 )
memsize=$( dmidecode -t 17 |grep "Size" | sed 's/^[ \t]*//;s/[ \t]*$//' > 67 )
meminfo=$( paste 12 34 45 56 23 67 )

#主机信息
#制造商
serveroe=$( dmidecode -t 1 | grep "Manufacturer" |sed 's/^[ \t]*//;s/[ \t]*$//' | awk -F: '{printf "制造商:%s \n" ,$2}' > 1 )
serverpn=$( dmidecode -t 1 | grep "Product Name" |sed 's/^[ \t]*//;s/[ \t]*$//' | awk -F: '{printf " 主机型号:%s \n" ,$2}' > 2 )
serverfm=$( dmidecode -t 1 | grep "Family" |sed 's/^[ \t]*//;s/[ \t]*$//' | awk -F: '{printf " Family:%s \n" ,$2}' > 3 )
serversn=$( dmidecode -t 1 | grep "Serial Number" |sed 's/^[ \t]*//;s/[ \t]*$//' | awk -F: '{printf " 主机SN码:%s \n" ,$2}' > 4 )
serverinfo=$( paste -d"|" 1 2 3 4 )


#硬盘信息
disksl=$( ls -l /dev/[sh]d[a-z] | wc -l )

#pci物理网卡信息
#pcinetsl=$( lspci | egrep -i --color 'network|ethernet' |wc -l )

####系统信息显示部分
echo -e "\n##################硬件信息##############"
echo "cpu物理数量	: $cpus 颗"
echo "CPU型号		: $cpuname"
echo "CPU核心数      	: $cpucores"
echo "CPU线程数      	:  $cputhread"
echo "CPU频率		: $freq MHz"
echo "CPU是否支持64位	: $cpu64"
echo "CPU虚拟化状态	: $cpuvm"
echo "内存插槽数量	: $memcao"
echo "最大内存支持	: $memmax"
echo "实际内存大小	: $memz"
echo -e "\n##内存信息\n$meminfo"
rm -f 12 23 34 45 56 67

echo -e "\n##主机信息\n$serverinfo"
rm -f 1 2 3 4

echo -e "\n##系统层面得到的硬盘信息"
echo "硬盘数量	: $disksl 块"
disk

echo -e "\n##网卡信息"
net

echo -e "\n##################系统信息###############"
echo "CPU负载		: $load"
echo "MEMORY		: $tram MB ($uram MB Used)"
echo "SWAP		: $swap MB ($uswap MB Used)"
echo "OS类别		: $system"
echo "内核版本	: $kern"
echo "OS版本		: $opsy"
echo "OS架构		: $arch ($lbit 位)"
echo "虚拟化		: $vm"
echo "OS运行时长	: $up"
echo "主机名		: $hostname"
echo "IPv4		: $ipv4	 $ipgs"

}
systeminfo