900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > OPENWRT-LUCI开发总结-LUCI开发过程中的小技巧

OPENWRT-LUCI开发总结-LUCI开发过程中的小技巧

时间:2022-03-17 01:38:01

相关推荐

OPENWRT-LUCI开发总结-LUCI开发过程中的小技巧

前言

本来这个章节想排在最后在写,但是考虑到自身的码字速度,还是优先输出本篇文档,让大家先上手进行LUCI的相关调试。

本篇整理分为以下几个部分

LUA脚本开发HTML页面开发常见函数及命令整理官方及参考网址

LUA脚本开发

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) doif y ~= nil thenmaclist_v[x] = yendend

(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"))

HTML页面开发

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 thenlocal dsp = require "luci.dispatcher"local utl = require "luci.util"local sid = dsp.context.authsessionif sid thenutl.ubus("session", "destroy", { ubus_rpc_session = sid })dsp.context.urltoken.stok = nilluci.http.header("Set-Cookie", "sysauth=%s; expires=%s; path=%s/" %{sid, 'Thu, 01 Jan 1970 01:00:00 GMT', dsp.build_url()})endluci.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调试信息网址(/bailyzheng/article/details/48663369)

2、lua调用底层uci网址(/doc/techref/uci#api)

3、luci系统调用函数网址(https://htmlpreview.github.io/?/openwrt/luci/master/documentation/api/modules/luci.util.html)

4、lua处理字符串网址(/edu//05-29/217576.html)

5、标准OS库网址(/chenny7/p/4056976.html)

6、lua table表单处理网址(/lua/lua-tables.html)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。