技巧一:在luci页面中执行shell命令
方法一:获得标准输出流
luci.sys.exec("命令")
然后可以声明一个变量将标准输出内容保存起来,如下
local str = luci.sys.exec("netstat -nlp")
方法二:获得错误输出流
luci.sys.call("命令")
同方法一用法一样,区别在于用它可以获得错误输出流
技巧二:获取UCI记录
可以直接通过技巧一执行shell命令来达到目的,如下例获取路由器LAN口的IP地址
local router_ip = luci.sys.exec("uci get network.lan.ipaddr")
顺便再提一下uci shell命令的写法,如上面的例子就是获取 /etc/config/network 文件下面 option名为lan 下面的ipaddr属性,UCI配置应为如下格式
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'fd25:5be0:231f::/48'
config interface 'lan'
option ifname 'eth0.1'
option force_link '1'
option type 'bridge'
option proto 'static'
option ipaddr '192.168.1.1'
option netmask '255.255.255.0'
option ip6assign '60'
option macaddr '00:88:a1:e4:f1:a3'
config interface 'wan'
option ifname 'eth0.2'
option proto 'dhcp'
option macaddr '00:88:a1:e4:f1:a8'
但是对于这样的UCI文件需要加上下标才能获得到结果
config ssr
option gfwlist 'china-banned'
option safe_dns_tcp '0'
option enabled '0'
option server '1.2.3.4'
option server_port '443'
option password 'Alex666666'
option method 'rc4-md5'
option protocol 'origin'
option obfs 'plain'
可以注意到 network的config行是两个参数,而上面这种格式只有一个参数,可以配置多个不同的config,所以要加上下标才能访问,如下
local vt_server_addr=`uci get ssr.@ssr[0].server`
同理我们可以获取列表型UCI记录的数据,如下
config main_server
option server_weight '10'
option server_ip '1.2.3.4'
option server_port '443'
option server_name 'JP1'
config backup_server
option server_name 'JP2'
option server_ip '2.2.2.2'
option server_port '8038'
config backup_server
option server_name 'JP3'
option server_ip '3.3.3.3'
option server_port '443'
config backup_server
option server_name 'JP4'
option server_ip '4.4.4.4'
option server_port '443'
那么我们获得第二个备用服务器的ip就可以通过修改下标实现
local bk_server_2='uci get haproxy.@backup_server[1].server_ip'
技巧三:字符串拼接
在luci中字符串拼接不能使用C语言里的+或者%s,而要使用 字符串..变量..字符串 的形式
比如我从UCI记录中查询到了路由器内网的IP,我将这个IP保存为一个变量,然后我想把它显示在luci界面上,可以如下书写
local router_ip = luci.sys.exec("uci get network.lan.ipaddr")
m=Map("haproxy",translate("HAProxy"),translate("HAProxy能够检测SS服务器的联通情况,从而实现负载均衡和高可用的功能") .. "<br><br>后台监控页面:<a href='http://" .. router_ip .. ":1111/haproxy'>" .. router_ip)
技巧四:判断某个服务是否在运行状态
方法一:通过查询服务名的pid,捕获错误输出来判断。原理就是根据服务的名字查询这个服务的pid,如果查不到就会输出错误流,否则输出标准流,可以通过检测是否有错误流输出判断该程序是否已经运行
local ssr_redir_on = (luci.sys.call("pidof ssr-redir > /dev/null") == 0)
if ssr_redir_on then
...
else
...
end
方法二:查询相关端口是否被监听,适用于监听端口的程序,与方法一相反,这次是通过捕捉标准流输出是否有内容判断服务是否开启,如果想同时判断端口和服务名,只需执行两次grep即可,一次端口号,一次服务名
local red_on = string.len(luci.sys.exec("netstat -nlp | grep " .. listen_port))>0
if red_on then
...
else
...
end
技巧五:通过HTML修改提示文字的颜色
我们经常需要在translate中填写菜单的名字或者提示语,可以通过普通的HTML标签来添加超链接,换行,字体颜色大小等等,如下
local state_msg = "<b><font color=\"green\">" .. translate("Running") .. "</font></b>"
m=Map("redsocks2",translate("Redsocks2 - General Settings"),
translatef("A modified version of redsocks.Beside the basic function of redsocks,it can redirect TC