OpenWrt Luci编写小技巧

技巧一:在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
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值