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.
325 lines
8.5 KiB
Bash
325 lines
8.5 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
|
|
|
|
CS_SERVICE_COMMON=cswireless
|
|
CS_SERVICE_24=cswireless24
|
|
CS_SERVICE_5=cswireless5
|
|
CS_SERVICE_SON=cswifi_son
|
|
SERVICE=wireless
|
|
|
|
CS_SERVICE=
|
|
|
|
my_logger() {
|
|
logger -t configsync_executor "${SERVICE}" "${@}"
|
|
}
|
|
|
|
copy_iface_to_cs() {
|
|
|
|
config_get iface_device $1 device
|
|
|
|
if [ "$2" = "$iface_device" ] ; then
|
|
|
|
local entry=$(uci_cs add ${CS_SERVICE} wifi-iface)
|
|
|
|
# Note: UCI lists are not supported by this construct
|
|
# TODO: complete the set of 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"
|
|
|
|
for synced_option in $synced_options; do
|
|
config_get VALUE $1 $synced_option
|
|
uci_cs set ${CS_SERVICE}.$entry.$synced_option="$VALUE"
|
|
done
|
|
fi
|
|
}
|
|
|
|
|
|
write_radio_to_cs() {
|
|
config_get HWMODE $1 hwmode
|
|
|
|
# TODO: consider require_mode '11n' too?
|
|
case "$HWMODE" in
|
|
11a)
|
|
# 5GHz
|
|
CS_SERVICE=$CS_SERVICE_5
|
|
RADIO_5=1
|
|
;;
|
|
11g)
|
|
# 2,4GHz
|
|
CS_SERVICE=$CS_SERVICE_24
|
|
RADIO_24=1
|
|
;;
|
|
*)
|
|
my_logger "ERROR: Illegal value of \$HWMODE: '$HWMODE'\n\n"
|
|
return 1
|
|
esac
|
|
|
|
# === radio options ===
|
|
|
|
uci_cs set ${CS_SERVICE}.radio=wifi-device
|
|
|
|
# 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
|
|
config_get VALUE $1 $synced_option
|
|
uci_cs set ${CS_SERVICE}.radio.$synced_option="$VALUE"
|
|
done
|
|
|
|
# === iface options ===
|
|
|
|
# Remove unnamed sections in CS config files completely and
|
|
# recreate them from scratch
|
|
delete_sections_cs ${CS_SERVICE} wifi-iface
|
|
|
|
config_foreach copy_iface_to_cs wifi-iface $1
|
|
}
|
|
|
|
##### check_common_wifi_settings process #####
|
|
|
|
check_iface_config()
|
|
{
|
|
local device dvl_main
|
|
config_get device "$1" device
|
|
config_get dvl_main "$1" dvl_main
|
|
[ "$dvl_main" = "1" ] || return
|
|
config_get ssid "$1" ssid
|
|
|
|
case "$device" in
|
|
wifi0)
|
|
SSID_WIFI0=$ssid;;
|
|
wifi1)
|
|
SSID_WIFI1=$ssid;;
|
|
esac
|
|
}
|
|
|
|
check_common_wifi_settings()
|
|
{
|
|
# check common_wifi_settings
|
|
local UCI_CONFIG_DIR="$CS_CONFIGURATION_PATH"
|
|
config_load cswireless24
|
|
config_foreach check_iface_config wifi-iface
|
|
config_load cswireless5
|
|
config_foreach check_iface_config wifi-iface
|
|
[ "$SSID_WIFI0" = "$SSID_WIFI1" ]
|
|
}
|
|
|
|
##### sync_common_wifi_settings process #####
|
|
|
|
get_iface_config()
|
|
{
|
|
local device dvl_type
|
|
config_get device "$1" device
|
|
[ "$device" = "wifi0" ] || return
|
|
config_get dvl_type "$1" "$2"
|
|
[ "$dvl_type" = "1" ] || return
|
|
config_get ssid "$1" ssid
|
|
config_get key "$1" key
|
|
config_get encryption "$1" encryption
|
|
}
|
|
|
|
set_iface_config()
|
|
{
|
|
local device dvl_type
|
|
config_get device "$1" device
|
|
[ "$device" = "wifi1" ] || return
|
|
config_get dvl_type "$1" "$2"
|
|
[ "$dvl_type" = "1" ] || return
|
|
uci_cs set ${CS_SERVICE_5}.${1}.ssid="$ssid"
|
|
uci_cs set ${CS_SERVICE_5}.${1}.key="$key"
|
|
uci_cs set ${CS_SERVICE_5}.${1}.encryption="$encryption"
|
|
}
|
|
|
|
sync_common_wifi_settings()
|
|
{
|
|
local COMMON_MODE=$1
|
|
local UCI_CONFIG_DIR="$CS_CONFIGURATION_PATH"
|
|
# check wifi common config
|
|
if [ "$COMMON_MODE" = "1" ]; then
|
|
config_load cswireless24
|
|
config_foreach get_iface_config wifi-iface dvl_main
|
|
config_load cswireless5
|
|
config_foreach set_iface_config wifi-iface dvl_main
|
|
fi
|
|
# guest wifi common config
|
|
config_load cswireless24
|
|
config_foreach get_iface_config wifi-iface dvl_guest
|
|
config_load cswireless5
|
|
config_foreach set_iface_config wifi-iface dvl_guest
|
|
}
|
|
|
|
######################################
|
|
|
|
system_to_configsync()
|
|
{
|
|
my_logger "This is ${0} system_to_configsync()!"
|
|
|
|
# if there are current changes pending to $SERVICE or $CS_SERVICE, quit
|
|
# uci_changes_service="$( uci changes ${SERVICE} )"
|
|
# uci_changes_csservice="$( uci_cs changes )"
|
|
# if [ ! -z "$uci_changes_service" || ! -z "$uci_changes_service" ] ; then
|
|
# my_logger "ERROR: pending changes to UCI configuration! Exiting." \
|
|
# "Output is:" \
|
|
# "$uci_changes_service\n" \
|
|
# "$uci_changes_csservice"
|
|
# return 1
|
|
# fi
|
|
|
|
|
|
# Configsync sets md5sum for config files it writes itself.
|
|
# This is done to distinguish own writes from others, e.g. by webpage.
|
|
# Also, when configsync writes config files, it triggers sync events.
|
|
# The following check makes sure, the just-written config is not synced again.
|
|
|
|
|
|
# set common wifi parameter
|
|
|
|
config_get VALUE wps min_hold_time
|
|
uci_cs set ${CS_SERVICE_COMMON}.wps.min_hold_time="$VALUE"
|
|
|
|
config_get VALUE wps max_hold_time
|
|
uci_cs set ${CS_SERVICE_COMMON}.wps.max_hold_time="$VALUE"
|
|
|
|
config_get VALUE qcawifi atf_mode
|
|
uci_cs set ${CS_SERVICE_COMMON}.qcawifi.atf_mode="$VALUE"
|
|
|
|
config_get VALUE guest_wifi auto_switch_off
|
|
uci_cs set ${CS_SERVICE_COMMON}.guest_wifi.auto_switch_off="$VALUE"
|
|
|
|
config_get VALUE guest_wifi interval
|
|
uci_cs set ${CS_SERVICE_COMMON}.guest_wifi.interval="$VALUE"
|
|
|
|
config_get VALUE guest_wifi starttime
|
|
uci_cs set ${CS_SERVICE_COMMON}.guest_wifi.starttime="$VALUE"
|
|
|
|
config_get VALUE son enabled
|
|
uci_cs set ${CS_SERVICE_SON}.son.enabled="${VALUE}"
|
|
|
|
config_get VALUE son airtimefairness
|
|
uci_cs set ${CS_SERVICE_SON}.son.airtimefairness="${VALUE}"
|
|
|
|
config_get VALUE son bandsteering
|
|
uci_cs set ${CS_SERVICE_SON}.son.bandsteering="${VALUE}"
|
|
|
|
config_get VALUE son ieee80211k
|
|
uci_cs set ${CS_SERVICE_SON}.son.ieee80211k="${VALUE}"
|
|
|
|
config_get VALUE son ieee80211v
|
|
uci_cs set ${CS_SERVICE_SON}.son.ieee80211v="${VALUE}"
|
|
|
|
config_get VALUE son ieee80211r
|
|
uci_cs set ${CS_SERVICE_SON}.son.ieee80211r="${VALUE}"
|
|
|
|
(check_common_wifi_settings) && local COMMON_MODE=1 # call as subshell (no config_load merging)
|
|
|
|
# loop though radios, get their device names (e.g. wifi0),
|
|
# detect type (2,4 GHz vs 5 Ghz) and work through the corresponding interfaces
|
|
config_foreach write_radio_to_cs wifi-device
|
|
|
|
if [ "$RADIO_24" = "1" -a "$RADIO_5" != "1" ]; then
|
|
# only 2.4 GHz radio available"
|
|
(sync_common_wifi_settings $COMMON_MODE) # call as subshell (no config_load merging)
|
|
fi
|
|
|
|
uci_cs commit ${CS_SERVICE_COMMON}
|
|
uci_cs commit ${CS_SERVICE_24} # returns error if no 2.4GHz radio available
|
|
uci_cs commit ${CS_SERVICE_5} # returns error if no 5GHz radio available
|
|
uci_cs commit ${CS_SERVICE_SON}
|
|
}
|
|
|
|
|
|
initialize_radio() {
|
|
config_get HWMODE $1 hwmode
|
|
|
|
# TODO: consider require_mode '11n' too?
|
|
case "$HWMODE" in
|
|
11a)
|
|
# 5GHz
|
|
>${CS_CONFIGURATION_PATH}/${CS_SERVICE_5}
|
|
uci_cs set ${CS_SERVICE_5}.configsync=info
|
|
uci_cs set ${CS_SERVICE_5}.configsync.version=1
|
|
;;
|
|
11g)
|
|
# 2,4GHz
|
|
>${CS_CONFIGURATION_PATH}/${CS_SERVICE_24}
|
|
uci_cs set ${CS_SERVICE_24}.configsync=info
|
|
uci_cs set ${CS_SERVICE_24}.configsync.version=1
|
|
;;
|
|
*)
|
|
my_logger "ERROR: Illegal value of \$HWMODE: '$HWMODE'\n\n"
|
|
return 1
|
|
esac
|
|
return 0
|
|
}
|
|
|
|
init()
|
|
{
|
|
my_logger "This is ${0}/init()!"
|
|
if [ ! -d ${CS_CONFIGURATION_PATH} ]; then
|
|
mkdir -p ${CS_CONFIGURATION_PATH}
|
|
fi
|
|
|
|
# initialize common wireless config file
|
|
|
|
# clear the current CS config to avoid accidental merging
|
|
>${CS_CONFIGURATION_PATH}/${CS_SERVICE_COMMON}
|
|
>${CS_CONFIGURATION_PATH}/${CS_SERVICE_SON}
|
|
|
|
# setup needed sections
|
|
uci_cs set ${CS_SERVICE_COMMON}.configsync=info
|
|
uci_cs set ${CS_SERVICE_COMMON}.configsync.version=1
|
|
uci_cs set ${CS_SERVICE_COMMON}.wps=wps
|
|
uci_cs set ${CS_SERVICE_COMMON}.qcawifi=qcawifi
|
|
uci_cs set ${CS_SERVICE_COMMON}.guest_wifi=guest_wifi
|
|
|
|
uci_cs set ${CS_SERVICE_SON}.son=son
|
|
|
|
# initialize radio config files
|
|
config_foreach initialize_radio wifi-device
|
|
|
|
system_to_configsync init
|
|
}
|
|
|
|
if [ "${1}" = "init" ] || [ "${1}" = "system_to_configsync" ]; then
|
|
config_load wireless
|
|
"${@}"
|
|
else
|
|
my_logger "Unknown command ${1} in ${0}!"
|
|
fi
|
|
|