#!/bin/bash # cpu? mem? # dns server, volumes/space gw # mac addr? # Config MOTD="/etc/motd" INSTPATH="/etc/bmotd.sh" CACHEPATH="/var/cache/bmotd" # The different colours as variables C1="\033[01;35m" # Purple C2="\033[00;92m" # Green C3="\033[01;97m" # White X="\033[00;0m" # Reset main () { # print help if [ $# -lt 1 ]; then printHelp fi # check if root if ! isRoot; then echo 'Script needs root privileges to run. Re-run with sudo.' exit 1 fi # check arguments case "$1" in enable) echo -e "\nEnabling bmotd.sh" # copy to INSTPATH cp "$(readlink -f $0)" "$INSTPATH" # check if crontab present if ! command -v crontab >/dev/null 2>&1; then echo "Error: couldn't find crontab. Exiting..." exit 1 fi # Check if motd writable if ! test -w $MOTD; then echo "Unable to write $MOTD . To enable update permissions. Exiting..." exit 1 fi # Check if script is already in crontab, if not add itself CRON_ENTRY="* * * * * $INSTPATH update" crontab -l 2>/dev/null | grep -q "$CRON_ENTRY" || ( crontab -l 2>/dev/null; echo "$CRON_ENTRY" ) | crontab - echo -e "Success! Check it yourself with crontab -l" echo "Exiting." exit 0 ;; disable) echo -e "\nDisabling BetterMOTD" ( crontab -l 2>/dev/null | egrep -v "$INSTPATH update$"; ) | crontab - rm $INSTPATH exit 0 ;; update) update exit 0 ;; test) MOTD="/dev/stdout" update exit 0 ;; *) printHelp esac } update() { # Gather information HOSTNAME=$(hostname -s) FQDN=$(hostname -f) OSID=$(cat /etc/*-release 2>/dev/null | awk -F'=' '/^ID=/ { print $2; count++ } END { if (!count) print "Unknown" }') KERNEL=$(uname -r) # check if crontab present if command -v dig >/dev/null 2>&1; then EXTERNAL=$(dig TXT +time=3 +tries=2 +short o-o.myaddr.l.google.com @ns1.google.com | tr -d '"') fi # Check if pkg number cache exists test -f "$CACHEPATH/pkg_count" || PKG_REFRESH=1 # Check if pkg number cache is outdate LASTMODIFICATION=$(date +%s -r "$CACHEPATH/pkg_count") CURRENTTIME=$(date +%s) UPDATEDAGO=$((CURRENTTIME - LASTMODIFICATION)) [ "$UPDATEDAGO" -gt "86400" ] && PKG_REFRESH=1 # If cache old or non existent, get number of updates awaiting if [ $PKG_REFRESH ]; then case "$OSID" in debian|osmc|linuxmint) PKG_NU=$(apt-get --just-print upgrade | awk '/^[0-9]/ { print $1; exit }') ;; arch|archarm) PKG_NU=$(pacman -Qu | wc -l) ;; *) PKG_NU="-1" esac mkdir -p "$CACHEPATH" echo $PKG_NU > "$CACHEPATH/pkg_count" fi PKG_NU=$(cat $CACHEPATH/pkg_count) # run motd generator if so motdGen } function printHelp { echo -e "Use: $0 [ test | update | enable | disable ]\n" printf " %-6s %s\n" "test" "- Print generated motd to standard output. Use for preview." printf " %-6s %s\n" "update" "- Update /etc/motd file" printf " %-6s %s\n" "enable" "- Places $0 in /etc and adds cron entry for script to run every minute" printf " %-6s %s\n\n" "disable" "- Removes cron entry and disables refreshes of /etc/motd" exit 0; } function prettyPrint { declare -A a height=5 a["32,0"]='$';a["32,1"]='$';a["32,2"]='$';a["32,3"]='$';a["32,4"]='$'; a["33,0"]=' _ ';a["33,1"]='| |';a["33,2"]='|_|';a["33,3"]='(_)';a["33,4"]=' '; a["34,0"]=' _ _ ';a["34,1"]='( | )';a["34,2"]=' V V ';a["34,3"]=' $ ';a["34,4"]=' '; a["35,0"]=' _ _ ';a["35,1"]=' _| | |_ ';a["35,2"]='|_ . _|';a["35,3"]='|_ _|';a["35,4"]=' |_|_| '; a["36,0"]=' ';a["36,1"]=' ||_';a["36,2"]='(_-<';a["36,3"]='/ _/';a["36,4"]=' || '; a["37,0"]=' _ __ ';a["37,1"]='(_)/ / ';a["37,2"]=' / /_ ';a["37,3"]=' /_/(_)';a["37,4"]=' '; a["38,0"]=' __ ';a["38,1"]='/ _|___ ';a["38,2"]='> _|_ _|';a["38,3"]='\_____| ';a["38,4"]=' '; a["39,0"]=' _ ';a["39,1"]='( )';a["39,2"]='|/ ';a["39,3"]=' $ ';a["39,4"]=' '; a["40,0"]=' __';a["40,1"]=' / /';a["40,2"]='| | ';a["40,3"]='| | ';a["40,4"]=' \_\'; a["41,0"]='__ ';a["41,1"]='\ \ ';a["41,2"]=' | |';a["41,3"]=' | |';a["41,4"]='/_/ '; a["42,0"]=' ';a["42,1"]='_/\_';a["42,2"]='> <';a["42,3"]=' \/ ';a["42,4"]=' '; a["43,0"]=' _ ';a["43,1"]=' _| |_ ';a["43,2"]='|_ _|';a["43,3"]=' |_| ';a["43,4"]=' '; a["44,0"]=' ';a["44,1"]=' ';a["44,2"]=' _ ';a["44,3"]='( )';a["44,4"]='|/ '; a["45,0"]=' ';a["45,1"]=' ___ ';a["45,2"]='|___|';a["45,3"]=' $ ';a["45,4"]=' '; a["46,0"]=' ';a["46,1"]=' ';a["46,2"]=' _ ';a["46,3"]='(_)';a["46,4"]=' '; a["47,0"]=' __';a["47,1"]=' / /';a["47,2"]=' / / ';a["47,3"]='/_/ ';a["47,4"]=' '; a["48,0"]=' __ ';a["48,1"]=' / \ ';a["48,2"]='| () |';a["48,3"]=' \__/ ';a["48,4"]=' '; a["49,0"]=' _ ';a["49,1"]='/ |';a["49,2"]='| |';a["49,3"]='|_|';a["49,4"]=' '; a["50,0"]=' ___ ';a["50,1"]='|_ )';a["50,2"]=' / / ';a["50,3"]='/___|';a["50,4"]=' '; a["51,0"]=' ____';a["51,1"]='|__ /';a["51,2"]=' |_ \';a["51,3"]='|___/';a["51,4"]=' '; a["52,0"]=' _ _ ';a["52,1"]='| | | ';a["52,2"]='|_ _|';a["52,3"]=' |_| ';a["52,4"]=' '; a["53,0"]=' ___ ';a["53,1"]='| __|';a["53,2"]='|__ \';a["53,3"]='|___/';a["53,4"]=' '; a["54,0"]=' __ ';a["54,1"]=' / / ';a["54,2"]='/ _ \';a["54,3"]='\___/';a["54,4"]=' '; a["55,0"]=' ____ ';a["55,1"]='|__ |';a["55,2"]=' / / ';a["55,3"]=' /_/ ';a["55,4"]=' '; a["56,0"]=' ___ ';a["56,1"]='( _ )';a["56,2"]='/ _ \';a["56,3"]='\___/';a["56,4"]=' '; a["57,0"]=' ___ ';a["57,1"]='/ _ \';a["57,2"]='\_, /';a["57,3"]=' /_/ ';a["57,4"]=' '; a["58,0"]=' _ ';a["58,1"]='(_)';a["58,2"]=' _ ';a["58,3"]='(_)';a["58,4"]=' '; a["59,0"]=' _ ';a["59,1"]='(_)';a["59,2"]=' _ ';a["59,3"]='( )';a["59,4"]='|/ '; a["60,0"]=' __';a["60,1"]=' / /';a["60,2"]='< < ';a["60,3"]=' \_\';a["60,4"]=' '; a["61,0"]=' ';a["61,1"]=' ___ ';a["61,2"]='|___|';a["61,3"]='|___|';a["61,4"]=' '; a["62,0"]='__ ';a["62,1"]='\ \ ';a["62,2"]=' > >';a["62,3"]='/_/ ';a["62,4"]=' '; a["63,0"]=' ___ ';a["63,1"]='|__ \';a["63,2"]=' /_/';a["63,3"]=' (_) ';a["63,4"]=' '; a["64,0"]=' ____ ';a["64,1"]=' / __ \ ';a["64,2"]='/ / _` |';a["64,3"]='\ \__,_|';a["64,4"]=' \____/ '; a["65,0"]=' _ ';a["65,1"]=' /_\ ';a["65,2"]=' / _ \ ';a["65,3"]='/_/ \_\';a["65,4"]=' '; a["66,0"]=' ___ ';a["66,1"]='| _ )';a["66,2"]='| _ \';a["66,3"]='|___/';a["66,4"]=' '; a["67,0"]=' ___ ';a["67,1"]=' / __|';a["67,2"]='| (__ ';a["67,3"]=' \___|';a["67,4"]=' '; a["68,0"]=' ___ ';a["68,1"]='| \ ';a["68,2"]='| |) |';a["68,3"]='|___/ ';a["68,4"]=' '; a["69,0"]=' ___ ';a["69,1"]='| __|';a["69,2"]='| _| ';a["69,3"]='|___|';a["69,4"]=' '; a["70,0"]=' ___ ';a["70,1"]='| __|';a["70,2"]='| _| ';a["70,3"]='|_| ';a["70,4"]=' '; a["71,0"]=' ___ ';a["71,1"]=' / __|';a["71,2"]='| (_ |';a["71,3"]=' \___|';a["71,4"]=' '; a["72,0"]=' _ _ ';a["72,1"]='| || |';a["72,2"]='| __ |';a["72,3"]='|_||_|';a["72,4"]=' '; a["73,0"]=' ___ ';a["73,1"]='|_ _|';a["73,2"]=' | | ';a["73,3"]='|___|';a["73,4"]=' '; a["74,0"]=' _ ';a["74,1"]=' _ | |';a["74,2"]='| || |';a["74,3"]=' \__/ ';a["74,4"]=' '; a["75,0"]=' _ __';a["75,1"]='| |/ /';a["75,2"]='| '"'"' < ';a["75,3"]='|_|\_\';a["75,4"]=' '; a["76,0"]=' _ ';a["76,1"]='| | ';a["76,2"]='| |__ ';a["76,3"]='|____|';a["76,4"]=' '; a["77,0"]=' __ __ ';a["77,1"]='| \/ |';a["77,2"]='| |\/| |';a["77,3"]='|_| |_|';a["77,4"]=' '; a["78,0"]=' _ _ ';a["78,1"]='| \| |';a["78,2"]='| .` |';a["78,3"]='|_|\_|';a["78,4"]=' '; a["79,0"]=' ___ ';a["79,1"]=' / _ \ ';a["79,2"]='| (_) |';a["79,3"]=' \___/ ';a["79,4"]=' '; a["80,0"]=' ___ ';a["80,1"]='| _ \';a["80,2"]='| _/';a["80,3"]='|_| ';a["80,4"]=' '; a["81,0"]=' ___ ';a["81,1"]=' / _ \ ';a["81,2"]='| (_) |';a["81,3"]=' \__\_\';a["81,4"]=' '; a["82,0"]=' ___ ';a["82,1"]='| _ \';a["82,2"]='| /';a["82,3"]='|_|_\';a["82,4"]=' '; a["83,0"]=' ___ ';a["83,1"]='/ __|';a["83,2"]='\__ \';a["83,3"]='|___/';a["83,4"]=' '; a["84,0"]=' _____ ';a["84,1"]='|_ _|';a["84,2"]=' | | ';a["84,3"]=' |_| ';a["84,4"]=' '; a["85,0"]=' _ _ ';a["85,1"]='| | | |';a["85,2"]='| |_| |';a["85,3"]=' \___/ ';a["85,4"]=' '; a["86,0"]='__ __';a["86,1"]='\ \ / /';a["86,2"]=' \ V / ';a["86,3"]=' \_/ ';a["86,4"]=' '; a["87,0"]='__ __';a["87,1"]='\ \ / /';a["87,2"]=' \ \/\/ / ';a["87,3"]=' \_/\_/ ';a["87,4"]=' '; a["88,0"]='__ __';a["88,1"]='\ \/ /';a["88,2"]=' > < ';a["88,3"]='/_/\_\';a["88,4"]=' '; a["89,0"]='__ __';a["89,1"]='\ \ / /';a["89,2"]=' \ V / ';a["89,3"]=' |_| ';a["89,4"]=' '; a["90,0"]=' ____';a["90,1"]='|_ /';a["90,2"]=' / / ';a["90,3"]='/___|';a["90,4"]=' '; a["91,0"]=' __ ';a["91,1"]='| _|';a["91,2"]='| | ';a["91,3"]='| | ';a["91,4"]='|__|'; a["92,0"]='__ ';a["92,1"]='\ \ ';a["92,2"]=' \ \ ';a["92,3"]=' \_\';a["92,4"]=' '; a["93,0"]=' __ ';a["93,1"]='|_ |';a["93,2"]=' | |';a["93,3"]=' | |';a["93,4"]='|__|'; a["94,0"]=' /\ ';a["94,1"]='|/\|';a["94,2"]=' $ ';a["94,3"]=' $ ';a["94,4"]=' '; a["95,0"]=' ';a["95,1"]=' ';a["95,2"]=' ';a["95,3"]=' ___ ';a["95,4"]='|___|'; a["96,0"]=' _ ';a["96,1"]='( )';a["96,2"]=' \|';a["96,3"]=' $ ';a["96,4"]=' '; a["97,0"]=' ';a["97,1"]=' __ _ ';a["97,2"]='/ _` |';a["97,3"]='\__,_|';a["97,4"]=' '; a["98,0"]=' _ ';a["98,1"]='| |__ ';a["98,2"]='| '"'"'_ \';a["98,3"]='|_.__/';a["98,4"]=' '; a["99,0"]=' ';a["99,1"]=' __ ';a["99,2"]='/ _|';a["99,3"]='\__|';a["99,4"]=' '; a["100,0"]=' _ ';a["100,1"]=' __| |';a["100,2"]='/ _` |';a["100,3"]='\__,_|';a["100,4"]=' '; a["101,0"]=' ';a["101,1"]=' ___ ';a["101,2"]='/ -_)';a["101,3"]='\___|';a["101,4"]=' '; a["102,0"]=' __ ';a["102,1"]=' / _|';a["102,2"]='| _|';a["102,3"]='|_| ';a["102,4"]=' '; a["103,0"]=' ';a["103,1"]=' __ _ ';a["103,2"]='/ _` |';a["103,3"]='\__, |';a["103,4"]='|___/ '; a["104,0"]=' _ ';a["104,1"]='| |_ ';a["104,2"]='| '"'"' \ ';a["104,3"]='|_||_|';a["104,4"]=' '; a["105,0"]=' _ ';a["105,1"]='(_)';a["105,2"]='| |';a["105,3"]='|_|';a["105,4"]=' '; a["106,0"]=' _ ';a["106,1"]=' (_)';a["106,2"]=' | |';a["106,3"]=' _/ |';a["106,4"]='|__/ '; a["107,0"]=' _ ';a["107,1"]='| |__';a["107,2"]='| / /';a["107,3"]='|_\_\';a["107,4"]=' '; a["108,0"]=' _ ';a["108,1"]='| |';a["108,2"]='| |';a["108,3"]='|_|';a["108,4"]=' '; a["109,0"]=' ';a["109,1"]=' _ __ ';a["109,2"]='| '"'"' \ ';a["109,3"]='|_|_|_|';a["109,4"]=' '; a["110,0"]=' ';a["110,1"]=' _ _ ';a["110,2"]='| '"'"' \ ';a["110,3"]='|_||_|';a["110,4"]=' '; a["111,0"]=' ';a["111,1"]=' ___ ';a["111,2"]='/ _ \';a["111,3"]='\___/';a["111,4"]=' '; a["112,0"]=' ';a["112,1"]=' _ __ ';a["112,2"]='| '"'"'_ \';a["112,3"]='| .__/';a["112,4"]='|_| '; a["113,0"]=' ';a["113,1"]=' __ _ ';a["113,2"]='/ _` |';a["113,3"]='\__, |';a["113,4"]=' |_|'; a["114,0"]=' ';a["114,1"]=' _ _ ';a["114,2"]='| '"'"'_|';a["114,3"]='|_| ';a["114,4"]=' '; a["115,0"]=' ';a["115,1"]=' ___';a["115,2"]='(_-<';a["115,3"]='/__/';a["115,4"]=' '; a["116,0"]=' _ ';a["116,1"]='| |_ ';a["116,2"]='| _|';a["116,3"]=' \__|';a["116,4"]=' '; a["117,0"]=' ';a["117,1"]=' _ _ ';a["117,2"]='| || |';a["117,3"]=' \_,_|';a["117,4"]=' '; a["118,0"]=' ';a["118,1"]='__ __';a["118,2"]='\ V /';a["118,3"]=' \_/ ';a["118,4"]=' '; a["119,0"]=' ';a["119,1"]='__ __ __';a["119,2"]='\ V V /';a["119,3"]=' \_/\_/ ';a["119,4"]=' '; a["120,0"]=' ';a["120,1"]='__ __';a["120,2"]='\ \ /';a["120,3"]='/_\_\';a["120,4"]=' '; a["121,0"]=' ';a["121,1"]=' _ _ ';a["121,2"]='| || |';a["121,3"]=' \_, |';a["121,4"]=' |__/ '; a["122,0"]=' ';a["122,1"]=' ___';a["122,2"]='|_ /';a["122,3"]='/__|';a["122,4"]=' '; str=$1 strarr=() for (( i=0; i<${#str}; i++ )); do strarr+=($(printf '%d\n' "'${str:$i:1}")) done for ((i=0;i/dev/null 2>&1 && parse_ip command -v ip >/dev/null 2>&1 || parse_ifconfig clear > $MOTD # to clear the screen when showing up echo -e "$C2" >> $MOTD prettyPrint $HOSTNAME >> $MOTD echo -e " $C3$LBT" >> $MOTD echo -e " $C3║$C2 • FQDN...............$C3: $C1 $FQDN" >> $MOTD echo -e " $C3║$C2 • Last Login.........$C3: $C1 $LASTLOGIN" >> $MOTD echo -e " $C3║$C2 • Pkg to update......$C3: $C1 $PKG_NU" >> $MOTD echo -e " $C3║$C2 • Uptime,Load........$C3: $C1 $UPTIME_EXT" >> $MOTD echo -e " $C3║$C2 • Kernel.............$C3: $C1 $KERNEL" >> $MOTD if ! test -z $EXTERNAL; then echo -e " $C3║$C2 • External IP........$C3: $C1 $EXTERNAL" >> $MOTD fi for (( i=0; i<${#arr[@]}; i++ )); do if [ $i -eq 0 ]; then echo -e "$C3 ║$C2 • Network Interfaces.$C3: $C1 ${arr[$i]}" >> $MOTD else echo -e "$C3 ║$C2 $C1 ${arr[$i]}" >> $MOTD fi done echo -e " $C3$LBB" >> $MOTD echo -e "$X" >> $MOTD } main "$@"