hostapd: add support for WPS pushbutton station
[openwrt/openwrt.git] / package / network / services / hostapd / files / wps-hotplug.sh
1 #!/bin/sh
2
3 wps_catch_credentials() {
4 local iface ifaces ifc ifname ssid encryption key radio radios
5 local found=0
6
7 . /usr/share/libubox/jshn.sh
8 ubus -S -t 30 listen wps_credentials | while read creds; do
9 json_init
10 json_load "$creds"
11 json_select wps_credentials || continue
12 json_get_vars ifname ssid key encryption
13 local ifcname="$ifname"
14 json_init
15 json_load "$(ubus -S call network.wireless status)"
16 json_get_keys radios
17 for radio in $radios; do
18 json_select $radio
19 json_select interfaces
20 json_get_keys ifaces
21 for ifc in $ifaces; do
22 json_select $ifc
23 json_get_vars ifname
24 [ "$ifname" = "$ifcname" ] && {
25 ubus -S call uci set "{\"config\":\"wireless\", \"type\":\"wifi-iface\", \
26 \"match\": { \"device\": \"$radio\", \"encryption\": \"wps\" }, \
27 \"values\": { \"encryption\": \"$encryption\", \
28 \"ssid\": \"$ssid\", \
29 \"key\": \"$key\" } }"
30 ubus -S call uci commit '{"config": "wireless"}'
31 ubus -S call uci apply
32 }
33 json_select ..
34 done
35 json_select ..
36 json_select ..
37 done
38 done
39 }
40
41 if [ "$ACTION" = "pressed" -a "$BUTTON" = "wps" ]; then
42 wps_done=0
43 ubusobjs="$( ubus -S list hostapd.* )"
44 for ubusobj in $ubusobjs; do
45 ubus -S call $ubusobj wps_start && wps_done=1
46 done
47 [ $wps_done = 0 ] || return 0
48 wps_done=0
49 ubusobjs="$( ubus -S list wpa_supplicant.* )"
50 for ubusobj in $ubusobjs; do
51 ubus -S call $ubusobj wps_start && wps_done=1
52 done
53 [ $wps_done = 0 ] || wps_catch_credentials &
54 fi
55
56 return 0