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