1.LUCI简介

LUCI是一个小巧的语言,诞生于2008年3月份,目的是为OpenWrt固件从 Whiterussian 到 Kamikaze实现快速配置接口。轻量级 LUA语言的官方版本只包括一个精简的核心和最基本的库。这使得LUA体积小、启动速度快,从而适合嵌入在别的程序里。UCI是OpenWrt中为实现所有系统配置的一个统一接口,英文名Unified Configuration Interface,即统一配置接口。LuCI,即是这两个项目的合体,可以实现路由的网页配置界面。[·引自百度百科https://baike.baidu.com/item/...]

2. 我做过什么

其实我接触LUCI并不久,主要用它来为OpenWrt写UCI接口,来存取配置文件里的内容。存取有两种方式:

使用LUCI原有机制实现存取

自定义界面进行存取

这两种我都会介绍。本文主要介绍一些LUCI的基本内容和一种方式的应用。

3. LUCI的基本架构

LUCI可以归属为web开发行列。因为它的内容都是直接在浏览器里体现出来的。它的基本架构跟很多WEB开发语言的框架一样,都是MVC架构。以下给出一些简单的解释:

M(Model): 模型层,路径是/usr/lib/lua/luci/model/。这个是数据处理的具体代码的层。该层中有一个cbi文件夹,那里面是预定义的一些的逻辑文件。

V(View): 视图层,路径是/usr/lib/lua/luci/view/。这个很容易理解,就是存放视图文件的地方。LUCI里的视图文件是.htm文件。

C(Controller): 控制层,路径是/usr/lib/lua/luci/controller/admin/。这个层最主要的功能是设定路由;它还有一个功能跟模型层一致——处理数据。

根目录: /usr/lib/lua/luci

资源文件存放目录: /www/luci-static/

4. 开始建立新页面

以配置network文件为例,实现一个testnet模块需要完成下面的步骤。

步骤:

建立一个配置文件

定义控制层

定义模型层

1> 建立一个配置文件

之前介绍的时候有说到,LUCI是用于存取配置文件的信息,所以我们的若要新建一个模块,需要一个配置文件。配置文件的路径一般是在/etc/config/。由于现在我们是需要配置network文件,而这个是系统必备文件,它已经存在,所以我们不需要新建,但我们要了解一下里面的结构是怎么样的:

config interface 'loopback'

option ifname 'lo'

option proto 'static'

option ipaddr '127.0.0.1'

option netmask '255.0.0.0'

config interface 'lan'

option type 'bridge'

option ifname 'eth1'

option proto 'static'

option ipaddr '192.168.1.1'

option netmask '255.255.255.0'

option ip6assign '60'

这个是配置里有内容,而其他配置文件内容格式也是差不多:

-- 编辑配置文件

root@openWrt:~# vim /etc/config/

-- 配置文件格式

config

option

option

option

那么我们建立一个新的配置给testnet模块使用

config interface testnets

option ifname 'testnets'

option type 'test'

option ipaddr '192.168.1.1'

option net '192.168.251.1'

2> 定义控制层

控制层中,我们主要定义访问的路由。每一个模块的控制都是独立的,那样才能方便控制。路由的定义是在控制器的index()函数里。控制器里还可以定义其他的函数用于处理处理,相信这一点有过WEB开发经验的童鞋们都知道。

接下来我们建立一个能以/admin/testnet访问的路由

话不多说,直接上代码:

-- /controller/admin/testnet.lua

module("luci.controller.admin.testnet")

function index()

entry({"admin", "testnet", "index"}, cbi("admin_test/net"), translate("Test Net"), 10)

end

function test()

return 'This is a test function.'

end

module("luci.controller.admin.testnet"):这一句是命名空间的声明,luci指的是/usr/lib/lua/luci这个的文件夹,也就是LUCI的根目录

entry({"admin", "testnet", "index"}, cbi("admin_test/net"), translate("Test Net"), 10):这一句必须写在控制器文件的index()函数里。它的格式定义是这样子的:

entry(path, target[[, title][, order]])

path:即路由规则,格式是{"admin","testnet","index"[[,"..."][,"..."]]}基本上可以无限延伸,但一般不建议这么干,到五六层已经很深了,再潜就不好了。

target:即页面指向,格式是cbi("admin_test/net")。这里的cbi的函数指的是调用/luci/model/cbi/里的admin_test/里的net.lua文件。它还有其他的使用方法:

cbi("..."):调用/luci/model/cbi/文件夹中的指定lua文件,这里指向的文件相当于指向一个处理函数。使用的是LUCI自带逻辑的处理方法,本文就是使用这种方法来生成的页面。

template("..."):调用/luci/view/文件夹里指定的.htm视图文件。这个方法是直接调用视图。在视图里我们也可以嵌入代码读取配置。

alias("..."):这个是重定向函数, 一般用于顶级菜单上,使其重定向到指定的子菜单。

call("..."):这个函数的作用是将该路由指向控制下的某个函数,一般用于处理数据,作用与指向模型层的cbi("...")函数类似,只是一个指向到其他文件,一个仍是存在于控制层文件内。

post("..."):这个函数在openwrt里的其他模块有使用过,本人研究了一下,其作用于call方法类似,但在使用的时候似乎没有成功,若是有成功使用过的猿友,欢迎交流探讨。

* title:即标题展示,这个是设置在菜单里显示的内容项。格式有_("Test Net")或translate("Test Net"),前一个使用我也没有成功(有点摸不清楚),后一个是调用translate('...')函数,用于与后期的语言包进行适配。该项可以用nil代替,表示为不在菜单栏显示。

order:这个是排序,为子菜单进行排序,序号以1开始,最大不限。该项也可以忽略,表示为不在菜单栏显示。

* 若想让某项隐藏,可以写成以下格式:

entry({"admin", "testnet", "index"}, cbi("admin_test/net"), nil)

3> 定义模型层

OK,说了那么多,终于到了我们最关键的模型层。在模型层,LUCI拥有一套自动生成机制,接下来让我们一一介绍。先上代码再解释——

-- /model/cbi/admin_test/net.lua

m = Map("network", translate("Test Net"))

s = m:section(NamedSection, "testnets", "interface", translate("Net Configuration")

s.addremove = true

s.anonymouse = true

ifname = s:option(Value, "ifname", translate("Ifname: "))

ifname.datatype = 'string'

itype = s:option(Value, "type", translate("Type: "))

itype.datatype = 'string'

ipaddr = s:option(Value, "ipaddr", translate("Ipaddr: "))

ipaddr.datatype = 'ipaddr'

net = s:option(Value, "net", translate("Net:"))

net.datatype = 'ipaddr'

return m

m = Map("network", translate("Test Net")):这一句是连接配置文件,是以LUCI机制的必不可少的语句。第一个参数是配置文件的名称,第二个参数页面的大标题。

s = m:section(NamedSection, "testnets", "interface", translate("Net Configuration"):这一句是以section`的name名连接到指定的section。

第一个参数是指定存取section的方法,本文用的是以section的name名进行查找的方式NamedSecton。其他还有几种方式:

TypedName: 根据section的type来进行存取

SimpleSection:(这个没用过,就不多说了)

Table:以表格的形式体现section

Tab:以标签的形式体现section

第二个参数是section的名字

第三个参数是section的类型

第四个参数是模块标题的名称

其他类型的代码示例分别如下:

-- TypedSection

s = m:section(TypedSection, "interface", translate("Net Configuration")

-- SimpleSection

s = m:section(SimpleSection, "interface", translate("Net Configuration")

-- Table

s = m:section(TypedSection, "interface", translate("Net Configuration")--也可以用NamedSection

s.Table(Table, "Table Title")

-- Tab

s = m:section(TypedSection, "interface", translate("Net Configuration")--也可以用NamedSection

s.Table(Tab, "Tab Title")

s.addremove = false:打开/关闭添加删除按钮,这个为true时,会在页面上添加一个添加和一个删除按钮,这样就能够在页面快速进行增减项了。不过有一点要注意的是,那样的页面比较丑……

s.anonymouse = true:这一句是不显示section的名字在页面上。还可以加上s.template = 'admin_test/net'这样的语句

net = s:option(Value, "net", translate("Net:")):这一句是连接具体的option。

第一个参数是显示类型。常用的显示类型有:

Value(普通文本框)、ListValue(下拉列表)、Flag(复选框)、MultiValue(文本域)、DummyValue(纯文本)、TextValue(多行input)、Button(按钮)、StaticList(静态列表)、DynamicList(动态列表)

第二个参数是option的名称

第三个参数是显示项的说明

net.datatype = 'ipaddr':这一句是指定option的类型。这里的是ip地址类型,其他还有很多类型:

neg、list、bool(布尔类型)、uinteger、integer(整型)、ufloat、float(浮点型)、ipaddr(IP地址)、ip4addr(IP4型IP地址)、ip4prefix(IP4前缀)、ip6addr、ip6prefix、port、portrange、macaddr、hostname、host、network、wpakey、wepkey、string、directory、file、device、uciname、range、min、max、rangelength、minlength、maxlength、phonedigit

这时访问/admin/testnet即可以看到页面了。

参考链接:

luci网页shell_LUCI 使用其原有机制的建立新的页面相关推荐

  1. ISME Commun: 华中农业大学在菌群收敛机制方面取得新进展

    ISME Commun: 华中农业大学在菌群收敛机制方面取得新进展 涌现性基因表达适应性促进合成菌群收敛演化 Emergent transcriptional adaption facilitates ...

  2. 尽可能保留原有数据,建立UEFI与BIOS双启PE优盘

    尽可能保留原有数据,建立UEFI与BIOS双启PE优盘 1.确保优盘或者移动硬盘有一个FAT32分区,如果没有FAT32分区,就用傲梅分区助手或者ppm转换一个现有的分区到FAT32分区0x0C,或者 ...

  3. 建立完善的员工晋升机制_【员工晋升机制】多渠道员工晋升机制如何建立

    北京华恒智信人力资源顾问有限公司 [员工晋升机制]多渠道员工晋升机制如何建立 引言: 员工晋升机制是员工由较低层级职位上升到较高层级职位的过程, 合理的员工晋 升机制可以实现良好的资源配置, 使合适的 ...

  4. 火狐浏览器 如何设置成 打开一个新的页面,原有的页面继续存在

    火狐浏览器 如何设置成 打开一个新的页面,原有的页面继续存在? Tab Utilities 扩展. 在新标签页打开书签.历史.主页.地址.搜索,以及更多增强标签式浏览的实用功能,包括紧邻当前标签页打开 ...

  5. HTML网页设计制作大作业(div+css) ~中华美德6页面带音乐 ~ 学生网页设计作业源码(中华文化)

    HTML网页设计制作大作业(div+css) ~ 中华美德6页面带音乐 ~ 学生网页设计作业源码(中华文化) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从 ...

  6. JSP网页全屏显示、退出全屏、关闭页面

    [转]JSP网页全屏显示.退出全屏.关闭页面 jsp相关知识 2009-06-07 20:36:42 阅读108 评论0   字号:大中小 订阅 全屏显示 ---------------------- ...

  7. 青岛旅行网页毕设HTML 带报告讲解5个充实超链接页面 大学生网页 旅游网页

    页面栏目包括首页的整体概览.推荐风景.图库.在线视频.注册共计5个栏目,首页布局多样,有左中右三列布局,也有上下布局,将div盒子的嵌套与浮动充分应用,相关知识点包含:HTML+CSS.CSS过渡效果 ...

  8. luci网页shell_openwrt luci web分析

    openwrt luci web分析 www/cbi-bin/luci run方法的主要任务就是在安全的环境中打开开始页面(登录页面),在run中,最主要的功能还是在dispatch.lua中完成. ...

  9. JWT验证机制【刘新宇】【Django REST framework中使用JWT】

    JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. 什么是JWT Json web t ...

  10. python网页查询然后返回结果_使用pythondjang在html页面上显示查询到的API结果

    我目前正在使用django webframework创建一个python应用程序,它允许用户查询外部API来获取有关食物营养(例如卡路里.脂肪)的信息.目前,当用户在网页上的搜索栏中输入食物时,API ...

最新文章

  1. 使用OpenCV进行图像全景拼接
  2. 20189208 2018-2019-2 《移动平台开发实践》分析小组项目代码
  3. self motivated ddl
  4. php调用hive,如何进行hive的简单操作
  5. SQL数据库对象的删除
  6. Spring Cloud Gateway介绍(一)
  7. 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借助TopSelf、服务类】)
  8. 【CodeForces - 202A】LLPS (思维,字符串)
  9. 苹果正研发类似亚马逊Echo设备 Sir更加智能化
  10. 安装完VS2010之后再安装VS2012以后,发现VS工程编译出现--fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  11. 8、第六 -面向对象高级语法-异常处理
  12. 【跃迁之路】【479天】程序员高效学习方法论探索系列(实验阶段236-2018.05.30)...
  13. 小米6Android11刷机包,小米6刷机包MIUI12
  14. CatBoost快速入门
  15. Win10 桌面图标出现空文件夹的删除及桌面图标排列问题
  16. 阿里云CDN产品介绍
  17. ORACEL R12 总账和子账的关系
  18. 南宁二中三中高考2021成绩查询,2021广西重点高中名单及排名
  19. 记录一次上网正常但是【登录客户端应用网络异常问题】
  20. 关于云开发数据库的使用经验和建议

热门文章

  1. 2021-2023年个人发展规划整理
  2. 易基因 | 表观技术:染色质结构构象与DNA互作:ChIP-seq、ATAC-seq
  3. 像西方知识分子那样登场
  4. 嵌入式实操----基于RT1170 移植mbw做SDRAM带宽测试(三十一)
  5. android模拟器高德地图,【高德地图电脑版】高德地图电脑版官方下载 含安卓模拟器 车机版-趣致软件园...
  6. 游戏玩到这种程度,酱紫真的好吗?
  7. Python爬虫入门教程【11】:半次元COS图爬取
  8. 黑苹果EFI引导启动文件,技嘉Z77P-D3+E3-1230 V2+蓝宝石RX560D+Macos10.15.x(5)
  9. Android技术分享| 实现视频连麦直播
  10. 激战2怎么选最新的服务器,选哪个服好?《激战2》高玩分析各服务器进驻人数...