#!/usr/bin/env bash
# author: sean
# date: 2023-07-29
# function: show dynamic information after login server
# function check_command(){
# local r=0
# `command -v $1 >/dev/null 2>&1` || r=1
# return ${r}
# }
# ---- Set Colors
save_cursor=$(tput sc) # Saves current cursor position.保存当前光标位置
restore_cursor=$(tput rc) # Restore the cursor position.恢复光标到上一次保存的位置
bold=$(tput bold) # 加粗字体
# half_bright=$(tput dim) # turn on half-bright mode
# blink=$(tput blink) # Set blink mode
# underline=$(tput smul) # Set underline mode
# exit_underline=$(tput rmul) # Exit underline mode
# reverse=$(tput rev) # Turn on reverse mode,突出模式,所有输出字符都突出显示。
# exit_reverse=$(tput rmso) # Exit standout mode,退出突出显示。
# reset_attr=$(tput sgr0) # Turn off all attributes,取消所有属性。
# tput setab [0-7] – 设置背景色。
# tput setaf [0-7] – 设置前景色。
# black=$(tput setaf 0)
red=$(tput setaf 1)
green=$(tput setaf 2)
yellow=$(tput setaf 3)
blue=$(tput setaf 4)
magenta=$(tput setaf 5) #洋红
cyan=$(tput setaf 6) #青色
white=$(tput setaf 7)
reset_color=$(tput setaf 9) # Reset to default color = 9
# ---- get infos
OS=$(uname -o)
USER=`whoami`
FROM=`who am i | grep -Po "(?<=\().*(?=\))"`
HOSTNAME_FQDN=`hostname`
HOSTNAME=`hostname -s`
SELinux=$(/usr/sbin/sestatus | grep "SELinux status: " | awk '{print $3}')
LastReboot=$(who -b | awk '{print $3,$4}')
IP=`ip addr | awk '/inet/ && ! /\/32/ {ip[$NF] = $2; sub(/\/.*$/,"",ip[$NF])} END {for(i in ip){if(i ~ "en|eth0") print ip[i]}}'`
if [ -f /etc/redhat-release ]; then
RELEASE=`cat /etc/redhat-release`
elif [ -f /etc/os-release ]; then
RELEASE=$(cat /etc/os-release | sed -n 's/^NAME=\(.*\)/\1/p;s/^VERSION=\(.*\)/" "\1/p' | awk '{gsub(/"|,|^\s+|/, "");print}' | sed ":a;N;s/\n//g;ta")
fi
KERNEL_VERSION=`uname -r`
CPU_Type=$(grep "model name" /proc/cpuinfo | awk -F ': ' '{print $2}' | sort | uniq)
CPU_Arch=$(uname -m)
# check_command docker && DOCKER_VERSION=`docker -v|awk '{print $3}'|cut -d',' -f1`
PSA=`ps -Afl | wc -l`
FORMATEDTIME=`date +"%Y-%m-%d %T"`
# Time of day
HOUR=$(date +"%H")
if [ $HOUR -lt 12 -a $HOUR -ge 0 ]; then
TIME="上午好"
elif [ $HOUR -lt 17 -a $HOUR -ge 12 ]; then
TIME="下午好"
else
TIME="晚上好"
fi
#### System uptime ####
uptime=`cat /proc/uptime | cut -f1 -d.`
upDays=$((uptime/60/60/24))
upHours=$((uptime/60/60%24))
upMins=$((uptime/60%60))
upSecs=$((uptime%60))
SYS_UPTIME="$upDays days $upHours hours $upMins minutes $upSecs seconds $RESET_COLORS"
#### 网络检查 ####
DNS=$(grep nameserver /etc/resolv.conf| grep -v "#" | awk '{print $2}' | tr '\n' ',' | sed 's/,$//')
#### 进程检查 ####
# 僵尸进程
defunct=$(ps -ef | grep defunct | grep -v grep | wc -l)
########## 资源统计 ########
# 列表显示系统资源使用情况
#memory
MEMORY=`free -m|awk 'NR==2 {printf("内存 %.2f%% %sM %sM\n",100-($7*100/$2),$2,$3,$7)}'`
#disk
DISK_DATA=`df -Ph | egrep '/$|/data$' |awk '{printf "区(%s) %s %s %s\n", $6,$5,$3,$4}'`
disk_warning=`df -Ph | egrep -v '/$|/data$' | sed '1d;/ /!N;s/\n//;s/ \+/ /;' | awk 'sub (/%/, "", $5){if ($5*1 > 89) printf "区(%s) %s %s %s\n", substr($6,1,10),$5,$3,$4}'`
#load负载情况
up_time=`uptime`
cpu_nums=`grep -c 'processor' /proc/cpuinfo`
load_1min=`echo $up_time | awk '{print $(NF-2)}'|sed 's/,//g'`
load_5min=`echo $up_time | awk '{print $(NF-1)}'|sed 's/,//g'`
load_15min=`echo $up_time | awk '{print $NF}'|sed 's/,//g'`
use_percent1=$(echo "$load_1min $cpu_nums" | awk '{printf ("%.1f\n",$1*100/$2)}')
use_percent5=$(echo "$load_5min $cpu_nums" | awk '{printf ("%.1f\n",$1*100/$2)}')
use_percent15=$(echo "$load_15min $cpu_nums" | awk '{printf ("%.1f\n",$1*100/$2)}')
use_percent1=$([ `echo $use_percent1|awk '{print int($0)}'` -lt 100 ] && echo -n "$use_percent1" || echo -n 100)
use_percent5=$([ `echo $use_percent5|awk '{print int($0)}'` -lt 100 ] && echo -n "$use_percent5" || echo -n 100)
use_percent15=$([ `echo $use_percent15|awk '{print int($0)}'` -lt 100 ] && echo -n "$use_percent15" || echo -n 100)
LOAD="负载1/5/15分钟 $use_percent1/$use_percent5/$use_percent15 - -"
cpu_use_warning=$(top b -n1 |awk '/^ \s+PID/,/NF/'|head -n10 | awk 'NR>2{if ($9*1 > 50) printf "CPU占用@'${blue}'CPU:'${red}'%s% '${blue}'MEM:'${green}'%s% '${blue}'PID:'${green}'%s '${blue}'命令:'${green}'(%s)\n", $9,$10,$1,substr($NF,1,20)}')
mem_use_warning=$(ps aux | awk '{print $2, $3, $4, $6, $11}' | sort -k4rn | head -n 10| awk 'NR>2{if ($3*1 > 50) printf "内存占用@'${blue}'CPU:'${green}'%s% '${blue}'MEM:'${red}'%s% '${blue}'RSS:'${green}'%s '${blue}'PID:'${green}'%s '${blue}'命令:'${green}'(%s)\n", $2,$3,$4,$1,substr($5,1,10)}')
######## 汇总显示项 ########
#system base info
SYS_INFO="主机名@${HOSTNAME_FQDN}\nIP地址@${IP}\n系统@${OS}\n发行版本@${RELEASE}\n内核@${KERNEL_VERSION}\n核心@${cpu_nums}\nCPU型号@${CPU_Type}\nCPU架构@${CPU_Arch}\n当前时间@${FORMATEDTIME}\n运行时间@${SYS_UPTIME}\n最后启动@${LastReboot}\nSELinux@${SELinux}\nDNS@${DNS}\n进程数@${PSA}"
if [ $defunct -gt 0 ]; then
SYS_INFO="${SYS_INFO}\n僵尸进程@${defunct}"
fi
if [ "X$cpu_use_warning" != "X" ]; then
SYS_INFO="${SYS_INFO}\n${cpu_use_warning}"
fi
if [ "X$mem_use_warning" != "X" ]; then
SYS_INFO="${SYS_INFO}\n${mem_use_warning}"
fi
#usage info
USAGE_INFO="${LOAD}\n${MEMORY}\n${DISK_DATA}"
## extra info
if [ "X$disk_warning" != "X" ]; then
USAGE_INFO="${USAGE_INFO}\n${disk_warning}"
fi
# if [[ "X$DOCKER_VERSION" != "X" ]]; then
# SYS_INFO="${SYS_INFO}\nDocker版本@${DOCKER_VERSION}"
# fi
#################### 显示 ########################
# 显示hostname
WIDTH=$(tput cols)
# printf "${save_cursor}"
# # Move up 8 lines
# i=0
printf "${bold}${magenta}"
if [ ! -z "$WIDTH" ];then
figlet $HOSTNAME -k -w $WIDTH 2>/dev/null
else
figlet $HOSTNAME 2>/dev/null
fi
printf "${bold}${cyan}$TIME ${yellow}$USER${cyan}! ${white}【 ${blue}${bold}技 术 中 台 诊 断 信 息 ${white}】\n"
# printf "${reset_attr}"
# printf "${restore_cursor}"
# #--------- calinda -------------------------------------------------------------
# printf "${cyan}"
# cal
# printf "${reset_attr}"
#--------------- 显示logo--------------
# LogoColumn=23
# printf "${save_cursor}"
# # Move up 8 lines
# i=0
# while [ $((++i)) -lt 9 ]; do tput cuu1; done
# tput cuf $LogoColumn # Move 49 columns right
# printf "${red}${bold}技 术 中 台 ${reset_attr}${red}诊 断 信 息"
# tput cud1 # Down one line
# tput cuf $LogoColumn
# tput cud1
# tput cuf $LogoColumn
# printf "%s" "${bold}${cyan}$TIME ${yellow}$USER${cyan}!"
# printf "${reset_attr}"
# printf "${restore_cursor}"
# #-------- TIME --------------------------------------------------------------
# TimeColumn=23
# printf "${save_cursor}"
# # Move up 8 lines
# i=0
# while [ $((++i)) -lt 6 ]; do tput cuu1; done
# tput cuf $TimeColumn # Move 49 columns right
# # Do we have the figlet package?
# if hash figlet 2>/dev/null; then
# if [ -f '/usr/share/figlet/miniwi.flf' ]; then
# date +"%I:%M %P" | figlet -f /usr/share/figlet/miniwi.flf -k 2>/dev/null > /tmp/terminal
# else
# date +"%I:%M %P" | figlet -f /usr/share/figlet/mini.flf -k 2>/dev/null > /tmp/terminal
# fi
# # else use standard font
# else
# date +"%I:%M %P" > /tmp/terminal
# fi
# tput cud1 # Down one line
# tput cuf $TimeColumn
# while IFS= read -r Time; do
# printf "${bold}${blue}"
# printf "%s" "$Time"
# tput cud1 # Up one line
# tput cuf $TimeColumn # Move 49 columns right
# done < /tmp/terminal
# printf "${reset_attr}"
# printf "${restore_cursor}"
#----------显示监控信息------------------
echo -e "$SYS_INFO" | awk -F'@' -f /usr/local/bin/color.awk -e '
BEGIN{
separater = BRIGHT_CYAN("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
line = CYAN("-----------------------------------------------------------------");
title = BG_CYAN("项目 系统信息 ");
print separater;
print title;
print line;
}
{
if($1=="主机名"){
$2 = BRIGHT_MAGENTA($2)
} else if($1=="IP地址"){
$2 = BRIGHT_YELLOW($2)
} else if($1=="僵尸进程"){
$2 = BL_BRIGHT_YELLOW($2)
} else if($1=="SELinux" && $2!="disabled"){
$2 = BL_BRIGHT_RED($2)
} else{
$2 = GREEN($2);
}
$1 = BRIGHT_CYAN($1);
printf "%-20s\t%-40s\t\n", $1,$2;
}'
echo -e "$USAGE_INFO" | awk -f /usr/local/bin/color.awk -e '
BEGIN{
separater = BRIGHT_CYAN("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
line = CYAN("-----------------------------------------------------------------");
title = BG_CYAN("项目 使用率 已用 空闲 图示 ");
print separater;
print title;
print line;
}
{
sub (/%/, "", $2);
$5 = percent_bar($2)
if($2*1 > 80 && $2*1 <= 89){
$1 = BRIGHT_YELLOW($1)
$2 = BL_BRIGHT_YELLOW($2"%")
$3 = BRIGHT_YELLOW($3);
$4 = BL_BRIGHT_YELLOW($4);
} else if($2*1 > 89){
$1 = BRIGHT_RED($1)
$2 = BL_BRIGHT_RED($2"%")
$3 = BRIGHT_RED($3);
$4 = BL_BRIGHT_RED($4);
} else{
$1 = BRIGHT_CYAN($1)
$2 = BRIGHT_WHITE($2"%")
$3 = BRIGHT_CYAN($3);
$4 = GREEN($4);
}
printf "%-20s\t%-17s\t%-5s\t%-5s\t%-17s\t\n", $1,$2,$3,$4,$5;
print line
}'