149 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/usr/bin/env bash
 | |
| #
 | |
| # display a list of system informations
 | |
| # + dig and curl have shorts timeouts to not hang the script
 | |
| #
 | |
| # requirements: sudo apt install dnsutils
 | |
| 
 | |
| # GENERAL ###########################################################
 | |
| 
 | |
| # locale env
 | |
| unset LC_ALL
 | |
| export LC_MESSAGES=C
 | |
| 
 | |
| # check if module was disabled
 | |
| module_disable=${module_sysinfo_disable:=0}
 | |
| if (($module_disable == 1)); then
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| # colors
 | |
| c_txt=${c_txt:="39"}
 | |
| c_txt_emphase=${c_txt_emphase:="35"}
 | |
| c_txt_deco=${c_txt_deco:="97"}
 | |
| c_txt_invert=${c_txt_invert:="30"}
 | |
| c_bg=${c_bg_sec:="47"}
 | |
| c_danger=${c_danger:="31"}
 | |
| c_warning=${c_warning:="33"}
 | |
| c_success=${c_success:="32"}
 | |
| c_title=${c_title:="${c_bg};1;${c_txt_invert}m"}
 | |
| 
 | |
| # api website name for plain public IP4/6 check
 | |
| publicip_api=${global_publicip_api:="icanhazip.com"}
 | |
| 
 | |
| # PREPARATIONS ######################################################
 | |
| 
 | |
| # output header
 | |
| echo -e "\nWaiting for DNS and IP checks\e[5m...\e[0m"
 | |
| 
 | |
| # get hostname
 | |
| HOSTNAME=`hostname -f`
 | |
| # get distribution name
 | |
| DISTRO=`/usr/bin/cat /etc/*release | /usr/bin/grep "PRETTY_NAME" | cut -d "=" -f 2- | sed 's/"//g'`
 | |
| # get name of main interface with a route for internet
 | |
| INTERNETIFACE="$(ip -o route get 8/32 2>/dev/null)"
 | |
| if [[ "$INTERNETIFACE" ]]; then
 | |
|     INTERNETIFACE=`echo -e "$INTERNETIFACE" | sed -e 's/.*dev //' -e 's/ .*//'`
 | |
| else
 | |
|     INTERNETIFACE="\e[1;${c_warning}mno interface with a route to 8/32\e[0;${c_txt}m"
 | |
| fi
 | |
| # get DNS servers ips from resolv.conf
 | |
| DNSSERVERS=`/usr/bin/grep '^nameserver' /etc/resolv.conf | cut -d' ' -f2 | paste -sd ','`
 | |
| if [[ ! $DNSSERVERS ]];then
 | |
|     DNSSERVERS="\e[1;${c_warning}mno ns in resolv.conf\e[0;${c_txt}m"
 | |
| fi
 | |
| # get current output public IPs and their revers DNS record
 | |
| PUBLICIP4=`timeout 6 curl -s -4 $publicip_api 2>/dev/null`
 | |
| if [[ $PUBLICIP4 ]];then
 | |
|     IP4PTR=`timeout 4 dig +short -x $PUBLICIP4 @1.1.1.1 2>/dev/null`
 | |
|     if [[ ! $IP4PTR ]];then
 | |
|         IP4PTR="\e[0;${c_txt}mno data"
 | |
|     fi
 | |
|         else
 | |
|     IP4PTR="\e[0;${c_txt}mno data"
 | |
|     PUBLICIP4="\e[1;5;${c_warning}mno IPv4 internet\e[0;${c_txt}m"
 | |
|     INTERNET_IP4=0
 | |
| fi
 | |
| PUBLICIP6=`timeout 6 curl -s -6 $publicip_api 2>/dev/null`
 | |
| if [[ $PUBLICIP6 ]];then
 | |
|     IP6PTR=`timeout 4 dig +short -x $PUBLICIP6 @1.1.1.1 2>/dev/null`
 | |
|     if [[ ! $IP6PTR ]];then
 | |
|         IP6PTR="\e[0;${c_txt}mno data"
 | |
|     fi
 | |
| else
 | |
|     IP6PTR="\e[0;${c_txt}mno data"
 | |
|     PUBLICIP6="\e[1;${c_warning}mno ipv6 internet\e[0;${c_txt}m"
 | |
|     INTERNET_IP6=0
 | |
| fi
 | |
| INTERNET_OUT=0
 | |
| if [[ $INTERNET_IP4 && $INTERNET_IP6 ]]; then
 | |
|     INTERNET_OUT=1
 | |
| fi
 | |
| # get DNS records of the FQDN
 | |
| HOSTNAMEIP4=`timeout 4 dig +short A $HOSTNAME @1.1.1.1 2>/dev/null`
 | |
| if [[ ! $HOSTNAMEIP4 ]];then
 | |
|     HOSTNAMEIP4="\e[0;${c_txt}mno data"
 | |
| fi
 | |
| HOSTNAMEIP6=`timeout 4 dig +short AAAA $HOSTNAME @1.1.1.1 2>/dev/null`
 | |
| if [[ ! $HOSTNAMEIP6 ]];then
 | |
|     HOSTNAMEIP6="\e[0;${c_txt}mno data"
 | |
| fi
 | |
| # get processes
 | |
| PROCESS=`/usr/bin/ps -eo user= | sort | uniq -c | awk '{ print $2 " " $1 }'`
 | |
| PROCESS_ALL=`echo "$PROCESS" | awk {'print $2'} | awk '{ SUM += $1} END { print SUM }'`
 | |
| PROCESS_ROOT=`echo "$PROCESS" | /usr/bin/grep root | awk {'print $2'}`
 | |
| PROCESS_USER=`echo "$PROCESS" | /usr/bin/grep -v root | awk {'print $2'} | awk '{ SUM += $1} END { print SUM }'`
 | |
| # get processors
 | |
| PROCESSOR_NAME=`/usr/bin/grep "model name" /proc/cpuinfo | cut -d ' ' -f3- | awk {'print $0'} | head -1 | sed -e 's/([^()]*)/ /g' -e 's/\s\+/ /g'`
 | |
| PROCESSOR_COUNT=`/usr/bin/grep -ioPc 'processor\t:' /proc/cpuinfo 2>/dev/null`
 | |
| # get load averages
 | |
| IFS=" " read LOAD1 LOAD5 LOAD15 <<<$(cat /proc/loadavg | awk '{ print $1,$2,$3 }')
 | |
| if [[ $(echo "$LOAD1 > $(echo "$PROCESSOR_COUNT + ($PROCESSOR_COUNT / 3)" | bc -l )" | bc) == 1 ]]; then
 | |
|     LOAD1="\e[1;5;${c_danger}m$LOAD1\e[0;${c_txt}m"
 | |
| elif [[ $(echo "$LOAD1 > $(echo "$PROCESSOR_COUNT - ($PROCESSOR_COUNT / 3)" | bc -l )" | bc) == 1 ]]; then
 | |
|     LOAD1="\e[1;5;${c_warning}m$LOAD1\e[0;${c_txt}m"
 | |
| fi
 | |
| if [[ $(echo "$LOAD5 > $(echo "$PROCESSOR_COUNT * 2" | bc -l )" | bc) == 1 ]]; then
 | |
|     LOAD2="\e[1;5;${c_warning}m$LOAD5\e[0;${c_txt}m"
 | |
| fi
 | |
| if [[ $(echo "$LOAD15 > $(echo "$PROCESSOR_COUNT * 2" | bc -l )" | bc) == 1 ]]; then
 | |
|     LOAD3="\e[1;5;${c_warning}m$LOAD15\e[0;${c_txt}m"
 | |
| fi
 | |
| # get free memory
 | |
| IFS=" " read USED AVAIL TOTAL <<<$(free -htm | /usr/bin/grep "Mem" | awk {'print $3,$7,$2'})
 | |
| # get free swap
 | |
| IFS=" " read SUSED SAVAIL STOTAL <<<$(free -htm | /usr/bin/grep "Swap" | awk {'print $3,$4,$2'})
 | |
| 
 | |
| # OUTPUT ############################################################
 | |
| 
 | |
| W="\e[0;${c_txt}m"
 | |
| X="\e[1;${c_txt}m"
 | |
| G="\e[1;${c_txt_emphase}m"
 | |
| N="\e[0m"
 | |
| echo -e "\e[1A\e[${c_title} System information  $N                    
 | |
| 
 | |
| $X  Distro$W..........: $DISTRO
 | |
| $X  Kernel$W..........: `uname -sr`
 | |
| $X  Uptime$W..........: $G`uptime -p`$W
 | |
| 
 | |
| $X  CPU$W.............: $PROCESSOR_NAME
 | |
| $X  CPU cores$W.......: $G$PROCESSOR_COUNT$W
 | |
| $X  Load$W............: $G$LOAD1$W (1m), $G$LOAD5$W (5m), $G$LOAD15$W (15m)
 | |
| $X  Processes$W.......: $G$PROCESS_ROOT$W (root), $G$PROCESS_USER$W (user), $G$PROCESS_ALL$W (total)
 | |
| $X  Memory$W..........: $G$USED$W used, $G$AVAIL$W avail, $G$TOTAL$W total$N"
 | |
| if [[ ${SUSED} ]]; then
 | |
|     echo -e "$X  Swap$W............: $G$SUSED$W used, $G$SAVAIL$W avail, $G$STOTAL$W total$W"
 | |
| else
 | |
|     echo -e "$X  Swap$W............: \e[1;${c_warning}mno Swap$W"
 | |
| fi
 | |
| echo -e "
 | |
| $X  Hostname/FQDN$W...: $G$(hostname)$W / $G$(hostname -f)$W
 | |
| $X  Internet Iface$W..: $G$INTERNETIFACE$W
 | |
| $X  DNS servers$W.....: $G$(echo -e "${DNSSERVERS}" | sed "s/,/\\\e[0m, \\\e[1;${c_txt_emphase}m/g")$N"
 | |
| if [[ ${INTERNET_OUT} == 0 ]]; then
 | |
|     echo -e "$X  Public IP4/IP6$W..: $G$PUBLICIP4$W / $G$PUBLICIP6$N"
 | |
| else
 | |
|     echo -e "$X  Public IP4/IP6$W..: \e[1;${c_warning}mno internet or "${publicip_api}" timeout$N"
 | |
| fi
 | |
| echo -e "$X  PTR IP4/IP6$W.....: $G$IP4PTR$W / $G$IP6PTR$W
 | |
| $X  FQDN A/AAAA$W.....: $G$HOSTNAMEIP4$W / $G$HOSTNAMEIP6$N" |