You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
5.4 KiB
Bash
194 lines
5.4 KiB
Bash
#!/bin/sh
|
|
|
|
#TODO: debugging
|
|
#logfile="/tmp/`basename $0`.log"
|
|
#exec 3<> "$logfile"
|
|
#exec >&3
|
|
#exec 2>&3
|
|
|
|
#set -x
|
|
|
|
. /lib/functions.sh
|
|
. /usr/lib/configsync_lib.sh
|
|
|
|
SERVICE=wireless
|
|
PSERVICE=${CS_PREFIX}${SERVICE}
|
|
RADIO=wifi
|
|
CS_SERVICE=$1; shift
|
|
|
|
my_logger() {
|
|
logger -t configsync_executor "${CS_SERVICE}" "${@}"
|
|
}
|
|
|
|
configsync_to_system()
|
|
{
|
|
my_logger "This is ${0}/configsync_to_system()!"
|
|
|
|
CS_RADIO=$1
|
|
CS_HWMODE=$2
|
|
|
|
# === radio options ===
|
|
|
|
hwmode=
|
|
I=0
|
|
while uci_tmp get ${PSERVICE}."$RADIO"$I >/dev/null 2>&1
|
|
do
|
|
device="$RADIO"$I
|
|
if [ "$( uci_tmp get ${PSERVICE}.$device.hwmode )" = $CS_HWMODE ] ; then
|
|
hwmode=$CS_HWMODE
|
|
break
|
|
fi
|
|
|
|
I=$((I+1))
|
|
done
|
|
|
|
if [ -z "$hwmode" ] ; then
|
|
my_logger "INFO: no $CS_RADIO GHz radio found. Exiting."
|
|
return 1
|
|
fi
|
|
|
|
# make working copy and get values from there step by step
|
|
uci_tmp revert $CS_SERVICE
|
|
uci_cs export $CS_SERVICE | uci_tmp import $CS_SERVICE
|
|
|
|
# Note: UCI lists are not supported by this construct. They are
|
|
# awkward in handling anyways and thus should not be used if
|
|
# possible.
|
|
# TODO: complete the set of options
|
|
synced_options="htmode
|
|
disabled
|
|
cfg_disabled
|
|
country"
|
|
for synced_option in $synced_options; do
|
|
VALUE="$( uci_tmp get ${CS_SERVICE}.radio.$synced_option )"
|
|
uci_tmp set ${PSERVICE}.$device.$synced_option="$VALUE"
|
|
done
|
|
|
|
|
|
# === iface options ===
|
|
|
|
synced_options="device
|
|
disabled
|
|
ssid
|
|
encryption
|
|
key
|
|
dvl_main
|
|
dvl_guest
|
|
network
|
|
mode
|
|
wds
|
|
ieee80211w
|
|
wps_config
|
|
uapsd
|
|
rrm
|
|
wnm
|
|
rsn_preauth
|
|
ieee80211r
|
|
hidden
|
|
isolate
|
|
maxassoc
|
|
wps_config"
|
|
|
|
# Note: UCI lists are not supported by this construct
|
|
# TODO: check the set of options
|
|
|
|
# loop system configuration: delete deleted interfaces (SSID|MODE)
|
|
J=0
|
|
while uci_tmp get ${PSERVICE}.@wifi-iface[$J]
|
|
do
|
|
DELETE=1
|
|
P_SSID="$( uci_tmp get ${PSERVICE}.@wifi-iface[$J].ssid )"
|
|
P_MODE="$( uci_tmp get ${PSERVICE}.@wifi-iface[$J].mode )"
|
|
iface_device="$( uci_tmp get ${PSERVICE}.@wifi-iface[$J].device )"
|
|
|
|
if [ "$device" = "$iface_device" ]; then
|
|
I=0
|
|
while uci_tmp get ${CS_SERVICE}.@wifi-iface[$I]
|
|
do
|
|
CS_SSID="$( uci_tmp get ${CS_SERVICE}.@wifi-iface[$I].ssid )"
|
|
CS_MODE="$( uci_tmp get ${CS_SERVICE}.@wifi-iface[$I].mode )"
|
|
if [ "${P_SSID}" = "${CS_SSID}" ] && [ "${P_MODE}" = "${CS_MODE}" ]; then
|
|
DELETE=0
|
|
break
|
|
fi
|
|
I=$((I+1))
|
|
done
|
|
else
|
|
DELETE=0
|
|
fi
|
|
|
|
if [ $DELETE -eq 1 ]; then
|
|
uci_tmp delete $PSERVICE.@wifi-iface[$J]
|
|
else
|
|
J=$((J+1))
|
|
fi
|
|
done
|
|
|
|
|
|
# loop cs configuration: and merge known interfaces and add new interfaces (SSID|MODE)
|
|
I=0
|
|
while uci_tmp get ${CS_SERVICE}.@wifi-iface[$I]
|
|
do
|
|
CS_SSID="$( uci_tmp get ${CS_SERVICE}.@wifi-iface[$I].ssid )"
|
|
CS_MODE="$( uci_tmp get ${CS_SERVICE}.@wifi-iface[$I].mode )"
|
|
|
|
# loop temp configuration
|
|
FOUND=0
|
|
J=0
|
|
while uci_tmp get ${PSERVICE}.@wifi-iface[$J]
|
|
do
|
|
iface_device="$( uci_tmp get ${PSERVICE}.@wifi-iface[$J].device )"
|
|
|
|
# delete interface if device not available (corrupt configuration)
|
|
if [ "$iface_device" = "" ]; then
|
|
uci_tmp delete $PSERVICE.@wifi-iface[$J]
|
|
continue
|
|
fi
|
|
|
|
# search interface in temp configuration
|
|
if [ "$device" = "$iface_device" ]; then
|
|
P_SSID="$( uci_tmp get ${PSERVICE}.@wifi-iface[$J].ssid )"
|
|
P_MODE="$( uci_tmp get ${PSERVICE}.@wifi-iface[$J].mode )"
|
|
if [ "${P_SSID}" = "${CS_SSID}" ] && [ "${P_MODE}" = "${CS_MODE}" ]; then
|
|
# if ssid found -> merge
|
|
for synced_option in $synced_options; do
|
|
VALUE="$( uci_tmp get ${CS_SERVICE}.@wifi-iface[$I].$synced_option )"
|
|
uci_tmp set ${PSERVICE}.@wifi-iface[$J].$synced_option="$VALUE"
|
|
done
|
|
FOUND=1
|
|
break
|
|
fi
|
|
fi
|
|
J=$((J+1))
|
|
done
|
|
|
|
if [ $FOUND -eq 0 ]; then
|
|
# if ssid not found -> add
|
|
local entry=$(uci_tmp add ${PSERVICE} wifi-iface)
|
|
for synced_option in $synced_options; do
|
|
VALUE="$( uci_tmp get ${CS_SERVICE}.@wifi-iface[$I].$synced_option )"
|
|
uci_tmp set ${PSERVICE}.$entry.$synced_option="$VALUE"
|
|
done
|
|
fi
|
|
I=$((I+1))
|
|
done
|
|
|
|
add_to_list $CS_IMPORTSERVICELIST ${SERVICE}
|
|
}
|
|
|
|
dynamic_update()
|
|
{
|
|
my_logger "This is ${0}/dynamic_update()!"
|
|
}
|
|
|
|
init()
|
|
{
|
|
my_logger "This is ${0}/init()!"
|
|
}
|
|
|
|
if [ "${1}" = "init" ] || [ "${1}" = "configsync_to_system" ] || [ "${1}" = "dynamic_update" ]; then
|
|
"${@}"
|
|
else
|
|
my_logger "Unknown command ${1} in ${0}!"
|
|
fi
|