OPENWRT-LUCI开发总结-LUCI启动流程介绍
前言
本章节主要从以下四个方面介绍LUCI的启动流程
- uhttpd启动流程
- cgi启动流程
- dispatcher启动流程
- 官方及参考网址
uhttpd启动流程
1、uhttpd的开机启动脚本为/etc/init.d/uhttpd,配置文件为/etc/config/uhttpd,启动命令如下,其中-h指定web server服务器的根目录是/www/;-x指定CGI URL 路径,默认为/www/cgi-bin。
/usr/sbin/uhttpd -f -h /www -r OpenWrt -x /cgi-bin -u /ubus -t 60 -T 30 -k 20 -A 1 -n 3 -N 100 -R -p 0.0.0.0:80 -p [::]:80
2、Web server主页面为/www/index.html,其中指定cgi程序启动脚本为/cgi-bin/luci
<?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;" href="/cgi-bin/luci">LuCI - Lua Configuration Interface</a>
</body>
</html>
3、/cgi-bin/luci脚本,指定缓存路径为/tmp/luci-indexcache,指定cgi启动接口为/usr/lib/lua/luci/sgi/cgi.lua的run()函数
#!/usr/bin/lua -- 执行命令的路径
require "luci.cacheloader" -- 导入/usr/bin/lua/luci/下cacheloader.lua脚本
require "luci.sgi.cgi" -- 导入/usr/lib/lua/luci/sgi下cgi.lua脚本
luci.dispatcher.indexcache = "/tmp/luci-indexcache" --设置网页cache 缓存路径地址
luci.sgi.cgi.run() -- 执行/usr/lib/lua/luci/sgi/cgi.lua脚本的run函数
注:可以rm -rf /tmp/luci* 来删除luci的备份文件,这样可以清除缓存,执行修改后的操作。
cgi启动流程
run()函数作为CGI程序的启动入口,代码解析如下:
function run()-- 获取web请求,放于变量r中(包括环境变量,请求数据,出错处理接口)local r = luci.http.Request(luci.sys.getenv(),limitsource(io.stdin, tonumber(luci.sys.getenv("CONTENT_LENGTH"))),ltn12.sink.file(io.stderr))-- coroutine.create(function):创建一个协同程序-- 参数为dispatcher.lua的httpdispatch()函数local x = coroutine.create(luci.dispatcher.httpdispatch)local hcache = ""local active = true-- coroutine.status(x):查看协同程序x的协同状态while coroutine.status(x) ~= "dead" do-- coroutine.resume(x, r):执行协同程序,参数为变量r。local res, id, data1, data2 = coroutine.resume(x, r)if not res thenprint("Status: 500 Internal Server Error")print("Content-Type: text/plain\n")print(id)break;end-- HTTP的响应报文通过io.write()方式写在stdout上,-- 在由uhttpd架构将这些数据传递给父进程,-- 通过tcp连接返回给client端。if active thenif id == 1 then-- 填写HTTP响应状态行io.write("Status: " .. tostring(data1) .. " " .. data2 .. "\r\n") elseif id == 2 then-- 准备报文头headerhcache = hcache .. data1 .. ": " .. data2 .. "\r\n"elseif id == 3 then-- 填写header、blank到stdout上io.write(hcache)io.write("\r\n")elseif id == 4 then-- 填写bodyio.write(tostring(data1 or ""))elseif id == 5 then-- 关闭io接口,EOFio.flush()io.close()active = falseelseif id == 6 thendata1:copyz(nixio.stdout, data2)data1:close()endendend
end
dispatcher启动流程
在上述run()函数中,创建了一个协同程序,调用httpdispatch()函数,而这个函数位于dispatcher.lua中。通过后续的介绍也可以发现,luci真正的主体部分都在dispatcher.lua脚本里,本小节主要对httpdispatch()和dispatch()函数进行介绍。(注:在版本机dispatcher.lua的同目录下有一个dispatcher.luadoc文件,里面介绍dispatcher.lua的参数说明,仅供参考。)
1、httpdispatch():解析请求,获得HTTP request请求参数
local pathinfo = http.urldecode(request:getenv("PATH_INFO") or "", true)
通过上述代码,解析HTTP request,获取请求路径,并传入dispatch()函数进行处理。例如请求地址为:http://x.x.x.x/cgi-bin/luci/;stok=2dea81db2c48e924a196e5ddba4e8c6d/admin/status/overview,获取的请求路径为/admin/status/overview
2、dispatch():解析请求节点,调度网页显示,分为以下四个部分
(1)创建节点树node-tree,解析请求路径,获取节点树节点
createtree()函数主要从controller目录下寻找.lua文件,并且调用每个lua文件中的index()函数。这些index函数通过entry(path,target,title,order)函数定义了菜单栏的每个子菜单选项,包括子菜单的节点位置path、调度行为target、页面标题title以及节点顺序order。当解析完index()下的node节点,对应生成一个node-tree。
local c = context.tree
local stat
if not c thenc = createtree()
end
(2)初始化页面风格及语言模式
if (c and c.index) or not track.notemplate then
......
end
(3)认证
if track.sysauth then
......
end
(4)获取节点调度行为target,显示页面或者处理调度函数
ok, err = util.copcall(target, c.target, unpack(args))
官方及参考网址
1、LUA协同程序使用网址(https://www.cnblogs.com/sifenkesi/p/3824321.html)
2、LUCI启动网址(https://blog.csdn.net/qq_21949217/article/details/42192627)
3、LUCI流程分析网址(http://blog.chinaunix.net/uid-23780428-id-4367414.html)
OPENWRT-LUCI开发总结-LUCI启动流程介绍相关推荐
- 成都工控开发:太简单了!串口触摸屏开发HMI的全流程介绍
成都工控开发:太简单了!串口触摸屏开发HMI的全流程介绍 有很多事,把它说清楚了,就简单了,比如用触摸屏开发HMI. 触摸屏是很常见的,比如说你用的智能手机,用手指在上面划划划就能显示出我们想要的页面 ...
- 移植u-boot-2012-10到tiny210v2(一)-----基本芯片介绍和启动流程介绍
软硬件环境 宿主机系统:Fedora10 U-boot版本:U-boot-2012-10 板子芯片:S5PV210(Contex-A8),512M DDR2,512M SLC Nand 交叉编译器:a ...
- linux系统编码启动,Linux启动流程介绍
一. 内核镜像Izmage被bootloader装载到内存中.zImage的入口代码是自引导程序.包含一些初始化代码.第一条指令在head.S文件中.解压内核,然后调用call_kernel启动vml ...
- Linux启动流程介绍
Linux基本的启动流程主要分成4个部分. 1.BIOS 阶段 在系统加电检测结束以后,由BIOS中的代码负责把引导器加载进入机器的内存中,控制权交给引导器. 2.Loader阶段 引导器负责确定Li ...
- 太简单了!串口触摸屏开发HMI的全流程介绍
有很多事,把它说清楚了,就简单了,比如用触摸屏开发HMI. 触摸屏是很常见的,比如说你用的智能手机,用手指在上面划划划就能显示出我们想要的页面,比如说早些年很流行的画画板,用触摸笔在上面画一画就能画出 ...
- 太简单了!串口触摸屏开发HMI的全流程介绍成都工控开发
有很多事,把它说清楚了,就简单了,比如用触摸屏开发HMI. 触摸屏是很常见的,比如说你用的智能手机,用手指在上面划划划就能显示出我们想要的页面,比如说早些年很流行的画画板,用触摸笔在上面画一画就能画出 ...
- Linux系统开机启动流程介绍
一.linux系统进程启动流程图: 二.简单概括描述linux系统从开机到登陆界面的启动过程 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核 5.启动init进程 6.读取i ...
- iOS开发之直播App流程介绍,直播资料收集汇总,视频推流,视频拉流,SMTP、RTMP、HLS、 PLPlayerKit
本文转自:http://blog.csdn.net/zhonggaorong/article/details/51483282,感谢 zhonggaorong的分享 (一) iOS 直播类APP开发流 ...
- iOS开发之直播App流程介绍
(一) iOS 直播类APP开发流程分解: 1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示 1.数据采集: 摄像机及拾音器收集视频及音频数据,此时 ...
- linux开机引导进程是什么,Linux系统开机启动流程介绍
一.linux系统进程启动流程图: 二.简单概括描述linux系统从开机到登陆界面的启动过程 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核 5.启动init进程 6.读取i ...
最新文章
- 复习最基础的linux 之 创建用户及修改用户组
- jQuery的extend详解
- activiti节点跳转
- gnu linux mysql下载_linux下的navicat for mysql下载
- Android Studio自定义视图无法预览
- android phone驱动_一文带你掌握 Android 系统架构
- fibonacci数列前20项_高考数学二级结论——数列部分
- python视频 神经网络 Tensorflow
- SQL2005迁移账户密码粗鲁设置
- img2txt(二)
- 面向对象编程(三):重载运算符和重载函数
- 模块 calendar
- css 多行文本的溢出显示省略号(移动端)
- 智能硬件开发怎么做?机智云全套自助式开发工具助力高效开发
- 国产操作系统之优麒麟安装
- Intel Media SDK概述
- 安卓期末大作业——单词本APP(源码+任务书)
- 诺基亚C2-03 - 简单才是首要的诺基亚C2-03
- 企业如何搭建呼叫中心?
- 论马加爵也为GDP发展作出了贡献
热门文章
- java解惑-------半斤
- windows10正式版官方原版镜像iso下载地址
- Android 选择图片、上传图片之Matisse
- 以太网没有有效的ip怎么解决
- 日本小学生走向APP开发私塾 智能手机迫切改变IT教育——日本经济新闻报道
- 《机器学习实战》笔记——第四章:基于概率论的分类方法:朴素贝叶斯
- 安装mysql忘记设置密码后如何重设密码
- Robust Object Tracking via Sparsity-based Collaborative Model
- linux怎么查服务器的ip地址查询,Linux操作系统查看当前服务器网卡的IP地址
- Java类加载机制,类加载过程,类加载器以及双亲委派详解