luci流程简介

2023-10-30 13:40
文章标签 流程 简介 luci

本文主要是介绍luci流程简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LuCI作为“FFLuCI”诞生于2008年3月份,目的是为OpenWrt固件从Whiterussian 到 Kamikaze实现快速配置接口。

LuCI是OpenWrt上的Web管理界面,LuCI采用了MVC三层架构,使用lua脚本开发,所以开发LuCI的配置界面不需要编辑任何的html代码,除非想自己单独去创建网页(View层),否则我们基本上只需要修改Model层就可以了。

1代码结构

在openwrt文件系统中,lua语言的代码不要编译,类似一种脚本语言被执行,还有一些uhttpd服务器的主目录,它们是:

/www/index.html

     /cgi-bin/luci

    /luci-static/xxx/xx.css、js、gif

/usr/lib/lua/nixio.so、uci.so

        /luci/http.lua、dispatcher.lua、core…

             /controller/xxx.lua

              /model/xxx.lua

              /view/xxx.lua

luci采用的是MVC架构的web框架,M是指module(有的源码包是module,配置模块代码),C指的是controller(定义模块的入口),V指的是view(创建网页)。

luci其实是Lua脚本语言和UCI统一配置接口的合称。就是说原本openwrt就提供里uci的api让你可以很方便的修改openwrt的配置文件,无论是创建、读取、修改、删除。而且uci命令可以植入shell脚本和c语言或者是lua脚本。在/usr/lib/lua/luci下大多数都是lua脚本,就是这些lua脚本生成我们所看见的web页面。

2luci框架流程


①首次运行时,是以普通的file方式获得docroot/index.html,该文件中以meta的方式自动跳转到cgi的url,这是web服务器的一般做法。

http://192.168.1.1/  index.html会自动跳到http://192.168.1.1/cgi-bin/luci,登陆默认rootindex.html对于OpenWrt源码路径为:

\package\ramips\ui\luci-mtk\src\modules\base\root\www\index.html源码:

<?xmlversion="1.0" encoding="utf-8"?>

<!DOCTYPEhtml PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<htmlxmlns="http://www.w3.org/1999/xhtml">

<head>

<metahttp-equiv="refresh" content="0; URL=/cgi-bin/luci"/>

</head>

<bodystyle="background-color: black">

<astyle="color: white; text-decoration: none" href="/cgi-bin/luci">LTERouter</a>

</body>

</html>

②第一次执行luci,path_info='/',会alise到'/admin'('/'会索引到tree.rootnode,并执行其target方法,即alise('/admin'),即重新去索引adminnode),该节点需要认证,所以返回一个登录界面sysauth.html。

Luci脚本源码路径:package\ramips\ui\luci-mtk\src\modules\base\htdocs\cgi-bin\luci,luci 的代码如下:

1#!/usr/bin/lua  -- 执行命令的路径

2require"luci.cacheloader" -- 导入 cacheloader 包

3require"luci.sgi.cgi"  -- 导入sgi.cgi 包

4luci.dispatcher.indexcache = "/tmp/luci-indexcache" --cache 缓存路径地址

5luci.sgi.cgi.run()  -- 执行run方法,此方法位于/usr/lib/lua/luci/sgi/cgi.lua中.

登录界面sysauth.html源码路径:package\ramips\ui\luci-mtk\src\modules\base\luasrc\view\sysauth.htm

③第3次交互,过程同上一次的,只是这时已post来了登录信息,所以server端会生成一个session值,然后执行'/admin'的target(它的target为firstchild,即索引第一个子节点),最终返回/admin/status.html,同时会把session值以cookie的形式发给client。这就是从原始状态到得到显示页面的过程,之后主要就是点击页面上的连接,产生新的request。

返回/admin/status.html源码路径:package\ramips\ui\luci-mtk\src\modules\admin-full\luasrc\view\admin_status\index.htm

④每个链接的url中都会带有一个stok值(它是server生成的,并放在html中的url里),并且每个新request都要带有session值,它和stok值一起供server端联合认证。

3node-tree

在controller目录下,每个.lua文件中,都有一个index()函数,其中主要调用entry()函 数,形如entry(path,target,title,order),path形如{admin,network,wireless},entry()函数根据这些创建一个node,并把它放在全局node-tree的相应位置,后面的参数都是该node的属性,还可以有其他的参数。其中最重要的就是target。

Createtree()函数就是要找到controller目录下所有的.lua文件,并找到其中的index()函数执行,从而生成一个node-tree。这样做的io操作太多,为了效率,第一次执行后,把生成的node-tree放在/tmp/treecache文件中,以后只要没有更新(一般情况下,服务器里的.lua文件是不会变的),直接读该文件即可。生成的node-tree如下:


这里要注意的是,每次dispatch()会根据path_info逐层索引,且每一层都把找到的节点信息放在一个变量track中,这样做使得上层node的信息会影响下层node,而下层node的信息又会覆盖上层node。比如{/admin/system},最后的auto=false,target=aa,而由于admin有sysauth值,它会遗传给它的子节点,也即所有admin下的节点都需要认证。

这篇关于luci流程简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/308289

相关文章

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请