| #!/bin/sh |
| |
| wps_catch_credentials() { |
| local iface ifaces ifc ifname ssid encryption key radio radios |
| local found=0 |
| |
| . /usr/share/libubox/jshn.sh |
| ubus -S -t 30 listen wps_credentials | while read creds; do |
| json_init |
| json_load "$creds" |
| json_select wps_credentials || continue |
| json_get_vars ifname ssid key encryption |
| local ifcname="$ifname" |
| json_init |
| json_load "$(ubus -S call network.wireless status)" |
| json_get_keys radios |
| for radio in $radios; do |
| json_select $radio |
| json_select interfaces |
| json_get_keys ifaces |
| for ifc in $ifaces; do |
| json_select $ifc |
| json_get_vars ifname |
| [ "$ifname" = "$ifcname" ] && { |
| ubus -S call uci set "{\"config\":\"wireless\", \"type\":\"wifi-iface\", \ |
| \"match\": { \"device\": \"$radio\", \"encryption\": \"wps\" }, \ |
| \"values\": { \"encryption\": \"$encryption\", \ |
| \"ssid\": \"$ssid\", \ |
| \"key\": \"$key\" } }" |
| ubus -S call uci commit '{"config": "wireless"}' |
| ubus -S call uci apply |
| } |
| json_select .. |
| done |
| json_select .. |
| json_select .. |
| done |
| done |
| } |
| |
| if [ "$ACTION" = "released" ] && [ "$BUTTON" = "wps" ]; then |
| # If the button was pressed for 3 seconds or more, trigger WPS on |
| # wpa_supplicant only, no matter if hostapd is running or not. If |
| # was pressed for less than 3 seconds, try triggering on |
| # hostapd. If there is no hostapd instance to trigger it on or WPS |
| # is not enabled on them, trigger it on wpa_supplicant. |
| if [ "$SEEN" -lt 3 ] ; then |
| wps_done=0 |
| ubusobjs="$( ubus -S list hostapd.* )" |
| for ubusobj in $ubusobjs; do |
| ubus -S call $ubusobj wps_start && wps_done=1 |
| done |
| [ $wps_done = 0 ] || return 0 |
| fi |
| wps_done=0 |
| ubusobjs="$( ubus -S list wpa_supplicant.* )" |
| for ubusobj in $ubusobjs; do |
| ifname="$(echo $ubusobj | cut -d'.' -f2 )" |
| multi_ap="" |
| if [ -e "/var/run/wpa_supplicant-${ifname}.conf.is_multiap" ]; then |
| ubus -S call $ubusobj wps_start '{ "multi_ap": true }' && wps_done=1 |
| else |
| ubus -S call $ubusobj wps_start && wps_done=1 |
| fi |
| done |
| [ $wps_done = 0 ] || wps_catch_credentials & |
| fi |
| |
| return 0 |