Gestire automaticamente configurazioni wifi multiple: differenze tra le versioni
S3v (discussione | contributi) Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
(6 versioni intermedie di 4 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
{{Versioni compatibili| | {{Versioni compatibili|Squeeze|Wheezy|Jessie|Testing_2015}} | ||
__TOC__ | __TOC__ | ||
==Introduzione== | ==Introduzione== | ||
Riga 63: | Riga 63: | ||
# # | # # | ||
#################################################################################### | #################################################################################### | ||
# ultima modifica: | # ultima modifica: 18/11/2014 | ||
use strict; | use strict; | ||
my $interface = shift | my $interface = shift; | ||
my $interface2 = shift; | |||
my | # Valori modificabili dall'utente ######################################### | ||
my $retry = 10; # numero di tentativi per la ricerca di una rete conosciuta | |||
$interface = "wlan0" unless $interface; # è possibile sostituire wlan0 | |||
$interface2 = "eth0" unless $interface2; # è possibile sostituire eth0 | |||
########################################################################### | |||
my $ | my @knownNetworks = ""; | ||
my $ | my $knownNetwork = ""; | ||
my | my %foundNetworks; | ||
my $link = ""; | |||
my $i = 0; | |||
my $ref_value = 100; | |||
my $best_network = ""; | |||
my $signal; | |||
if ($interface eq "-h" or $interface eq "--help") { | 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/ ); | 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`) { | # Se il cavo di rete è connesso e il link è attivo, configuro la rete cablata con DHCP | ||
print "wifiup.pl: Verifico se il link su $interface2 è attivo... "; | |||
} | system("ifconfig $interface2 up"); | ||
sleep 5; | |||
$link = `ethtool $interface2 | grep "Link detected" | cut -d " " -f 3`; | |||
chomp $link; | |||
print "$link\n"; | |||
if ($link eq "yes") { | |||
print "wifiup.pl: Acquisizione dell'indirizzo di rete per $interface2.\n"; | |||
system ("dhclient $interface2"); | |||
} else { | |||
# scansione delle reti wifi e selezione delle reti conosciute | |||
foreach (`grep ^iface /etc/network/interfaces`) { | |||
push (@knownNetworks,$1) if /iface\s+([^\s]*)\s+inet/; | |||
} | |||
system("ifconfig $interface up"); | |||
for ($i=1; $i<=$retry; $i++) { | |||
foreach (`iwlist $interface sc`) { | |||
$signal = $1 if /.*Signal level=-([0-9]+)\sdBm/; | |||
if (/ESSID:\s*"(.*)"\n/) { | |||
foreach $knownNetwork (@knownNetworks) { | |||
$foundNetworks{$1}=$signal if $1 eq $knownNetwork; | |||
} | |||
} | |||
} | |||
# ricerca della rete migliore in base al livello del segnale (nel caso ci fossero più reti conosciute a distanza di visibilità) | |||
print "wifiup.pl: Ricerca della rete migliore.\n"; | |||
foreach (keys %foundNetworks) { | |||
print "* $_ - Signal level: -$foundNetworks{$_}dBm\n"; | |||
} | |||
if ((keys %foundNetworks) > 0){ | |||
foreach (keys %foundNetworks) { | |||
foreach | if ( $foundNetworks{$_} < $ref_value ) { | ||
$best_network = $_; | |||
$ref_value = $foundNetworks{$_}; | |||
} | |||
} | } | ||
if ($ | } | ||
if ($best_network eq "") { | |||
} else { | print "wifiup.pl: Nessuna rete wifi conosciuta al tentativo $i\n"; | ||
sleep 2; | |||
} else { | |||
$i = 11; | |||
} | |||
} | |||
# Attivazione della configurazione per la migliore rete wifi a distanza di visibilità | |||
unless ($best_network eq "") { | |||
print "wifiup.pl: Configuro $interface per la rete $best_network.\n"; | |||
$best_network =~ s/ /_/g; | |||
system("ifup $interface=$best_network"); | |||
} | |||
} | } | ||
</pre> | </pre> | ||
Riga 104: | Riga 152: | ||
# chmod +x wifiup.pl | # chmod +x wifiup.pl | ||
</pre> | </pre> | ||
A questo punto possiamo testarne il funzionamento | A questo punto possiamo testarne il funzionamento. Se lo script viene eseguito senza argomenti, l'interfaccia wifi considerata sarà wlan0, mentre verrà usata la eth0 come interfaccia cablata. Nel caso in cui in nomi delle interfacce da usare non fossero quelli di default, possiamo specificarne il nome indicando come primo argomento l'interfaccia wifi e come secondo argomento l'interfaccia cablata (attenzione a non invertire l'ordine). | ||
Nel caso in cui lo script rilevasse un link attivo sull'interfaccia cablata (cavo connesso), questa verrebbe direttamente configurata in DHCP, senza nemmeno effettuare la ricerca delle reti wifi. | |||
Possiamo, quindi, eseguire lo script nel seguente modo: | |||
<pre> | <pre> | ||
# /root/wifiup.pl wlan0 | # /root/wifiup.pl wlan0 eth0 | ||
</pre> | </pre> | ||
Nel caso in cui ci fossero più reti conosciute a distanza di visibilità, lo script tenterà di selezionare quella con il segnale migliore. | |||
Per fare in modo che il nostro script venga eseguito ad ogni avvio di Debian, basta inserire il comando in <code>/etc/rc.local</code>. | |||
{{ warningbox|Lo script funziona solo nel caso in cui l'access point non nasconda lo SSID della rete wifi. }} | {{ warningbox|Lo script funziona solo nel caso in cui l'access point non nasconda lo SSID della rete wifi. }} | ||
Autore | {{Autori | ||
|Autore = [[Utente:Metaldaze|Metaldaze]] | |||
}} | |||
[[Categoria:Configurazione wireless]] | [[Categoria:Configurazione wireless]] | ||
[[Categoria:Perl]] | [[Categoria:Perl]] |
Versione attuale delle 11:36, 10 nov 2015
Attenzione. Questa guida è da considerarsi abbandonata, per via del tempo trascorso dall'ultima verifica.
Potrà essere resa obsoleta, previa segnalazione sul forum, se nessuno si propone per l'adozione. |
Versioni Compatibili Debian 6 "squeeze" Debian 7 "wheezy" Debian 8 "jessie" |
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: 18/11/2014 use strict; my $interface = shift; my $interface2 = shift; # Valori modificabili dall'utente ######################################### my $retry = 10; # numero di tentativi per la ricerca di una rete conosciuta $interface = "wlan0" unless $interface; # è possibile sostituire wlan0 $interface2 = "eth0" unless $interface2; # è possibile sostituire eth0 ########################################################################### my @knownNetworks = ""; my $knownNetwork = ""; my %foundNetworks; my $link = ""; my $i = 0; my $ref_value = 100; my $best_network = ""; my $signal; 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/ ); # Se il cavo di rete è connesso e il link è attivo, configuro la rete cablata con DHCP print "wifiup.pl: Verifico se il link su $interface2 è attivo... "; system("ifconfig $interface2 up"); sleep 5; $link = `ethtool $interface2 | grep "Link detected" | cut -d " " -f 3`; chomp $link; print "$link\n"; if ($link eq "yes") { print "wifiup.pl: Acquisizione dell'indirizzo di rete per $interface2.\n"; system ("dhclient $interface2"); } else { # scansione delle reti wifi e selezione delle reti conosciute foreach (`grep ^iface /etc/network/interfaces`) { push (@knownNetworks,$1) if /iface\s+([^\s]*)\s+inet/; } system("ifconfig $interface up"); for ($i=1; $i<=$retry; $i++) { foreach (`iwlist $interface sc`) { $signal = $1 if /.*Signal level=-([0-9]+)\sdBm/; if (/ESSID:\s*"(.*)"\n/) { foreach $knownNetwork (@knownNetworks) { $foundNetworks{$1}=$signal if $1 eq $knownNetwork; } } } # ricerca della rete migliore in base al livello del segnale (nel caso ci fossero più reti conosciute a distanza di visibilità) print "wifiup.pl: Ricerca della rete migliore.\n"; foreach (keys %foundNetworks) { print "* $_ - Signal level: -$foundNetworks{$_}dBm\n"; } if ((keys %foundNetworks) > 0){ foreach (keys %foundNetworks) { if ( $foundNetworks{$_} < $ref_value ) { $best_network = $_; $ref_value = $foundNetworks{$_}; } } } if ($best_network eq "") { print "wifiup.pl: Nessuna rete wifi conosciuta al tentativo $i\n"; sleep 2; } else { $i = 11; } } # Attivazione della configurazione per la migliore rete wifi a distanza di visibilità unless ($best_network eq "") { print "wifiup.pl: Configuro $interface per la rete $best_network.\n"; $best_network =~ s/ /_/g; system("ifup $interface=$best_network"); } }
Rendiamo wifiup.pl
eseguibile con
# chmod +x wifiup.pl
A questo punto possiamo testarne il funzionamento. Se lo script viene eseguito senza argomenti, l'interfaccia wifi considerata sarà wlan0, mentre verrà usata la eth0 come interfaccia cablata. Nel caso in cui in nomi delle interfacce da usare non fossero quelli di default, possiamo specificarne il nome indicando come primo argomento l'interfaccia wifi e come secondo argomento l'interfaccia cablata (attenzione a non invertire l'ordine). Nel caso in cui lo script rilevasse un link attivo sull'interfaccia cablata (cavo connesso), questa verrebbe direttamente configurata in DHCP, senza nemmeno effettuare la ricerca delle reti wifi. Possiamo, quindi, eseguire lo script nel seguente modo:
# /root/wifiup.pl wlan0 eth0
Nel caso in cui ci fossero più reti conosciute a distanza di visibilità, lo script tenterà di selezionare quella con il segnale migliore.
Per fare in modo che il nostro script venga eseguito ad ogni avvio di Debian, 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 |