openwrt 关于 luci

Openwrt luci

目录说明

/usr/lib/lua/luci #luci主目录
luci/controller/ #MVC的控制器目录
->./admin/ #admin模块
luci/view/ #mvc 的view目录
->./admin_status/ #admin_status的视图

目录为 luci/model/ #MVC模型的model
-> cbi #mode的CBI模块

CBI模块的操作

$cat /etc/config/helloconfig
config hello
	option enabled 0	

CBI管理配置文件

Map表示/etc/config/目录中的配置文件

m = Map("helloconfig", translate("hello config"), translate("hello config"))  --/etc/config/helloconfig
m:chain("luci")

section 表示配置文件中的项目, 如上: config hello

s=m:section(TypedSection, "hello", translate("Config"))
s.anonymous = true --不显示Section的名称
s.addremove = true --支持增加
s.template  = "cbi/tblsection" --表示在一行显示

TypedSection :为这个配置文件中的那个config, 上面为config hello

TypedSection 定义在luci/cbi.lua

TypedSection 说明
Flag 选择框
Value 文本框
Button 按钮
TextValue 文本
ListValue list下拉框

如何控制新建TypedSection项

function s.create(self, section)
	return TypedSection.create(self, section)
end
 o=s:option(Flag, "enabled", translate("启用"))  
 o.default=0 --默认值

option:表示这个config文件中的option

l= s:option(ListValue, "level", translate("Level"))  -- option level
l:value("1", translate("a")) --显示别名
l:value("2", translate("b"))
option 说明
o.passowrd 表示密码
o.default=0 默认值0
o.rmempty=true 是否允许为空true/false
o.placeholder 背景提示
o.datatype 数据类型(见 luci/cbi/datatypes.lua)

数据类型(datatype )

o.datatype -, 见 luci/cbi/datatypes.lua, 可以or() 或者and()
如 “and(uinteger,range(1,255))” IP范围
range(1,255) 取值范围1-255
max(1000) 最大不超过1000
uinteger 无符号整形

o:depends(“enabled”,“1”) --需要enable为1才可使用,用于联动

--保存o的时候将value进行base64编码
function o.write(self, section, value)
        local base64 = require "luci.base64"
        if(value~=nil) 
        then
                value= base64.encode(value)		
	    end        
        AbstractValue.write(self, section, value)
        ---
        self.map.uci:foreach(self.map.config, "user",
        	function(item)
        	    log.print(json.stringify(item))
        	end	)
end
-- 读取值这个值必须与保存时的一样,不然就会执行两次write
function user.cfgvalue(self, value)        
        return Value.cfgvalue(self, value)         
end

显示环境变量

#!/bin/sh
#/www/cgi-bin/os_export
echo "Content-Type: text/plain"
echo ""
export

关于luci

添加新界面

--[[ 在 luci/controller/admin/help.lua ]]
module('luci.controller.admin.help', package.seeall)
function index()
    local page
	--添加页
    page = node('admin', 'help')
    page.target = firstchild()
    page.title = _('help')
    page.order = 70
    page.index = true
    ---help下添加菜单,系统日志
   entry({"admin", "help", "syslog"}, call("action_help_syslog"), _("System Log"), 4)

end

关于entry(路劲, 目标,标题,排序)

目标target:

  • template(“模板文件名在luci/view目录”)
    比如: template(“admin_status/index”) #状态模板
    这相当于MVC中的View
    cbi其实是对View的一种分类封装,专门处理/etc/config配置文件
    在index.htm中也可以调用luci.http.formvalue得到请求参数
  • call(“方法名”)
    调用方法:call(“action_load”)
  • post(“方法名”)
    通过http post调用此方法
  • alias( “”,"","", …)

controller中的方法

function action_test()
 --- #得到http请求参数
 local prm = luci.http.context.request.message.params
 ---#返回json格式如下
 luci.http.prepare_content("application/json")
 luci.http.write_json({ action="hello", msg="aa" })
 --#返回一个模板
 luci.template.render("admin_status/syslog", {syslog=syslog})
end

通用调用

-- 执行命令行,返回命令打印数据
luci.sys.exec("命令行")  
luci.sys.call("date -s '%04d-%02d-%02d %02d:%02d:%02d'" %{
				date.year, date.month, date.day, date.hour, date.min, date.sec
			})
luci.sys.call("uci set system.lede.zonename='Asia/Shanghai'")
luci.sys.call("uci set system.lede.timezone='CST-8'")
luci.sys.call("uci commit system")

--解析json字符串为对象
luci.jsonc.parse("json字符串") 

--得到http参数数据
luci.http.formvalue("http参数")  
 
--http回复json数据
	luci.http.prepare_content("application/json")
	luci.http.write_json({ timestring = os.date("%F %T ") .. luci.i18n.translate(os.date('%A')) })
	
--序列号json对象返回json字符串
luci.util.serialize_json(x,b)  

--读文件返回文件数据
nixio.fs.readfile("文件路劲") 

--写文件
nixio.fs.writefile("文件路劲", "数据") 

-- 中文翻译
luci.i18n.translate("Enable")  

--uci信息获取
local uci = require("luci.model.uci").cursor()
local enable=uci:get("system","ntp","enable")

你可能感兴趣的:(项目总结)