luci工作流程,程序调用

本文详细介绍了luci在openwrt上如何通过uhttpd服务器工作,解析了lua程序如何调用io.write将HTML内容传送到web上。luci通过创建node-tree来构建菜单栏,通过dispatch函数进行路由处理。在lua文件中,entry函数创建节点,通过cbi生成配置页面,最后利用template将lua代码转化为HTML并由uhttpd呈现。
摘要由CSDN通过智能技术生成

1,luci在openwrt上使用的是uhttpd服务器,了解不多,uhttpd会将lua的默认io修改连接到uhttpd,当调用io.write时会传到uhttpd中!所以想写到web上,直接把html代码调用io.write就可以显示!

2,入口在/www文件下,lua的入口程序在sgi/cgi.lua中的run函数,在这里会建立httpdispatch的协程,当协程没dead就会不停地调用!所以实际的函数运作在httpdispatch中!以下是run中的程序,在httpdispatch中调用yeild协程,就会把数据返回到这里,分为6种!id=4,传递HTML代码到uhttpd;id=5,刷新缓冲区;id=1,响应消息比如200OK;id=3,4写消息头字段。

if active then
			if id == 1 then
				io.write("Status: " .. tostring(data1) .. " " .. data2 .. "\r\n")
			elseif id == 2 then
				hcache = hcache .. data1 .. ": " .. data2 .. "\r\n"
			elseif id == 3 then
				io.write(hcache)
				io.write("\r\n")
			elseif id == 4 then
				io.write(tostring(data1 or ""))
			elseif id == 5 then
				io.flush()
				io.close()
				active = false
			elseif id == 6 then
				data1:copyz(nixio.stdout, data2)
				data1:close()
			end
		end

3,接下在进入httpdispatch中,在这里调用dispatch中,这是真正实际运作的程序!

这里要介绍一下util.coxpcall程序,在此之后还会继续出现,当调用这个函数时,会为传递的参数(一个函数)再建立一个协程,当协程中的协程yield时,会递归的把上一级直到dispatch这个协程yield,作用待会在说。

local stat, err = util.coxpcall(function()
		dispatch(context.request)
	end, error500)

4,接下来进入dispatch函数,

第一步,调用createtree函数建立node-tree(结点是非常重要的之后再说)。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值