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