Firefly开源社区

FireWRT添加WifiDog界面-1

98

积分

9

威望

6

贡献

注册会员

Rank: 8Rank: 8

积分
98
发表于 2015-3-25 11:46:03     
本帖最后由 代祥军 于 2015-3-26 09:35 编辑


代码下载地址:FireWRT-luci-wifidog
1. 引言
OpenWRT中采用LuCI作为它的Web interface界面框架,采用Lua语言。在本文中将以一个简单
的示例详细描述如何自定义开发一个界面,对一个配置文件进行操作。

2.Model与ControlerMVC的设计理念是进行LuCI开发的一个关键,什么是MVC
请参看如下Blog:
http://www.cnblogs.com/gnuhpc/archive/2012/12/21/2827597.html在 LuCI
中Controller的文件定义在固件中的/usr/lib/lua/luci/controller目录中,模版目录

/usr/lib /lua/luci/view目录下,而model则是在/usr/lib/lua/luci/model中。而model中有
一个特殊的模块叫做 CBI,被称为LuCI中最酷的功能,该模块的功能是方便的对一个配置文件进行修改。
3.wifidog界面实例
本文中的页面建立在LuCI界面的services下,不单独创建页面,因此无需写view,只用些controller和model就可以了。
3.1.首先创建一个controller
controller/wifidog.lua
  1. module("luci.controller.wifidog", package.seeall)
  2. function index()
  3.                 local fs = require "nixio.fs"
  4.                 if fs.access("/usr/bin/wifidog") then --必须确认你/usr/bin下有wifidog文件
  5.                                entry({"admin", "services","wifidog"}, cbi("wifidog"), "WEB认证配置", 4)
  6.                         end
  7. end
复制代码
代码解释:
图片1.jpg
fs.access检查/usr/bin/wifidog文件是否有执行权限。
效果如下:

图片2.jpg
在index()函数中,使用entry函数来完成每个模块函数的注册,官方说明文档如下:
  1. entry(path, target, title=nil, order=nil)
  2. 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.
  3. 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
  4. 3.<b><font face="宋体" size="4">title</font> </b>defines the title that will be visible to the user in the menu (optional)
  5. 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源代码如下
  1. local sys = require "luci.sys"
  2. local fs = require "nixio.fs"
  3. local uci = require "luci.model.uci".cursor()
  4. local wan_ifname = luci.util.exec("uci get network.wan.ifname")
  5. local lan_ifname = luci.util.exec("uci get network.lan.ifname")
  6. m = Map("wifidog", "认证设置",translate("无线认证"))


  7. if fs.access("/usr/bin/wifidog") then
  8.         s = m:section(TypedSection, "wifidog", "web认证配置")
  9.         s.anonymous = true
  10.         s.addremove = false
  11.         s:tab("jbsz", translate("基本设置"))
  12.         s:tab("bmd", translate("白名单"))
  13.         s:tab("qos", translate("速度限制"))
  14.         s:tab("wpa2", translate("无线密码同步"))
  15.         s:tab("gjsz", translate("高级设置"))
  16.         
  17.         wifidog_enable = s:taboption("jbsz",Flag, "wifidog_enable",
  18.         translate("启用认证"),
  19.         translate("打开或关闭认证"))
  20.         --wifi_enable.default = wifi_enable.enable
  21.         --wifi_enable.optional = true
  22.         wifidog_enable.rmempty=false
  23.         deamo_enable = s:taboption("jbsz",Flag, "deamo_enable", translate("守护进程"),"开启监护认证进程,保证认证进程时时在线")
  24.         deamo_enable:depends("wifidog_enable","1")        
  25.         ssl_enable = s:taboption("gjsz",Flag, "ssl_enable", translate("加密传输"),"启用安全套接层协议传输,提高网络传输安全")
  26.         sslport = s:taboption("gjsz",Value,"sslport","SSL传输端口号","默认443")
  27.         sslport:depends("ssl_enable","1")
  28.         gatewayID = s:taboption("jbsz",Value,"gateway_id","AP编码","此处填写认证服务器端生成的AP编码")
  29.         gateway_interface = s:taboption("gjsz",Value,"gateway_interface","内网接口","设置内网接口,默认'br-lan'。")
  30.         gateway_interface.default = "br-lan"
  31.         gateway_interface:value(wan_ifname,wan_ifname .."" )
  32.         gateway_interface:value(lan_ifname,lan_ifname .. "")
  33.         
  34.         gateway_eninterface = s:taboption("gjsz",Value,"gateway_eninterface","外网接口","此处设置认证服务器的外网接口一般默认即可")
  35.         gateway_eninterface.default = wan_ifname
  36.         gateway_eninterface:value(wan_ifname,wan_ifname .."")
  37.         gateway_eninterface:value(lan_ifname,lan_ifname .. "")

  38. for _, e in ipairs(sys.net.devices()) do
  39.         if e ~= "lo" then gateway_interface:value(e) end
  40.         if e ~= "lo" then gateway_eninterface:value(e) end
  41. end
  42.         
  43.         gateway_hostname = s:taboption("jbsz",Value,"gateway_hostname","认证服务器地址","域名或者IP地址")
  44.         gatewayport = s:taboption("gjsz",Value,"gatewayport","认证网关端口号","默认端口号2060")
  45.         gateway_httpport = s:taboption("gjsz",Value,"gateway_httpport","HTTP端口号","默认80端口")
  46.         gateway_path = s:taboption("gjsz",Value,"gateway_path","认证服务器路径","最后要加/,例如:'/','/wifidog/'")
  47.         gateway_connmax = s:taboption("gjsz",Value,"gateway_connmax","最大用户接入数量","以路由器性能而定,默认50")
  48.         gateway_connmax.default = "50"
  49.         check_interval = s:taboption("gjsz",Value,"check_interval","检查间隔","接入客户端在线检测间隔,默认60秒")
  50.         check_interval.default = "60"
  51.         client_timeout = s:taboption("gjsz",Value,"client_timeout","客户端超时","接入客户端认证超时,默认5分")
  52.         client_timeout.default = "5"
  53.                                                         --[白名单]--
  54.     bmd_url=s:taboption("bmd",Value,"bmd_url","网站URL白名单","编辑框内的url网址不认证也能打开,不能带”http://“多个URL请用”,“号隔开。如:“www.baidu.com,www.qq.com”")
  55.         bmd_url.placeholder = "www.baidu.com,www.qq.com,www.163.com"
  56.         myz_mac=s:taboption("bmd",Value,"myz_mac","免认证设备","填入设备的MAC地址,多个设备请用“,”号隔开。如:“11:22:33:44:55:66,aa:bb:cc:dd:ff:00”")
  57.         myz_mac.placeholder = "00:11:22:33:44:55,AA:BB:CC:DD:EE:FF"
  58.         --[智能QOS]--

  59.         qos_enable = s:taboption("qos",Flag,"qos_enable","启用智能限速")
  60.         sxsd = s:taboption("qos",Value,"sxsd","上行带宽","总的上行带宽,单位Mbit")
  61.         sxsd.default = "1"
  62.         xxsd = s:taboption("qos",Value,"xxsd","下行带宽","总的下行带宽,单位Mbit")
  63.         xxsd.default = "2"        
  64. else
  65.         m.pageaction = false
  66. end
  67. local apply = luci.http.formvalue("cbi.apply")
  68. if apply then
  69.                 io.popen("/etc/init.d/config restart")
  70. end

  71. return m
复制代码
3.2.2源代码解析3.2.2.1头文件代码
图片3.jpg

3.2.2.2 Map代码
图片4.jpg
效果如下:
图片5.jpg

其中无线密码同步未用到。这里提到了配置文件,配置文件如下:
图片6.jpg
s = m:section(TypedSection, "wifidog", "web认证配置"),s就像是一个句柄能通过它找到配置文件的option中的每一项,然后对其进行操作。
其中”jbsz””bmd”是标签的名字,用来识别是哪个标签,后面的中文是在web页面上显示标签,第四个标签我们没用。效果如下:
图片7.jpg

3.2.2.4“基本设置”代码先看效果:
图片8.jpg

有三个taboption(不知道怎么翻译,凑合用英文),第一个taboption是单选按钮,其他两个是输入框。三个taboption都对应在配置文件找到选项,注意:每次luci中web认证启动后都会去读取配置文件的选项显示到web页面(具体是怎么读,没有深究过,但是就是调用函数嘛,跟c语言那些差不多吧。)
1.启用认证
图片9.jpg
[size=12.0000pt]2.守护进程
图片10.jpg
3.AP编码
图片11.jpg
4.认证服务器地址
代码分析:
图片12.jpg

3.2.2.5白名单(省略,同上)3.2.2.6速度限制(省略,同上)3.2.2.7高级设置效果如下,这里用了下拉菜单。 图片13.jpg

下拉菜单说明:
图片14.jpg
3.2.2.8保存与应用效果如下:
图片15.jpg

代码:
图片16.jpg


5.脚本文件wifidog
其实完全是shell的语法。
5.1.config_load函数START=65,表示优先级,且是应用层初始化代码。
.wifidog_enable=$(uci get wifidog.@wifidog[0].wifidog_enable)取出配置文件参数赋值给wifidog_enbale
图片17.jpg
图片18.jpg
图片19.jpg
图片20.jpg
5.2 restart函数
图片21.jpg
6.luci-wifidog
图片22.jpg

代码下载地址:FireWRT-luci-wifidog
qq:574889524

回复

使用道具 举报

4

积分

0

威望

0

贡献

吃瓜的群众

积分
4
发表于 2015-5-13 15:04:47     
LZ你是怎么注册www.scjxsw.com的?我找遍都没看到后台入口
回复

使用道具 举报

8

积分

0

威望

0

贡献

游客

积分
8
发表于 2015-7-31 17:35:41     
试了很多,感觉都不能用,或者不会用,再试一试
回复

使用道具 举报

7

积分

0

威望

0

贡献

游客

积分
7
发表于 2015-12-23 22:12:08     
谢谢楼主,我已经集成到openwrt里去了,可以用,很方便
回复

使用道具 举报

10

积分

0

威望

0

贡献

游客

积分
10
发表于 2016-2-15 17:33:12     
路过
回复

使用道具 举报

7

积分

0

威望

0

贡献

游客

积分
7
发表于 2016-9-6 18:09:28     
怎么就是没有显示web认证这个功能
回复

使用道具 举报

7

积分

0

威望

0

贡献

游客

积分
7
发表于 2016-9-6 18:10:11     
怎么就是没有显示web认证这个功能
QQ图片20160906180953.png
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表