吵吵   2011-09-03  阅读:18,198

正如当初在wordpress插件页面设置时一筹莫展一样,在实现LuCI路由器设置页面中启动或者退出我们的应用程序(我这里是港湾认证程序)确实让我伤透脑筋。若是纯粹的php代码或者html表单对我来说是小菜一叠,但是面对这openWrt这个说是为了方便实现web配置页面的LuCI,我简直毫无办法。
        也许你发现我连中文都有英文的味道了,不是我故意这样子,是因为查阅了很多的英文文档才知道这个到底要怎么做,原本一位路由中在user/lib/lua文件夹下可以找到些许的代码,仿照这做下去,但是事实上这些lua文件都给加密了,我们看不到,只能是在虚拟机中运行的代码了。好在在官方找到了所有的开发文档,ok我们终于可以知道怎么做了。

1、至少你已经懂得了一个LuCI的基本的配置页面该怎么做,知道了cbi实现openWrt中的config文件配置要怎么做,你可以看看我的那篇日志:

luci界面修改实现802.1x配置界面

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我还得继续研究,看看能不能美化之类的。

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

11条回应:“LuCI实现启动应用程序等脚本命令”

  1. 流氓兔足迹说道:

    又是技术活!请博主原谅我的飘过!

  2. 酷配网说道:

    了解关注了。

  3. 海棠果说道:

    我来了 看了 没看懂 支持你一下

  4. 郑永说道:

    学习了,呵呵,谢谢哈。

  5. […] 你先得了解一下LuCI,包括它的模块怎么写的,用的是lua语言等: LuCI实现启动应用程序等脚本命令 […]

  6. s说道:

    luci 如何实现上传啊 上传大文件到路由器优盘,lua 的 fp:write(chunk)不能用来传输大文件吗?为什么?

  7. 大土豆说道:

    学习了,local reboot = luci.http.formvalue(“cbi.apply”)这句话写在什么文件啊,cbi.apply是什么啊

  8. […] 你先得了解一下luci,包括它的模块怎么写的,用的是lua语言等: LuCI实现启动应用程序等脚本命令 […]

  9. 杨兴强说道:

    您好,我想请问下,为什么我给了执行权限的shell,用luci.sys.call(“/etc/test.sh”)为什么会调用不成功呢?

发表评论

电子邮件地址不会被公开。 必填项已用*标注