路由器:newifi mini
硬件信息:mt7620a +mt7612e+128M DDR+16M flash
固件: Pandorabox
luci theme:lafite
winSCP登录
securieCRT 串口登录
/www/index.html:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Cache-Control" content="no-cache" /><meta http-equiv="refresh" content="0; URL=/cgi-bin/luci" /></head><body style="background-color: white"><a style="color: black; font-family: arial, helvetica, sans-serif;" rel="external nofollow" href="/cgi-bin/luci">LuCI for PandoraBox</a></body></html>找到lcgi.lua运行文件, /usr/lib/lua/luci/sgi/cgi.lua :
exectime=os.clock()module("luci.sgi.cgi",package.seeall)local a=require("luci.ltn12")require("nixio.util")require("luci.http")require("luci.sys")require("luci.dispatcher")local function o(t,e)e=e or 0local a=a.BLOCKSIZEreturn function()if e<1 thent:close()return nilelselocal a=(e>a)and a or ee=e-alocal e=t:read(a)if not e then t:close()endreturn eendendendfunction run()local t=luci.http.Request(luci.sys.getenv(),o(io.stdin,tonumber(luci.sys.getenv("CONTENT_LENGTH"))),a.sink.file(io.stderr))local e=coroutine.create(luci.dispatcher.httpdispatch) //开启协助线程---->调用/usr/lib/lua/luci/dispatcher.lua里的httpdispatch函数local o=""local i=truewhile coroutine.status(e)~="dead"dolocal n,e,t,a=coroutine.resume(e,t)if not n thenprint("Status: 500 Internal Server Error")print("Content-Type: text/plainn")print(e)break;endif i thenif e==1 thenio.write("Status: "..tostring(t).." "..a.."rn")elseif e==2 theno=o..t..": "..a.."rn"elseif e==3 thenio.write(o)io.write("rn")elseif e==4 thenio.write(tostring(t or""))elseif e==5 thenio.flush()io.close()i=falseelseif e==6 thent:copyz(nixio.stdout,a)t:close()endendendend连接路由器,浏览器下输入192.168.1.1,kldpy192.168.1.1/cgi-bin/luci,kldpy登录页面,调用了/usr/lua/luci/controller/admin/index.html文件:
module("luci.controller.admin.index", package.seeall)function index () local root = node() if not root.target then root.target = alias("admin") root.index = true end local page = node("admin") page.target = firstchild() //从dispatcher.lua调firstchild() page.title = _("Administration") page.order = 10 page.sysauth = "root" page.sysauth_authenticator = "htmlauth" //从dispatcher.lua调htmlauth() page.ucidata = true page.index = true -- Empty services menu to be populated by addons entry({"admin", "services"}, firstchild(), _("Services"), 40).index = true entry({"admin", "logout"}, call("action_logout"), _("Logout"), 90)endfunction action_logout () local dsp = require "luci.dispatcher" local utl = require "luci.util" local sid = dsp.context.authsession if sid then utl.ubus("session", "destroy", { ubus_rpc_session = sid }) luci.http.header("Set-Cookie", "sysauth=%s; expires=%s; path=%s/" %{ sid, 'Thu, 01 Jan 1970 01:00:00 GMT', dsp.build_url() }) end luci.http.redirect(dsp.build_url())endwydhbhtmlauth()函数:
function authenticator.htmlauth(a,t,o)local t=e.formvalue("luci_username")local i=e.formvalue("luci_password")if t and a(t,i)thenreturn tendrequire("luci.i18n")require("luci.template")context.path={}e.status(403,"Forbidden")luci.template.render("sysauth",{duser=o,fuser=t})return falseend使用了/usr/lib/lua/luci/viem/theme/lafite
wydhb/usr/lib/lua/luci/controller/admin/lafite.lua :
Luci则会calling /luci/admin/目录下的lafite.lua脚本。
模块入口文件lafite.lu中index()函数中,使用entry函数来完成每个模块函数的注册:
kldpy/www/web/
entry({"lafite", "change"}, call("action_change"), _("index"), 0)change函数中加入了/usr/lib/lua/luci/pb/目录下文件