Gestire automaticamente configurazioni wifi multiple

Versione del 20 mag 2014 alle 09:03 di Metaldaze (discussione | contributi) (Aggiornato script)
Debian-swirl.png Versioni Compatibili

Tutte le versioni supportate di Debian

Introduzione

Chi si sposta frequentemente con il proprio portatile ha, spesso, la necessità di collegarsi a reti wifi differenti, ma editare ogni volta il file /etc/network/interfaces per cambiare la configurazione dell'interfaccia wireless può risultare alquanto fastidioso. Per questo motivo alcuni si affidano a tool grafici per gestire diverse configurazioni di rete, ma questi strumenti non sono esenti da difetti e, talvolta, possono avere comportamenti imprevedibili. Un'altra valida soluzione è quella di usare Switchconf , sicuramente più affidabile, che però richiede un intervento manuale per la scelta della configurazione adatta al luogo in cui ci si trova.
Questa guida vuole proporre una soluzione alternativa, completamente automatica, al problema della gestione delle configurazioni wifi multiple, utilizzando /etc/network/interfaces come unico file di configurazione e un piccolo script in perl.

Le interfacce logiche

Normalmente siamo abituati a vedere nel file /etc/network/interfaces una configurazione simile alla seguente

iface eth0 inet static
  address 192.168.0.2
  netmask 255.255.255.0
  network 192.168.0.0
  broadcast 192.168.0.255
  gateway 192.168.0.1

dove eth0 è il nome dell'interfaccia fisica a cui la configurazione si riferisce.
Per abilitare una configurazione come questa basta lanciare il comando

# ifup eth0

Non tutti sanno, però, che è perfettamente lecito scrivere

iface rete_casa inet static
  address 192.168.0.2
  netmask 255.255.255.0
  network 192.168.0.0
  broadcast 192.168.0.255
  gateway 192.168.0.1

dove il nome dell'interfaccia fisica è sostituito da un nome di fantasia (rete_casa).
Per rendere operativa una configurazione del genere si userà sempre il comando ifup creando l'associazione tra l'interfaccia logica e una interfaccia fisica. Ad esempio con

ifup eth0=rete_casa

viene attivata e configurata l'interfaccia fisica eth0 come specificato per l'interfaccia logica rete_casa.

Rendere automatica la configurazione wifi

A questo punto è facile capire come sia possibile, utilizzando le interfacce logiche, creare in /etc/network/interfaces tutte le configurazioni wifi che ci servono. Vediamo come, però, possiamo automatizzare la scelta della configurazione corretta in base al luogo in cui ci troviamo.
Ipotizziamo di voler configurare il nostro portatile in modo che si connetta automaticamente a due reti: wifi_casa e wifi_lavoro. In /etc/network/interfaces scriveremo qualcosa di simile a

iface wifi_casa inet dhcp
        wpa-driver wext
        wpa-ssid wifi_casa
        wpa-psk ddff442dg4

iface wifi_lavoro inet dhcp
        wireless-essid wifi_lavoro
        wireless-channel 1
        wireless-key 6303727062

facendo attenzione che il nome dell'interfaccia logica corrisponda allo SSID della rete a cui la configurazione si riferisce. Creiamo, poi, in /root/wifiup.pl (o in un altro percorso a piacere) lo script in perl che, in base al risultato della scansione delle reti disponibili, attiverà la giusta configurazione.
Il contenuto dello script è il seguente:

#!/usr/bin/perl -w
####################################################################################
#                                                                                  #
#           wifiup.pl  2009  Scritto da Metaldaze (Cristiano Inturri)              #
#                                                                                  #
####################################################################################
# ultima modifica: 29/11/2011

use strict;

my $interface = shift;
my $interface2 = shift;

my @knownNetwork = "";

my $foundNetwork = "";
my $knownNetwork;
my @iwlist = "";
my $link = "";
my $i = 0;

$interface = "wlan0" unless $interface;
$interface2 = "eth0" unless $interface2;
if ($interface eq "-h" or $interface eq "--help" or !$interface2) {
	print "USO: wifiup.pl [interfaccia_wifi [interfaccia_eth]]\nOPZIONI:\n\t--h --help\tVisualizza questo messaggio\n";
	exit 0;
}

die "ERRORE: L\'interfaccia $interface non fa riferimento ad un dispositivo wifi\n" if ( `iwconfig $interface 2>&1` !~ /ESSID/ );

foreach (`grep ^iface /etc/network/interfaces`) {
	push(@knownNetwork,$1) if /iface\s+(.*)\s+inet/;
}

system("ifconfig $interface up");

for ($i=1; $i<11; $i++) {
	@iwlist = "";
	push(@iwlist,$_) foreach (`iwlist $interface scan | grep ESSID`);
	foreach $knownNetwork (@knownNetwork) {
		foreach (@iwlist) {
			$foundNetwork = $knownNetwork  if /$knownNetwork/;
		}
	}
	if ($foundNetwork eq "") {
		print "wifiup.pl: Nessuna rete wifi conosciuta al tentativo $i\n";
		sleep 2;
	} else {
		$i = 11;
	}
}

if ($foundNetwork eq "") {
	print "wifiup.pl: Nessuna rete wifi conosciuta.\n";
	$link = `ethtool $interface2 | grep "Link detected" | cut -d " " -f 3`;
	chomp $link;
	if ($link eq "yes") {
		print "wifiup.pl: Acquisizione dell'indirizzo di rete per $interface2.\n";
		system ("dhclient $interface2");
}
} else {
	print "wifiup.pl: Configuro $interface per la rete  $foundNetwork.\n";
	system("ifup $interface=$foundNetwork");
}

Rendiamo wifiup.pl eseguibile con

# chmod +x wifiup.pl

A questo punto possiamo testarne il funzionamento tenendo presente che lo script richiede come argomento il nome dell'interfaccia wifi. Ad esempio

# /root/wifiup.pl wlan0

Ora dobbiamo fare in modo che il nostro script venga eseguito ad ogni avvio di Debian. Per fare questo basta inserire il comando in /etc/rc.local.

  ATTENZIONE
Lo script funziona solo nel caso in cui l'access point non nasconda lo SSID della rete wifi.





Guida scritta da: Metaldaze   Debianized 20%
Estesa da:
Verificata da:

Verificare ed estendere la guida | Cos'è una guida Debianized