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

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

Python库 Django 的简介、安装、用法入门教程

《Python库Django的简介、安装、用法入门教程》Django是Python最流行的Web框架之一,它帮助开发者快速、高效地构建功能强大的Web应用程序,接下来我们将从简介、安装到用法详解,... 目录一、Django 简介 二、Django 的安装教程 1. 创建虚拟环境2. 安装Django三、创

MySQL 升级到8.4版本的完整流程及操作方法

《MySQL升级到8.4版本的完整流程及操作方法》本文详细说明了MySQL升级至8.4的完整流程,涵盖升级前准备(备份、兼容性检查)、支持路径(原地、逻辑导出、复制)、关键变更(空间索引、保留关键字... 目录一、升级前准备 (3.1 Before You Begin)二、升级路径 (3.2 Upgrade