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