找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 17633|回复: 6

【7.21更新】【OpenWrt 脚本配置】

[复制链接]
发表于 2014-7-18 09:30 | 显示全部楼层 |阅读模式
本帖最后由 radixdigit 于 2014-7-21 15:27 编辑

脚本配置

加载
为了加载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过程也许是用来读取或设置属于当前进程段的值。








欢迎大家提出自己的想法和意见,可以以回复的形式提出,或者加入我的QQ群大家一起交流,互相思考。
      名   称:openwrt开发
      群   号:  278691630、331230369 、318937037、208461032
发表于 2014-7-18 12:29 | 显示全部楼层
顶一个。。。持续更新

点评

非常感谢您的支持~  详情 回复 发表于 2014-7-21 15:22
发表于 2014-7-18 12:39 | 显示全部楼层
支持楼主,但是对我来说,根本搞不懂

点评

非常感谢您的支持~  详情 回复 发表于 2014-7-21 15:23
 楼主| 发表于 2014-7-21 15:22 | 显示全部楼层
cgnq 发表于 2014-7-18 12:29
顶一个。。。持续更新

非常感谢您的支持~
 楼主| 发表于 2014-7-21 15:23 | 显示全部楼层
wyxmh6311 发表于 2014-7-18 12:39
支持楼主,但是对我来说,根本搞不懂

非常感谢您的支持~
 楼主| 发表于 2014-7-21 15:26 | 显示全部楼层
读取选项
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"



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开发
      群   号:  278691630、331230369 、318937037、208461032


发表于 2014-11-5 16:43 | 显示全部楼层
请问以下代码里,config_get_bool ledstatus $1 ledstatus 这句话什么意思?3个参数分别是什么意思


以下是配置文件和代码




  1.     config boardinfo
  2.         option ipaddr1 '192.168.123.212'
  3.         option netmask1 '255.0.0.0'
  4.         option boardname '1'

  5.     config controlboard
  6.         option beepfreq '100'
  7.         option beepstatus '0'
  8.         option lednum '2'
  9.         option ledstatus '0
复制代码






  1.     #!/bin/sh /etc/rc.common
  2.     # (C) 2014 openwrt.org
  3.     # add by Davied Huang <apple_guet@126.com>

  4.     START=50

  5.     LED_BIN="/usr/sbin/gsc3280_led"


  6.     control_board()
  7.     {
  8.         local ledstatus, lednum;
  9.         
  10.         config_get_bool ledstatus $1 ledstatus
  11.         
  12.         config_get lednum $1 lednum
  13.         
  14.         echo "${lednum} ${ledstatus}"
  15.         ${LED_BIN} ${lednum} ${ledstatus}
  16.     }

  17.     start() {
  18.         config_load loogson
  19.         config_foreach control_board controlboard
  20.     }

  21.     stop() {
  22.         config_load loogson
  23.         #config_foreach stop_instance controlboard
  24.     }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-6-8 15:10

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com

快速回复 返回顶部 返回列表