#!/bin/bash
#SN,SLOT接口,封装大小未采集到
getCpu(){
CPU_LIST="["
#获取CPU颗数
#CPU_COUNT=`dmidecode -t processor | grep 'Processor Information' | wc -l`
CPU_COUNT=`cat /proc/cpuinfo | grep 'physical id' | sort | uniq | wc -l`
INDEX=1
while [[ ${INDEX} -le ${CPU_COUNT} ]]
do
#品牌
CPU_BRAND=`dmidecode -t processor | grep 'Manufacturer' | sed -n ${INDEX}p | cut -f2 -d: | sed 's/^[ \t]*//g'`
#名称
NAME=`dmidecode -t processor | grep 'Socket Designation' | sed -n ${INDEX}p | cut -f2 -d: | sed 's/^[ \t]*//g'`
#型号
CPU_MODEL=`dmidecode -t processor | grep 'Version' | sed -n ${INDEX}p | cut -f2 -d: | sed 's/^[ \t]*//g'`
#线程数数
#THREAD_SIZE=`dmidecode -t processor | grep 'Thread Count' | sed -n ${INDEX}p | cut -f2 -d: | sed 's/^[ \t]*//'` #虚拟机上没取到该值
THREAD_SIZE=`cat /proc/cpuinfo | grep 'physical id' | sort | uniq -c | sed 's/^[ \t]*//g' | cut -f1 -d\ | sed -n ${INDEX}p`
#核心数
#CORE_SIZE=`cat /proc/cpuinfo | grep "cpu cores" | cut -f2 -d: | uniq | sed 's/^[ \t]*//g'`
#CPU_CORE_COUNT=`dmidecode -t processor | grep 'Core Count' | cut -f2 -d: | sed 's/^[ \t]*//'`
CORE_SIZE=`dmidecode -t processor | grep 'Core Count' | sed -n ${INDEX}p | cut -f2 -d: | sed 's/^[ \t]*//'`
#颗数,不取颗数,分别显示
#CPU_SIZE=`cat /proc/cpuinfo | grep 'physical id' | cut -f2 -d: | tail -1 | sed 's/^[ \t]*//g'`
#CPU_SIZE=$(($CPU_SIZE + 1))
#主频
#MHZ=`cat /proc/cpuinfo | grep name | cut -f2 -d@ | uniq | sed 's/^[ \t]*//g'`
MHZ=`dmidecode -t processor | grep 'Current Speed' | sed -n ${INDEX}p | cut -f2 -d: | sed 's/^[ \t]*//'`
#最大频率
MAX_SPEED=`dmidecode -t processor | grep 'Max Speed' | sed -n ${INDEX}p | cut -f2 -d: | sed 's/^[ \t]*//'`
#L3 缓存
L3_CACHE=`lscpu | grep -i 'L3 cache' | cut -f2 -d: | sed 's/^[ \t]*//'`
#电压
VOLTAGE=`dmidecode -t processor | grep 'Voltage' | sed -n ${INDEX}p | cut -f2 -d: | sed 's/^[ \t]//'`
CPU_LIST=${CPU_LIST}"{\"brand\":\"$CPU_BRAND\",\"model\":\"$CPU_MODEL\",\"threadSize\":\"$THREAD_SIZE\",\"coreSize\":\"$CORE_SIZE\",\"processorSpeed\":\"$MHZ\",\"boostProcessorSpeed\":\"$MAX_SPEED\",\"l3Cache\":\"${L3_CACHE}\",\"voltage\":\"${VOLTAGE}\",\"name\":\"${NAME}\"},"
INDEX=$((INDEX+1))
done
CPU_LIST=${CPU_LIST}")"
CPU_LIST=`echo ${CPU_LIST} | sed 's/,)$//'`
echo ${CPU_LIST}"]"
}
#内存品牌,型号,L3缓存未采集到
getMemory(){
#TOTAL_MEMORY=`cat /proc/meminfo | grep MemTotal | cut -f2 -d: | sed 's/^[ \t]*//g' | cut -f1 -d\ `
#TOTAL_MEMORY=$(($TOTAL_MEMORY/1000/1000))
MEMORY_LIST="["
#内存条数量
MEMORY_COUNT=`dmidecode -t memory | grep Size | grep -v 'No Module Installed' | grep -v 'Installed' | grep -v 'Maximum' | grep -v 'Enabled' | cut -f2 -d: | sed 's/^[ \t]*//' | cut -f1 -d\ | wc -l`
INDEX=1
while [[ ${INDEX} -le ${MEMORY_COUNT} ]]
do
#内存条大小(单个)
MEMORY_SIZE=`dmidecode -t memory | grep 'Size' | grep -v 'No Module Installed' | grep -v 'Installed' | grep -v 'Maximum' | grep -v 'Enabled' | sed -n ${INDEX}p | cut -f2 -d: | sed 's/^[ \t]//g'`
#内存类型
MEMORY_TYPE=`dmidecode -t memory | grep 'Type' | grep -v 'Detail' | grep -v 'Unknown' | grep -v 'Error' | sed -n ${INDEX}p | cut -f2 -d: | sed 's/^[ \t]*//'`
#内存频率
MEMORY_FREQUENCY=`dmidecode -t memory | grep 'Speed' | grep -v 'Unknown' | grep -v 'Clock' | sed -n ${INDEX}p | cut -f2 -d: | sed 's/^[ \t]*//'`
#内存条序列号,有些机器可能读取不到
MEMORY_SN=`dmidecode -t memory | grep 'Serial' | grep -v 'Not Specified' | sed -n ${INDEX}p | cut -f2 -d: | sed 's/^[ \t]*//'`
# 内存
MEMORY_BRAND=`dmidecode -t memory | grep 'Manufacturer' | grep -v 'Not Specified' | sed -n ${INDEX}p | cut -f2 -d: | sed 's/^[ \t]//'`
MEMORY_LIST=${MEMORY_LIST}"{\"capacity\":\"${MEMORY_SIZE}\",\"brand\":\"${MEMORY_BRAND}\",\"memoryType\":\"${MEMORY_TYPE}\",\"frequency\":\"${MEMORY_FREQUENCY}\",\"sn\":\"${MEMORY_SN}\",\"name\":\"Memory\"},"
INDEX=$((INDEX+1))
done
MEMORY_LIST=${MEMORY_LIST}")"
MEMORY_LIST=`echo ${MEMORY_LIST} | sed 's/,)$//'`
echo ${MEMORY_LIST}"]"
}
# 数据网卡:物理类型,总线类型 未采集到
# 增加ethtool后,可以采集到的数据:品牌,型号,SN,网卡接口类型
# ILO网卡:无法采集任何数据
# 未采集虚拟IP, 因为虚拟IP会导致MAC地址重复,SNMP采集交换机与主机连接信息时是根据MAC地址来关联
#########################################################
#网卡采集逻辑:
# 1. 首先判断/proc/net/bonding目录下是否有绑定网卡,如果有,则循环处理bond类型网卡
# 2. bond处理完成后,通过ifconfig命令获取输出的网卡:ifconfig | grep -v '^[ \t]' | grep -v '^$'
# 3. 循环处理每个网卡:
# 3.1 排除已经通过bond绑定过物理网卡,避免mac地址重复(snmp采集交换机与服务器连接关系时需要通过mac地址关联)
# 3.2 排除docker0,docker0的默认IP 172.17.0.1,避免IP地址重复
# 3.3 排除虚拟IP,ifconfig输出没有MAC地址的IP为虚拟IP,避免MAC地址为空重复
# 3.4 排除没有分配IP地址备用网卡(em3,em4);避免IP地址为空重复
# 4. 设置网卡的useType的规则:将取得第一个IP作为主数据IP(useType为2),后取到的全部设置为备用IP(useType为3),
#########################################################
getNetworkAdapter(){
ALL_NET="["
ls /proc/net/bonding/ > /dev/null 2>&1
BOND_EXIST="$?"
#如果存在bond,处理bond网卡
if [ ${BOND_EXIST} -eq "0" ]; then
BOND_COUNT=`ls -l /proc/net/bonding/ | awk '{print $9}' | grep -v '^$' | wc -l`
BOND_INDEX=1
while [[ ${BOND_INDEX} -le ${BOND_COUNT} ]]
do
BOND=`ls -l /proc/net/bonding | awk '{print $9}' | grep -v '^$' | sed -n ${BOND_INDEX}p`
# 查看bond是否存在,有些机器上/proc/net/bonding这个目录下有多个bond文件,但是只有一个生效,例如有bond0和bond1,但是bond0未生效(ifconfig命令查不到bond0)
ifconfig ${BOND} > /dev/null 2>&1
BOND_VALID="$?"
if [ ${BOND_VALID} -eq "0" ]; then #等于0表示bond网卡存在
NET_NAME="${BOND}"
#获取网卡速率
#判断speed文件是否存在,如果存在则直接读取文件内容,不存在就通过ethtool命令获取网卡速率
if [ -f "/sys/class/net/${BOND}/speed" ]; then
NET_SPEED=`cat /sys/class/net/${BOND}/speed`
NET_SPEED=${NET_SPEED}"Mb/s" #文件读取的没有单位,此处直接加上
else
NET_SPEED=`ethtool ${BOND} | grep 'Speed' | cut -f2 -d: | sed 's/^[ \t]//g'`
fi
#获取网卡MAC地址:先从/sys/class/net/${BOND}/address文件中取,如果文件不存在再使用ifconfig命令获取
if [ -f "cat /sys/class/net/${BOND}/address" ]; then
NET_MAC=`cat /sys/class/net/${BOND}/address | tr 'A-Z' 'a-z'`
else
NET_MAC=`ifconfig ${BOND} | egrep -o '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}' | tr 'A-Z' 'a-z'`
fi
#获取网卡IP地址
NET_IP=`ifconfig ${BOND} | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | sed -n 1p`
#获取网卡flags,暂时不获取flags
#NET_FLAGS=`ifconfig ${BOND} | egrep -o '<[A-Za-z0-9,]*>'`
#判断是否已经存在useType=2的网卡,一个主机只有一个useType为2的网卡
NET_USE_TYPE="3"
echo ${ALL_NET} | grep "\"useType\":\"2\"" > /dev/null
GREP_USE_TYPE_2="$?"
if [ "${GREP_USE_TYPE_2}" -ne "0" ]; then
#如果没有useType为2的网卡,则设置为2
NET_USE_TYPE="2"
fi
#以下内容是物理网卡的属性,bond卡是由两个物理卡绑定的逻辑卡,不存在以下属性(网卡品牌,型号,连接类型,SN),因此不采集
#根据bond文件内容获取物理卡名称
#SLAVE_INTERFACE_NAME=`cat /proc/net/bonding/bond0 | grep -i 'slave interface' | tail -1 | cut -f2 -d: | sed 's/^[ \t]//'`
#使用ethtool获取网卡的接口类型,
#NET_INTERFACE_TYPE=`ethtool ${SLAVE_INTERFACE_NAME} | grep 'Port:' | cut -f2 -d: | sed 's/^[ \t]//'`
#采集网卡品牌和型号:根据bond的Slave Interface 取得物理网卡名,再根据ethtool获取bus-info(0000:01:00.1),再根据lspci获取品牌和型号
#BUS_INFO=`ethtool -i ${SLAVE_INTERFACE_NAME} | grep -i 'bus-info' | cut -f2 -d\ | sed 's/^[ \t]//'`
#NET_BRAND=`lspci -vms ${BUS_INFO} | egrep '^Vendor' | cut -f2 -d: | sed 's/^[ \t]*//'`
#NET_MODEL=`lspci -vms ${BUS_INFO} | egrep '^Device' | tail -1 | cut -f2 -d: | sed 's/^[ \t]//'`
#网卡SN,直接将MAC地址中的:替换为-,并在前面加00-00-
#NET_SN=`echo ${NET_MAC} | sed 's/:/-/g'`
#NET_SN='00-00-'${NET_SN}
#只处理分配了IP地址的网卡,IP地址长度超过6位(最短的IP地址7位)
if [ ${#NET_IP} -gt 6 ]; then
ALL_NET=${ALL_NET}"{\"ip\":\"${NET_IP}\",\"macAddress\":\"${NET_MAC}\",\"rate\":\"${NET_SPEED}\",\"name\":\"${NET_NAME}\",\"useType\":\"${NET_USE_TYPE}\"},"
fi
#处理bond下的slave网卡, 注释掉SLAVE网卡,避免mac地址重复
#SLAVE_COUNT=`cat /proc/net/bonding/${BOND} | grep 'Slave Interface' | wc -l`
#for ((j=1; j<$((SLAVE_COUNT + 1)); j++)) {
# SLAVE_NET_NAME=`cat /proc/net/bonding/${BOND} | grep 'Slave Interface' | sed -n ${j}p | cut -f2 -d: | sed 's/^[ \t]*//'`
# SLAVE_NET_SPEED=`cat /sys/class/net/${SLAVE_NET_NAME}/speed`
# SLAVE_NET_MAC=`cat /sys/class/net/${SLAVE_NET_NAME}/address`
# #SLAVE_NET_PORT=`ethtool ${SLAVE_NET_NAME} | grep 'Port' | cut -f2 -d: | sed 's/^[ \t]//'`
# #SLAVE网卡没有IP地址
# ALL_NET=${ALL_NET}"{\"macAddress\":\"${SLAVE_NET_MAC}\",\"rate\":\"${SLAVE_NET_SPEED} Mbps\",\"name\":\"${SLAVE_NET_NAME}\",\"master\":\"${BOND}\",\"useType\":\"3\"},"
# SLAVE_NET_ARR+=(${SLAVE_NET_NAME})
#}
fi
BOND_INDEX=$((BOND_INDEX+1))
done
fi
####################bond处理结束##################
####################开始处理非bond的网卡######################
IFCONFIG_NET_ARR_COUNT=`ifconfig | grep -v '^[ \t]' | grep -v '^$' | wc -l`
IFCONFIG_NET_INDEX=1
while [[ ${IFCONFIG_NET_INDEX} -le ${IFCONFIG_NET_ARR_COUNT} ]]
do
#IFCONFIG_NET_NAME=`ifconfig | grep -v '^[ \t]' | grep -v '^$' | cut -f1 -d: | sed -n ${IFCONFIG_NET_INDEX}p` # CENT OS 6格式不一样
IFCONFIG_NET_NAME=`ifconfig | grep -v '^[ \t]' | grep -v '^$' | cut -f1 -d\ | sed 's/:$//' | sed -n ${IFCONFIG_NET_INDEX}p`
echo "${ALL_NET}" | grep "\"name\":\"${IFCONFIG_NET_NAME}\"" > /dev/null
EXIST_NET="$?"
#当名称不存在时才处理(跳过前面已经添加的bond卡)
if [ ${EXIST_NET} -ne "0" ];then
#检测是不是本地还回
ethtool -i ${IFCONFIG_NET_NAME} > /dev/null 2>&1
IS_PHYSICAL_NET="$?"
#获取IP
IFCONFIG_NET_IP=`ifconfig ${IFCONFIG_NET_NAME} | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | sed -n 1p`
#以下采集项只有当不是还回卡的时候才采集
if [ ${IS_PHYSICAL_NET} -eq "0" ]; then
#获取mac,先根据ifcfg-xx文件获取,直接通过ifconfig可能无法获取到真实的mac,因为SLAVE卡的MAC地址是相同的,都是MASTER指定的MAC
IFCONFIG_NET_MAC=""
if [ -f "/etc/sysconfig/network-scripts/ifcfg-${IFCONFIG_NET_NAME}" ]; then
IFCONFIG_NET_MAC=`cat "/etc/sysconfig/network-scripts/ifcfg-${IFCONFIG_NET_NAME}" | egrep -o '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}' | tr 'A-Z' 'a-z'`
fi
MAC_LEN=`echo "${IFCONFIG_NET_MAC}" | wc -c`
if [ ${MAC_LEN} -le 17 ]; then
IFCONFIG_NET_MAC=`ifconfig ${IFCONFIG_NET_NAME} | egrep -o '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}' | tr 'A-Z' 'a-z'`
fi
#获取网卡速率, 有问题 TODO
`cat /sys/class/net/${IFCONFIG_NET_NAME}/speed > /dev/null 2>&1`
CAT_SPEED="$?"
if [ ${CAT_SPEED} -eq "0" ]; then
IFCONFIG_NET_SPEED=`cat /sys/class/net/${IFCONFIG_NET_NAME}/speed`
IFCONFIG_NET_SPEED=${IFCONFIG_NET_SPEED}"Mb/s" #文件读取的没有单位,此处直接加上
else
IFCONFIG_NET_SPEED=`ethtool ${IFCONFIG_NET_NAME} | grep 'Speed' | cut -f2 -d: | sed 's/^[ \t]//g'`
fi
#判断是否已经存在useType=2的网卡
NET_USE_TYPE="3"
echo ${ALL_NET} | grep "\"useType\":\"2\"" > /dev/null
GREP_USE_TYPE_2="$?"
if [ "${GREP_USE_TYPE_2}" -ne "0" ] && [ "${IFCONFIG_NET_NAME}" != "docker0" ] && [ "${IFCONFIG_NET_NAME}" != "lo" ]; then #不等于0表示没找到useType为2
#如果没有useType为2的网卡,则设置为2
NET_USE_TYPE="2"
fi
#使用ethtool获取网卡的接口类型,
NET_INTERFACE_TYPE=`ethtool ${IFCONFIG_NET_NAME} | grep 'Port:' | cut -f2 -d: | sed 's/^[ \t]//'`
#采集网卡品牌和型号:根据ethtool获取bus-info(0000:01:00.1),再根据lspci获取品牌和型号
BUS_INFO=`ethtool -i ${IFCONFIG_NET_NAME} | grep -i 'bus-info' | cut -f2 -d\ | sed 's/^[ \t]//'`
BUS_INFO_LEN=`echo ${BUS_INFO} | wc -c`
if [ ${BUS_INFO_LEN} -gt 1 ]; then
NET_BRAND=`lspci -vms ${BUS_INFO} | egrep '^Vendor' | cut -f2 -d: | sed 's/^[ \t]*//'`
NET_MODEL=`lspci -vms ${BUS_INFO} | egrep '^Device' | tail -1 | cut -f2 -d: | sed 's/^[ \t]//'`
fi
#网卡SN,直接将MAC地址中的:替换为-,并在前面加00-00-
NET_SN=`echo ${IFCONFIG_NET_MAC} | sed 's/:/-/g'`
NET_SN='00-00-'${NET_SN}
ALL_NET=${ALL_NET}"{\"ip\":\"${IFCONFIG_NET_IP}\",\"macAddress\":\"${IFCONFIG_NET_MAC}\",\"rate\":\"${IFCONFIG_NET_SPEED}\",\"name\":\"${IFCONFIG_NET_NAME}\",\"brand\":\"${NET_BRAND}\",\"model\":\"${NET_MODEL}\",\"networkInterfaceType\":\"${NET_INTERFACE_TYPE}\",\"sn\":\"${NET_SN}\",\"useType\":\"${NET_USE_TYPE}\"},"
else
#虚拟IP,useType直接设置为3
NET_USE_TYPE="3"
#虚拟IP:只上报名称和IP
ALL_NET=${ALL_NET}"{\"ip\":\"${IFCONFIG_NET_IP}\",\"name\":\"${IFCONFIG_NET_NAME}\",\"useType\":\"${NET_USE_TYPE}\"},"
fi
fi
IFCONFIG_NET_INDEX=$((IFCONFIG_NET_INDEX+1))
done
RESULT=${ALL_NET}")"
RESULT=`echo ${RESULT} | sed 's/,)$//'`
echo ${RESULT}"]"
#return ${RESULT}
}
#获取IP的规则:
#先检查bond,如果有则取bond的IP,取到后直接退出;没有取到bond再通过ifconfig命令获取其他网卡的IP,只要取到一个ip即可
getIp(){
NET_IP=""
ls /proc/net/bonding/ > /dev/null 2>&1
BOND_EXIST="$?"
if [ ${BOND_EXIST} -eq "0" ]; then
BOND_COUNT=`ls -l /proc/net/bonding/ | awk '{print $9}' | grep -v '^$' | wc -l`
INDEX=1
while [[ ${INDEX} -le ${BOND_COUNT} ]]
do
BOND=`ls -l /proc/net/bonding | awk '{print $9}' | grep -v '^$' | sed -n ${INDEX}p`
#NET_IP=`ifconfig ${BOND} | grep 'inet ' | sed 's/^[ \t]*//' | cut -f2 -d\ `
NET_IP=`ifconfig ${BOND} | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | sed -n 1p`
if [ ${#NET_IP} -gt 6 ]; then
break
fi
INDEX=$((INDEX+1))
done
fi
if [ ${#NET_IP} -gt 6 ]; then
echo "\"ip\":\"${NET_IP}\""
else
IFCONFIG_NET_ARR_COUNT=`ifconfig | grep -v '^[ \t]' | grep -v '^$' | wc -l`
NET_INDEX=1
while [[ ${NET_INDEX} -le ${IFCONFIG_NET_ARR_COUNT} ]]
do
#IFCONFIG_NET_NAME=`ifconfig | grep -v '^[ \t]' | grep -v '^$' | cut -f1 -d: | sed -n ${k}p`
IFCONFIG_NET_NAME=`ifconfig | grep -v '^[ \t]' | grep -v '^$' | cut -f1 -d\ | sed 's/:$//' | sed -n ${NET_INDEX}p`
echo ${IFCONFIG_NET_NAME} | grep "docker" > /dev/null
GREP_DOCKER="$?"
#不处理lo和docker的IP
if [ "${IFCONFIG_NET_NAME}" != "lo" ] && [ "${GREP_DOCKER}" != "0" ] && [ "${IFCONFIG_NET_NAME}" != "idrac" ]; then
#NET_IP=`ifconfig ${IFCONFIG_NET_NAME} | grep 'inet ' | sed 's/^[ \t]*//' | cut -f2 -d\ `
NET_IP=`ifconfig ${IFCONFIG_NET_NAME} | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | sed -n 1p`
if [ ${#NET_IP} -gt 6 ]; then
echo "\"ip\":\"${NET_IP}\""
break
fi
fi
NET_INDEX=$((NET_INDEX+1))
done
fi
#return ${RESULT}
}
#磁盘个数,转速,RAID类型,接口类型,平均传输率,高速缓存,电源无法采集到,需要使用第三方工具 TODO
getDisk(){
DISK_COUNT=`fdisk -l | grep 'Disk' | grep -v 'Disk identifier' | grep -v 'label' | grep -v 'mapper' | wc -l`
ALL_DISK="["
DISK_INDEX=1
while [[ ${DISK_INDEX} -le ${DISK_COUNT} ]]
do
DISK=`fdisk -l | grep 'Disk' | grep -v 'Disk identifier' | grep -v 'label' | grep -v 'mapper' | sed -n ${DISK_INDEX}p`
#DISK_NAME=`echo $DISK | cut -f2 -d\ | cut -f1 -d:`
#DISK_SIZE=`echo $DISK | cut -f3,4 -d\ | cut -f1 -d,`
#磁盘名称
DISK_NAME=`lsblk -o "NAME,TYPE" | grep disk | sed -n ${DISK_INDEX}p | cut -f1 -d\ `
#磁盘容量
DISK_CAPACITY=`lsblk -o "SIZE,TYPE" | grep disk | sed -n ${DISK_INDEX}p | sed 's/^[ \t]*//' | cut -f1 -d\ `
#磁盘SN
DISK_SN=""
lsblk -o "SERIAL,TYPE" > /dev/null 2>&1
LSBLK_SERIAL_EXIST="$?"
if [ ${LSBLK_SERIAL_EXIST} -eq "0" ]; then
DISK_SN=`lsblk -o "SERIAL,TYPE" | grep disk | sed -n ${DISK_INDEX}p | sed 's/^[ \t]*//' | cut -f1 -d\ `
fi
#磁盘类型:SSD/HDD
DISK_TYPE=`lsblk -o "ROTA,TYPE" | grep disk | sed -n ${DISK_INDEX}p | sed 's/^[ \t]*//g' | cut -f1 -d\ `
#品牌
DISK_BRAND=""
lsblk -o "VENDOR,TYPE" > /dev/null 2>&1
LSBLK_VENDOR_EXIST="$?"
if [ ${LSBLK_VENDOR_EXIST} -eq "0" ]; then
DISK_BRAND=`lsblk -o "VENDOR,TYPE" | grep disk | sed -n 1p | sed 's/^[ \t]*//g' | cut -f1 -d\ `
fi
ALL_DISK=$ALL_DISK"{\"name\":\"${DISK_NAME}\",\"capacity\":\"${DISK_CAPACITY}\",\"brand\":\"${DISK_BRAND}\",\"diskType\":\"${DISK_TYPE}\",\"sn\":\"${DISK_SN}\"},"
DISK_INDEX=$((DISK_INDEX+1))
done
ALL_DISK=$ALL_DISK")"
ALL_DISK=`echo $ALL_DISK | sed 's/,)$//'`
echo $ALL_DISK"]"
#return ${RESULT}
}
getDeviceSn(){
SN=`dmidecode -t system | grep 'Serial Number' | cut -f2 -d: | sed 's/[ \t]//'`
echo "\"sn\":\"$SN\""
}
getDeviceInfo(){
#设备序列号
SN=`dmidecode -t system | grep 'Serial Number' | cut -f2 -d: | sed 's/[ \t]//'`
#BIOS 版本
BIOS_VERSION=`dmidecode -t bios | grep Version | cut -f2 -d: | sed 's/[ \t]//'`
#型号
MODEL=`dmidecode -t system | grep 'Product Name' | cut -f2 -d: | sed 's/[ \t]//'`
#品牌
BRAND=`dmidecode -t system | grep 'Manufacturer' | cut -f2 -d: | sed 's/[ \t]//'`
#IFCONFIG; 以下的sed部分是将换行符替换为新的符号,避免json格式错误
#IFCONFIG=`ifconfig | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/#LINE_SEPERATOR#/g'`
echo "{\"sn\":\"$SN\",\"biosVersion\":\"$BIOS_VERSION\",\"model\":\"$MODEL\",\"brand\":\"$BRAND\"}"
}
getServerOs(){
#主机名
HOSTNAME=`hostname`
#操作系统名称
NAME=""
#操作系统版本
VERSION=""
if [ -f "/etc/os-release" ]; then
#操作系统名称
NAME=`cat /etc/os-release | grep PRETTY_NAME | sed 's/"//g' | cut -f2 -d=`
#操作系统版本
VERSION=`cat /etc/os-release | grep VERSION | head -1 | cut -f2 -d= | sed 's/"//g'`
elif [ -f "/etc/redhat-release" ]; then
NAME=`cat /etc/redhat-release`
VERSION=`cat /etc/redhat-release`
elif [ -f "/etc/system-release" ]; then
NAME=`cat /etc/system-release`
VERSION=`cat /etc/system-release`
else
NAME="Unknown"
VERSION="Unknown"
fi
#32位或64位,直接使用arch命令
OS_BIT=`arch`
#操作系统类型,固定为Linux
OS_TYPE="Linux"
echo "{\"hostname\":\"${HOSTNAME}\",\"version\":\"${VERSION}\",\"osBit\":\"${OS_BIT}\",\"osType\":\"${OS_TYPE}\",\"name\":\"${NAME}\"}"
}
reportInfo(){
#REPORT_URL="http://host:port/api/report"
# 将数据构造成数组
CPU=`getCpu`
MEMORY=`getMemory`
NETWORK_ADAPTER=`getNetworkAdapter`
DISK=`getDisk`
IP=`getIp`
SN=`getDeviceSn`
DEVICE=`getDeviceInfo`
OS=`getServerOs`
INFO="{$SN,$IP,\"cpuDtoList\":$CPU,\"memoryDtoList\":$MEMORY,\"networkAdapterDtoList\":$NETWORK_ADAPTER,\"diskDtoList\":$DISK,\"serverDeviceDto\":$DEVICE,\"serverOsDto\":$OS}"
echo "$INFO"
#curl -X POST --header "Content-Type: application/json" --header "charset: utf-8" --header "token: XXX" --data "${INFO}" ${REPORT_URL}
}
# 使用ansible callback的方式
#CPU=`getCpu`
#MEMORY=`getMemory`
#NETWORK_ADAPTER=`getNetworkAdapter`
#DISK=`getDisk`
#IP=`getIp`
#DEVICE=`getDeviceInfo`
#OS=`getServerOs`
#echo "{$IP,\"cpu\":$CPU,\"memory\":$MEMORY,\"networkAdapter\":$NETWORK_ADAPTER,\"diskList\":$DISK,\"serverDevice\":$DEVICE,\"serverOs\":$OS}"
# 使用脚本直接POST数据的方式
reportInfo