hostapd: add support for WPS pushbutton station
[oweals/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