#!/bin/bash
# dependency: apt install whois
# based on https://linuxconfig.org/check-domain-name-availability-with-bash-and-whois & https://gist.github.com/hotheadhacker/873519dea910b70bfc0137c527583056
# Please copy, share, redistribute and improve

#________                        .__              .__                   __                 
#\______ \   ____   _____ _____  |__| ____   ____ |  |__   ____   ____ |  | __ ___________ 
# |    |  \ /  _ \ /     \\__  \ |  |/    \_/ ___\|  |  \_/ __ \_/ ___\|  |/ // __ \_  __ \
# |    `   (  <_> )  Y Y  \/ __ \|  |   |  \  \___|   Y  \  ___/\  \___|    <\  ___/|  | \/
#/_______  /\____/|__|_|  (____  /__|___|  /\___  >___|  /\___  >\___  >__|_ \\___  >__|   
#        \/             \/     \/        \/     \/     \/     \/     \/     \/    \/       

if ! command -v whois &> /dev/null; then
    echo -e "\e[1;31mWhois command not found! Please install whois and try again.\nExit with error code 1.\e[0m"
    exit 1
fi

if [ "$#" == "0" ]; then
    echo -e "\e[1;31mYou need to supply at least one argument!\nExit with error code 1.\e[0m"
    exit 1
fi

echo -e "\e[1;93mstarting...\e[0m\n"
start_time=$(date +%s%N)

TLDS=( '.de' '.at' '.com' '.net' '.org' '.info' \
'.biz' '.eu' '.ch' '.co.at' '.or.at' '.li' \
'.us' '.dk' '.ws' '.it' '.bz.it' '.be' \
'.nl' '.name' '.in' '.es' '.mobi' )

ELEMENTS=${#TLDS[@]}

MAX_LENGTH=0
for (( i=0;i<$ELEMENTS;i++)); do
  FULL_DOMAIN=$1${TLDS[${i}]}
  LENGTH=${#FULL_DOMAIN}
  if [ $LENGTH -gt $MAX_LENGTH ]; then
    MAX_LENGTH=$LENGTH
  fi
done

while (( "$#" )); do
  for (( i=0;i<$ELEMENTS;i++)); do
    FULL_DOMAIN=$1${TLDS[${i}]}
    if [ "${TLDS[${i}]}" == ".ch" ] || [ "${TLDS[${i}]}" == ".li" ]; then
      RESPONSE=$(whois -h whois.nic.ch -p 4343 $FULL_DOMAIN)
    elif [ "${TLDS[${i}]}" == ".es" ]; then
      #RESPONSE=$(whois -h whois.nic.es $FULL_DOMAIN)
      RESPONSE=".es TLDs are not natively supported, see https://www.dominios.es/en/sobre-dominios/valores-anadidos#whois"
      printf "%-${MAX_LENGTH}s: \e[3;33m$RESPONSE\e[0m\n" "$FULL_DOMAIN"
      continue
    else
      RESPONSE=$(whois $FULL_DOMAIN)
    fi

    if [ -z "$RESPONSE" ]; then
      printf "%-${MAX_LENGTH}s: \e[91mno response\e[0m\n" "$FULL_DOMAIN"
    elif [ "${TLDS[${i}]}" == ".ch" ] || [ "${TLDS[${i}]}" == ".li" ]; then
      CODE=$(echo "$RESPONSE" | head -1 | cut -d':' -f1)
      case $CODE in
        1)
          printf "%-${MAX_LENGTH}s: \e[1;32mavailable\e[0m\n" "$FULL_DOMAIN"
          ;;
        0)
          printf "%-${MAX_LENGTH}s: \e[90munavailable\e[0m\n" "$FULL_DOMAIN"
          ;;
        -1)
          printf "%-${MAX_LENGTH}s: \e[33minvalid query\e[0m\n" "$FULL_DOMAIN"
          ;;
        -95)
          printf "%-${MAX_LENGTH}s: \e[31maccess restricted\e[0m\n" "$FULL_DOMAIN"
          ;;
        -99)
          printf "%-${MAX_LENGTH}s: \e[31mtemporary server error\e[0m\n" "$FULL_DOMAIN"
          ;;
        *)
          printf "%-${MAX_LENGTH}s: \e[91munknown response code $CODE:\e[0m\n" "$FULL_DOMAIN"
          echo -e "\e[91m$RESPONSE\e[0m"
          ;;
      esac
    elif echo "$RESPONSE" | grep -v '%' | grep -Eq \
      '^No match|^NOT FOUND|^Not fo|AVAILABLE|^No Data Fou|has not been regi|No entri|Not Found|available|free|not found|not exist'; then
      printf "%-${MAX_LENGTH}s: \e[1;32mavailable\e[0m\n" "$FULL_DOMAIN"
    elif echo "$RESPONSE" | grep -q "nothing found"; then
      printf "%-${MAX_LENGTH}s: \e[1;32mavailable\e[0m\n" "$FULL_DOMAIN"
    elif echo "$RESPONSE" | grep -v '%' | grep -Eq \
      'Requests of this client are not permitted|not permitted|client is not permitted'; then
      printf "%-${MAX_LENGTH}s: \e[31mblocked\e[0m\n" "$FULL_DOMAIN"
    elif echo "$RESPONSE" | grep -v '%' | grep -Eq \
      'not supported|not recognized|invalid query|invalid input|no whois-server|keinen Whois-Server'; then
      printf "%-${MAX_LENGTH}s: \e[33mnot supported\e[0m\n" "$FULL_DOMAIN"
    elif echo "$RESPONSE" | grep -Eq \
      'Quota exceeded|Too many requests|timeout'; then
      printf "%-${MAX_LENGTH}s: \e[33mtoo many requests\e[0m\n" "$FULL_DOMAIN"
    else  
      printf "%-${MAX_LENGTH}s: \e[90munavailable\e[0m\n" "$FULL_DOMAIN"
    fi
  done

shift

done

end_time=$(date +%s%N)
execution_time=$(( ($end_time - $start_time) / 1000000 ))
echo -e "\n\e[1;92mdone!\e[0m\n\e[96mexecution time: $execution_time ms\e[0m"
