Configurazione automatica della rete con whereami+ifplugd (senza NetworkManager)
- Correzioni file di configurazione /etc/whereami/whereami.conf
Non ho nulla contro NM, anzi secondo me è un progetto veramente valido sotto molti punti di vista: nel 90% dei casi riesce a far funzionare al primo colpo la rete, sia essa wired o wireless, e senza nessuno sbattimento. Però...
Molti di voi si sono imbattuti nei problemi che affligono NM: non gestisce gli ip statici (aspetto più evidente), non utilizza lo standard /etc/network/interfaces e quindi non funzionano gli script standard di debian ifup/ifdown e tutti i tool che ne fanno uso... ecc.. ma, la cosa più importante a mio avviso, è che quando non va non si sa dove mettere le mani. (mi ricorda un altro s.o...
Quando poi devo fare dei test sulla rete voglio avere le mani libere, poter settare a mano i parametri e usare i tool di gestione classici della rete senza nessuno che mi riconfiguri il tutto sotto il naso.
Dopo un po' di ricerche per trovare delle alternative che facessero al caso mio, avevo deciso di provare due soluzioni: guessnet e whereami. Mi intrigava più la prima, perchè si integra completamente all'interno del classico file interfaces e non necessita di ulteriori file di configurazione, ma con edgy andava in segfault e non sono proprio riuscito a venirne a capo (su feisty adesso non dà errori, ma non ho avuto il tempo di testare..)
Ho provato quindi whereami, che uso tuttora con risultati soddisfacenti.
Qui di seguito provo a illustrare un esempio di configurazione (la mia è davvero incasinata)
Scenario:
Con il mio notebook ho la necessità di connettermi a diverse reti, alcune wireless, altre wired, con e senza dhcp.
- Casa: wireless, dhcp - wired, statico
- Ufficio1: wired, dhcp
- Ufficio2: wired, statico
La nostra soluzione dovrà permetterci di avere la rete perfettamente operativa appena "attaccato il cavo di rete", riconoscendo in automatico la rete alla quale ci siamo collegati, configurando i relativi parametri ed eventualmente stoppare/avviare dei servizi specifici, montare delle unità di rete, ecc...
Prerequisiti:
Prima ho parlato di "attaccare il cavo di rete": ovviamente nel caso di connessione wireless non sarà fatto realmente, però lo strato fisico deve essere già configurato e funzionante. in pratica l'output di ifconfig deve visualizzare la vostra scheda di rete (eth1, wlan0, o altro secondo il vostro hardware) e iwconfig vi deve confermare che siete correttamente associati all'access point, con o senza cifratura (io preferirei con, poi fate vobis)
Se non avete ancora configurato il wireless (sempre riferito allo strato fisico), potete riferirvi alla guida sul wiki:
http://wiki.ubuntu-it.org/Hardware/Wireless/WpaSupplicant
L'unica variazione che posso suggerire è di utilizzare il comando wpa_passphrase per la generazione del file /etc/wpa_supplicant.conf
Codice: Seleziona tutto
sudo wpa_passphrase VostroSSID VostraPassphrase > /etc/wpa_supplicant.confCodice: Seleziona tutto
sudo apt-get remove avahi-daemon avahi-autoipd network-managerFatto ciò il nostro sistema è pronto per whereami e ifplugd
Configurazione iniziale:
Tiriamo giù intanto le interfacce di rete
Codice: Seleziona tutto
sudo ifdown eth0
sudo ifdown eth1Codice: Seleziona tutto
sudo cp /etc/network/interfaces /etc/network/interfaces.funzionante
Codice: Seleziona tutto
sudo gedit /etc/network/interfacesCodice: Seleziona tutto
################################################
#/etc/network/interfaces
#
# Interfaccia di loopback
auto lo
iface lo inet loopback
noauto eth0 eth1
################################################
#Mappatura profili interfaccia wireless - eth1
################################################
mapping eth1
map whome
### PROFILO whome - wifi ###
iface whome inet dhcp
wpa_driver wext
wpa-conf /etc/wpa_supplicant.conf
################################################
#Mappatura profili interfaccia wired - eth0
################################################
mapping eth0
map home
map work1
map work2
### PROFILO home - wired ###
iface home inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
broadcast 192.168.1.255
dns-nameservers 192.168.1.1
### PROFILO work1 - wired ###
iface work1 inet dhcp
up hostname PC239
### PROFILO work2 - wired ###
iface work2 inet static
address 10.0.10.100
netmask 255.255.255.0
gateway 10.0.10.1
broadcast 10.0.10.255
dns-nameservers 10.0.10.200
Codice: Seleziona tutto
sudo ifup eth0=homeAdesso ci stacchiamo dalla rete (anche fisicamente) e ci colleghiamo tramite il wireless
Codice: Seleziona tutto
sudo ifdown eth0
sudo ifup eth1=whome
Installazione di whereami
Installiamo adesso whereami, ovviamente con:
Codice: Seleziona tutto
sudo apt-get install whereamiCodice: Seleziona tutto
sudo mv /etc/whereami/detect.conf /etc/whereami/detect.conf.originale
sudo mv /etc/whereami/whereami.conf /etc/whereami/whereami.conf.originale
Partiamo con la configurazione del detect.conf. All'interno di questo file vanno definiti i test da effettuare per stabilire a quale rete siamo connessi e settare il corrispondente "stato"
Codice: Seleziona tutto
sudo gedit /etc/whereami/detect.conf
##############################
### /etc/whereami/detect.conf
##############################
#set DEBUGWHEREAMI 1
default conn-none
### Controlliamo se il cavo di rete è collegato
testmii eth0 conn-wired
### Se è stato passato il parametro stop, settiamo gli stati corrispondenti
if stop
always at conn-norete
always notat conn-wired,conn-wireless
fi
### se siamo collegati con il cavo, verifichiamo a quale rete, attraverso il MAC address
if conn-wired
set INTERFACE eth0
testarp 00:11:22:33:44:55,192.168.1.1 s-home
testarp AA:BB:CC:DD:EE:FF,192.168.168.1 s-work1
testping 10.0.10.100,10.0.10.1 s-work2
testdhcp '*.*.*.*' s-wfree
notat conn-wired
### altrimenti, tiriamo su l'interfaccia wireless e vediamo se ci sono ap in in giro
else
set INTERFACE eth1
always modprobe ipw3945 conn-wireless
always testap scan conn-wireless
fi
### se stiamo sul wireless controlliamo se riusciamo a contattare il nostro AP
### ....se no... ci accontentiamo di quello che c'è...
if conn-wireless
set INTERFACE eth1
testappassive VostroSSID s-home-w
testappassive .+ s-other-w
notat conn-wireless
fi
### ..basta che ci dia un indirizzo ip....
if s-other-w
testdhcp '*.*.*.*' s-wfree
notat s-other-w
fi
Possiamo subito notare che tutto si appoggia a dei test (testmii, testarp, testping) che non sono altro che degli script perl presenti nella cartella /usr/share/whereami/tests (una descrizione dettagliata degli script disponibili e dei relativi parametri la si può trovare in /usr/share/doc/whereami/html/detection.html); nulla vieta, avendone la possibilità, di scriversene dei propri (basta che lo script, anche bash, ritorni 0 o 1 al termine dell'esecuzione per indicare l'esito positivo o negativo del test)
I MAC address da passare come parametro a testarp possono essere ricavati con il comando
Codice: Seleziona tutto
arping -I <interfaccia> <ip_da_controllare>
Se un test ha esito positivo, allora whereami imposta la variabile che noi indichiamo subito dopo. Sulle variabili che così impostate, possiamo effettuare ulteriori controlli.
Da notare che se un test all'interno di un "if...fi" risulta vero, vengono saltati tutti i controlli successivi.
Una volta eseguiti i test, e quindi aver determinato che tipo di connessione abbiamo attivato e a quale rete siamo collegati, impostiamo le relative azioni da intraprendere nel file /etc/whereami/whereami.conf
Codice: Seleziona tutto
sudo gedit /etc/whereami/whereami.conf
Codice: Seleziona tutto
##############################
### /etc/whereami/whereami.conf
##############################
!conn-wired ifdown eth0
!conn-wired ifconfig eth0 down
!conn-wireless ifdown eth1
!conn-wireless modprobe -r ipw3945
=s-home-w ifup eth1=home-w
=s-home ifup eth0=home
=s-work1 ifup eth0=work1
+s-work1 smbmount //serverwin/dati /mnt/serverwin/
-s-work1 umount /mnt/pcwin/
=s-work2 ifup eth0=s-work2
+s-work2 /etc/init.d/apache start
-s-work2 /etc/init.d/apache stop
Prima di provare il tutto, dobbiamo eliminare il file
Codice: Seleziona tutto
sudo rm /etc/interfaces/pre-up.d/whereami
Codice: Seleziona tutto
sudo whereami --debug
Proviamo a rilanciare whereami dopo avere staccato/riattaccato il cavo di rete e controllato se è tutto ok con i soliti comandi ifconfig, iwconfig
Installazione ifplugd
A questo punto, la chicca finale: installiamo ifplugd, che è un demone che si "accorge" se è stato inserito o disinserito il plug della scheda ethernet ed esegue gli script che si trovano in /etc/ifplugd/action.d. Dovremo sistemare tutto quanto in modo che venga ogni volta chiamato in causa whereami anzichè lo script standard:
Codice: Seleziona tutto
sudo apt-get install ifplugd
sudo rm /etc/ifplugd/action.d/ifupdown
sudo gedit /etc/ifplugd/action.d/whereami
Codice: Seleziona tutto
#!/bin/sh
# Quit if we're called for the loopback
[ "$1" = lo ] && exit 0
# Just exit if whereami is no longer installed
test ! -e /usr/sbin/whereami && exit 1
# Can't use --syslog because syslog starts after the network
/usr/sbin/whereami --syslog --run_from ifplugd --hint "${1}-${2}"
exit 0
Codice: Seleziona tutto
sudo chmod +x /etc/ifplugd/action.d/whereamiNotifiche
Per avere un feedback "sonoro" sull'attività di ifplugd possiamo caricare il modulo pcspkr
Codice: Seleziona tutto
sudo modprobe pcspkr
Per avere anche delle informazioni visive possiamo utilizzare il comando notify-send, che ci permette di inviare dei messaggi sull'area di notifica tramite dbus.
Installiamo quindi il pacchetto:
Codice: Seleziona tutto
sudo apt-get install libnotify-binCodice: Seleziona tutto
sudo gedit /usr/local/bin/notify-rootCodice: Seleziona tutto
#!/bin/bash
title=$1
text=$2
pids=`pgrep x-session`
for pid in $pids; do
echo $pid
# find DBUS session bus for this session
DBUS_SESSION_BUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS \
/proc/$pid/environ | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'`
# find user for this session
USER=`grep -z USERNAME \
/proc/$pid/environ | sed -e 's/USERNAME=//'`
# use it
DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS \
su $USER -c "notify-send '$title' '$text'"
echo $DBUS_SESSION_BUS_ADDRESS
echo $USER
done
Codice: Seleziona tutto
sudo chmod +x /usr/local/bin/notify-rootCodice: Seleziona tutto
##############################
### /etc/whereami/whereami.conf
##############################
+conn-wired /usr/local/bin/notify-root "Whereami" "Connessione cavo di rete"
-conn-wired /usr/local/bin/notify-root "Whereami" "Disconnessione cavo di rete"
!conn-wired ifdown eth0
!conn-wired ifconfig eth0 down
+conn-wireless /usr/local/bin/notify-root "Whereami" "Connessione Wireless"
-conn-wireless /usr/local/bin/notify-root "Whereami" "Disconnessione Wireless"
!conn-wireless ifdown eth1
!conn-wireless ifconfig eth0 down
!conn-wireless modprobe -r ipw3945
+s-home-w /usr/local/bin/notify-root "Whereami" "Benvenuto a casa"
=s-home-w ifup eth1=home-w
+s-home /usr/local/bin/notify-root "Whereami" "Benvenuto a casa"
=s-home ifup eth0=home
+s-work1 /usr/local/bin/notify-root "Whereami" "Buon Lavoro!!"
=s-work1 ifup eth0=work1
+s-work1 smbmount //serverwin/dati /mnt/serverwin/
-s-work1 umount /mnt/pcwin/
+s-work2 /usr/local/bin/notify-root "Whereami" "Buon Lavoro!!"
=s-work2 ifup eth0=work2
+s-work2 /etc/init.d/apache start
-s-work2 /etc/init.d/apache stop
Ma noi vogliamo esagerare, e oltre a vedere scritto sul monitor cosa succede vogliamo anche sentircelo dire dalla chiara (!?) voce del nostro notebook: installiamo i pacchetti necessari:
Codice: Seleziona tutto
sudo apt-get install festvox-itapc16kCodice: Seleziona tutto
##############################
### /etc/whereami/whereami.conf
##############################
+conn-wired echo -e "Connessione cavo di rete" | festival --tts -b --language italian
+conn-wired /usr/local/bin/notify-root "Whereami" "Connessione cavo di rete"
-conn-wired echo -e "Disconnessione cavo di rete" | festival --tts -b --language italian
-conn-wired /usr/local/bin/notify-root "Whereami" "Disconnessione cavo di rete"
!conn-wired ifdown eth0
!conn-wired ifconfig eth0 down
+conn-wireless echo -e "Connessione Wireless" | festival --tts -b --language italian
+conn-wireless /usr/local/bin/notify-root "Whereami" "Connessione Wireless"
-conn-wireless echo -e "Disconnessione Wireless" | festival --tts -b --language italian
-conn-wireless /usr/local/bin/notify-root "Whereami" "Disconnessione Wireless"
!conn-wireless ifdown eth1
!conn-wireless ifconfig eth0 down
!conn-wireless modprobe -r ipw3945
+s-home-w echo -e "Benvenuto a casa Miguel!" | festival --tts -b --language italian
+s-home-w /usr/local/bin/notify-root "Whereami" "Benvenuto a casa"
=s-home-w ifup eth1=home-w
+s-home echo -e "Benvenuto a casa Miguel!" | festival --tts -b --language italian
+s-home /usr/local/bin/notify-root "Whereami" "Benvenuto a casa"
=s-home ifup eth0=home
+s-work1 /usr/local/bin/notify-root "Whereami" "Buon Lavoro!!"
=s-work1 ifup eth0=work1
+s-work1 smbmount //serverwin/dati /mnt/serverwin/
-s-work1 umount /mnt/pcwin/
+s-work2 /usr/local/bin/notify-root "Whereami" "Buon Lavoro!!"
=s-work2 ifup eth0=work2
+s-work2 /etc/init.d/apache start
-s-work2 /etc/init.d/apache stop
Come tornare indietro (!!!)
Se voleste a questo punto, per qualche oscuro motivo,tornare alla configurazione precedente, ripristinate il file /etc/network/interfaces originale, disinstallate ifplugd e whereami, e infine reinstallate networkmanager e avahi...