本帖最后由 代祥军 于 2015-3-26 09:35 编辑
OpenWRT中采用LuCI作为它的Web interface界面框架,采用Lua语言。在本文中将以一个简单 的示例详细描述如何自定义开发一个界面,对一个配置文件进行操作。
3.wifidog界面实例
本文中的页面建立在LuCI界面的services下,不单独创建页面,因此无需写view,只用些controller和model就可以了。 3.1.首先创建一个controller
controller/wifidog.lua- module("luci.controller.wifidog", package.seeall)
- function index()
- local fs = require "nixio.fs"
- if fs.access("/usr/bin/wifidog") then --必须确认你/usr/bin下有wifidog文件
- entry({"admin", "services","wifidog"}, cbi("wifidog"), "WEB认证配置", 4)
- end
- end
复制代码 代码解释: fs.access检查/usr/bin/wifidog文件是否有执行权限。 效果如下:
在index()函数中,使用entry函数来完成每个模块函数的注册,官方说明文档如下:- entry(path, target, title=nil, order=nil)
- 1.<font face="宋体" size="4"><b>path</b></font> is a table that describes the position in the dispatching tree: For example a path of {"foo", "bar", "baz"} would insert your node in foo.bar.baz.
- 2.<b><font face="宋体" size="4">target</font></b> describes the action that will be taken when a user requests the node. There are several predefined ones of which the 3 most important (call, template, cbi) are described later on on this page
- 3.<b><font face="宋体" size="4">title</font> </b>defines the title that will be visible to the user in the menu (optional)
- 4.<b><font face="宋体" size="4">order</font> </b>is a number with which nodes on the same level will be sorted in the menu (optional)
复制代码 其 中target主要分为三类:call,template和cbi。call用来调用函数,template用来调用已有的htm模版,而CBI 模块则是使用非常频繁也非常方便的模块,包含的一系列lua文件构成界面元素的组合,所有cbi模块中的控件都需要写在luci.cbi.Map中,在 cbi模块中定义各种控件,Luci系统会自动执行大部分处理工作。在cbi.lua文件中封装了所有的控件元素,例如复选框,下拉列表等。
3.2.model/cbi
3.2.1源代码如下 - local sys = require "luci.sys"
- local fs = require "nixio.fs"
- local uci = require "luci.model.uci".cursor()
- local wan_ifname = luci.util.exec("uci get network.wan.ifname")
- local lan_ifname = luci.util.exec("uci get network.lan.ifname")
- m = Map("wifidog", "认证设置",translate("无线认证"))
- if fs.access("/usr/bin/wifidog") then
- s = m:section(TypedSection, "wifidog", "web认证配置")
- s.anonymous = true
- s.addremove = false
- s:tab("jbsz", translate("基本设置"))
- s:tab("bmd", translate("白名单"))
- s:tab("qos", translate("速度限制"))
- s:tab("wpa2", translate("无线密码同步"))
- s:tab("gjsz", translate("高级设置"))
-
- wifidog_enable = s:taboption("jbsz",Flag, "wifidog_enable",
- translate("启用认证"),
- translate("打开或关闭认证"))
- --wifi_enable.default = wifi_enable.enable
- --wifi_enable.optional = true
- wifidog_enable.rmempty=false
- deamo_enable = s:taboption("jbsz",Flag, "deamo_enable", translate("守护进程"),"开启监护认证进程,保证认证进程时时在线")
- deamo_enable:depends("wifidog_enable","1")
- ssl_enable = s:taboption("gjsz",Flag, "ssl_enable", translate("加密传输"),"启用安全套接层协议传输,提高网络传输安全")
- sslport = s:taboption("gjsz",Value,"sslport","SSL传输端口号","默认443")
- sslport:depends("ssl_enable","1")
- gatewayID = s:taboption("jbsz",Value,"gateway_id","AP编码","此处填写认证服务器端生成的AP编码")
- gateway_interface = s:taboption("gjsz",Value,"gateway_interface","内网接口","设置内网接口,默认'br-lan'。")
- gateway_interface.default = "br-lan"
- gateway_interface:value(wan_ifname,wan_ifname .."" )
- gateway_interface:value(lan_ifname,lan_ifname .. "")
-
- gateway_eninterface = s:taboption("gjsz",Value,"gateway_eninterface","外网接口","此处设置认证服务器的外网接口一般默认即可")
- gateway_eninterface.default = wan_ifname
- gateway_eninterface:value(wan_ifname,wan_ifname .."")
- gateway_eninterface:value(lan_ifname,lan_ifname .. "")
- for _, e in ipairs(sys.net.devices()) do
- if e ~= "lo" then gateway_interface:value(e) end
- if e ~= "lo" then gateway_eninterface:value(e) end
- end
-
- gateway_hostname = s:taboption("jbsz",Value,"gateway_hostname","认证服务器地址","域名或者IP地址")
- gatewayport = s:taboption("gjsz",Value,"gatewayport","认证网关端口号","默认端口号2060")
- gateway_httpport = s:taboption("gjsz",Value,"gateway_httpport","HTTP端口号","默认80端口")
- gateway_path = s:taboption("gjsz",Value,"gateway_path","认证服务器路径","最后要加/,例如:'/','/wifidog/'")
- gateway_connmax = s:taboption("gjsz",Value,"gateway_connmax","最大用户接入数量","以路由器性能而定,默认50")
- gateway_connmax.default = "50"
- check_interval = s:taboption("gjsz",Value,"check_interval","检查间隔","接入客户端在线检测间隔,默认60秒")
- check_interval.default = "60"
- client_timeout = s:taboption("gjsz",Value,"client_timeout","客户端超时","接入客户端认证超时,默认5分")
- client_timeout.default = "5"
- --[白名单]--
- bmd_url=s:taboption("bmd",Value,"bmd_url","网站URL白名单","编辑框内的url网址不认证也能打开,不能带”http://“多个URL请用”,“号隔开。如:“www.baidu.com,www.qq.com”")
- bmd_url.placeholder = "www.baidu.com,www.qq.com,www.163.com"
- myz_mac=s:taboption("bmd",Value,"myz_mac","免认证设备","填入设备的MAC地址,多个设备请用“,”号隔开。如:“11:22:33:44:55:66,aa:bb:cc:dd:ff:00”")
- myz_mac.placeholder = "00:11:22:33:44:55,AA:BB:CC:DD:EE:FF"
- --[智能QOS]--
- qos_enable = s:taboption("qos",Flag,"qos_enable","启用智能限速")
- sxsd = s:taboption("qos",Value,"sxsd","上行带宽","总的上行带宽,单位Mbit")
- sxsd.default = "1"
- xxsd = s:taboption("qos",Value,"xxsd","下行带宽","总的下行带宽,单位Mbit")
- xxsd.default = "2"
- else
- m.pageaction = false
- end
- local apply = luci.http.formvalue("cbi.apply")
- if apply then
- io.popen("/etc/init.d/config restart")
- end
- return m
复制代码3.2.2源代码解析3.2.2.1头文件代码
3.2.2.2 Map代码 效果如下:
其中无线密码同步未用到。这里提到了配置文件,配置文件如下:
s = m:section(TypedSection, "wifidog", "web认证配置"),s就像是一个句柄能通过它找到配置文件的option中的每一项,然后对其进行操作。
其中”jbsz””bmd”是标签的名字,用来识别是哪个标签,后面的中文是在web页面上显示标签,第四个标签我们没用。效果如下: 3.2.2.4“基本设置”代码先看效果:
有三个taboption(不知道怎么翻译,凑合用英文),第一个taboption是单选按钮,其他两个是输入框。三个taboption都对应在配置文件找到选项,注意:每次luci中web认证启动后都会去读取配置文件的选项显示到web页面(具体是怎么读,没有深究过,但是就是调用函数嘛,跟c语言那些差不多吧。)
1.启用认证 [size=12.0000pt]2.守护进程
3.AP编码
4.认证服务器地址
代码分析:
3.2.2.5白名单(省略,同上)3.2.2.6速度限制(省略,同上)3.2.2.7高级设置效果如下,这里用了下拉菜单。
下拉菜单说明:
3.2.2.8保存与应用效果如下:
代码:
5.脚本文件wifidog
其实完全是shell的语法。
5.1.config_load函数START=65,表示优先级,且是应用层初始化代码。
.wifidog_enable=$(uci get wifidog.@wifidog[0].wifidog_enable)取出配置文件参数赋值给wifidog_enbale
5.2 restart函数
6.luci-wifidog
qq:574889524
|