luci学习指南

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

LUCI这个在百度上搜索除了一篇我的百度文库luci的介绍文章之外,前三页都是些不知所云的名词(足见百度在专业领域的搜索之烂),我却在大学毕业的大半年的大部分时间里与它纠结,由于开始的发懵到后来逐渐感觉到这家伙还很好玩的,现在就把我对luci的浅显认识介绍给大家。官网:有关luci的各个方面,你几乎都可以从这里获得,当然,只是浅显的获得,luci的文档写的还算比较全,但是写的稍显简略,开始看的时候会有一点不知所措。UCI熟悉openwrt的人都会有所了解,就是UnifiedConfigurationInterface的简称,而luci这个openwrt上的默认web系统,是一个独立的由严谨的德国人开发的web框架,是LuaConfigurationInterface的简称,如果在您的应用里,luci是对openwrt的服务,我们就有必要做一下uci的简介,我这里就不说了,见链接:=t&source=web&cd=5&ved=0CEMQFjAE&url=http%3A%2F%2Fnbd.name%2Fopenwrt-fosdem-09.pdf&ei=h52iTcXvOcrMcJ-xxOwD&usg=AFQjCNGFhumCIgS5tK_mDJ2dDFU4qsskfQ有的时候,我们开发的luci是在自己的LinuxPC上开发,在普通的linux上,一般是没有uci命令的,为了开发方便,可以手动编译一下,方法见链接:=15243OK,之前罗里罗嗦的说了很多,现在就进入正题,进入正题的前提是你已经makeinstall正确的安装了lua,luci,以及编译好链接了相关的so(如果你需要,比如uci.sonixio.so),以及makeinstall正确webserver,(我用的webserver是thttpd,也编译过mongoose,lighttpd,在这三个之中,lighttpd是功能最完善的,mongoose是最小巧的)。进入正题:一:luci的启动在webserver中的cgi-bin目录下,运行luci文件(权限一般是755),luci的代码如下:1#!/usr/bin/lua--cgi的执行命令的路径2requireluci.cacheloader--导入cacheloader包3requireluci.sgi.cgi--导入sgi.cgi包4luci.dispatcher.indexcache=/tmp/luci-indexcache--cache缓存路径地址5luci.sgi.cgi.run()--执行run方法,此方法位于*/luci/sgi/cgi.lua中run方法的主要任务就是在安全的环境中打开开始页面(登录页面),在run中,最主要的功能还是在dispatch.lua中完成。运行luci之后,就会出现登录界面:-bash-4.0#pwd/var/:200OKContent-Type:text/html;charset=utf-8Cache-Control:no-cacheExpires:0!DOCTYPEHTMLPUBLIC-//W3C//DTDHTML4.01//EN=ext-stricthead/*somehtmlcode*//html如果你成功的运行了luci就说明你的luci框架成功的跑了起来。二:LUCI的MVC1:用户管理:在luci的官方网站说明了luci是一个MVC架构的框架,这个MVC做的可扩展性很好,可以完全的统一的写自己的html网页,而且他对shell的支持相当的到位,(因为luci是lua写的,lua是C的儿子嘛,与shell是兄弟)。在登录界面用户名的选择很重要,luci是一个单用户框架,公用的模块放置在*/luci/controller/下面,各个用户的模块放置在*/luci/controller/下面对应的文件夹里面,比如admin登录,最终的页面只显示/luci/controller/admin下面的菜单。这样既有效的管理了不同管理员的权限。2:controller文件夹下的lua文件说明:(以mini用户为例)在mini目录下面,会有一个index.lua文件,简略的代码如下:这个文件定义了node,最外面的节点,最上层菜单的显示等等。在其他的lua文件里,定义了其他菜单的显示和html以及业务处理路径。每个文件对应一个菜单相。例如system.lua文件mudel是对应文件的,functionindex定义了菜单,比如这一句entry({mini,system,reboot},call(action_reboot),i18n(reboot),100)第1项为菜单入口:{mini,system,reboot},mini是最上层的菜单,即为用户项,system为一个具体的菜单,reboot为这个菜单的子菜单,如果reboot还需要加上子菜单的话,可以这样写:entry({mini,system,reboot,chreboot},call(action_chreboot),i18n(chreboot),1),这样就会在reboot上产生一个新的子菜单,以此类推,可以产生N层菜单。第二项为菜单对应的页面,可以是lua的源代码文件,也可以是html页面。aliascgiformcall等定义了此菜单相应的处理方式,form和cgi对应到model/cbi相应的目录下面,那里面是对应的定制好的html和lua业务处理。alias是等同于别的链接,call调用了相应的action_function。还有一种调用,是template,是直接链接到view相应目录下面的htm页面。(说明:luci框架下面的htm都是可以嵌入lua语句的,做业务处理,相当于jsp页面的内部的Java语句)。问价查找对应简介:entry({mini,system,reboot},call(action_reboot),i18n(reboot),100):对应此文件的action_rebootfunctionentry({mini,system,index},cbi(mini/system,{autoapply=true}),i18n(general),1):对应*/model/cbi/mini/system.lua{autoapply=true}这个失传的参数。。。。。。第三项为i18n显示,比如entry({mini,system,reboot},call(action_reboot),i18n(reboot),100),菜单的名字为admin-core文件内的对应显示。此处也可以这样写,i18n(reboot,重启),即直接做了国际化。菜单上显示的就是“重启”。第四项为现实的顺序,这个数字越小,显示越靠前,靠上。3:model业务处理和页面生成简介我认为model的业务处理和html生成,是luci框架的精华,但是想用好它,最终扩展定义自己的页面也是最难的,但是一旦定义好了,后面的工作就会轻松高效简介统一,不失为一种好的解决方案。但是它又有缺点,就是写页面虽然统一,但是不够灵活。下面以SimpleForm为例,讲解一下。具体文件*/luci/model/cbi/passwd.luaf=SimpleForm(password,translate(a_s_changepw),translate(a_s_changepw1))--调用SimpleForm页面当然还是I18N从中捣乱,看上去没那么直观,不理他pw1=f:field(Value,pw1,translate(password))--SimpleForm里面加一个field至于SimpleForm和fiemd是什么,一会去看SimpleForm页面去pw1.rmempty=false--把SimpleForm的rmempty为不显示后面就不做注释了应该看得懂了pw2=f:field(Value,pw2,translate(confirmation))pw2.rmempty=falsefunctionpw2.validate(self,value,section)returnpw1:formvalue(section)==valueandvalueendfunctionf.handle(self,state,data)ifstate==FORM_VALIDthen--这个就是业务处理了你懂得呵呵localstat=luci.sys.user.setpasswd(admin,data.pw1)==0--root--adminifstatthenf.message=translate(a_s_changepw_changed)elsef.errmessage=translate(unknownerror)enddata.pw1=nildata.pw2=nilendreturntrueendreturnf说明:(simpleForm位于view/cbi下面,可以研究一下,各个元素是如何定义的)现在在给一个小例子:以.*/luci/model/cbi/admin_system/version_manage.lua为例,介绍一下luci中web页面lua代码6localh=loadfile(/usr/local/luci/help.lua)7ifhthen8h()9end10localhelp_txt=help_infoandhelp_info.version加载帮助帮助文件help.lua,关于loadfile()的用法可以查看lua的手册(我还没完全弄明白,先用了)help_txt是一个全局变量12appadmin_path=/usr/local/appadmin/bin/定义一个全局变量,其实跟功能跟宏一样,定义appadmin的绝对路径14versionlist={}1516functiongetline(s).........32end3334functionget_versionlist().........68end6970versionlist=get_versionlist()定义一个全局变量和两个函数,并初始化此变量接下来就是和最终展现的Web页面直接相关的代码了,大部分都是对luci封装好的一些html控件(代码)的使用和扩展。luci封装好的html控件类可以在以下文件查看:./host/usr/lib/lua/luci/cbi.lua71m=SimpleForm(version,translate(版本管理))72m.submit=false73m.reset=false74m.help=help_txtandtrueorfalse75m.helptxt=help_txtor使用了一个SimpleForm的控件,SimpleForm实际上对应一个html表单,是整个页面最大的容器,本页面内的绝大部分控件都处于SimpleForm内,是它的子控件。我知道的可以做页面最大容器的控件还有一个Map,但它需要./host/etc/config/目录下的一个配置文件,我没有使用。submitreset是luci默认就封装好的一个属性,分别控制html表单的提交重置按钮;helphelptxt是我扩充的表单属性,分别控制web页面的帮助功能和帮助内容。关于控件属性的意义、实现和扩充可以按以下步骤进行:在文件./host/usr/lib/lua/luci/cbi.lua中查找控件名SimpleForm,然后可以找到以下行664self.template=cbi/s

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功