Home | History | Annotate | Line # | Download | only in hooks
10-wpa_supplicant revision 1.1.1.1.2.2
      1  1.1.1.1.2.2  roy # Start, reconfigure and stop wpa_supplicant per wireless interface.
      2  1.1.1.1.2.2  roy # This is needed because wpa_supplicant lacks hotplugging of any kind
      3  1.1.1.1.2.2  roy # and the user should not be expected to have to wire it into their system
      4  1.1.1.1.2.2  roy # if the base system doesn't do this itself.
      5  1.1.1.1.2.2  roy 
      6  1.1.1.1.2.2  roy if [ -z "$wpa_supplicant_conf" ]; then
      7  1.1.1.1.2.2  roy 	for x in \
      8  1.1.1.1.2.2  roy 		/etc/wpa_supplicant/wpa_supplicant-"$interface".conf \
      9  1.1.1.1.2.2  roy 		/etc/wpa_supplicant/wpa_supplicant.conf \
     10  1.1.1.1.2.2  roy 		/etc/wpa_supplicant-"$interface".conf \
     11  1.1.1.1.2.2  roy 		/etc/wpa_supplicant.conf \
     12  1.1.1.1.2.2  roy 	; do
     13  1.1.1.1.2.2  roy 		if [ -s "$x" ]; then
     14  1.1.1.1.2.2  roy 			wpa_supplicant_conf="$x"
     15  1.1.1.1.2.2  roy 			break
     16  1.1.1.1.2.2  roy 		fi
     17  1.1.1.1.2.2  roy 	done
     18  1.1.1.1.2.2  roy fi
     19  1.1.1.1.2.2  roy : ${wpa_supplicant_conf:=/etc/wpa_supplicant.conf}
     20  1.1.1.1.2.2  roy 
     21  1.1.1.1.2.2  roy wpa_supplicant_ctrldir()
     22  1.1.1.1.2.2  roy {
     23  1.1.1.1.2.2  roy 	local dir
     24  1.1.1.1.2.2  roy 
     25  1.1.1.1.2.2  roy 	dir=$(key_get_value "[[:space:]]*ctrl_interface=" \
     26  1.1.1.1.2.2  roy 		"$wpa_supplicant_conf")
     27  1.1.1.1.2.2  roy 	dir=$(trim "$dir")
     28  1.1.1.1.2.2  roy 	case "$dir" in
     29  1.1.1.1.2.2  roy 	DIR=*)
     30  1.1.1.1.2.2  roy 		dir=${dir##DIR=}
     31  1.1.1.1.2.2  roy 		dir=${dir%%[[:space:]]GROUP=*}
     32  1.1.1.1.2.2  roy 		dir=$(trim "$dir")
     33  1.1.1.1.2.2  roy 		;;
     34  1.1.1.1.2.2  roy 	esac
     35  1.1.1.1.2.2  roy 	printf %s "$dir"
     36  1.1.1.1.2.2  roy }
     37  1.1.1.1.2.2  roy 
     38  1.1.1.1.2.2  roy wpa_supplicant_start()
     39  1.1.1.1.2.2  roy {
     40  1.1.1.1.2.2  roy 	local dir err errn
     41  1.1.1.1.2.2  roy 
     42  1.1.1.1.2.2  roy 	# If the carrier is up, don't bother checking anything
     43  1.1.1.1.2.2  roy 	[ "$ifcarrier" = "up" ] && return 0
     44  1.1.1.1.2.2  roy 
     45  1.1.1.1.2.2  roy 	# Pre flight checks
     46  1.1.1.1.2.2  roy 	if [ ! -s "$wpa_supplicant_conf" ]; then
     47  1.1.1.1.2.2  roy 		syslog warn \
     48  1.1.1.1.2.2  roy 			"$wpa_supplicant_conf does not exist"
     49  1.1.1.1.2.2  roy 		syslog warn "not interacting with wpa_supplicant(8)"
     50  1.1.1.1.2.2  roy 		return 1
     51  1.1.1.1.2.2  roy 	fi
     52  1.1.1.1.2.2  roy 	dir=$(wpa_supplicant_ctrldir)
     53  1.1.1.1.2.2  roy 	if [ -z "$dir" ]; then
     54  1.1.1.1.2.2  roy 		syslog warn \
     55  1.1.1.1.2.2  roy 			"ctrl_interface not defined in $wpa_supplicant_conf"
     56  1.1.1.1.2.2  roy 		syslog warn "not interacting with wpa_supplicant(8)"
     57  1.1.1.1.2.2  roy 		return 1
     58  1.1.1.1.2.2  roy 	fi
     59  1.1.1.1.2.2  roy 
     60  1.1.1.1.2.2  roy 	wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 && return 0
     61  1.1.1.1.2.2  roy 	syslog info "starting wpa_supplicant"
     62  1.1.1.1.2.2  roy 	driver=${wpa_supplicant_driver:+-D}$wpa_supplicant_driver
     63  1.1.1.1.2.2  roy 	err=$(wpa_supplicant -B -c"$wpa_supplicant_conf" -i"$interface" \
     64  1.1.1.1.2.2  roy 	    "$driver" 2>&1)
     65  1.1.1.1.2.2  roy 	errn=$?
     66  1.1.1.1.2.2  roy 	if [ $errn != 0 ]; then
     67  1.1.1.1.2.2  roy 		syslog err "failed to start wpa_supplicant"
     68  1.1.1.1.2.2  roy 		syslog err "$err"
     69  1.1.1.1.2.2  roy 	fi
     70  1.1.1.1.2.2  roy 	return $errn
     71  1.1.1.1.2.2  roy }
     72  1.1.1.1.2.2  roy 
     73  1.1.1.1.2.2  roy wpa_supplicant_reconfigure()
     74  1.1.1.1.2.2  roy {
     75  1.1.1.1.2.2  roy 	local dir err errn
     76  1.1.1.1.2.2  roy 
     77  1.1.1.1.2.2  roy 	dir=$(wpa_supplicant_ctrldir)
     78  1.1.1.1.2.2  roy 	[ -z "$dir" ] && return 1
     79  1.1.1.1.2.2  roy 	if ! wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1; then
     80  1.1.1.1.2.2  roy 		wpa_supplicant_start
     81  1.1.1.1.2.2  roy 		return $?
     82  1.1.1.1.2.2  roy 	fi
     83  1.1.1.1.2.2  roy 	syslog info "reconfiguring wpa_supplicant"
     84  1.1.1.1.2.2  roy 	err=$(wpa_cli -p "$dir" -i "$interface" reconfigure 2>&1)
     85  1.1.1.1.2.2  roy 	errn=$?
     86  1.1.1.1.2.2  roy 	if [ $errn != 0 ]; then
     87  1.1.1.1.2.2  roy 		syslog err "failed to reconfigure wpa_supplicant"
     88  1.1.1.1.2.2  roy 		syslog err "$err"
     89  1.1.1.1.2.2  roy 	fi
     90  1.1.1.1.2.2  roy 	return $errn
     91  1.1.1.1.2.2  roy }
     92  1.1.1.1.2.2  roy 
     93  1.1.1.1.2.2  roy wpa_supplicant_stop()
     94  1.1.1.1.2.2  roy {
     95  1.1.1.1.2.2  roy 	local dir err errn
     96  1.1.1.1.2.2  roy 
     97  1.1.1.1.2.2  roy 	dir=$(wpa_supplicant_ctrldir)
     98  1.1.1.1.2.2  roy 	[ -z "$dir" ] && return 1
     99  1.1.1.1.2.2  roy 	wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 || return 0
    100  1.1.1.1.2.2  roy 	syslog info "stopping wpa_supplicant"
    101  1.1.1.1.2.2  roy 	err=$(wpa_cli -i"$interface" terminate 2>&1)
    102  1.1.1.1.2.2  roy 	errn=$?
    103  1.1.1.1.2.2  roy 	if [ $errn != 0 ]; then
    104  1.1.1.1.2.2  roy 		syslog err "failed to start wpa_supplicant"
    105  1.1.1.1.2.2  roy 		syslog err "$err"
    106  1.1.1.1.2.2  roy 	fi
    107  1.1.1.1.2.2  roy 	return $errn
    108  1.1.1.1.2.2  roy }
    109  1.1.1.1.2.2  roy 
    110  1.1.1.1.2.2  roy if [ "$ifwireless" = "1" ] && \
    111  1.1.1.1.2.2  roy     type wpa_supplicant >/dev/null 2>&1 && \
    112  1.1.1.1.2.2  roy     type wpa_cli >/dev/null 2>&1
    113  1.1.1.1.2.2  roy then
    114  1.1.1.1.2.2  roy 	case "$reason" in
    115  1.1.1.1.2.2  roy 	PREINIT)	wpa_supplicant_start;;
    116  1.1.1.1.2.2  roy 	RECONFIGURE)	wpa_supplicant_reconfigure;;
    117  1.1.1.1.2.2  roy 	DEPARTED)	wpa_supplicant_stop;;
    118  1.1.1.1.2.2  roy 	esac
    119  1.1.1.1.2.2  roy fi
    120