正如当初在wordpress插件页面设置时一筹莫展一样,在实现LuCI路由器设置页面中启动或者退出我们的应用程序(我这里是港湾认证程序)确实让我伤透脑筋。若是纯粹的php代码或者html表单对我来说是小菜一叠,但是面对这openWrt这个说是为了方便实现web配置页面的LuCI,我简直毫无办法。
也许你发现我连中文都有英文的味道了,不是我故意这样子,是因为查阅了很多的英文文档才知道这个到底要怎么做,原本一位路由中在user/lib/lua文件夹下可以找到些许的代码,仿照这做下去,但是事实上这些lua文件都给加密了,我们看不到,只能是在虚拟机中运行的代码了。好在在官方找到了所有的开发文档,ok我们终于可以知道怎么做了。
1、至少你已经懂得了一个LuCI的基本的配置页面该怎么做,知道了cbi实现openWrt中的config文件配置要怎么做,你可以看看我的那篇日志:
2、你已经知道大概的luCI的模块该怎么做了,好了,那么现在我告诉你要实现当我们点击这个按键时候luci可以实现运行一个应用程序或者脚本的话,你需要知道LuCI开发的一个函数luci.http.formvalue 没错,这个函数就是用来获取我们的post过去表单的值的,假设你配置页面是一个帐号和密码,然后你需要在点击按键“保存并应用”的时候启动我们的应用程序(我这里是smustar),那么你只要检测该按键的值是否传递过去了,如果传递过去了则是用户提交后页面,如果没有这个值,那么只是用户第一次进入这个页面而已,和wordpress何其相似。代码如下:
local reboot = luci.http.formvalue(“cbi.apply”)
if reboot then
s:option(DummyValue,”xiugai”,”港湾帐号和密码修改成功!港湾认证已经开启,如果是还没连上网,请确认帐号仍有余额或未在别处登录。”)
luci.sys.call(“killall smustar”)
luci.sys.call(“smustarLogout &”)
luci.sys.call(“smustar &”)
end
3、如果你需要多个按键,并且这些按键都有不同作用的话,你需要加入一个按钮,同样只要检测这个按钮就知道是不是用户点击了这个按钮提交过去的页面了,比如点击个按钮重启,代码如下:
s:option(Button,”logout”,”重启”)
local logout=luci.http.formvalue(“cbid.smuset.smustar.logout”)
if logout then
s:option(DummyValue,”tuichu”,”重新启动中!”)
luci.sys.call(“reboot”)
end
4、LuCI提供的这个函数luci.sys.call允许你调用shell等任何linux下的脚本或者执行程序,你可以用它来进行更多的程序交换,也就是实现了web配置和linux执行程序之间的交互了。如果你需要更加复杂的交互,你可以用luCI的文件函数来得到与程序间的沟通,当然这个程序也得通过文件来交流,如果是自己的程序那好办,如果不是那就期待它提供命令调用,不过一般都支持了。好了,到此结束,LuCI我还得继续研究,看看能不能美化之类的。