#!/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"