ubnt解决方案
查看: 1712|回复: 1

OpenWrt 脚本配置

[复制链接]

141

回帖

2161

积分

139 小时

在线时间

少校

注册时间
2013-10-16
金币
1975 个
威望
0 个
荣誉
0 个
累计签到:192 天
连续签到:0 天
[LV.200]无线新星
发表于 2014-7-31 13:45 |显示全部楼层
本帖最后由 bandgear 于 2014-9-5 10:20 编辑

脚本配置
加载
为了加载UCI配置文件,你需要包含常见函数:
. /lib/functions.sh
然后你可以使用config_load name来加载配置文件。
此函数首先会把name当做是绝对文件名并后退到/etc/config/进行加载。
如果你想对节段或选项使用特殊回调的话,你需要重新定义以下描述的shell函数,并且是在运行config_load之前,/etc/functions.sh之后。
Callbacks
在句法分析过程中,每次遇到UCI节段标题时都会调用config_cb过程。
当被调用时,此过程就会接收到两个参数:
1.       TYPE,节段类型
2.       NAME,节段名称
config_cb() {
local type="$1"
local name="$2"
# commands to be run for every section
}
config_cb相似,每次遇到UCI选项时都会调用option_cb过程。
当被调用时,此进程会接收两个参数:
1.       NAME,选项名称
2.       VALUE,选项值
option_cb() {
local name="$1"
local value="$2"
# commands to be run for every option
}
你可以基于节段类型将config_cb更改为option_cb。它可以使你能够依据它们的类型逐一处理单独的config节段。
Iterating
基于语句分析的callback的变换方法是用config_foreach过程迭代配置节段。
Config_foreach过程至少需要一个参数:
1.       Function,为每个遇到的节段而调用的预先定义的程序名称
2.       Type,只迭代已给类型的节段,跳过其它的。
3.       Additional arguments,所有以下参数都按原样传递给回调程序
在以下示例中,每个config interface节段都会在/etc/config/network调用handle_interface过程。Test字符串会被做为第二个参数在每个调用中进行传送。
handle_interface() {
local config="$1"
local custom="$2"
# run commands for every interface section
}
config_load network
config_foreach handle_interface interface test
也可以通过return一个非零值在callback内部取消迭代。
在每个节段回调内,config_getconfig_set过程也许是用来读取或设置属于当前进程段的值。
读取选项
Config_get过程至少需要三个参数:
1.       用以保存恢复值的可变名称
2.       读取数值的节段ID
3.       读取数值的选项名称
4.       默认,如果选项未设置数值会返回
# read the value of "option ifname" into the "iface" variable
# $config contains the ID of the current section
local iface
config_get iface "$config" ifname
echo "Interface name is $iface"
设置选项
Config_set过程需要三个参数:
1.       设置选项的节段ID
2.       分配数值的选项名称
3.       分配的数值
# set the value of "option auto" to "0"
# $config contains the ID of the current section
config_set "$config" auto 0
需要注意的是用config_set更改的数值只保存在内存中。随后调用config_get将会返回被更新的数值。如果你想改变数值,使用/lib/config/uci.sh中的uci_*函数,此函数会自动包括在/etc/fuctions.sh中。
直接存取
如果预先知道配置节段的名称,便宜可以直接读取选项而无须使用节段迭代程序回调。
以下示例是从“config interface”节段读取“option proto”
local proto config_get proto wan proto
echo "Current WAN protocol is $proto"






欢迎大家提出自己的想法和意见,可以以回复的形式提出,或者加入我的QQ群大家一起交流,互相学习。
      名   称:openwrt开发
      群   号:  278691630、331230369 、318937037、208461032
web认证请加ApFree群

141

回帖

2161

积分

139 小时

在线时间

少校

注册时间
2013-10-16
金币
1975 个
威望
0 个
荣誉
0 个
累计签到:192 天
连续签到:0 天
[LV.200]无线新星
发表于 2014-9-5 10:20 |显示全部楼层
Reading List

一些UCI配置可能会在表格中包含list选项:


list network lan
list network wifi



在network调用config_get,list将会回复由空格隔开的列表值,以lan wifi为例.
然而,如果列表项本身包含空格的话,这一举动也许会破坏数值,例如:


list animal 'White Elephant'
list animal 'Mighty Unicorn'



Config_get会在White Elephant Mighty Unicorn表格中回复数值,并且最初的列表项也不再被清晰的分隔开。
为了避免这个问题,可以使用config_list_foreach迭代模式。它与config_foreach相似,但对list value起作用,而不是config节段。
Config_list__foreach过程需要至少三个参数:
1.        从列表进行读取的节段ID
2.        从选项读取对象的列表名称
3.        每个列表对象调用的进程
4.        附加参数。所有以下参数都会原样传送到回调过程

# handle list items in a callback
# $config contains the ID of the section
handle_animal() {
local value="$1"
# do something with $value
}

config_list_foreach "$config" animal handle_animal


Reading Booleans

Boolean选项也许包括各种数值来表示一个true value,例如on,true,enabled或1。
Config_get_bool过程简化了对读取boolean选项的处理,并生成一个整数值(1是true,0是false)。
此过程至少需要三个参数:
1.        从列表进行读取的节段ID
2.        从选项读取对象的列表名称
3.        每个列表对象调用的进程
4.        附加参数。如果未设置选项会返回boolean value。



欢迎大家提出自己的想法和意见,可以以回复的形式提出,或者加入我的QQ群大家一起交流,互相学习。
      名   称:openwrt开发
      群   号: 79612872
web认证请加ApFree群
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

Archiver | 手机版 | 无线门户 ( 粤ICP备11076993号|粤公网安备44010602008359号 ) |网站地图

GMT+8, 2026-6-27 08:51

返回顶部 返回列表