vi volevo mostrare una cosetta che ho fatto e vorrei avere un pò di commenti al riguardo.
premessa
la situazione è la seguente: la slack non ha nessun tool che consenta un avvio selettivo delle interfacce di rete. mi spiego meglio:
1- o configurate a mano le schede di rete una volta avviata la macchina e poi le attivate
2- oppure inserite i vari dati in rc.inet1.conf e lasciate che rc.inet1 le attivi per voi.
ora io ho un laptop e con esso una scheda cablata (eth0) ed una wireless(wlan0). accade che a seconda del luogo dove mi trovo debba usare o l'una o l'altra. finchè si usano ip statici no problem: rc.inet1 attiva le interfacce in maniera rapida. quando però si vuole/deve usare il dhcp occorre attendere che rc.inet1 lanci il demone dhcp e che esso acquisisca un ip per ogni interfaccia. ovviamente se un'interfaccia non è collegata alla rete il dhcp gira "a vuoto" andando in time out... questa attesa è un pò snervante... so che esistono applicativi che gestiscono la cosa in maniera intelligente (mi pare esista qualcosa su debian...) tuttavia sulla slack io avevo trovato 2 sole soluzioni:
1- accorciare il tempo di timeout
2-mettere in background l'esecuzione di dhcpcd...
la mia soluzione
dato che la cosa non mi piaceva molto, per il mio laptop ho fatto uno scriptino che cerca di attivare in maniera selettiva le interfacce... ovviamente è una cosa molto rude dato che l'ho fatta per il mio portatile che ha 1 wireless ed una wired... e che funziona senza wpa: quindi non è una soluzione completa per tutti. ma volevo sapere se poteva essere di aiuto...
la logica è questa: innanzi tutto viene data la precedenza alle schede wireless. se iwlist non trova alcuna rete il cui essid è stato configurato dall'utente allora le schede wireless non vengono fatte attivare a rc.inet1.
se invece è presente un essid indicato dall'amministratore allora la scheda wireless viene lasciata così com'è mentre vengono bypassate le schede wired. vi pasto lo script:
Codice: Seleziona tutto
#!/bin/sh
# /etc/rc.d/rc.inet1.smart
#
# personal hack by MN
#
# rc.wireless code has been partially reused in this script
#
# This file contains the smart selector of network interfaces.
# usage:
#
# rc.inet1.smart
#
#this script is usable if only one wireless devise is avaible...
# =============================================================================
ESSIDLIST=("casa" "smipp" "pcmgroup" "Unifi02")
KEYLIST=("************** open" "************ open" "************** open" "off")
# Find the path where wireless tools are installed
for IWPATH in /usr/{bin,sbin} /usr/local/{bin,sbin} /sbin /bin ; do
if [ -x $IWPATH/iwconfig ] ; then
break ;
fi
done
SCANCMD="$IWPATH/iwlist" #no check is done so BE sure you've it installed and setted in your path
SCANDIRECTIVE="scan"
CHECKCMD="$IWPATH/iwconfig"
#find position of wireless interface
j=0;
while [ $j -lt $MAXNICS ]; do
[ -x $IWPATH/iwconfig ] || return 1
LC_ALL=C $IWPATH/iwconfig "${IFNAME[$j]}" 2>&1 | \
grep -Eiq "no wireless extensions|no such device" || break;
j=$(($j+1))
done
WLAN_ESSID[$j]=""
IPADDR[$j]=""
AVAIBLENET=$($SCANCMD ${IFNAME[$j]} $SCANDIRECTIVE)
POWER_OLD=-1000;
w=-1
for (( k=0; k<${#ESSIDLIST[@]}; k++ )); do
[ `echo "$AVAIBLENET" | grep ${ESSIDLIST[k]}` ] && {
POWER=`echo "$AVAIBLENET" | grep -A7 ${ESSIDLIST[k]} | tail -1 | awk '{printf $3}' | cut -f2 -d = \
| cut -f1 -d "/" `
echo "detected wireless essid \"${ESSIDLIST[k]}\" with level: $POWER dB"
[ $POWER -gt $POWER_OLD ] && { WLAN_ESSID[$j]=${ESSIDLIST[k]}; w=$k;}
POWER_OLD=$POWER
};
done
#if we haven't any matching net we disable dhcp and we leave IPADDR empty
#so rc.inet1 will skip this interface;
#else we set the right key and we disable wired devices (we need just one interface on a common laptop).
[ "${WLAN_ESSID[$j]}" = "" ] && { USE_DHCP[$j]=""; echo "switch to wired network";} || {
WLAN_KEY[$j]="${KEYLIST[w]}";
for (( k=0; k<$MAXNICS; k++ )); do
[ ! $k -eq $j ] && { USE_DHCP[$k]=""; IPADDR[$k]=""; }
done
echo "selected wireless network: ${WLAN_ESSID[$j]}"
}
Codice: Seleziona tutto
##################################
# run my personal smart selector #
##################################
. /etc/rc.d/rc.inet1.smart
######################
# LOOPBACK FUNCTIONS #
######################
ciao,
M

