Bonjour à tous,
Je re-poste un nouveau sujet sur whiptail pour ceux qui souhaitent faire du pseudo graphique pour des scripts interactifs sous Debian. Certains me diront que dialog est mieux et c’est vrai mais il n’est pas natif sous Debian !
J’invite les membres du forum qui s’intéressent à la question à poster leurs astuces à la suite de celles-ci. Comme ça on centralise et ce sera + simple pour ceux qui voudront se documenter.
Précautions oratoires
Avec whiptail pas d’install de paquet nécessaire pour exécuter le script (voir question en bas du post). Le portage sous sh ou ksh ne m’intéresse pas le moins du monde vu l’utilité que j’ai pour le script. Je l’ai rédigé sous bash car c’est en natif sous Debian. Je ne script pas sous les Red Hat Like et je n’aime pas trop Ubuntu, Mint, Fedora, Gentoo… Ne me jetez pas la pierre, chacun ses goûts. C’est sûr que pour OpenStack j’utilise Ubuntu mais si j’ai le choix je prends Debian. De même si on me commande un SRV exchange, pas le choix, c’est du CroSoft…
Contrôle de saisie !
J’ai fait un petit script qui permet d’ajouter un contrôle de saisie + une remontée vers la question précédente. Le principe c’est des fonctions gigognes qui permettent de revenir en arrière. Pas très élégant, mais qui dit mieux (@Dunatotatos) ? Si c’est plus simple et intelligible par moi je prends !
[code]function Quest1 () {
function testip () {
IP=$(whiptail --inputbox “Tapez l’adresse IPV4 que vous souhaitez assigner au serveur
(au format xxx.xxx.xxx.xxx ou x représente un chiffre) :” 20 80 $(ifconfig| grep “inet adr”| grep -v 127.0.0.1|awk ‘{print $2}’|cut -d: -f2) 3>&1 1>&2 2>&3)
if [ “$?” = “1” ]
then
Quest1
fi
}
testip
until [[ “$IP” =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]
do
testip
done
function Quest2 () {
function testmask () {
netmask=$(whiptail --inputbox “Tapez l’adresse du masque de sous reseau :” 20 80 $(ifconfig |grep Masque|grep Bcast|awk ‘{ print $4 }’|cut -d: -f2) 3>&1 1>&2 2>&3)
if [ “$?” = “1” ]
then
Quest1
fi
}
testmask
until [[ “$netmask” =~ ^((255|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]|0).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]
do
testmask
done
function Quest3 () {
function testdns () {
dns=$(whiptail --inputbox “Tapez l’adresse du serveur DNS primaire :” 20 80 $(grep nameserver /etc/resolv.conf|head -n 1|awk ‘{ print $2 }’ ) 3>&1 1>&2 2>&3)
if [ “$?” = “1” ]
then
Quest2
fi
}
testdns
until [[ “$dns” =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]
do
testdns
done
function Quest4 () {
function testdns2 () {
dns2=$(whiptail --inputbox “Tapez l’adresse du serveur DNS secondaire :” 20 80 $(grep nameserver /etc/resolv.conf|head -2|tail -1|awk ‘{ print $2 }’ ) 3>&1 1>&2 2>&3)
if [ “$?” = “1” ]
then
Quest3
fi
}
testdns2
until [[ “$dns2” =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]
do
testdns2
done
function Quest5 () {
function testgate () {
##gateway=$(whiptail --inputbox “Tapez l’adresse de la passerelle :” 20 80 $(route|grep default|awk ‘{print $2}’) 3>&1 1>&2 2>&3)
GateW=$(route|grep default|awk ‘{print $2}’)
if [[ $GateW =~ [A-Z]$ ]] || [[ $GateW =~ [a-z]$ ]]
then
nslookup $GateW|grep Address|grep -v “#”|awk ‘{print $2}’ > /tmp/passerelle
gateway=$(whiptail --inputbox “Tapez l’adresse de la passerelle :” 20 80 $(cat /tmp/passerelle) 3>&1 1>&2 2>&3)
else
gateway=$(whiptail --inputbox “Tapez l’adresse de la passerelle :” 20 80 $(route|grep default|awk ‘{print $2}’) 3>&1 1>&2 2>&3)
fi
if [ “$?” = “1” ]
then
Quest4
fi
test -f /tmp/passerelle
if [ “$?” = “0” ]
then
rm /tmp/passerelle
fi
}
testgate
until [[ “$gateway” =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]
do
testgate
done
function Quest6 () {
function domaine_addr () {
domain=$(whiptail --inputbox “Tapez votre nom de domaine :” 20 80 $(grep domain /etc/resolv.conf|awk ‘{print $2}’) 3>&1 1>&2 2>&3)
if [ “$?” = “1” ]
then
Quest5
fi
}
domaine_addr
until [[ “$domain” =~ [A-Za-z0-9.-]+.[A-Za-z]{2,4}$ ]]
do
domaine_addr
done
function Quest7 () {
function hostname_addr () {
hostname=$(whiptail --inputbox “Tapez le nom de machine de votre serveur” 20 80 $(cat /etc/hostname) 3>&1 1>&2 2>&3)
if [ “$?” = “1” ]
then
Quest6
fi
}
hostname_addr
until [[ “$hostname” =~ ^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-][a-zA-Z0-9]).)([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$ ]]
do
hostname_addr
done
}
}
}
}
}
}
}
Quest1
Quest2
Quest3
Quest4
Quest5
Quest6
Quest7
whiptail --msgbox “Récapitulatif des modifications :
- Adresse IP de l’interface : $IP
- Masque de sous réseau : $netmask
- Passerelle : $gateway
- Serveur DNS 1 : $dns
- Serveur DNS 2 :$dns2
- Nom de machine : $hostname
- Nom de domaine : $domain
- FQDN : $hostname.$domain” 20 80[/code]
Radiolist sur le contenu d’un dossier
j’ai créé un petit script pour lister le contenu d’un dossier et l’insérer dans un whiptail radiolist.
Le script n’est pas très propre, il y a sans aucun doute moyen de faire mieux, mais en tout cas ça fonctionne. Mais si quelqu’un connaît un moyen de faire mieux en 3 lignes et sous bash ça m’intéresse !
Astuce pour des fichiers et non des dossiers remplacer ^d (qui commence par d) par ^- (qui commence par -)
[code]##lister les dossiers contenus dans un dossier et insérer les valeurs trouvées dans un radiolist whiptail
mkdir /tmp/RADIO
Nb de dossiers
Dnum=$(ls -l /usr | grep -c ^d)
créer liste de dossiers à insérer dans le menu whiptail
ls -l /usr | grep ^d | awk ‘{print $9}’ > /tmp/RADIO/NbDir.txt
Ajout d’un " en fin de ligne
sed -i ‘s/$/"/’ /tmp/RADIO/NbDir.txt
Ajout d’un " en début de ligne (pas moyen de le faire sans le concaténer dans un fichier texte !!)
sed ‘s/^/ "/’ /tmp/RADIO/NbDir.txt > /tmp/RADIO/NbDir2.txt
On remet tout ensemble…
cat /tmp/RADIO/NbDir2.txt > /tmp/RADIO/NbDir.txt
On ajoute un \ en fin de ligne ==> opur le radiolist !
sed -i ‘s/$/ \/’ /tmp/RADIO/NbDir.txt
On prépare la dernière ligne
tail -n 1 /tmp/RADIO/NbDir.txt > /tmp/RADIO/Last.txt
On prépare la syntaxe pour la dernière ligne
sed -i ‘s/ \/ 3>&1 1>&2 2>&3)/’ /tmp/RADIO/Last.txt
On supprime la dernière ligne qui finit par un \
echo “sed ‘${Dnum}d’ /tmp/RADIO/NbDir.txt > /tmp/RADIO/radio.txt” > /tmp/RADIO/sed
bash /tmp/RADIO/sed
On ajoute la dernière ligne avec la syntaxe qui va bien
cat /tmp/RADIO/Last.txt >> /tmp/RADIO/radio.txt
On numérote les lignes
cat -n /tmp/RADIO/radio.txt > /tmp/RADIO/radiolist
On créé un fichier à part sans esapce en début de ligne
sed ‘s/^[ \t]*//’ /tmp/RADIO/radiolist > /tmp/RADIO/radiolistnospace
Ce fichier est enfermé dans une variable
FolderList=$(cat /tmp/RADIO/radiolistnospace)
insertion des variables dans le radiolist dans un fhichier texte
echo “Folder_choice=$(whiptail --menu “Choisissez parmis les dossiers :” --nocancel 20 80 ${Dnum} \
${FolderList}
echo $Folder_choice > /tmp/RADIO/Folder_choice” > /tmp/RADIO/RadioQuest
Exécution du fichier
bash /tmp/RADIO/RadioQuest
On récupère le résultat de la question dans une variable
Folder_choice=$(cat /tmp/RADIO/Folder_choice)
On vérifie que ça marche
echo ${Folder_choice}
On supprime les fichiers temporels
rm -rf /tmp/RADIO
[/code]
Si quelqu’un sait comment utiliser l’option gauge de whiptail sans avoir à installer pv je prends (mon objectif est que le script puisse s’exécuter à partir d’une intall Debian Fraîche et en NetInstall) !!
A+ sous linux