Skip to content

Instantly share code, notes, and snippets.

@Akagi201
Created May 11, 2014 16:06
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Akagi201/4ef040b430961a8f6a01 to your computer and use it in GitHub Desktop.
Save Akagi201/4ef040b430961a8f6a01 to your computer and use it in GitHub Desktop.

Lua简洁

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

LuCI简介

Luci是Lua Configuration Interface的简称, 意在OpenWrt整个系统的配置集中化. 详见链接: http://wiki.openwrt.org/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的代码如下:

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

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

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

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

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脚本:

module("luci.controller.admin.status", package.seeall)
/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.subsignal.org/api/luci/

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

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

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

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

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

luci-relate

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

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


via: http://www.cnblogs.com/andy-ahz/p/3722538.html

本文由 AKmaker 发布

投稿:Andy 校对:Akagi201

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment