修改openwrt页面配置工具—uci(+源码)

UCI

    UCI (Unified Configuration Interface, 统一配置接口)是openwrt的一种页面配置工具,通过该工具可以直接配置openwrt的一些信息,用户只管信息的填写。uci使用lua语言进行开发,lua语言语法比较简单,所以入手编写还是较快的。

动手增加功能

    前面说到,openwrt是一个高度模块化的系统,所以我们可以试着去改uci界面,这里我们并不需要去管文件的读取、存储,openwrt会帮我们完成。所以在原有的页面上面简单增加自己想要的功能,像配置网络,驱动一些小模块之类的。

    这里需要先知道相关的文件在哪,uci配置文件相关都在路径(/usr/lib/lua/luci/)在这个路径下,如果只是想应用的话,并不需要每个文件都去深究,只需了解几个文件。

要增加一个功能需要现在controller这个文件下去注册相关功能,在该文件夹中建立一个lua文件

module("luci.controller.admin.mylua",package.seeall)

function index()

entry({"admin","mylua"},alias("admin","mylua","mylua"),_("mylua"),30).index = true

entry({"admin","mylua","mylua"},cbi("admin_mylua/mylua"),_("BoardType"),1)

    entry({"admin","mylua","control"},cbi("admin_mylua/control"),_("Control web"),1)

end

第一行—声明模块的入口处,一般都是luci.controller.admin.(创建的文件名)

entry(文件路径,调用目标,菜单名,菜单顺序) 语法解释:

如路径按如下方式写“{"admin", "mylua", "control"}”,那么就可以在浏览器里访问“http://192.168.8.1/cgi-bin/luci/admin/mylua/control”来访问这个脚本。而通常我们希望为管理员菜单添加脚本,那么我们需要按如下方式编写“{"admin", "一级菜单名", "菜单项名"}”,系统会自动在对应的菜单中生成菜单项。比如想在“网络”菜单下创建一个菜单项,那么一级菜单名可以写为“network”。

第二项为调用目标,调用目标分为三种,分别是执行指定方法(Action)、访问指定页面(Views)以及调用CBI Module。

  • 第一种可以直接调用指定的函数,比如点击菜单项就直接重启路由器等等,比如写为“call("function_name")”,然后在lua文件下编写名为function_name的函数就可以调用了。
  • 第二种可以访问指定的页面,比如写为“template("myapp/mymodule")”就可以调用/usr/lib/lua/luci/view/myapp/mymodule.htm文件了。
  • 而如果要编写配置页面,那么使用第三种方法无非是最方便的,比如写为“cbi("myapp/mymodule")”就可以调用/usr/lib/lua/luci/model/cbi/myapp/mymodule.lua文件了。

第三个第四个参数从字面上就可以知道意思了,这里就不讲了。

注意:路径用的是花括号“{}”,而调用时使用的是圆括号“()”。

调用目标这里,如果使用“call("function_name")”,那么只需要在文件中编写相应的函数,即可调用实现相关功能

比如:

    Function_name(){

    ./pwm.sh 2500000000

}

如果使用“template("test")”,那么就需要在view 文件夹中添加htm文件,去网上随便拷贝一个web。

使用cbi("myapp/mymodule")调用其它模块

m = Map("mylua", translate("Control"), translate("This is a control example.")) 



 s = m:section(TypedSection, "controlboard", translate("Control Board"))   --对应配置         

 s.anonymous = true

 s.addremove = false

 s:tab("led", translate("Control LED"))   --创建一个表格

 o = s:option("led", ListValue, "lednum", translate("LED NUM:"))   --设置为选项类型

 o.default = 0

 o.datatype = "uinteger"

 o:value(0, translate("LED0"))

 o:value(1, translate("LED1"))

 o:value(2, translate("LED2"))



 local apply = luci.http.formvalue("cbi.apply")     --监控页面行为

 if apply then

 io.popen("/etc/init.d/mylua restart")              --将配置写入文件

 end

 return m     --返回界面配置结果,不加这一句的话,配置界面将不会出现任何控件

    第一行映射与存储文件的关系

m = Map("配置文件名", "配置页面标题", "配置页面说明")

这里配置文件名需要在/etc/config路径下创建一个文件名字随便(但是一定要创建一个文件,否则运行不了),内容格式有限制,形如:

config controlboard

    option lednum '0'

“controlboard”其实可以理解为存储标志,lednum自己声明的一个变量, 然后初始值是0,格式为option [参数1] [参数2]

接下来需要创建与配置文件中对应的Section,Section分为两种,NamedSection和TypedSection,前者根据配置文件中的Section名,而后者根据配置文件中的Section类型,这里我们使用后者,代码如下。同时我们设定不允许增加或删除Section(“.addremove = false”),以及不显示Section的名称(“.anonymous = true”)。

创建Section中不同内容的交互(创建Option),常见的比如有Value(文本框)、ListValue(下拉框)、Flag(选择框)等等

创建Option的过程非常简单,而且创建后系统会无需考虑读取以及写入配置文件的问题,系统都会自动处理。但是根据上述的要求,我们在应用配置以后可能希望启用、禁用或重新启动njit-client,所以我们还需要在页面最后判断用户是否点击了“应用”按钮,这里与编写asp网页等都是相同的,我们可以通过如下的代码判断是否点击了“应用”按钮。

最后想要将页面配置的信息获取到的方法很多,最简单的就是到/etc/config/mylua(配置文件,具体找个人建立的文件)下获得信息,页面配置的信息将会被写入该文件,因为模块调用的时候映射到这里来了,使用cat 命令直接查看文件中的信息,可以编写一个简单的脚本文件在后台获取文件中的信息,去执行相应的功能。

总结

         uci作为openwrt配置界面的人机交互接口,由于模块化,对于初学者来说,学习还是较容易,能让初学者看到真正的效果,但是真正要深入openwrt,这个还只是鸡毛蒜皮。

源码:链接:https://pan.baidu.com/s/1lYOxarnNw7aQb9H6vpdfBQ 
            提取码:s95t 

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值