Gestire automaticamente configurazioni wifi multiple: differenze tra le versioni

nessun oggetto della modifica
(Prima versione)
 
Nessun oggetto della modifica
 
(9 versioni intermedie di 6 utenti non mostrate)
Riga 1: Riga 1:
{{Versioni compatibili|Tutte le versioni di Debian}}
{{Versioni compatibili|Squeeze|Wheezy|Jessie|Testing_2015}}
__TOC__
__TOC__
==Introduzione==
==Introduzione==
Riga 46: Riga 46:
iface wifi_casa inet dhcp
iface wifi_casa inet dhcp
         wpa-driver wext
         wpa-driver wext
         wpa-ssid "wifi_casa"
         wpa-ssid wifi_casa
         wpa-psk "ddff442dg4"
         wpa-psk ddff442dg4


iface wifi_lavoro inet dhcp
iface wifi_lavoro inet dhcp
         wireless-essid wifi_lavoro
         wireless-essid wifi_lavoro
         wireless-channel 1
         wireless-channel 1
         wireless-key "6303727062"
         wireless-key 6303727062
</pre>
</pre>
facendo attenzione che il nome dell'interfaccia logica corrisponda allo [http://it.wikipedia.org/wiki/SSID SSID] della rete a cui la configurazione si riferisce. Creiamo, poi, in <code>/root/wifiup.pl</code> (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.<br/>
facendo attenzione che il nome dell'interfaccia logica corrisponda allo [http://it.wikipedia.org/wiki/SSID SSID] della rete a cui la configurazione si riferisce. Creiamo, poi, in <code>/root/wifiup.pl</code> (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.<br/>
Riga 63: Riga 63:
#                                                                                  #
#                                                                                  #
####################################################################################
####################################################################################
# ultima modifica: 19/02/2010
# ultima modifica: 18/11/2014


use strict;
use strict;


my $interface = shift or die "Specificare il nome dell\'interfaccia wifi\n";
my $interface = shift;
my $interface2 = shift;


my @knownNetwork = "";
# 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 $foundNetwork = "";
my @knownNetworks = "";
my $knownNetwork;
my $knownNetwork = "";
my @iwlist = "";
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\nOPZIONI:\n\t--h --help\tVisualizza questo messaggio\n";
        print "USO: wifiup.pl [interfaccia_wifi [interfaccia_eth]]\nOPZIONI:\n\t--h --help\tVisualizza questo messaggio\n";
exit 0;
        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
push(@knownNetwork,$1) if /iface\s+(.*)\s+inet/;
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";
        }


system("ifconfig $interface up");
                if ((keys %foundNetworks) > 0){
push(@iwlist,$_) foreach (`iwlist $interface scan | grep ESSID`);
                        foreach (keys %foundNetworks) {
foreach $knownNetwork (@knownNetwork) {
                                if ( $foundNetworks{$_} < $ref_value ) {
foreach (@iwlist) {
                                        $best_network = $_;
$foundNetwork = $knownNetwork  if /$knownNetwork/;
                                        $ref_value = $foundNetworks{$_};
}
                                }
}
                        }
if ($foundNetwork eq "") {
                }
print "wifiup.pl: Nessuna rete wifi conosciuta.\n";
                if ($best_network eq "") {
} else {
                        print "wifiup.pl: Nessuna rete wifi conosciuta al tentativo $i\n";
print "wifiup.pl: Configuro $interface per la rete $foundNetwork.\n";
                        sleep 2;
system("ifup $interface=$foundNetwork");
                } 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 tenendo presente che lo script richiede come argomento il nome dell'interfaccia wifi. Ad esempio
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>
Ora dobbiamo fare in modo che il nostro script venga eseguito ad ogni avvio di Debian. Per fare questo basta inserire il comando in <code>/etc/rc.local</code>.
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: [[Utente:Metaldaze|Metaldaze]]
{{Autori
[[Categoria:Wireless]]
|Autore = [[Utente:Metaldaze|Metaldaze]]
[[Categoria:Networking]]
}}
 
[[Categoria:Configurazione wireless]]
[[Categoria:Perl]]
24

contributi