Created
December 1, 2019 18:38
-
-
Save Jarvvski/3de8e8d2f6cd3b381751ec5c92b79e70 to your computer and use it in GitHub Desktop.
Nice MOTD
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| ####################### | |
| ### pretty hostname ### | |
| ####################### | |
| /usr/bin/env figlet $(hostname -s) | /usr/bin/env lolcat -f | |
| ####################### | |
| ### System Info ### | |
| ####################### | |
| # get load averages | |
| IFS=" " read LOAD1 LOAD5 LOAD15 <<<$(cat /proc/loadavg | awk '{ print $1,$2,$3 }') | |
| # get free memory | |
| IFS=" " read USED FREE TOTAL <<<$(free -htm | grep "Mem" | awk {'print $3,$4,$2'}) | |
| # get processes | |
| PROCESS=`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"| grep root | awk {'print $2'}` | |
| PROCESS_USER=`echo "$PROCESS"| grep -v root | awk {'print $2'} | awk '{ SUM += $1} END { print SUM }'` | |
| # get processors | |
| PROCESSOR_NAME=`grep "model name" /proc/cpuinfo | cut -d ' ' -f3- | awk {'print $0'} | head -1` | |
| PROCESSOR_COUNT=`grep -ioP 'processor\t:' /proc/cpuinfo | wc -l` | |
| W="\e[0;39m" | |
| G="\e[1;32m" | |
| echo -e " | |
| ${W}system info: | |
| $W Distro......: $W`cat /etc/*release | grep "PRETTY_NAME" | cut -d "=" -f 2- | sed 's/"//g'` | |
| $W Kernel......: $W`uname -sr` | |
| $W Uptime......: $W`uptime -p` | |
| $W Load........: $G$LOAD1$W (1m), $G$LOAD5$W (5m), $G$LOAD15$W (15m) | |
| $W Processes...:$W $G$PROCESS_ROOT$W (root), $G$PROCESS_USER$W (user), $G$PROCESS_ALL$W (total) | |
| $W CPU.........: $W$PROCESSOR_NAME ($G$PROCESSOR_COUNT$W vCPU) | |
| $W Memory......: $G$USED$W used, $G$FREE$W free, $G$TOTAL$W total$W" | |
| ####################### | |
| ### Disk usage ### | |
| ####################### | |
| # config | |
| max_usage=90 | |
| bar_width=50 | |
| # colors | |
| white="\e[39m" | |
| green="\e[1;32m" | |
| red="\e[1;31m" | |
| dim="\e[2m" | |
| undim="\e[0m" | |
| # disk usage: ignore zfs, squashfs & tmpfs | |
| mapfile -t dfs < <(df -H -x zfs -x squashfs -x tmpfs -x devtmpfs --output=target,pcent,size | tail -n+2) | |
| printf "\ndisk usage:\n" | |
| for line in "${dfs[@]}"; do | |
| # get disk usage | |
| usage=$(echo "$line" | awk '{print $2}' | sed 's/%//') | |
| used_width=$((($usage*$bar_width)/100)) | |
| # color is green if usage < max_usage, else red | |
| if [ "${usage}" -ge "${max_usage}" ]; then | |
| color=$red | |
| else | |
| color=$green | |
| fi | |
| # print green/red bar until used_width | |
| bar="[${color}" | |
| for ((i=0; i<$used_width; i++)); do | |
| bar+="=" | |
| done | |
| # print dimmmed bar until end | |
| bar+="${white}${dim}" | |
| for ((i=$used_width; i<$bar_width; i++)); do | |
| bar+="=" | |
| done | |
| bar+="${undim}]" | |
| # print usage line & bar | |
| echo "${line}" | awk '{ printf("%-31s%+3s used out of %+4s\n", $1, $2, $3); }' | sed -e 's/^/ /' | |
| echo -e "${bar}" | sed -e 's/^/ /' | |
| done | |
| ####################### | |
| ### Service Status ### | |
| ####################### | |
| # set column width | |
| COLUMNS=3 | |
| # colors | |
| green="\e[1;32m" | |
| red="\e[1;31m" | |
| undim="\e[0m" | |
| services=("fail2ban" "yum-cron" "docker" "nginx") | |
| # sort services | |
| IFS=$'\n' services=($(sort <<<"${services[*]}")) | |
| unset IFS | |
| service_status=() | |
| # get status of all services | |
| for service in "${services[@]}"; do | |
| service_status+=($(systemctl is-active "$service")) | |
| done | |
| out="" | |
| for i in ${!services[@]}; do | |
| # color green if service is active, else red | |
| if [[ "${service_status[$i]}" == "active" ]]; then | |
| out+="${services[$i]}:,${green}${service_status[$i]}${undim}," | |
| else | |
| out+="${services[$i]}:,${red}${service_status[$i]}${undim}," | |
| fi | |
| # insert \n every $COLUMNS column | |
| if [ $((($i+1) % $COLUMNS)) -eq 0 ]; then | |
| out+="\n" | |
| fi | |
| done | |
| out+="\n" | |
| printf "\nservices:\n" | |
| printf "$out" | column -ts $',' | sed -e 's/^/ /' | |
| ####################### | |
| ### Fail2ban ### | |
| ####################### | |
| logfile='/var/log/fail2ban.log*' | |
| mapfile -t lines < <(grep -hioP '(\[[a-z-]+\]) (ban|unban)' $logfile | sort | uniq -c) | |
| jails=($(printf -- '%s\n' "${lines[@]}" | grep -oP '\[\K[^\]]+' | sort | uniq)) | |
| out="" | |
| for jail in ${jails[@]}; do | |
| bans=$(printf -- '%s\n' "${lines[@]}" | grep -iP "[[:digit:]]+ \[$jail\] ban" | awk '{print $1}') | |
| unbans=$(printf -- '%s\n' "${lines[@]}" | grep -iP "[[:digit:]]+ \[$jail\] unban" | awk '{print $1}') | |
| bans=${bans:-0} # default value | |
| unbans=${unbans:-0} # default value | |
| diff=$(($bans-$unbans)) | |
| out+=$(printf "$jail, %+3s bans, %+3s unbans, %+3s active" $bans $unbans $diff)"\n" | |
| done | |
| printf "\nfail2ban status (monthly):\n" | |
| printf "$out" | column -ts $',' | sed -e 's/^/ /' | |
| ####################### | |
| ### Docker info ### | |
| ####################### | |
| # set column width | |
| COLUMNS=2 | |
| # colors | |
| green="\e[1;32m" | |
| red="\e[1;31m" | |
| undim="\e[0m" | |
| mapfile -t containers < <(docker ps -a --format '{{.Names}}\t{{.Status}}' | awk '{ print $1,$2 }') | |
| out="" | |
| for i in "${!containers[@]}"; do | |
| IFS=" " read name status <<< ${containers[i]} | |
| # color green if service is active, else red | |
| if [[ "${status}" == "Up" ]]; then | |
| out+="${name}:,${green}${status,,}${undim}," | |
| else | |
| out+="${name}:,${red}${status,,}${undim}," | |
| fi | |
| # insert \n every $COLUMNS column | |
| if [ $((($i+1) % $COLUMNS)) -eq 0 ]; then | |
| out+="\n" | |
| fi | |
| done | |
| out+="\n" | |
| printf "\ndocker status:\n" | |
| printf "$out" | column -ts $',' | sed -e 's/^/ /' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment