openwrt上LUCI模块配置界面开发框架 ---我的笔记(2.5)

LuCI配置界面开发的框架


LuCI是OpenWrt上的Web管理界面,LuCI采用了MVC三层架构,同时其使用Lua脚本开发,所以开发LuCI的配置界面不需要编辑任何的Html代码,除非想自己单独去创建网页(View层),否则我们基本上只需要修改Model层就可以了。
要为LuCI增加一个新模块,首先需要创建两个文件,一个位于Controller(/usr/lib/lua/luci/controller/)下,定义模块的入口;另一个位于Model(/usr/lib/lua/luci/model/cbi/)下,为配置模块实际的代码




controller下的.lua文件。
首先我们定义模块的入口,在/usr/lib/lua/luci/controller/下创建一个lua文件,类似如下:
module("luci.controller.控制器名", package.seeall)
function index()
        entry(路径, 调用目标, _("显示名称"), 显示顺序)
  end
第一行说明了程序和模块的名称,比如在controller/目录创建一个mymodule.lua,那么就可以写成“luci.controller.mymodule”,如果你的程序比较多,可能分为好几个模块,那么可以在controller下再常见一个子目录,比如controller/myapp/,那么就可以写成“luci.controller.myapp.mymodule”。


接下来的entry表示添加一个新的模块入口,官方给出了entry的定义,其中后两项都是可以为空的:


entry(path, target, title=nil, order=nil)
第一项是访问的路径,不过路径是按字符串数组给定的,比如路径按如下方式写“{"click", "here", "now"}”,那么就可以在浏览器里访问“http://192.168.1.1/cgi-bin/luci/click/here/now”来访问这个脚本。而通常我们希望为管理员菜单添加脚本,那么我们需要按如下方式编写“{"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文件了。
而title和order无非是针对管理员菜单来的,可以参考其他的lua文件来决定编写的内容。
例1.




module("luci.controller.njitclient", package.seeall)


function index()
        entry({"admin", "network", "njitclient"}, cbi("njitclient"), _("NJIT Client"), 100)
        end


例二:路由器Firewalls 
module("luci.controller.firewall", package.seeall)


function index()
entry({"admin", "network", "firewall"},
alias("admin", "network", "firewall", "zones"),
_("Firewall"), 60)


entry({"admin", "network", "firewall", "zones"},
arcombine(cbi("firewall/zones"), cbi("firewall/zone-details")),
_("General Settings"), 10).leaf = true


entry({"admin", "network", "firewall", "forwards"},
arcombine(cbi("firewall/forwards"), cbi("firewall/forward-details")),
_("Port Forwards"), 20).leaf = true


entry({"admin", "network", "firewall", "rules"},
arcombine(cbi("firewall/rules"), cbi("firewall/rule-details")),
_("Traffic Rules"), 30).leaf = true


entry({"admin", "network", "firewall", "custom"},
cbi("firewall/custom"),
_("Custom Rules"), 40).leaf = true
end
二、用Lua和UCI接口开发LuCI配置模块
对于使用UCI的方式,我们首先需要创建对应的配置文件(如果配置文件不存在的话,访问配置页面将会报错),格式即为linux配置文件的格式,文件需要存储在/etc/config,比如文件路径为“/etc/config/njitclient”,内容如下:


config login
    option username ''
    option password ''
    option ifname 'eth0'
    option domain ''
然后创建在model/文件下的.lua文件
     require("luci.sys")
 2 
 3 m = Map("njitclient", translate("NJIT Client"), translate("Configure NJIT 802.11x client."))  //首先需要映射与存储文件的关系 m = Map("配置文件文件名", "配置页面标题", "配置页面说明")
 4 
 5 s = m:section(TypedSection, "login", "")
 6 s.addremove = false
 7 s.anonymous = true
   //创建与配置文件中对应的Section,Section分为两种,NamedSection和TypedSection,前者根据配置文件中的Section名,而后者根据配置文件中的Section类型,这里我们使用后者,代码如下。同时我们设定不允许增加或删除Section(“.addremove = false”),以及不显示Section的名称(“.anonymous = true”)。




接下来我们需要创建Section中不同内容的交互(创建Option),常见的比如有Value(文本框)、ListValue(下拉框)、Flag(选择框)等等,详细的可以参考官方的文档,创建Option的过程非常简单,而且创建后系统会无需考虑读取以及写入配置文件的问题,系统都会自动处理。
 9 enable = s:option(Flag, "enable", translate("Enable"))
10 name = s:option(Value, "username", translate("Username"))
11 pass = s:option(Value, "password", translate("Password"))
12 pass.password = true
13 domain = s:option(Value, "domain", translate("Domain"))
14 
15 ifname = s:option(ListValue, "ifname", translate("Interfaces"))
16 for k, v in ipairs(luci.sys.net.devices()) do
17     if v ~= "lo" then
18         ifname:value(v)
19     end
20 end
//但是根据上述的要求,我们在应用配置以后可能希望启用、禁用或重新启动njit-client,所以我们还需要在页面最后判断用户是否点击了“应用”按钮,这里与编写asp网页等都是相同的,我们可以通过如下的代码判断是否点击了“应用”按钮:


复制代码
22 local apply = luci.http.formvalue("cbi.apply")
23 if apply then
24     io.popen("/etc/init.d/njitclient restart")
25 end
26 
27 return m




三、在Bash文件中调用UCI接口
接下来我们要编写/etc/init.d/njitclient脚本,使程序最终能运行起来。
 #!/bin/sh /etc/rc.common
 2 START=50
 3 
 4 run_njit()
 5 {
 6     local enable
 7     config_get_bool enable $1 enable
 8     
 9     if [ $enable ]; then
10         local username
11         local password
12         local domain
13         local ifname
14         
15         config_get username $1 username
16         config_get password $1 password
17         config_get domain $1 domain
18         config_get ifname $1 ifname
19         
20         if [ "$domain" != "" ]; then
21             njit-client $username@$domain $password $ifname &
22         else
23             njit-client $username $password $ifname &
24         fi
25         
26         echo "NJIT Client has started."
27     fi
28 }
29 
30 start()
31 {
32     config_load njitclient
33     config_foreach run_njit login
34 }
35 
36 stop()
37 {
38     killall njit-client
39     killall udhcpc
40     
41     echo "NJIT Client has stoped."
42 }
然后编译就行了。
总结一下:首先control目录下创个.lua文件
其次etc/config下写个配置
再次luci/model/文件下要再写一个.lua
最后你要启动它所以要写一个启动脚本这个脚本在etc/init.d中。




参考网页:
http://www.cnblogs.com/mayswind/p/3468124.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值