• Luci介绍


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

      Luci是 Lua ConfigurationInterface的简称,意在OpenWrt整个系统的配置集中化。见链接: http://wiki.openwrt.org/zh-cn/doc/uci

      1. Luci 的启动--uhttpd

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

      2. Luci 的启动--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中

      3. Luci-- 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()

      4. 以status模块为例进行说明

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

      entry(path, target, title=nil, order=nil)

        5. entry()函数

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

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

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

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

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

      6. target主要分为三类:call,template 和cbi。

      a. call用来调用函数。即语句

      entry({"admin", "status", "iptables"}, call("action_iptables"), _("Firewall"), 2)

      Firewall模块调用了action_iptables函数

      b. template调用

      template用来调用已有的htm模版,模版目录在lualuciview目录下。即语句

      entry({"admin","status","overview"},template("admin_status/index"),_("Overview"), 1)

      调用lualuciviewadmin_statusindex.htm文件来显示。

      7. cbi调用

      a. CBI了解 –- Configuration Binding Interface

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

      8. Luci API的使用

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

      比如:luci.sys luci.sys.net等对应的解析,由Luci源码结构中的/luci-0.11/libs/sys/luasrc/sys.lua完成。

      9. Uci的使用

      Uci命令的使用

      Uci show <config>

      Uci get /uci set /uci commit

      Uci c API的使用

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

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

      

      

      以上为最近研究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的相关研究、笔记等等。也希望大家能多留言、多指导,谢谢!

  • 相关阅读:
    循环控制Goto、Break、Continue
    linux多进/线程编程(6)——进程间通信之信号
    linux多进/线程编程(5)——进程间通信之mmap
    docker学习笔记(6)——docker场景问题汇总(centos7 由于内核版本低带来的一系列问题,docker彻底卸载,安装、启动日志报错分析)
    c/c++ 日常积累
    broken pipe 报错分析和解决办法
    c/c++ 常见字符串处理函数总结 strlen/sizeof strcpy/memcpy/strncpy strcat/strncat strcmp/strncmp sprintf/sscanf strtok/split/getline atoi/atof/atol
    docker学习笔记(5)——docker场景问题汇总(docker权限问题、docker文件目录、查看docker历史日志文件)
    linux多进/线程编程(4)——进程间通信之pipe和fifo
    linux多进/线程编程(3)——wait、waitpid函数和孤儿、僵尸进程
  • 原文地址:https://www.cnblogs.com/andy-ahz/p/3722538.html
Copyright © 2020-2023  润新知