dotfree.sh: un script shell pour interroger la base whois

dotfree

Voici un script bash dont la fonction est d'interroger la base Whois afin de savoir si un nom de domaine est libre ou non.
Outre l'affichage du résultat en console il est possible de garder une trace de ses requêtes dans un fichier.

Installation

Copier puis coller le script ci-dessous dans un fichier que l'on nommera dotfree.sh (le nom importe peu en fait).

#!/bin/bash

####    déclaration des variables    #### 

#enregistrer dans un fichier? : 0 = non 1 = oui
printfile=1
#si printfile=1 écrire également les domaines non libres? :  0 = non 1 = oui
printnonfree=1
#chemin et nom du fichier à enregistrer
pathrec="$HOME/whois.txt" 

#tableau des tld à tester
tab_tld=( 
    '.com' 
    '.net' 
    '.org' 
    '.info'
    '.biz'
    '.edu'
    '.mobi'
    '.name'
    '.eu'
    '.fr' 
    '.ch' 
    '.be'
    '.ca'
    )
#/!\ attention: les cles des tableaux tab_tld et tab_msg doivent correspondre
#tableau des retours whois en cas de succès
tab_msg=(
    'No match for'                      #.com
    'No match for'                      #.net
    'NOT FOUND'                         #.org
    'NOT FOUND'                         #.info
    'Not found'                         #.biz
    'No Match'                          #.edu
    'NOT FOUND'                         #.mobi
    'No match.'                         #.name
    'Status:    AVAILABLE'              #.eu 
    'No entries found'                  #.fr
    'We do not have an entry'           #.ch
    'Status:    AVAILABLE'              #.be
    'Domain status:         available'  #.ca
    )

#compter les entrées des tableaux (-1 pour index 0)
let "n=${#tab_tld[*]} -1"


####    debut du code    ####

#tester si un paramètre existe
if [ -z $1 ] ; then
    echo -e "\033[1;41;37mLa commande doit être appelée avec une chaîne de caractère en paramètre.\033[32m \nex: dotfree nom.tld\033[0m"
else
    #tester si la syntaxe est correcte
    b=`expr match "$1" '\([a-zA-Z0-9.-]*\)'`
    if [ $1 == $b ]; then
        #la syntaxe est bonne on regarde si il y a une extension tld
        tld=${b#*.}
        nom=${b%%.*}
        #si tld == nom c'est qu'il n'y a pas d'extension on test donc avec tous les tld connus
        if [ $tld == $nom ]; then
            for i in `seq 0 $n`
            do
                tld_name="$1${tab_tld[$i]}"
                #enfin on regarde si le domaine est libre pour ces extensions
                if [ -z "`whois $tld_name | grep "${tab_msg[$i]}"`" ]; then
                    echo -e "\033[1;41;37m \033[0m $tld_name est déjà enregistré"
                    #écrire dans le fichier
                    if [ $printfile == 1 ] && [ $printnonfree == 1 ]; then
                        echo "-- $tld_name" >> "$pathrec";
                    fi
                else
                    echo -e "\033[1;42;37m \033[0m $tld_name est libre"
                    #écrire dans le fichier
                    if [ $printfile == 1 ]; then
                        echo "++ $tld_name" >> "$pathrec";
                    fi
                fi
            done
            #écriture du séparateur
            if [ $printfile == 1 ]; then
                echo "=======================================================" >> "$pathrec";
            fi

        #si tld != nom alors il y a une extension.???
        else
            #on regarde si cette extension est connue dans tab_tld
            ext=".$tld"
            id="not"
            for i in `seq 0 $n`
            do
                if [ ${tab_tld[$i]} == $ext ];then
                    id=$i
                fi
            done
            #si l'extension à été trouvée alors id correspond à la clé des tableaux tab_tld et tab_msg sinon id vaut "not"
            if [ $id == "not" ];then
                echo -e "\033[1;41;37mTLD \"$ext\" inconnue.\033[0m"
            else
                #enfin on regarde si le domaine est libre pour cette extension
                if [ -z "`whois $1 | grep "${tab_msg[$id]}"`" ]; then
                    echo -e "\033[1;41;37m \033[0m $1 est déjà enregistré"
                    #écrire dans le fichier
                    if [ $printfile == 1 ] && [ $printnonfree == 1 ]; then
                        echo "-- $1" >> "$pathrec";
                    fi
                else
                    echo -e "\033[1;42;37m \033[0m $1 est libre"
                    #écrire dans le fichier
                    if [ $printfile == 1 ]; then
                        echo "++ $1" >> "$pathrec";
                    fi
                fi
                #ecriture du séparateur
                if [ $printfile == 1 ]; then
                    echo "=======================================================" >> "$pathrec";
                fi
            fi
        fi
    else
        #mauvaise syntaxe 
        echo -e "\033[1;41;37mErreur de syntaxe pour \"$1\":\033[0m\033[1;37m seuls les caractères alphanumériques et le tiret peuvent former un nom de domaine correcte.\033[0m"
    fi;
fi;

Rendre ce fichier exécutable

# chmod +x dotfree.sh

Modifier quelques paramètres

Comme indiqué ci-dessus, le script permet d'écrire les résultats des requêtes dans un fichier. C'est ce qu'il fera si vous ne le modifiez pas.
Modifiez la valeur de la variable "printfile" en lui donnant comme valeur 0 si vous ne souhaitez pas sauvegarder les retours dans un fichier.

printfile=0

Modifiez la valeur de la variable "printnonfree" en lui donnant comme valeur 0 si vous ne souhaitez sauvegarder que les retours avec des domaines libre dans un fichier.

printnonfree=0

Par défaut le script enregistrera un fichier whois.txt dans le répertoire personnel de l'utilisateur courant, modifiez la valeur de la variable "pathrec" si vous souhaitez enregistrer les retours vers un autre emplacement ou sous un nom différent.

pathrec="autre/chemin/autre_nom.txt"

Utilisation

Lancer le script avec en argument un nom de domaine et une extension effectuera une recherche whois uniquement sur ce critère.

$ ./dotfree.sh gogolplex.org
gogolplex.org est déjà enregistré

Lancer le script avec en argument un nom de domaine sans extension effectuera une recherche whois avec toutes les extensions déclarées dans le script.

$ ./dotfree.sh gogolplex
 gogolplex.com est déjà enregistré
 gogolplex.net est déjà enregistré
 gogolplex.org est déjà enregistré
 gogolplex.info est libre
 gogolplex.biz est libre
 gogolplex.edu est libre
 gogolplex.mobi est libre
 gogolplex.name est libre
 gogolplex.eu est déjà enregistré
 gogolplex.fr est libre
 gogolplex.ch est libre
 gogolplex.be est déjà enregistré
 gogolplex.ca est libre

Ajouter des extensions tld

Tel qu'il est, le script ne propose qu'une liste non exhaustive des extensions tld disponibles mais rien n'empêche d'en ajouter (ou d'en enlever).

Supposons que l'on souhaite ajouter à la liste des tld les domaines ayant pour extension .co.uk.
Dans une console tapez la commande suivante:

$ whois xbnvxnbvxnbxvnxvxn.co.uk

je choisis volontairement un nom de domaine absurde (xbnvxnbvxnbxvnxvxn.co.uk) afin d'être certain qu'il soit libre.

Voici ce que whois me répond:

No match for "xbnvxnbvxnbxvnxvxn.co.uk".

    This domain name has not been registered.

    WHOIS lookup made at 19:42:40 20-Feb-2013

-- 
This WHOIS information is provided for free by Nominet UK the central registry
for .uk domain names. This information and the .uk WHOIS are:

   Copyright Nominet UK 1996 - 2013.

You may not access the .uk WHOIS or use any data from it except as permitted
by the terms of use available in full at ...
...

les réponses sont différentes selon le tld interrogé.

Ici la ligne qui nous intéresse est la première, No match for "xbnvxnbvxnbxvnxvxn.co.uk"..
On copiera juste No match for qui sera l'élément commun à toutes les requêtes fructueuses pour un tld .co.uk.

No match for signifie que le domaine est libre

Au début du script on peut voir 2 tableaux:
* tab_tld qui contient la liste des tld (.com .net ...)
* tab_msg qui contient une chaine de caractère présente dans les retours fructueux d'une requête whois (No match for dans notre exemple).

Vous l'aurez compris il suffit d'ajouter ".co.uk" au tableau "tab_tld" et "No match for" au tableau "tab_msg". Toutefois attention, à chaque entrée du tableau tab_tld correspond une entrée du tableau tab_msg au même index. Ainsi si l'on souhaite placer le tld ".co.uk" entre le ".eu" et le ".fr" dans le tableau tab_tld, il faudra impérativement placer la chaine "No match for" entre les entrées "Status: AVAILABLE" et "No entries found" dans le tableau tab_msg.

^