#!/bin/sh
. /usr/share/libubox/jshn.sh
. /lib/config/uci.sh


# get all enabled radio names to start clone on
get_radios_for_wps_clone()
{
	local radio
	for radio in wifi0 wifi1; do
		[ -n "$(uci_get wireless $radio)" ] && [ $(uci_get wireless $radio disabled 0) -eq 0 ] && echo $radio
	done
}


start_wps_clone()
{
	local global_pid="/var/run/wpa_supplicant-global.pid"
	local global_ctrl="/var/run/wpa_supplicantglobal"
	local radio=''

	json_init

	uci_get_state wireless wps_clone > /dev/null || uci_set_state wireless wps_clone "" wps_clone

	if [ "$(uci_get_state wireless wps_clone state)" != "running" ]; then
		local radios=$(get_radios_for_wps_clone)

		if [ -z "$radios" ]; then
			json_add_string "status" "failed: no radio activated"
			json_dump
			return 1
		fi

		local uuid="87654321-9abc-def0-1234-$(tr -d : < /sys/class/net/eth0/address)"
		for radio in $radios; do
			local interface=
			# note: adding the same json_property again overrides the former
			case "$radio" in
				wifi0)
					interface=athClone0
					json_add_string "status" "Ok"
					json_add_string "frequency" "2.4G"
				;;
				wifi1)
					interface=athClone1
					json_add_string "status" "Ok"
					json_add_string "frequency" "5G"
				;;
				*)
					json_add_string "status" "Failed: no radio activated"
					json_add_string "reason" "No radio activated"
					json_dump
					return 1
				;;
			esac
 
			interface=$(wlanconfig $interface create wlandev $radio wlanmode sta)
			local ctrl_socket="/var/run/wpa_supplicant-$interface"

			cat > /var/run/wpa_supplicant-$interface.conf <<EOF
ctrl_interface=/var/run/wpa_supplicant-$interface
config_methods=display virtual_display push_button virtual_push_button physical_push_button
wps_cred_processing=2
update_config=1
uuid=$uuid
network={
	scan_ssid=1
	key_mgmt=WPA-PSK
	proto=RSN
	pairwise=CCMP
	group=CCMP TKIP
} 
EOF
			wpa_cli -g $global_ctrl interface_add $interface /var/run/wpa_supplicant-$interface.conf athr /var/run/wpa_supplicant-$interface \"\" br-lan > /dev/null
			touch /var/run/wpa_supplicant-$interface.lock
			wpa_cli -i $interface -p $ctrl_socket wps_pbc > /dev/null
			wpa_cli -p $ctrl_socket -a /usr/libexec/delos/delos-clone-mode-uci -P /var/run/wpa_supplicant-$interface.pid -B > /dev/null
		done
		/usr/sbin/updateled.sh > /dev/null 2>/dev/null </dev/null &
		# use toggle here to cleanup former state history completely when new run starts
		uci_toggle_state wireless wps_clone state running
	else
		for ifpath in $(ls -d /sys/class/net/athClone? 2>/dev/null); do
			local radio=$(cat $ifpath/parent)
			local interface=$(basename $ifpath)
			local ctrl_socket="/var/run/wpa_supplicant-$interface"
			wpa_cli -i $interface -p $ctrl_socket > /dev/null
			json_add_string status "restarted"
			case $radio in
				wifi0)
					json_add_string frequency "2.4G"
				;;
				wifi1)
					json_add_string frequency "5G"
				;;
			esac
		done
	fi
	json_dump
}