Home | History | Annotate | Line # | Download | only in hooks
      1 # SPDX-License-Identifier: BSD-2-Clause
      2 # Copyright (c) 2017-2024 Roy Marples <roy (a] marples.name>
      3 
      4 # Start, reconfigure and stop wpa_supplicant per wireless interface.
      5 #
      6 # This is only needed when using wpa_supplicant-2.5 or older, OR
      7 # when wpa_supplicant has not been built with CONFIG_MATCH_IFACE, OR
      8 # wpa_supplicant was launched without the -M flag to activate
      9 # interface matching.
     10 
     11 if [ -z "$wpa_supplicant_conf" ]; then
     12 	for x in \
     13 		/etc/wpa_supplicant/wpa_supplicant-"$interface".conf \
     14 		/etc/wpa_supplicant/wpa_supplicant.conf \
     15 		/etc/wpa_supplicant-"$interface".conf \
     16 		/etc/wpa_supplicant.conf \
     17 	; do
     18 		if [ -s "$x" ]; then
     19 			wpa_supplicant_conf="$x"
     20 			break
     21 		fi
     22 	done
     23 fi
     24 : ${wpa_supplicant_conf:=/etc/wpa_supplicant.conf}
     25 
     26 wpa_supplicant_ctrldir()
     27 {
     28 	dir=$(key_get_value "[[:space:]]*ctrl_interface=" \
     29 		"$wpa_supplicant_conf")
     30 	dir=$(trim "$dir")
     31 	case "$dir" in
     32 	DIR=*)
     33 		dir=${dir##DIR=}
     34 		dir=${dir%%[[:space:]]GROUP=*}
     35 		dir=$(trim "$dir")
     36 		;;
     37 	esac
     38 	printf %s "$dir"
     39 }
     40 
     41 wpa_supplicant_start()
     42 {
     43 	# If the carrier is up, don't bother checking anything
     44 	[ "$ifcarrier" = "up" ] && return 0
     45 
     46 	# Pre flight checks
     47 	if [ ! -s "$wpa_supplicant_conf" ]; then
     48 		syslog warn \
     49 			"$wpa_supplicant_conf does not exist"
     50 		syslog warn "not interacting with wpa_supplicant(8)"
     51 		return 1
     52 	fi
     53 	dir=$(wpa_supplicant_ctrldir)
     54 	if [ -z "$dir" ]; then
     55 		syslog warn \
     56 			"ctrl_interface not defined in $wpa_supplicant_conf"
     57 		syslog warn "not interacting with wpa_supplicant(8)"
     58 		return 1
     59 	fi
     60 
     61 	wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 && return 0
     62 	syslog info "starting wpa_supplicant"
     63 	driver=${wpa_supplicant_driver:+-D}$wpa_supplicant_driver
     64 	err=$(wpa_supplicant -B -c"$wpa_supplicant_conf" -i"$interface" \
     65 	    "$driver" 2>&1)
     66 	errn=$?
     67 	if [ $errn != 0 ]; then
     68 		syslog err "failed to start wpa_supplicant"
     69 		syslog err "$err"
     70 	fi
     71 	return $errn
     72 }
     73 
     74 wpa_supplicant_reconfigure()
     75 {
     76 	dir=$(wpa_supplicant_ctrldir)
     77 	[ -z "$dir" ] && return 1
     78 	if ! wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1; then
     79 		wpa_supplicant_start
     80 		return $?
     81 	fi
     82 	syslog info "reconfiguring wpa_supplicant"
     83 	err=$(wpa_cli -p "$dir" -i "$interface" reconfigure 2>&1)
     84 	errn=$?
     85 	if [ $errn != 0 ]; then
     86 		syslog err "failed to reconfigure wpa_supplicant"
     87 		syslog err "$err"
     88 	fi
     89 	return $errn
     90 }
     91 
     92 wpa_supplicant_stop()
     93 {
     94 	dir=$(wpa_supplicant_ctrldir)
     95 	[ -z "$dir" ] && return 1
     96 	wpa_cli -p "$dir" -i "$interface" status >/dev/null 2>&1 || return 0
     97 	syslog info "stopping wpa_supplicant"
     98 	err=$(wpa_cli -i"$interface" terminate 2>&1)
     99 	errn=$?
    100 	if [ $errn != 0 ]; then
    101 		syslog err "failed to stop wpa_supplicant"
    102 		syslog err "$err"
    103 	fi
    104 	return $errn
    105 }
    106 
    107 if [ "$ifwireless" = "1" ] && \
    108     command -v wpa_supplicant >/dev/null 2>&1 && \
    109     command -v wpa_cli >/dev/null 2>&1
    110 then
    111 	case "$reason" in
    112 	PREINIT)		wpa_supplicant_start;;
    113 	RECONFIGURE)		wpa_supplicant_reconfigure;;
    114 	DEPARTED|STOPPED)	wpa_supplicant_stop;;
    115 	esac
    116 fi
    117