初识OPENWRT:luci与web
来源:互联网 发布:大数据未来形势 编辑:程序博客网 时间:2024/06/05 10:46
汇总几篇关于openwrt web的文章,写的各有特色。
- luci与web的整体框架以及运行流程:【OpenWRT之旅】LuCI探究
- lua语言的用法详解,内容不多,全部浏览一遍很快,可以掌握基本语法:Lua基本语法
- Lua常用的函数:Lua函数
- 尝试写一个web标题的,很好的解析了mvc框架:OpenWRT下web框架初尝试之总结
- 关于CBI模块交互的官方文档,文档还算详细吧:Writing LuCI CBI models
- 跟着这篇文章做个简单的模块,实践中学习知识:开发OpenWrt路由器上LuCI的模块
重点记下。
1. 添加mymodule模块:module(“luci.controller.myapp.mymodule”, package.seeall)
2. 注册system节点:entry(path,target,title,order)
2.1 函数解析
在controller目录下,每个.lua文件中,都有一个index()函数,其中主要调用entry()函数;
- path:插入的节点路径,如:{“admin”, “system”, “heyg1”},表示在admin下system中插入节点heyg1
- target:主要有:alise、firstchild、call、cbi、form、template。
可以分成两类,前两种主要用于链接其它node,后几个个则是主要的操作、以及页面生成。
template方式:即调该节点会直接调用view下的相应htm文件,举例:template(“heyg/heyg1”)会调用view/heyg/heyg1.htm文件
cbi/form方式:会调用model下的相应文件做相应的处理 (3).call方式,会调用本文件或者导入文件的函数
call方式:会调用本文件或者导入文件的函数 - title:插入节点在对应位置的名字,在web界面对应菜单中的显示名字,写为_(“heyg1”)格式更符合
- order:插入结点的同等级的不同分类,或者说是区别同等级下的其他结点的数字代号,级别是从小到大
2.2 函数属性解析:
对于插入一个结点,该结点除了有相应的名称和处理动作之外,它还有一些相应的属性,我们可以手动的设置它的属性值类似于entry().dependent=false
官方给出以下属性:
- dependent :当该节点的父节点丢失时,将该节点保护起来,不让它被意外调用
- leaf:如果该节点下还有其他子节点,解析到该结点时,就不向下继续解析其子节点。
- sysauth:在使用该节点时需要一个系统账户验证
- I18n:定义了当求页面请求时,哪些文件会自动加载
以下是自己写的例子:
1.根目录/usr/lib/lua/luci/view目录创建my文件夹,在这个文件夹创建以下文件my.htm文件:<%+header%><h2><a id="content" name="content"><%:my%></a></h2><%+footer%>my_one.htm文件:<%+header%><h2><a id="content" name="content"><%:my one%></a></h2><%+footer%>my_two.htm文件:<%+header%><h2><a id="content" name="content"><%:my two%></a></h2><%+footer%>my_three.htm文件:<%+header%><h2><a id="content" name="content"><%:my three%></a></h2><%+footer%>2.根目录/usr/lib/lua/luci/controller/admin目录创建my.lua文件:module("luci.controller.admin.my", package.seeall)function index() entry({"admin", "my"}, alias("admin", "my", "my_a","my_a_1"), "my", 63).index = true entry({"admin", "my", "my_a"}, alias("admin","my","my_a","my_a_1"), "my_a", 1) entry({"admin", "my", "my_a","my_a_1"}, template("my/my_one"), "my_a_1", 1) entry({"admin", "my", "my_a","my_a_2"}, template("my/my_two"), "my_a_2", 2) entry({"admin", "my", "my_a","my_a_3"}, template("my/my_three"), "my_a_3", 3) entry({"admin", "my", "my_b"}, template("my/my"), "my_b", 2) entry({"admin", "my", "my_c"}, template("my/my"), "my_c", 3)end3.1 目录效果:---------------------------------------------xxx |xxx |xxx |xxx |xxx |my |xxx |--------------------------------------------- |my_a| ---------- |my_b| ---------- |my_c| ----------3.2 点击my_a内页面效果:------------------------------------my_a_1 |my_a_2 |my_a_3 |------------------------------------my one3.3 点击my_a内页面my_a_2按钮效果:------------------------------------my_a_1 |my_a_2 |my_a_3 |------------------------------------my two3.4 点击my_b内页面效果:----------------------my4. 总结:1 .index = true 表示总标题显示,alias方法为链接到xxx节点2 一级目录:my,二级目录:my_a,my_b,my_c,三级目录(my_a的子目录):my_a_1 ,my_a_2 ,my_a_3
3.关于CBI Module
下面直接是关于model与controller的例子
下面是关于model与controller的例子写用例之前先是基础知识,先有个概念m = Map("配置文件文件名", "配置页面标题", "配置页面说明") //映射与uci配置文件关系s = m:section(class, ...) //创建一个section,不同的class有不一样的参数 NamedSection:section(name, type, title, description) 以下为属性 .addremove = false --是否允许用户删除并重新创建配置部分 .dynamic = false --将该部分标记为动态。动态部分可以包含自定义选项 .optional = true --可选的选项 TypedSection:section(type, title, description) 以下为属性 .addremove = false --是否允许用户删除并重新创建配置部分 .dynamic = false --将该部分标记为动态。动态部分可以包含自定义选项 .optional = true --可选的选项 .anonymous = false --不要显示段名 :depends (key, value) --键值对,互相依赖 .filter (self, section) [abstract] --可以重写此函数以过滤某些不被解析的部分【没懂】p = s:option (optionclass, ...) //创建一个option,不同的class有不一样的参数 Value:option(option, title, description) 以下为属性 .default = nil --默认值 .maxlength = nil --值的最大长度 .optional = false --将此选项标记为是否可选 .rmempty = true --当用户输入空值时,从配置文件中删除此选项 .size = nil --表单字段的大小 :value (key, value = key) --这个文本字段转换成一个组合框,可能增加选项【没懂】 :depends (key, value) --如果在同一部分中设置了另一个选项键,则只显示此选项字段。 .password = true --值隐藏为*用例如下创建1.根目录/etc/config/首先创建uci文件myconfig文件:config my option switch '1' option username 'xiaowang' option password '123456' option ifname 'eth0' option ipaddr '192.168.0.126'2.根目录/usr/lib/lua/luci/model/cbi/目录创建my文件夹,然后创建*.lua文件my.lua文件:m = Map("myconfig", "MYCONFIG", "Haha haha haha ... ") --参数1:文件名; 参数2:显示标题的文本; 参数3:显示标题的文本s = m:section(TypedSection, "my", "balabalabala") --参数1:已类型方式查找; 参数2:类型名为‘my’; 参数3:描述的文本 s.addremove = flases.anonymous = trueswitch = s:option(Flag, "switch", translate("switch")) --translate()作用是根据参数到指定库查找字符,并进行转换 --源码中文字符库的位置:编译目录/local/luci/luci-0.11.1/po/zh_CNname = s:option(Value, "username", "UserName") --参数1:option类型,这里是Vlaue类型; 参数2:uci文件的值名; 参数3:页面显示的文本pass = s:option(Value, "password", "PassWord")pass.password = trueipaddr = s:option(Value, "ipaddr", translate("IpAddr"))ifname = s:option(ListValue, "ifname", translate("Interfaces"))for k, v in ipairs(luci.sys.net.devices()) do if v ~= "lo" then ifname:value(v) endendreturn m3.根目录/usr/lib/lua/luci/controller/admin目录创建my.lua文件:module("luci.controller.admin.my", package.seeall)function index() entry({"admin", "my"}, alias("admin", "my", "my_a","my_a_1"), "my", 63).index = true entry({"admin", "my", "my_a"}, alias("admin","my","my_a","my_a_1"), "my_a", 1) entry({"admin", "my", "my_a","my_a_1"}, template("my/my_one"), "my_a_1", 1) entry({"admin", "my", "my_a","my_a_2"}, template("my/my_two"), "my_a_2", 2) entry({"admin", "my", "my_a","my_a_3"}, template("my/my_three"), "my_a_3", 3) entry({"admin", "my", "my_b"}, template("my/my"), "my_b", 2) entry({"admin", "my", "my_c"}, template("my/my"), "my_c", 3) entry({"admin", "my", "my_d"}, cbi("my/my"), "my_d", 4)end3.效果 见图14. 总结:4.1 require关键字相当于include加载头文件用法: require("luci.sys") local fs = require "nixio.fs"4.2 return 文件结尾要加return,return全部申请的Map举例: return m return m, m24.3 判断用户是否点击了“应用”按钮 local apply = luci.http.formvalue("cbi.apply") if apply then io.popen("/etc/init.d/appclient restart") //重启应用程序 end4.4 比较特殊的俩运算符 .. 连接两个字符串 a..b ,其中 a 为 "Hello " , b 为 "World", 输出结果为 "Hello World"。 # 一元运算符,返回字符串或表的长度。 #"Hello" 返回 5
图1:
阅读全文
0 0
- 初识OPENWRT:luci与web
- openwrt luci web解析
- openwrt开发与luci介绍
- Openwrt开发与Luci介绍
- Openwrt开发与Luci介绍
- openwrt web管理luci界面修改
- openwrt web管理luci界面修改
- openwrt web管理luci界面修改
- openwrt luci管理的Web界面实例
- openwrt luci
- openwrt的web界面luci的添加模块
- OpenWrt的luci web管理器添加新菜单
- OpenWrt的luci web管理器添加新菜单(二)
- OpenWrt的luci web管理器添加新菜单(三)
- OpenWrt的luci web管理器添加新菜单(四)
- 将luci编译ipk包修改openwrt web界面
- [OpenWrt] openwrt编译过程(luci)
- [OpenWrt] openwrt编译过程(luci)
- 业务或产品意识
- 《神作之路》读书心得
- Python中sys.argv[]的用法简明解释
- HTML:百度首页
- Leetcode002 Add Two Numbers
- 初识OPENWRT:luci与web
- 《成功之路》部分精华语句摘录
- 【操作系统】固定分区和可变分区——主存区内存分配
- Contest1275
- 为什么选择python
- Log4j使用
- 文本分类算法带监督的FastText
- Java单元测试(JUnit)
- Cron表达式说明