Configration in script(uci 腳本使用bug,以及API分析)

BUG: config_load之后,調(diào)用uci delete或者uci set xxx.xxx.xxx='',再度掉用config_load,之后通過config_get讀取出來的值將會(huì)出錯(cuò),delete之后不使用commit

解決方法1:使用API函數(shù)config_unset或者config_set

解決方法2:

config_clear() {

local SECTION="$1"

#遍歷每一項(xiàng)option,并將其unset

for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \

sed -e 's/\(.*\)=.*$/\1/'` ; do

unset $oldvar

done

}

config () {

local cfgtype="$1"

local name="$2"

config_clear $name

export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=$(($CONFIG_NUM_SECTIONS + 1))

name="${name:-cfg$CONFIG_NUM_SECTIONS}"

append CONFIG_SECTIONS "$name"

[ -n "$NO_CALLBACK" ] || config_cb "$cfgtype" "$name"

export ${NO_EXPORT:+-n} CONFIG_SECTION="$name"

export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_TYPE=$cfgtype"

}



在調(diào)用api時(shí),首先我們需要調(diào)用config_load

config_load() {

[ -n "$IPKG_INSTROOT" ] && return 0

uci_load "$@"

}

uci_load() {

local PACKAGE="$1"

local DATA

local RET

local VAR

_C=0

if [ -z "$CONFIG_APPEND" ]; then

for VAR in $CONFIG_LIST_STATE; do

export ${NO_EXPORT:+-n} CONFIG_${VAR}=

export ${NO_EXPORT:+-n} CONFIG_${VAR}_LENGTH=

done

export ${NO_EXPORT:+-n} CONFIG_LIST_STATE=

export ${NO_EXPORT:+-n} CONFIG_SECTIONS=

export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=0

export ${NO_EXPORT:+-n} CONFIG_SECTION=

fi

DATA="$(/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} ${LOAD_STATE:+-P /var/state} -S -n export "$PACKAGE" 2>/dev/null)"

RET="$?"

[ "$RET" != 0 -o -z "$DATA" ] || eval "$DATA"

unset DATA

${CONFIG_SECTION:+config_cb}

return "$RET"

}

1、首先通過uci export $PACKAGE 獲取配置文件的內(nèi)容(其他參數(shù)就不一一簡(jiǎn)紹了,具體查看uci --help)

package xxx

config xxx xxx

option xxx xxx

list????? xxx? xxx

2、之后eval "$DATA",將package config option替換成函數(shù)(這一步是很讓我很驚艷的用法,得向大牛學(xué)習(xí))

package() {

return 0

}

config () {

local cfgtype="$1"

local name="$2"

export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=$(($CONFIG_NUM_SECTIONS + 1))

name="${name:-cfg$CONFIG_NUM_SECTIONS}"

append CONFIG_SECTIONS "$name"

[ -n "$NO_CALLBACK" ] || config_cb "$cfgtype" "$name"

export ${NO_EXPORT:+-n} CONFIG_SECTION="$name"

export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_TYPE=$cfgtype"

}

option () {

local varname="$1"; shift

local value="$*"

export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_${varname}=$value"

[ -n "$NO_CALLBACK" ] || option_cb "$varname" "$*"

}

list() {

local varname="$1"; shift

local value="$*"

local len

config_get len "$CONFIG_SECTION" "${varname}_LENGTH" 0

[ $len = 0 ] && append CONFIG_LIST_STATE "${CONFIG_SECTION}_${varname}"

len=$(($len + 1))

config_set "$CONFIG_SECTION" "${varname}_ITEM$len" "$value"

config_set "$CONFIG_SECTION" "${varname}_LENGTH" "$len"

append "CONFIG_${CONFIG_SECTION}_${varname}" "$value" "$LIST_SEP"

list_cb "$varname" "$*"

}

3、通過這四個(gè)函數(shù)將每一項(xiàng)配置項(xiàng)設(shè)置到環(huán)境變量當(dāng)中

(bug出現(xiàn)原因:當(dāng)設(shè)入環(huán)境變量后,通過uci delete或uci set 刪除只會(huì)操作換存,在調(diào)用config_load 因?yàn)閛ption項(xiàng)不存在了,則不會(huì)在度設(shè)置到環(huán)境變量中,因此還是刪除之前的值,而不是空)

4、之后的config_get之類的函數(shù)就是獲取環(huán)境變量的值


for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \

sed -e 's/\(.*\)=.*$/\1/'` ; do

for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \

sed -e 's/\(.*\)=.*$/\1/'` ; do

for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \

sed -e 's/\(.*\)=.*$/\1/'` ; do

for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \

sed -e 's/\(.*\)=.*$/\1/'` ; do

for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \

sed -e 's/\(.*\)=.*$/\1/'` ; do

for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \

sed -e 's/\(.*\)=.*$/\1/'` ; do

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容