475 lines
13 KiB
Bash
Executable File
475 lines
13 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
LSB=/usr/bin/lsb_release
|
|
Bash3lper="$(cd "$(dirname "$0")" && pwd)"
|
|
Bscripts="scripts"
|
|
|
|
#### Color definition
|
|
GREEN="$(tput setaf 2)"
|
|
PINK="$(tput setaf 5)"
|
|
BLUE="$(tput setaf 6)"
|
|
RED="$(tput setaf 1)"
|
|
YELLOW="$(tput setaf 3)"
|
|
ORANGE="\e[38;5;202m"
|
|
ORANGE1="$(tput setaf 166)"
|
|
GRIS="\e[38;5;8m"
|
|
#GRIS="$(tput setaf 246)"
|
|
NOC="$(tput sgr0)"
|
|
|
|
# Quit
|
|
pause_quit(){
|
|
echo -e "$(tput setaf 3)"
|
|
local message="$@"
|
|
[ -z "$message" ] && message=" Press [Enter] to quit..."
|
|
read -r -p "$message" readEnterKey ; exit 0
|
|
echo -e "$(tput sgr0)"
|
|
clear
|
|
# exit 0
|
|
}
|
|
# Return
|
|
pause(){
|
|
echo -e "$(tput setaf 3)"
|
|
local message="$@"
|
|
[ -z "$message" ] && message=" Press [Enter] key to continue..."
|
|
read -r -p "$message" readEnterKey
|
|
echo -e "$(tput sgr0)"
|
|
# clear
|
|
# exit 0
|
|
}
|
|
|
|
|
|
#
|
|
# Help script:
|
|
# ./Monitor32.sh -help
|
|
#
|
|
# ************************************************************ #
|
|
# * [ CONFIG ] * #
|
|
# ************************************************************ #
|
|
|
|
# Disk usage - Show or hide virtual mountpoints (tmpfs)
|
|
DISK_SHOW_TMPFS=false
|
|
|
|
# Hosts to ping
|
|
PING_HOSTS=("google.com" "free.fr")
|
|
|
|
# Services port number to check
|
|
SERVICES_NAME[21]="FTP Server"
|
|
SERVICES_HOST[21]="localhost"
|
|
|
|
SERVICES_NAME[22]="SSH"
|
|
SERVICES_HOST[22]="localhost"
|
|
|
|
SERVICES_NAME[80]="Web Server"
|
|
SERVICES_HOST[80]="localhost"
|
|
|
|
SERVICES_NAME[3306]="Database"
|
|
SERVICES_HOST[3306]="localhost"
|
|
|
|
# Temperatures blocks (true for enable)
|
|
TEMP_ENABLED=true
|
|
|
|
|
|
# ********************************************************** #
|
|
# * [ VARS ] * #
|
|
# ********************************************************** #
|
|
|
|
ESM_NAME="Server Monitor \`sh"
|
|
ESM_VERSION="0.32"
|
|
ESM_AUTHOR="Erreur32"
|
|
ESM_CREATED="october 2016"
|
|
ESM_URL="https://gitlab.echosystem.fr/Erreur32/all-config/edit/master/Bash/Monitor32.sh"
|
|
|
|
|
|
# Colors
|
|
NC="\e[0m"
|
|
RED="\e[31;40m"
|
|
GREEN="\e[32;40m"
|
|
YELLOW="\e[33;40m"
|
|
WHITE="\e[37;40m"
|
|
|
|
# Styles
|
|
BOLD="\e[1m"
|
|
RESET="\e[0m"
|
|
WHITE_ON_GREY="\e[100;97m"
|
|
|
|
|
|
# *************************************************************** #
|
|
# * [ FUNCTIONS ] * #
|
|
# *************************************************************** #
|
|
|
|
makeTitle()
|
|
{
|
|
|
|
echo -e "${BOLD}${WHITE_ON_GREY} $1 ${RESET}"
|
|
|
|
}
|
|
|
|
# Function : system
|
|
system()
|
|
{
|
|
OS=`uname -s`
|
|
|
|
if [ -e "/usr/bin/lsb_release" ] ; then
|
|
DISTRO=`/usr/bin/lsb_release -ds`
|
|
elif [ -e "/etc/system-release" ] ; then
|
|
DISTRO=`cat /etc/system-release`
|
|
else
|
|
DISTRO=`find /etc/*-release -type f -exec cat {} \; | grep NAME | tail -n 1 | cut -d= -f2 | tr -d '"'`;
|
|
fi
|
|
|
|
HOSTNAME=`hostname`
|
|
KERNEL_INFO=`/bin/uname -r`
|
|
|
|
UPTIME=`cat /proc/uptime`
|
|
UPTIME=${UPTIME%%.*}
|
|
UPTIME_MINUTES=$(( UPTIME / 60 % 60 ))
|
|
UPTIME_HOURS=$(( UPTIME / 60 / 60 % 24 ))
|
|
UPTIME_DAYS=$(( UPTIME / 60 / 60 / 24 ))
|
|
|
|
LAST_BOOT_DATE=`who -b | awk '{print $3}'`
|
|
LAST_BOOT_TIME=`who -b | awk '{print $4}'`
|
|
|
|
USERS_NB=`who | wc -l`
|
|
|
|
CURRENT_DATE=`/bin/date '+%F %T'`
|
|
|
|
makeTitle "System"
|
|
|
|
echo -e "${GREEN} Hostname\t ${WHITE}$HOSTNAME"
|
|
echo -e "${GREEN} OS\t\t ${WHITE}$OS $DISTRO"
|
|
echo -e "${GREEN} Kernel\t ${WHITE}$KERNEL_INFO"
|
|
echo -e "${GREEN} Uptime\t ${WHITE}$UPTIME_DAYS day(s), $UPTIME_HOURS hours(s), $UPTIME_MINUTES minute(s)"
|
|
echo -e "${GREEN} Last boot\t ${WHITE}$LAST_BOOT_DATE $LAST_BOOT_TIME"
|
|
echo -e "${GREEN} Current user(s) ${WHITE}$USERS_NB connected"
|
|
echo -e "${GREEN} Server datetime ${WHITE}$CURRENT_DATE"
|
|
}
|
|
|
|
# Function : load average
|
|
load_average()
|
|
{
|
|
PROCESS_NB=`ps -e h | wc -l`
|
|
PROCESS_RUN=`ps r h | wc -l`
|
|
|
|
CPU_NB=`cat /proc/cpuinfo | grep "^processor" | wc -l`
|
|
|
|
LOAD_1=`cat /proc/loadavg | awk '{print $1}'`
|
|
# LOAD_1_PERCENT=`echo $LOAD_1 | awk '{print 100 * $1}'`
|
|
LOAD_1_PERCENT=`echo $(($(echo $LOAD_1 | awk '{print 100 * $1}') / $CPU_NB))`
|
|
if [ $LOAD_1_PERCENT -ge 100 ] ; then
|
|
LOAD_1_PERCENT=100;
|
|
fi
|
|
|
|
if [ $LOAD_1_PERCENT -ge 75 ] ; then
|
|
LOAD_1_COLOR=${RED}
|
|
elif [ $LOAD_1_PERCENT -ge 50 ] ; then
|
|
LOAD_1_COLOR=${YELLOW}
|
|
else
|
|
LOAD_1_COLOR=${WHITE}
|
|
fi
|
|
|
|
LOAD_2=`cat /proc/loadavg | awk '{print $2}'`
|
|
# LOAD_2_PERCENT=`echo $LOAD_2 | awk '{print 100 * $1}'`
|
|
LOAD_2_PERCENT=`echo $(($(echo $LOAD_2 | awk '{print 100 * $1}') / $CPU_NB))`
|
|
if [ $LOAD_2_PERCENT -ge 100 ] ; then
|
|
LOAD_2_PERCENT=100;
|
|
fi
|
|
|
|
if [ $LOAD_2_PERCENT -ge 75 ] ; then
|
|
LOAD_2_COLOR=${RED}
|
|
elif [ $LOAD_2_PERCENT -ge 50 ] ; then
|
|
LOAD_2_COLOR=${YELLOW}
|
|
else
|
|
LOAD_2_COLOR=${WHITE}
|
|
fi
|
|
|
|
LOAD_3=`cat /proc/loadavg | awk '{print $3}'`
|
|
# LOAD_3_PERCENT=`echo $LOAD_3 | awk '{print 100 * $1}'`
|
|
LOAD_3_PERCENT=`echo $(($(echo $LOAD_3 | awk '{print 100 * $1}') / $CPU_NB))`
|
|
if [ $LOAD_3_PERCENT -ge 100 ] ; then
|
|
LOAD_3_PERCENT=100;
|
|
fi
|
|
|
|
if [ $LOAD_3_PERCENT -ge 75 ] ; then
|
|
LOAD_3_COLOR=${RED}
|
|
elif [ $LOAD_3_PERCENT -ge 50 ] ; then
|
|
LOAD_3_COLOR=${YELLOW}
|
|
else
|
|
LOAD_3_COLOR=${WHITE}
|
|
fi
|
|
|
|
echo
|
|
makeTitle "Load Average"
|
|
echo -e "${GREEN} Since 1 minute $LOAD_1_COLOR $LOAD_1_PERCENT% ($LOAD_1)"
|
|
echo -e "${GREEN} Since 5 minutes $LOAD_2_COLOR $LOAD_2_PERCENT% ($LOAD_2)"
|
|
echo -e "${GREEN} Since 15 minutes $LOAD_3_COLOR $LOAD_3_PERCENT% ($LOAD_3)"
|
|
echo -e "${GREEN} Processus\t ${WHITE}$PROCESS_NB process, including $PROCESS_RUN running"
|
|
}
|
|
|
|
# Function : CPU
|
|
cpu()
|
|
{
|
|
CPU_NB=`cat /proc/cpuinfo | grep -i "^processor" | wc -l`
|
|
CPU_INFO=`cat /proc/cpuinfo | grep -i "^model name" | awk -F": " '{print $2}' | head -1 | sed 's/ \+/ /g'`
|
|
|
|
CPU_FREQ=`cat /proc/cpuinfo | grep -i "^cpu MHz" | awk -F": " '{print $2}' | head -1`
|
|
|
|
if [ -z $CPU_FREQ ] ; then
|
|
CPU_FREQ=`cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq`
|
|
CPU_FREQ=$(( $CPU_FREQ / 1000 ))
|
|
fi
|
|
|
|
CPU_CACHE=`cat /proc/cpuinfo | grep -i "^cache size" | awk -F": " '{print $2}' | head -1`
|
|
CPU_BOGOMIPS=`cat /proc/cpuinfo | grep -i "^bogomips" | awk -F": " '{print $2}' | head -1`
|
|
|
|
echo
|
|
makeTitle "CPU"
|
|
|
|
if [ $CPU_NB -gt 1 ] ; then
|
|
echo -e "${GREEN} Number\t ${WHITE}$CPU_NB"
|
|
fi
|
|
echo -e "${GREEN} Model\t\t ${WHITE}$CPU_INFO"
|
|
echo -e "${GREEN} Frequency\t ${WHITE}$CPU_FREQ MHz"
|
|
echo -e "${GREEN} Cache L2\t ${WHITE}$CPU_CACHE"
|
|
echo -e "${GREEN} Bogomips\t ${WHITE}$CPU_BOGOMIPS"
|
|
}
|
|
|
|
# Function : memory
|
|
memory()
|
|
{
|
|
MEM_TOTAL=`/usr/bin/free -tm | grep -i Mem: | awk '{print $2}'`
|
|
MEM_FREE=`/usr/bin/free -tm | grep -i Mem: | awk '{print $4+$6+$7}'`
|
|
|
|
echo
|
|
makeTitle "Memory"
|
|
echo -e "${GREEN} RAM\t\t${WHITE}$MEM_FREE Mb free of $MEM_TOTAL Mb"
|
|
}
|
|
|
|
# Function : network
|
|
network()
|
|
{
|
|
INTERFACES=`/sbin/ifconfig |awk -F '[/ |: ]' '{print $1}' |sed -e '/^$/d'`
|
|
|
|
|
|
echo
|
|
makeTitle "Network"
|
|
|
|
for INTERFACE in $INTERFACES
|
|
do
|
|
IP_LAN=`/sbin/ip -f inet -o addr show ${INTERFACE} | cut -d\ -f 7 | cut -d/ -f 1`
|
|
echo -e "${GREEN} IP LAN (${INTERFACE})\t ${WHITE}$IP_LAN"
|
|
done
|
|
|
|
echo -e "${GREEN} IP WAN\t ${WHITE}$IP_WAN"
|
|
}
|
|
|
|
# Function : ping
|
|
ping()
|
|
{
|
|
echo
|
|
makeTitle "Ping"
|
|
|
|
for HOST in ${PING_HOSTS[@]}
|
|
do
|
|
PING=`/bin/ping -qc 1 $HOST | awk -F/ '/^rtt/ { print $5 }'`
|
|
|
|
echo -e "${GREEN} ${HOST}\t ${WHITE}$PING ms"
|
|
done
|
|
}
|
|
|
|
# Function : Disk space (top 5)
|
|
disk_space()
|
|
{
|
|
HDD_TOP=`df -h | head -1 | sed s/^/" "/`
|
|
#HDD_DATA=`df -hl | grep -v "^Filesystem" | grep -v "^Sys. de fich." | sort -k5r | head -5 | sed s/^/" "/`
|
|
# HDD_DATA=`df -hl | sed "1 d" | grep -v "^Filesystem" | grep -v "^Sys. de fich." | sort | head -5 | sed s/^/" "/`
|
|
|
|
if [ ${DISK_SHOW_TMPFS} = true ] ; then
|
|
HDD_DATA=`df -hl | sed "1 d" | grep -iv "^Filesystem|Sys." | sort | head -5 | sed s/^/" "/`
|
|
else
|
|
HDD_DATA=`df -hl | sed "1 d" | grep -iv "^Filesystem|Sys." | grep -vE "^tmpfs|udev" | sort | head -5 | sed s/^/" "/`
|
|
fi
|
|
|
|
echo
|
|
makeTitle "Disk space (top 5)"
|
|
echo -e "${GREEN}$HDD_TOP"
|
|
echo -e "${WHITE}$HDD_DATA"
|
|
}
|
|
|
|
# Function : services
|
|
services()
|
|
{
|
|
echo
|
|
makeTitle "Services"
|
|
|
|
for PORT in "${!SERVICES_NAME[@]}"
|
|
do
|
|
NAME=${SERVICES_NAME[$PORT]}
|
|
HOST=${SERVICES_HOST[$PORT]}
|
|
|
|
CHECK=`(exec 3<>/dev/tcp/$HOST/$PORT) &>/dev/null; echo $?`
|
|
|
|
if [ $CHECK = 0 ] ; then
|
|
CHECK_LABEL=${WHITE}ONLINE
|
|
else
|
|
CHECK_LABEL=${RED}OFFLINE
|
|
fi
|
|
|
|
echo -e "${GREEN} $NAME ($PORT) : ${CHECK_LABEL}"
|
|
done
|
|
}
|
|
|
|
# Function : hard drive temperatures
|
|
hdd_temperatures()
|
|
{
|
|
if [ ${TEMP_ENABLED} = true ] ; then
|
|
echo
|
|
makeTitle "Hard drive Temperatures"
|
|
|
|
DISKS=`ls /sys/block/ | grep -E -i '^(s|h)d'`
|
|
|
|
# If hddtemp is installed
|
|
if [ -e "/usr/sbin/hddtemp" ] ; then
|
|
|
|
for DISK in $DISKS
|
|
do
|
|
TEMP_DISK=`hddtemp -n /dev/$DISK`"°C"
|
|
|
|
echo -e " ${GREEN}/dev/$DISK\t${WHITE}$TEMP_DISK"
|
|
done
|
|
else
|
|
echo -e "${WHITE}\nPlease, install hddtemp${WHITE}"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Function : system temperatures
|
|
system_temperatures()
|
|
{
|
|
if [ ${TEMP_ENABLED} = true ] ; then
|
|
echo
|
|
makeTitle "System Temperatures"
|
|
|
|
# If lm-sensors is installed
|
|
if [ -e "/usr/bin/sensors" ] ; then
|
|
TEMP_CPU=`/usr/bin/sensors | grep -E "^(CPU Temp|Core 0)" | cut -d '+' -f2 | cut -d '.' -f1`"°C"
|
|
TEMP_MB=`/usr/bin/sensors | grep -E "^(Sys Temp|Board Temp)" | cut -d '+' -f2 | cut -d '(' -f1`
|
|
|
|
echo -e " ${GREEN}CPU ${WHITE}$TEMP_CPU"
|
|
echo -e " ${GREEN}Motherboard ${WHITE}$TEMP_MB"
|
|
# Raspberry Pi
|
|
elif [ -f "/sys/class/thermal/thermal_zone0/temp" ] ; then
|
|
TEMP_CPU=`cat /sys/class/thermal/thermal_zone0/temp`
|
|
TEMP_CPU=$(( $TEMP_CPU / 1000 ))
|
|
|
|
echo -e " ${GREEN}CPU ${WHITE}$TEMP_CPU°C"
|
|
|
|
else
|
|
echo -e "${WHITE}\nPlease, install lm-sensors${WHITE}"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Function : showAll
|
|
showAll()
|
|
{
|
|
system
|
|
load_average
|
|
cpu
|
|
memory
|
|
network
|
|
ping
|
|
disk_space
|
|
services
|
|
hdd_temperatures
|
|
system_temperatures
|
|
}
|
|
|
|
# Function : showVersion
|
|
showVersion()
|
|
{
|
|
echo "$ESM_VERSION"
|
|
}
|
|
|
|
# Function : showHelp
|
|
showHelp()
|
|
{
|
|
echo
|
|
echo "-------"
|
|
echo -e "Name : $ESM_NAME\nVersion : $ESM_VERSION\nAuthor : $ESM_AUTHOR\nCreated : $ESM_CREATED"
|
|
echo
|
|
echo -e "$ESM_NAME Display system's information of a Unix machine.\nThis is the bash version."
|
|
echo
|
|
echo -e "[USAGE]\n"
|
|
echo -e " -h, -u, --help, --usage print this help message \n"
|
|
echo -e " -v, --version print program version\n"
|
|
echo -e " -C, --clear clear console\n Must be inserted before any argument\n"
|
|
echo -e " -s, --system system information (OS and distro ; kernel ; hostname ; uptime ; users connected; last boot; datetime)\n"
|
|
echo -e " -e, --services checks port number\n"
|
|
echo -e " -n, --network network information (IP LAN ; IP WAN)\n"
|
|
echo -e " -p, --ping pings several hosts\n Can be configured in the file\n"
|
|
echo -e " -c, --cpu processor information (model ; frequency ; cache ; bogomips)\n"
|
|
echo -e " -m, --memory RAM information (free and total)\n"
|
|
echo -e " -l, --load system load ; processus\n"
|
|
echo -e " -t, --temperatures print CPU, system and HDD temperatures\n Can be configured in the file\n"
|
|
echo -e " -d, --disk disk space (top 5) ; sorted by alpha\n"
|
|
echo -e " -a, --all print all data\n"
|
|
echo; echo;
|
|
echo -e "More information on : $ESM_URL"
|
|
echo "-------"
|
|
echo
|
|
#pause
|
|
}
|
|
|
|
|
|
# *************************************************************** #
|
|
# * [ LET'S GO !! ] * #
|
|
# *************************************************************** #
|
|
|
|
if [ $# -ge 1 ] ; then
|
|
|
|
while getopts "Csenpcmltdavhu-:" option
|
|
do
|
|
case $option in
|
|
h | u) showHelp; exit ;;
|
|
v) showVersion; exit;;
|
|
C) clear ;;
|
|
s) system ;;
|
|
n) network ;;
|
|
p) ping ;;
|
|
c) cpu ;;
|
|
m) memory ;;
|
|
l) load_average ;;
|
|
t) hdd_temperatures; system_temperatures ;;
|
|
d) disk_space ;;
|
|
e) services ;;
|
|
a) showAll ;;
|
|
-) case $OPTARG in
|
|
help | usage) showHelp; exit ;;
|
|
version) showVersion; exit ;;
|
|
all) showAll; exit ;;
|
|
clear) clear ;;
|
|
system) system ;;
|
|
services) services ;;
|
|
load) load_average ;;
|
|
cpu) cpu ;;
|
|
memory) memory ;;
|
|
network) network ;;
|
|
ping) ping ;;
|
|
disk) disk_space ;;
|
|
temperatures) hdd_temperatures; system_temperatures ;;
|
|
*) pause ;;
|
|
esac ;;
|
|
?) echo "Option -$OPTARG inconnue"; exit ;;
|
|
*) exit ;;
|
|
esac
|
|
done
|
|
|
|
else
|
|
#showAll
|
|
showHelp;
|
|
pause;
|
|
fi
|
|
|
|
echo -e "${RESET}"
|
|
|