Whiptail + contrôle de saisie

Bonjour,

Voici un petit script test pour implémenter un contrôle de saisie avec une REGEX sous bash. J’arrive à y ajouter un retour en arrière mais pas plus d’une fois et sans contrôle de saisie…
Enfin j’ai quand même essayé !

[code]#!/bin/bash

-- coding: UTF8 --

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)
}
testip
if [ $? = 1 ]
then
whiptail --msgbox “Retour au menu.” 20 80
else
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
whiptail --msgbox "Retentez votre saisie… " 20 80
testip
done
fi

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)
}
testmask
if [ $? = 1 ]
then
testip
testmask
else
until [[ “$netmask” =~ ^((255|[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
whiptail --msgbox "Retentez votre saisie… " 20 80
testmask
done
fi

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)
}
testdns
if [ $? = 1 ]
then
testmask
testdns
else
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
whiptail --msgbox "Retentez votre saisie… " 20 80
testdns
done
fi

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)
}
testdns2
if [ $? = 1 ]
then
testdns
testdns2
else
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
whiptail --msgbox "Retentez votre saisie… " 20 80
testdns2
done
fi

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)
}
testgate
if [ $? = 1 ]
then
testdns2
testgate
else
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
whiptail --msgbox "Retentez votre saisie… " 20 80
testgate
done
fi

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)
}
domaine_addr
if [ $? = 1 ]
then
testgate
domaine_addr
else
until [[ “$domain” =~ [A-Za-z0-9.-]+.[A-Za-z]{2,4}$ ]]
do
whiptail --msgbox "Retentez votre saisie… " 20 80
domaine_addr
done
fi

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)
}
hostname_addr
if [ $? = 1 ]
then
domaine_addr
hostname_addr
else
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
whiptail --msgbox "Retentez votre saisie… " 20 80
hostname_addr
done
fi[/code]

Le code n’est probablement pas très propre mais je suis sûr que vous aurez des idées :smiley:
Si on enlève le retour en arrière (–nocancel) ça fonctionne plutôt bien :

[code]#!/bin/bash

-- coding: UTF8 --

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) :” --nocancel 20 80 $(ifconfig| grep “inet adr”| grep -v 127.0.0.1|awk ‘{print $2}’|cut -d: -f2) 3>&1 1>&2 2>&3)
}
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
whiptail --msgbox "Retentez votre saisie… " 20 80
testip
done

function testmask () {
netmask=$(whiptail --inputbox “Tapez l’adresse du masque de sous reseau :” --nocancel 20 80 $(ifconfig |grep Masque|grep Bcast|awk ‘{ print $4 }’|cut -d: -f2) 3>&1 1>&2 2>&3)
}
testmask
until [[ “$netmask” =~ ^((255|[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
whiptail --msgbox "Retentez votre saisie… " 20 80
testmask
done

function testdns () {
dns=$(whiptail --inputbox “Tapez l’adresse du serveur DNS primaire :” --nocancel 20 80 $(grep nameserver /etc/resolv.conf|head -n 1|awk ‘{ print $2 }’ ) 3>&1 1>&2 2>&3)
}
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
whiptail --msgbox "Retentez votre saisie… " 20 80
testdns
done

function testdns2 () {
dns2=$(whiptail --inputbox “Tapez l’adresse du serveur DNS secondaire :” --nocancel 20 80 $(grep nameserver /etc/resolv.conf|head -2|tail -1|awk ‘{ print $2 }’ ) 3>&1 1>&2 2>&3)
}
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
whiptail --msgbox "Retentez votre saisie… " 20 80
testdns2
done

function testgate () {
gateway=$(whiptail --inputbox “Tapez l’adresse de la passerelle :” --nocancel 20 80 $(route|grep default|awk ‘{print $2}’) 3>&1 1>&2 2>&3)
}
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
whiptail --msgbox "Retentez votre saisie… " 20 80
testgate
done

function domaine_addr () {
domain=$(whiptail --inputbox “Tapez votre nom de domaine :” --nocancel 20 80 $(grep domain /etc/resolv.conf|awk ‘{print $2}’) 3>&1 1>&2 2>&3)
}
domaine_addr
until [[ “$domain” =~ [A-Za-z0-9.-]+.[A-Za-z]{2,4}$ ]]
do
whiptail --msgbox "Retentez votre saisie… " 20 80
domaine_addr
done

function hostname_addr () {
hostname=$(whiptail --inputbox “Tapez le nom de machine de votre serveur” --nocancel 20 80 $(cat /etc/hostname) 3>&1 1>&2 2>&3)
}
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
whiptail --msgbox "Retentez votre saisie… " 20 80
hostname_addr
done[/code]

Voilà !