前言

本章节主要从以下四个方面介绍LUCI的启动流程

  1. uhttpd启动流程
  2. cgi启动流程
  3. dispatcher启动流程
  4. 官方及参考网址
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启动流程介绍相关推荐

  1. 成都工控开发:太简单了!串口触摸屏开发HMI的全流程介绍

    成都工控开发:太简单了!串口触摸屏开发HMI的全流程介绍 有很多事,把它说清楚了,就简单了,比如用触摸屏开发HMI. 触摸屏是很常见的,比如说你用的智能手机,用手指在上面划划划就能显示出我们想要的页面 ...

  2. 移植u-boot-2012-10到tiny210v2(一)-----基本芯片介绍和启动流程介绍

    软硬件环境 宿主机系统:Fedora10 U-boot版本:U-boot-2012-10 板子芯片:S5PV210(Contex-A8),512M DDR2,512M SLC Nand 交叉编译器:a ...

  3. linux系统编码启动,Linux启动流程介绍

    一. 内核镜像Izmage被bootloader装载到内存中.zImage的入口代码是自引导程序.包含一些初始化代码.第一条指令在head.S文件中.解压内核,然后调用call_kernel启动vml ...

  4. Linux启动流程介绍

    Linux基本的启动流程主要分成4个部分. 1.BIOS 阶段 在系统加电检测结束以后,由BIOS中的代码负责把引导器加载进入机器的内存中,控制权交给引导器. 2.Loader阶段 引导器负责确定Li ...

  5. 太简单了!串口触摸屏开发HMI的全流程介绍

    有很多事,把它说清楚了,就简单了,比如用触摸屏开发HMI. 触摸屏是很常见的,比如说你用的智能手机,用手指在上面划划划就能显示出我们想要的页面,比如说早些年很流行的画画板,用触摸笔在上面画一画就能画出 ...

  6. 太简单了!串口触摸屏开发HMI的全流程介绍成都工控开发

    有很多事,把它说清楚了,就简单了,比如用触摸屏开发HMI. 触摸屏是很常见的,比如说你用的智能手机,用手指在上面划划划就能显示出我们想要的页面,比如说早些年很流行的画画板,用触摸笔在上面画一画就能画出 ...

  7. Linux系统开机启动流程介绍

    一.linux系统进程启动流程图: 二.简单概括描述linux系统从开机到登陆界面的启动过程 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核 5.启动init进程 6.读取i ...

  8. iOS开发之直播App流程介绍,直播资料收集汇总,视频推流,视频拉流,SMTP、RTMP、HLS、 PLPlayerKit

    本文转自:http://blog.csdn.net/zhonggaorong/article/details/51483282,感谢 zhonggaorong的分享 (一) iOS 直播类APP开发流 ...

  9. iOS开发之直播App流程介绍

    (一) iOS 直播类APP开发流程分解:  1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示 1.数据采集: 摄像机及拾音器收集视频及音频数据,此时 ...

  10. linux开机引导进程是什么,Linux系统开机启动流程介绍

    一.linux系统进程启动流程图: 二.简单概括描述linux系统从开机到登陆界面的启动过程 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核 5.启动init进程 6.读取i ...

最新文章

  1. 复习最基础的linux 之 创建用户及修改用户组
  2. jQuery的extend详解
  3. activiti节点跳转
  4. gnu linux mysql下载_linux下的navicat for mysql下载
  5. Android Studio自定义视图无法预览
  6. android phone驱动_一文带你掌握 Android 系统架构
  7. fibonacci数列前20项_高考数学二级结论——数列部分
  8. python视频 神经网络 Tensorflow
  9. SQL2005迁移账户密码粗鲁设置
  10. img2txt(二)
  11. 面向对象编程(三):重载运算符和重载函数
  12. 模块 calendar
  13. css 多行文本的溢出显示省略号(移动端)
  14. 智能硬件开发怎么做?机智云全套自助式开发工具助力高效开发
  15. 国产操作系统之优麒麟安装
  16. Intel Media SDK概述
  17. 安卓期末大作业——单词本APP(源码+任务书)
  18. 诺基亚C2-03 - 简单才是首要的诺基亚C2-03
  19. 企业如何搭建呼叫中心?
  20. 论马加爵也为GDP发展作出了贡献

热门文章

  1. java解惑-------半斤
  2. windows10正式版官方原版镜像iso下载地址
  3. Android 选择图片、上传图片之Matisse
  4. 以太网没有有效的ip怎么解决
  5. 日本小学生走向APP开发私塾 智能手机迫切改变IT教育——日本经济新闻报道
  6. 《机器学习实战》笔记——第四章:基于概率论的分类方法:朴素贝叶斯
  7. 安装mysql忘记设置密码后如何重设密码
  8. Robust Object Tracking via Sparsity-based Collaborative Model
  9. linux怎么查服务器的ip地址查询,Linux操作系统查看当前服务器网卡的IP地址
  10. Java类加载机制,类加载过程,类加载器以及双亲委派详解