Pagina 1 di 1

RFC: rc.inet1.smart

Inviato: sab 17 feb 2007, 16:01
da absinthe
salve,

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]}"
}
lo script deve essere lanciato da rc.inet1 prima di avviare le operzioni di avvio delle schede. io l'ho inserito qua, proprio prima dell'attivazione del loopback:

Codice: Seleziona tutto

##################################
# run my personal smart selector #
##################################
. /etc/rc.d/rc.inet1.smart

######################
# LOOPBACK FUNCTIONS #
######################
che ne pensate?

ciao,
M

Inviato: sab 17 feb 2007, 16:55
da dapuzz
in pratica modifica 'un attimo prima' le variabili usate da rc.inet1.conf in base a se iwlist trova o meno le reti?

Inviato: sab 17 feb 2007, 17:05
da absinthe
dapuzz ha scritto:in pratica modifica 'un attimo prima' le variabili usate da rc.inet1.conf in base a se iwlist trova o meno le reti?
in pratica sì... una roba molto grezza ma per adesso fa il suo :) [credo abbia un milione di bachi visto che non è stato scritto considerando tutte le possibili configurazioni presenti su un pc]

M

Inviato: mar 12 giu 2007, 12:18
da absinthe
up! ho fatto una modifica perchè in caso di più reti wireless disponibili il tool non sapeva che fare: ora sceglie quella con il segnale più potente.
ho postato il codice aggiornato! ovviamente cannibalizzatelo pure!

Inviato: mar 12 giu 2007, 12:26
da Bart
Si vero l'attesa è un po noiosa, io ho risolto lanciando il servizio in background con una semplice &....;)

Inviato: mar 12 giu 2007, 21:32
da absinthe
Bart ha scritto:Si vero l'attesa è un po noiosa, io ho risolto lanciando il servizio in background con una semplice &....;)
eh lo so ma mi piaceva piallere i settaggi inutili e gestire il tutto in maniera dinamica! puro sfizio e poi non devo usare accrocchi altrui per selezionare la rete wifi giusta!
per inciso nella nuova versione c'era un baco! adesso è risolto ! ho modificato il post precedente con il codice giusto!

M

Inviato: lun 9 lug 2007, 21:36
da absinthe
per chi fosse interessato allo script ho fatto alcune modifiche al codice del primo post: adesso gira anche sulla versione bash della slack 12.0

M

PS: incomincio a pensare che forse sto thread è nel posto sbagliato :?