本来这个章节想排在最后在写,但是考虑到自身的码字速度,还是优先输出本篇文档,让大家先上手进行LUCI的相关调试。
本篇整理分为以下几个部分
1、查找页面及需要修改的元素
LUCI的目录框架包含LUA及HTML两部分,当你不知道想要修改的页面或者节点在哪个文件里时,可以选择将LUCI页面语言切换成英文模式,然后选择页面中相应的元素,通过设备串口或者版本机输入find . -type f |xargs grep "xxxx"命令进行搜索,找到对应的文件。例如:查找“状态->总览->网络状态信息”存在哪个文件中,可以选择在“系统->语言与界面”中选择英文。然后在版本机敲写find . -type f |xargs grep “IPv4 WAN Status”查找文件。
2、LUA注释
LUA单行注释使用“--”;LUA块注释使用“--[[ 注释内容 ]]--”;
3、LUA添加log打印信息
此方法转自下列链接,主要通过在/luasrc/下创建log.lua文件,并在需要增加调试信息的LUA代码中进行引用(此处为何写LUA代码,主要因为HTML页面中也可以添加LUA语句,同样可以使用这种方法增加打印信息),引用方法如下:
local log = require "luci.log"
log.print("=====STEP1=====")
4、LUA文件引用其他LUA脚本中的函数
在LUA文件中使用require关键字进行其他LUA脚本引用,引用的起始目录在/lua/,每一个"."号相当于文件目录的"/"分隔号。例1:require "nixio.fs",引用的是/lua/nixio/fs.lua文件;例2:local uci = require("luci.model.uci").cursor()调用/lua/luci/model/uci.lua中的cursor函数,使用该函数可以进行底层uci get及set操作。
5、LUA脚本调用函数时用点号还是用冒号
(1)使用点号时,需要开发者手动把自身self值当作参数传入到函数中; (2)使用冒号时,定义函数时,给函数的添加隐藏的第一个参数self;调用函数时,默认把当前调用者作为第一个参数传递进去。
6、LUA中字符串的处理
(1)连接字符串,使用“..”符号;(2)判断字符串是否相等使用“==”;(3)判断字符串不相等使用“~=”;(4)其他字符串操作可参考下列链接;
7、LUA中table的处理
(1)遍历table中的元素,需要使用for循环。其中v是table类型,x是遍历table的位置,默认位置从1开始,y是当前位置的值。
local maclist = {}
for x,y in pairs(v) do
if y ~= nil then
maclist_v[x] = y
end
end
(2)如果将table转化成字符串,可以使用table.concat()函数
8、多语言
(1)对于/usr/lib/lua/luci/controller/目录下的模块,我们可以使用_()来翻译标题 entry({"admin", "example"}, firstchild(), _("Example"), 60)
(2)对于/usr/lib/lua/luci/model/cbi/下的 lua 脚本,则使用 translate()来翻译 m = Map("example", translate("Example for cbi"), translate("This is very simple example for cbi"))
1、view下HTML页面的内容
(1)HTML页面使用“<% %>”嵌入 LUA 代码,在HTML页面的开头会发现有一段“<% %>”的引用,那里包含着LUA的数据处理;(2)可以在HTML的任何地方,使用<%=xxx%>进行LUA数据的引用;(3)HTML页面里的<%+header%>表示加载/usr/lib/lua/luci/view/header.htm;(4)使用<%:xxx%>,实现页面节点不同语言风格的切换。
2、XHR函数
HTML通过XHR调用LUA脚本,通常LUA的脚本位置在/usr/lib/lua/luci/controller/目录下
(1)XHR.get
XHR.get,静态从后台获取数据,仅调用一次,其函数模型如下所示
XHR.get(callPath,null,function(x,rval){
......
}
);
/*******************************************************************************************************************
callPath:访问LUA脚本的路径,可拼接参数下发,例:callPath=callPath+'/'+param1+'/'+param2;
null:此参数默认设置为null,功能待查
function(x,rval):回调函数,其中x:是XHR对象,rval是所访问LUA函数的返回值
********************************************************************************************************************/
(2)XHR.poll
XHR.poll,动态从后台获取数据,设置固定的时间进行调用,其函数模型如下所示
XHR.poll(time,callPath, param,function(x,rval){
......
}
);
/*******************************************************************************************************************
time:刷新间隔时间
callPath:访问LUA脚本的路径
param:拼接下发的JSON字符串,例如{ status: 1 }
function(x,rval):回调函数,其中x:是XHR对象,rval是所访问LUA函数的返回值
********************************************************************************************************************/
(3)XHR.post
XHR().post,将数据发送给后台LUA脚本执行,其函数模型如下所示
var xhr = new XHR();
xhr.post(callPath, null,function(rval){
}
);
/*******************************************************************************************************************
callPath:访问LUA脚本的路径
null:此参数为传入参数,可拼接JSON字符串,例如{ status: 1 }
function(rval):回调函数,其中rval是所访问LUA函数的返回值
********************************************************************************************************************/
1、LUCI的跳转方式
(1)cbi的跳转方式(跳转LUA页面):
local http = require 'luci.http'
local dsp = require 'luci.dispatcher'
http.redirect(dsp.build_url("/admin/system/wifitest"))
(2)template的跳转方式(跳转HTML页面):
local temp = require 'luci.template'
temp.render("sysauth")
2、luci.http.formvalue函数
此函数用于获取我们post发送的表单值,例如在model目录下的LUA页面中,当想自定义保存生效按钮时,可以使用如下代码;同时也可以在HTML页面的LUA部分判断当前页面提交哪些信息
--此段代码功能是点击保存生效按钮后,跳转到登录页面
local apply = luci.http.formvalue("cbi.apply")
if apply then
local dsp = require "luci.dispatcher"
local utl = require "luci.util"
local sid = dsp.context.authsession
if sid then
utl.ubus("session", "destroy", { ubus_rpc_session = sid })
dsp.context.urltoken.stok = nil
luci.http.header("Set-Cookie", "sysauth=%s; expires=%s; path=%s/" %{
sid, 'Thu, 01 Jan 1970 01:00:00 GMT', dsp.build_url()
})
end
luci.http.redirect(luci.dispatcher.build_url())
os.execute("rm -rf /tmp/luci*")
end
3、调用Linux底层脚本及程序函数
(1)luci.sys.call(command)
允许调用linux下任何的shell脚本或者执行程序
(2)luci.sys.exec(command)
执行底层命令,返回程序运行结果
(3)os.execute(command)
执行底层命令,判断命令是否执行成功
4、ubus
在LUCI页面中,多数使用ubus库函数获取网络、无线、状态等参数,具体引用方法查看luci目录下的util.lua文件。同样可以在设备串口敲写ubus --h命令查看ubus的使用方法。
(1)ubus list:显示当前ubus注册的接口
(2)ubus -v list 接口:添加-v参数,详细打印接口信息,例如:ubus -v list network.interface.wan,详细打印wan接口信息
(3)ubus call: 调用对象方法,例如:ubus call network.interface.wan status,调用wan接口状态
5、清除页面缓存
LUCI页面缓存文件存储在/tmp/luci-modulecache下,如果不想清除浏览器缓存记录,可以使用rm -rf /tmp/luci*命令清理缓存
6、修改登录密码
在串口执行passwd命令进行修改,改动后的密码存储在/etc/shadow里。
1、lua添加log调试信息网址(http://blog.csdn.net/bailyzheng/article/details/48663369)
2、lua调用底层uci网址(https://wiki.openwrt.org/doc/techref/uci#api)
3、luci系统调用函数网址(https://htmlpreview.github.io/?https://raw.githubusercontent.com/openwrt/luci/master/documentation/api/modules/luci.util.html)
4、lua处理字符串网址(http://www.3lian.com/edu/2015/05-29/217576.html)
5、标准OS库网址(https://www.cnblogs.com/chenny7/p/4056976.html)
6、lua table表单处理网址(https://www.runoob.com/lua/lua-tables.html)