hostapd: add fallback for WPS on stations

Up to now the WPS script triggered WPS on the stations only if it
could not trigger it successfully on any hostapd instance.

In a Multi-AP context, there can be a need (to establish a new
wireless backhaul link) to trigger WPS on the stations, regardless of
whether there is already a hostapd instance configured or not. The
current script makes it impossible, as if hostapd is running and
configured, WPS would always be triggered on hostapd only.

To allow both possibilities, the following changes are made:

- Change the "pressed" action to "release", so that we can make use of
the "$SEEN" variables (to know for how long the button was pressed).

- If the button is pressed for less than 3 seconds, keep the original
behavior.

- If the button is pressed for 3 seconds or more, trigger WPS on the
stations, regardless of the status of any running hostapd instance.

- Add comments explaining both behaviors.

- While at it, replace the usage of '-a' with a '[] && []'
construct (see [1]).

This gives users a "fallback" mechanism to onboard a device to a
Multi-AP network, even if the device already has a configured hostapd
instance running.

[1]: https://github.com/koalaman/shellcheck/wiki/SC2166

Signed-off-by: Raphaël Mélotte <raphael.melotte@mind.be>
This commit is contained in:
Raphaël Mélotte 2021-10-29 10:45:06 +02:00 committed by Daniel Golle
parent c555c34dd1
commit 69ce75fb12

View File

@ -38,13 +38,20 @@ wps_catch_credentials() {
done done
} }
if [ "$ACTION" = "pressed" -a "$BUTTON" = "wps" ]; then if [ "$ACTION" = "released" ] && [ "$BUTTON" = "wps" ]; then
wps_done=0 # If the button was pressed for 3 seconds or more, trigger WPS on
ubusobjs="$( ubus -S list hostapd.* )" # wpa_supplicant only, no matter if hostapd is running or not. If
for ubusobj in $ubusobjs; do # was pressed for less than 3 seconds, try triggering on
ubus -S call $ubusobj wps_start && wps_done=1 # hostapd. If there is no hostapd instance to trigger it on or WPS
done # is not enabled on them, trigger it on wpa_supplicant.
[ $wps_done = 0 ] || return 0 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 wps_done=0
ubusobjs="$( ubus -S list wpa_supplicant.* )" ubusobjs="$( ubus -S list wpa_supplicant.* )"
for ubusobj in $ubusobjs; do for ubusobj in $ubusobjs; do