openwrt advanced configuration

youxiaojie1979發表於2020-11-21

 

openwrt advanced configuration

openwrt高階配置(汗 照著標題就翻譯過來了

openwrt Kamikaze 8.09的一般配置檔案都在目錄 /etc/config 下面,可以使用指令碼來呼叫引數和設定引數。 比如 sbin/wifi(函式庫在 madwifi.sh 指令碼)裡面就是這樣配置本機上的無線網路卡的。

一般來說,每個configure檔案都是由一些 section 組成的,section 裡面包含了option ,option 都會有一個值。 section定義包含了type和name ,其中 name不是必須定義的,若沒有定義,系統會按照cfg**的形式分配給該section一個name。

舉例來說,wifi的配置檔案 /etc/config/wireless 內容如下:

******************************file: /etc/config/wireless ******************************************

config wifi-device wifi0
option type atheros
option channel auto
option hwmode 11g
option disabled 0

config wifi-iface
option device wifi0
option network lan
option mode adhoc
option ssid OpenWrt
option encryption none

*****************************************************************************************************

這個配置檔案裡面有兩個section, 其type分別是wifi-device 和wifi-iface。其中wifi-device擁有一個name是 wifi0 而wifi-iface沒有。

可以看到,option 具體設定了驅動或者應用程式的配置,每一項option都有name和value。

##################################華麗的分割線#######################

利用指令碼可以配置這些configure file 。

首先,指令碼需要新增. /etc/functions.sh庫。然後,使用命令config_load <name> 來載入相應的配置檔案,<name>代表配置檔案的檔名,函式會在 /etc/config 目錄下尋找名字為 name 的檔案。

配置檔案載入後,可以使用函式 config_cb() option_cb() config_foreach() config_get() 以及命令config_foreach 。詳細使用如下:

1)config_cb()和option_cb() 函式是指每一個section或option執行的callback函式。就是說,config_load 命令載入的config檔案中 , 每一個section都會呼叫config_cb()一次,每一個option都會呼叫option_cb()一次。其中,最後一個section的name可以用CONFIG_SECTION引用到。在所有section被呼叫完之後,config_cb()還會被呼叫一次,需要注意的是,config_cb()和option_cb() 函式需要在config_load 命令前定義(在. /etc/functions.sh被新增後)。

程式碼如下:

config_cb() {
local type="$1"
local name="$2"
# commands to be run for every section
}

注:變數$1 和$2分別代表section的type和name

option_cb() {
# commands to be run for every option
}

注:變數$1 和$2分別代表option的name和value

2)config_foreach命令在config_load後使用,方法如下:

config_foreach <function name> [<sectiontype>] [<arguments...>]

這條命令表示對每一個section都執行函式function name,該函式在其他地方定義。函式的引數 $1表示該section的name。如果新增sectiontype ,則只有該type的section才可以執行function name 函式。

3)config_get 命令,很簡單,不作解釋。

# print the value of the option
config_get <section> <option>

# store the value inside the variable
config_get <variable> <section> <option>

注:section欄填寫的是section的name,注意檔案中沒有設定的name是由系統分配的,此種情況最好還是用config_cb()或者option_cb()函式來完成功能比較好。

4)config_set 命令:

config_set <section> <option> <value>
這個 也很簡單不做解釋 。只是貌似不能更改實際檔案中的option的value而已,僅僅是在當前load的“檔案下”。

指令碼例項:

file: config_custom.sh

#this scripts is for advanced configure test , by huasion

. /etc/functions.sh

config_cb(){
local type="$1"
local name="$2"
if [ "$1" != "" ] && [ "$2" != "" ]; then
echo "my type is $1, my name is $2"
fi
#echo "last my type is $1, my name is $2"
}
option_cb(){
echo "option is $1 and option name is $2"
}
test(){
echo "fisrt varible is $1"
}
config_load wireless
echo "now do the last job"
config_get foo wifi0 type

echo "$foo"
echo "$CONFIG_SECTION"
config_get wifi0 channel
config_set wifi0 hwmode 11b
config_foreach test wifi-iface

#file is over

file: /etc/config/wireless

config wifi-device wifi0
option type atheros
option channel auto
option hwmode 11g
# REMOVE THIS LINE TO ENABLE WIFI:
#option disabled 1

config wifi-iface
option device wifi0
option network lan
option mode adhoc
option ssid OpenWrt
option encryption none
config wifi-device wifi1
option type atheros
option channel auto

# REMOVE THIS LINE TO ENABLE WIFI:
#option disabled 1

config wifi-iface
option device wifi1
option network lan
option mode adhoc
option ssid OpenWrt
option encryption none

#file is over

執行結果如下:

my type is wifi-device, my name is wifi0
option is type and option name is atheros
option is channel and option name is auto
option is hwmode and option name is 11g
my type is wifi-iface, my name is cfg03c84e
option is device and option name is wifi0
option is network and option name is lan
option is mode and option name is adhoc
option is ssid and option name is OpenWrt
option is encryption and option name is none
my type is wifi-device, my name is wifi1
option is type and option name is atheros
option is channel and option name is auto
my type is wifi-iface, my name is cfg0695cf
option is device and option name is wifi1
option is network and option name is lan
option is mode and option name is adhoc
option is ssid and option name is OpenWrt
option is encryption and option name is none
now do the last job
atheros
cfg0695cf
auto
option is hwmode and option name is 11b
fisrt varible is cfg03c84e
fisrt varible is cfg0695cf

打不動字了 分析以上結果就可以清晰地看到每個函式在什麼時候被呼叫,引數情況和函式都做了些什麼事,完了,撒花。

分類: OpenWrt

相關文章