#!/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