"network-select" Cambiamento configurazione di rete - collegato anche ai nomi eth e wlan - usa ifconfig, ifup, ifdown

- A cura del Prof. Stefano Salvi -


#!/bin/bash
# network-select
# questo script puo' essere invocato come
#	+ wlan -> attiva tutte le interfacce wireless (wlanX)
#	+ eth -> attiva tutte le interfacce fisse (ethX)
# posso dare un parametro per richiedere di caricare una nuova configurazione
# oppure nessun parametro, per passare da eth a wlan
# Per prima cosa comunque disattiva tute le interfacce attive

# Stefano Salvi <stefano@salvi.mn.it>
# this file is available under the GNU general public license

# Controlla se l'utente che lancia lo script e' ROOT (cha ha l'UID = 0)
if [ $UID -ne 0 ]
then
        echo "Devi essere l'utente ROOT per operare sulle schede di rete"
        echo "Puoi diventare l'utente ROOT o facendo login su di una"
        echo "console come \"root\" oppure digitando il comando \"su -\""
        echo "che chiede la password di root e ti trasforma nell'utente ROOT"
        exit 3
fi

# Ottiene la lista delle interfacce di rete attive
RUNNINGIFACES=`ifconfig | grep "^[ew]" | sed -e "s/^\([a-z0-9]*\) .*$/\1/" -`

# Le ferma
for interface in $RUNNINGIFACES
do
	ifdown $interface
done

# recupero il nome dello script (solo in nome, senza il percrso)
SCRIPT=`basename $0`

# Predispone due variabili per indicare se avviare le Ethernet o le Wlan
WLAN=""
ETH=""
# Variabile con il nome della nuova configurazione
NEWCONF=""
# Percorso del file di configurazione
NETPATH="/etc/network/interfaces"
RESOLVPATH="/etc/resolv.conf"

if [ $SCRIPT = "wlan" ]
then
	WLAN="s"
elif [ $SCRIPT = "eth" ]
then
	ETH="s"
fi

# processa i paramentri
# Finche' ho un parametro
while [ $1 ]
do
	# Controlla il valore del parametro corrente
	case $1 in
	    # Inizia per "-" (quindi e' un parametro)
	    -*)
	    	# Controlla quale parametro
		case $1 in
		    -w)
			WLAN="s"
			;;
		    -e)
			ETH="s"
			;;
		    # ogni altro parametro (non riconosciuto)
		    -*)
		    	echo "ERRORE: Parametro $1 sconosciuto"
			echo " 	Paramterti validi:"
			echo "	-w	Attiva le interfacce Wireless"
			echo "	-e	Attiva le interfacce Ethernet"
			exit 1
			;;
		esac
		;;
	    # Qualunque altra cosa che non e' un parametro -> configurazione
	    *)
		NEWCONF=$1
		# verifica se il file di configurazione esiste ed e' leggibile
		if [ ! -r $NETPATH.$NEWCONF ]
		then
			echo "il file con la configurazione $NEWCONF ($NETPATH.$NEWCONF) non esiste o non e' leggibile"
			exit 2
		fi
		;;
	esac
	# Passa al parametro successivo
	shift
done

# Se ha un nome di configurazione, copia il relativo file nella conf. corrente
if [ $NEWCONF ]
then
	cp $NETPATH.$NEWCONF $NETPATH
fi

# Se deve installare le interfacce wireless
if [ $WLAN ]
then
	# cerca le righe contenti la stringa "wlan" ed estrae il nome
	WLAN=`grep "^iface.*wlan" /etc/network/interfaces | \
		sed -e "s/^.*\(wlan[0-9]\).*$/\1/"`
fi

# Se deve installare le interfacce wireless
if [ $ETH ]
then
	# cerca le righe contenti la stringa "wlan" ed estrae il nome
	ETH=`grep "^iface.*eth" /etc/network/interfaces | \
		sed -e "s/^.*\(eth[0-9]\).*$/\1/"`
fi

#Concatena le interfacce
INTERFACES="$ETH $WLAN"

#Se non ci sono interfacce perche' non ho indicato ne "-w" ne "-e" ed 
# il nome dello script non e' ne "wlan" ne "eth"
if [ ! "$INTERFACES" ]
then
	# utilizza le interfacce attive all'avvio
	INTERFACES="$RUNNINGIFACES"
fi

#Attiva le interfacce
for interface in $INTERFACES
do
	ifup $interface
done

# e adesso gestisce il DNS (se trova le stringhe opportune)
# Esrae la prima riga indicante i server DNS
DNS=`grep dns-nameservers /etc/network/interfaces | head -n 1 | \
	sed "s/^[ \t]*dns-nameservers[ \t]*\(.*\)$/\1/"`
# Estrae la prima riga contente un dominio di ricerca
SEARCH=`grep dns-searc /etc/network/interfaces | head -n 1 | \
	sed "s/^[ \t]*dns-search[ \t]*\(.*\)$/\1/"`

#Se ha trovato i DNS
if [ "$DNS" ]
then
	# Crea un backup
	mv $RESOLVPATH $RESOLVPATH.old
	echo "# Creato dallo script network-select" > $RESOLVPATH
	if [ $SEARCH ]
	then
		echo "search $SEARCH" >> $RESOLVPATH
	fi
	for d in $DNS
	do
                echo "nameserver $d" >> $RESOLVPATH
	done
fi