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文本ListValuelist下拉框
如何控制新建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默认值0o.rmempty=true是否允许为空true/falseo.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
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
()
---
local prm
= luci.http.context.request.message.params
---
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 'd-d-d d:d:d'" %{
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")