分享

Openwrt下初识Luci

 中间件 2020-04-01

1、 代码结构

  1. 在openwrt文件系统中,lua语言的代码不要编译,类似一种脚本语言被执行,还有一些uhttpd服务器的主目录,它们是:
  2. /www/index.html
  3. #引导页面
  4. /cgi-bin/luci
  5. #脚本跳转
  6. /luci-static/*/*.css、*.js、*.gif
  7. #静态页面css js gif 等目录
  8. /usr/lib/lua/nixio.so、uci.so
  9. #库文件,调用接口用
  10. /usr/lib/lua/luci/
  11. #mvc 层需要的脚本及库文件存放目录
  12. /usr/lib/lua/luci/controller/*.lua
  13. # lua 文件里,定义了菜单的显示和html 以及业务处理路径,每个文件对应一个菜单项。
  14. # ./admin/index.lua 这个文件定义了node ,最外面的节点,最上层菜单的显示。
  15. /usr/lib/lua/luci/model/*.lua
  16. #对应controller 里面调用的脚本文件,下文会解析, 这里不再赘述
  17. /usr/lib/lua/luci/view/*.lua
  18. #对应controller 里面调用的静态页面文件

MVC

  1. OpenWRT luci中,web界面在/www下。其他的界面由CGI程序生成。 /www下放有index.html,仅仅用来直接跳转至 /cgi-bin/luci 。
  2. CGI程序实质上是MVC模式。Mmodel,Vview,C~controller。MVC读取配置文件的信息,然后输出到页面上,也就是MVC里面的读“数据库”,写“数据库”。只不过这里面的“数据库”对应的是配置文件,读写方法也不太一样。
  3. Model(配置文件):/etc/config
  4. View(页面文件):/usr/lib/lua/luci/view
  5. Controller(控制器):/usr/lib/lua/luci/Controller。
  6. 请注意:View(页面文件)的stylesheet(样式表文件)地址是 /www/luci-static/bootstrap/cascade.css。
  7. view、controller根据功能进行分组后存在不同的文件夹内。比如状态功能以及状态功能下的总览、防火墙等功能的view会存在admin-status文件夹下面。文件的存储路径恰好与访问功能的url一致(为http://192.168.1.1/cgi-bin/luci/admin/status/xxx)。

2、LuCI模块

  1. LuCI模块分为几个类别目录,即:
  2. applications (单个应用程序或其他模块或应用程序的插件)
  3. i18n (翻译文件)
  4. libs (独立的库)
  5. modules (应用程序集)
  6. themes (前端主题)
  7. 模块目录
  8. Makefile文件
  9. SRC
  10. 该SRC目录保留对C源代码。
  11. luasrc
  12. luasrc包含所有Lua源代码文件。这些将根据Make目标自动剥离或编译,并安装在LuCI安装目录中。
  13. LUA
  14. lua相当于luasrc但包含Lua文件将安装在Lua文件根目录中。
  15. htdocs目录
  16. htdocs 下的所有文件都将复制到目标Web服务器的文档根目录。
  17. root
  18. root 下的所有目录和文件将按原样复制到安装目标。
  19. DIST
  20. 为构建器保留dist以创建将代表目标计算机上的文件系统的工作安装树。 不要在那里放任何文件,因为它们会被删除。
  21. ipkg
  22. ipkg包含IPKG包控制文件,如preinst,posinst,prerm,postrm。conffiles。
  23. OpenWRT feed集成
  24. 如果要将模块添加到LuCI OpenWRT提要,则必须在contrib/package/luci/Makefile中添加几个部分。
  25. 对于Web UI应用程序:
  26. 包的描述:
  27. define Package/luci-app-YOURMODULE
  28. $(call Package/luci/webtemplate)
  29. DEPENDS+=+some-package +some-other-package
  30. TITLE:=SHORT DESCRIPTION OF YOURMODULE
  31. endef
  32. 包的安装目标:
  33. define Package/luci-app-YOURMODULE/install
  34. $(call Package/luci/install/template,$(1),applications/YOURMODULE)
  35. endef
  36. 模块构建指令:
  37. ifneq ($(CONFIG_PACKAGE_luci-app-YOURMODULE),)
  38. PKG_SELECTED_MODULES+=applications/YOURMODULE
  39. endif
  40. 构建包调用:
  41. $(eval $(call BuildPackage,luci-app-YOURMODULE))

3、

Lua简介

Lua作为一门方便嵌入(其它应用程序)并可扩展的轻量级脚本语言来设计的, 因此, 他一直遵从着简单, 小巧, 可移植, 快速的原则, 官方实现完全采用ANSI C编写, 能以C程序库的形式嵌入到宿主程序中. Lua的每个版本都保持着开放源码的传统, 不过各版采用的许可协议并不相同, 自5.0版(最新版是5.1)开始她采用的是著名的MIT许可协议(与三条款BSD许可证内容颇为近似, 使用者可以"为所欲为"). 正由于上述特点, 所以Lua在游戏开发, 机器人控制, 分布式应用, 图像处理, 生物信息学等各种各样的领域中得到了越来越广泛的应用.

LuCI简介

Luci是Lua Configuration Interface的简称, 意在OpenWrt整个系统的配置集中化. 详见链接: http://wiki./doc/uci.

LuCI的启动流程分析

  1. uhttpd

uhttpd是一个简单的web服务器程序, 主要就是cgi的处理, openwrt是利用uhttpd作为web服务器, 实现客户端web页面配置功能. 对于request处理方式, 采用的是cgi, 而所用的cgi程序就是LuCI.

  1. luci

在web server中的cgi-bin目录下, 运行luci文件(权限一般是755), luci的代码如下:

  1. #!/usr/bin/lua --cgi的执行命令的路径
  2. require"luci.cacheloader" --导入cacheloader包
  3. require"luci.sgi.cgi" --导入sgi.cgi包
  4. luci.dispatcher.indexcache = "/tmp/luci-indexcache" --cache缓存路径地址
  5. luci.sgi.cgi.run() --执行run,此方法位于*/luci/sgi/cgi.lua中
  1. web

a. 登陆 输入: http://x.x.x.x/ 登录LuCI.

Calling /www/cgi-bin/luci.

b. 进入主菜单status

输入: http://x.x.x.x/cgi-bin/luci/admin/status/ 即可访问status页面, Luci则会calling /luci/admin/status.lua脚本:

  1. module("luci.controller.admin.status", package.seeall)
  2. /usr/lib/lua/luci/controller/admin/status.lua->index()
  1. 以status模块为例进行说明

模块入口文件status.lua在目录lua\luci\controller\admin下在index()函数中, 使用entry函数来完成每个模块函数的注册:

entry(path, target, title=nil, order=nil)
  1. entry()函数

第一个参数是定义菜单的显示(Virtual path).

第二个参数定义相应的处理方式(target).

alias是指向别的entry的别名, from调用的某一个view, cbi调用某一个model, call直接调用函数.

第三个参数是菜单的文本, _(“string”), 国际化.

第四个参数是是同级菜单下, 此菜单项的位置, 从大到小.

  1. template调用

template用来调用已有的htm模板, 模板目录在lua\luci\view目录下, 即语句entry({"admin","status","overview"},template("admin_status/index"),_("Overview"), 1)调用lua\luci\view\admin_status\index.htm文件来显示.

  1. cbi调用 CBI(Configuration Binding Interface)模型是Lua文件描述UCI配置文件的结构和由此产生的HTML表单来评估CBI解析器, 所有CBI luci.cbi.Map类型的模型文件必须返回一个map对象, 在cbi模块中定义各种控件, Luci系统会自动执行大部分处理工作. 其链接目录在lua\luci\model\cbi下 entry({"admin", "status", "processes"}, cbi("admin_status/processes"), _("Processes"), 6)

调用\lua\luci\model\cbi\admin_status\processes.lua来实现模块.

  1. Luci API的使用

官方文档介绍:http://luci./api/luci/

比如:luci.sys luci.sys.net等

Luci源码结构中的sys.lua 对应的解析在源码/luci-0.11/libs/sys/luasrc/sys.lua

  1. Uci的使用
  1. Uci show <config>
  2. Uci get /uci set /uci commit
  1. Uci c API的使用

在脚本中使用uci config文件:http://wiki./doc/devel/config-scripting

总结一下Luci、Lua、Uci、CBI的关系图,如下图:

以上为最近研究Luci开发的相关资料整理, 同时自己也动手做了几个测试页面并通过luci.sys.call实现了脚本, 系统程序的调用.

为了方便大家学习, 顺便整理出了openwrt的build root的使用官方文档地址: http://wiki./zh-cn/doc/howto/build 以及CBI模块的section属性设置, 官方文档介绍: http://luci./trac/wiki/Documentation/CBI. 后续有时间会继续与大家分享openwrt的相关研究, 笔记等等. 也希望大家能多留言, 多指导, 谢谢!

 

ubuntu虚拟机安装openwrt,参考文章:https:///archives/2444

LUCI参考:https://gist.github.com/Akagi201/4ef040b430961a8f6a01

学习博客:https://www./articles/zaUNfy

https://blog.csdn.net/u012041204/article/category/6585005

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多