初识OPENWRT:luci与web

来源:互联网 发布:大数据未来形势 编辑:程序博客网 时间:2024/06/05 10:46

汇总几篇关于openwrt web的文章,写的各有特色。

  1. luci与web的整体框架以及运行流程:【OpenWRT之旅】LuCI探究
  2. lua语言的用法详解,内容不多,全部浏览一遍很快,可以掌握基本语法:Lua基本语法
  3. Lua常用的函数:Lua函数
  4. 尝试写一个web标题的,很好的解析了mvc框架:OpenWRT下web框架初尝试之总结
  5. 关于CBI模块交互的官方文档,文档还算详细吧:Writing LuCI CBI models
  6. 跟着这篇文章做个简单的模块,实践中学习知识:开发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 文件结尾要加returnreturn全部申请的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:
效果图

原创粉丝点击