什么是Luci呢?先直观的感受一下,打开web浏览器,输入R2的网关地址,然后出现了一个web登录界面,这个就是Openwrt Luci的应用。

那么到底什么是Luci呢?在这里我先给大家一个公式:Luci = lua + uci,然后接下来我针对这个公式去讲解什么是Luci。

首先简单介绍一下什么是lua和uci;lua是一门编程语言,在后面你会看到它长什么样子,uci(Unified Configuration Interface)是Openwrt的配置框架。

那么到这里能不能大致猜到Luci是什么了?没错,Luci就是这两者的结合,简单理解就是基于lua语言去实现配置Openwrt。

我们再回过头来看这个web界面,是不是感觉和家里路由器的配置web界面很相近呀,细心一点看,会看到路径除了IP地址外,还有"/cgi-bin/luci",这里留个伏笔,后面我们会讲到为什么是这个路径。

那么接下来我们就来看luci的基本用法,以及工作原理,让大家对Luci有一个初步的认识。

初识Luci

输入账号密码(一般默认是root,root)登录页面,登录后的界面类似于这样:

从页面上可以看到我们设备的固件、内核版本以及内存等相关信息。

点击Status => Routes,我们可以看到设备上的路由信息:

更多的Luci界面的配置细节,我在这里就不过多阐述,后续结合代码的时候再来看部分Luci的配置,接下来我们来看一下Luci的工作原理。

回到第一个问题,我们在浏览器里输入网关地址“192.168.1.1”,但是为什么Luci的路径是“http://192.168.1.1/cgi-bin/luci”,那么当我们在web输入网关地址后,页面是在哪里被调用的呢?在这里我们就要引入一个概念uhttpd,那么这个uhttpd是个什么东东呢?

uhttpd是一个轻量级的web服务器,由于其可以和Openwrt的配置框架UCI结合到一起,因此默认被用于OpenWrt的Web管理接口LuCI。

我们都知道,网站都是被部署在一台台服务器,PC等设备上的,我们的设备访问网站时,先是通过网络访问到部署这个网站的服务器,然后服务器的web服务再返回页面给我们;也就是说如果服务器没有web服务,我们是访问不了网页的哦。

接下来我们来看一下uhttpd的UCI配置

root@LEDE:/# cat /etc/config/uhttpd

config uhttpd'main'list listen_http'0.0.0.0:80'    #http协议IPV4的监听端口80list listen_http'[::]:80'      #http协议IPV6的监听端口为443list listen_https'0.0.0.0:443'list listen_https'[::]:443'option redirect_https'1'option home'/www'         #指定根路径option rfc1918_filter'1'option max_requests'3' #最大请求数option max_connections'100' #最大TCP连接数option cert'/etc/uhttpd.crt' #HTTPS连接的证书路径option key'/etc/uhttpd.key' #HTTPS连接的私钥路径option cgi_prefix'/cgi-bin' #cgi脚本的路径,这个路径又是home的相对路径,即/www/cgi-binoption lua_prefix'/luci' #lua解释器路径,这个路径又是home的相对路径,即/www/lucioption lua_handler'/usr/lib/lua/luci/sgi/uhttpd.lua' #lua runtime初始化的路径option script_timeout'60'option network_timeout'30'option http_keepalive'20'option tcp_keepalive'1'option ubus_prefix'/ubus'config cert'defaults'option days'730'option bits'2048'option country'ZZ'option state'Somewhere'option location'Unknown'option commonname'LEDE'

当然我们也可以通过uci的命令去查看:

root@LEDE:/www/cgi-bin# uci show uhttpd

uhttpd.main=uhttpd

uhttpd.main.listen_http='0.0.0.0:80' '[::]:80'uhttpd.main.listen_https='0.0.0.0:443' '[::]:443'uhttpd.main.redirect_https='1'uhttpd.main.home='/www'uhttpd.main.rfc1918_filter='1'uhttpd.main.max_requests='3'uhttpd.main.max_connections='100'uhttpd.main.cert='/etc/uhttpd.crt'uhttpd.main.key='/etc/uhttpd.key'uhttpd.main.cgi_prefix='/cgi-bin'uhttpd.main.lua_prefix='/luci'uhttpd.main.lua_handler='/usr/lib/lua/luci/sgi/uhttpd.lua'uhttpd.main.script_timeout='60'uhttpd.main.network_timeout='30'uhttpd.main.http_keepalive='20'uhttpd.main.tcp_keepalive='1'uhttpd.main.ubus_prefix='/ubus'uhttpd.defaults=cert

uhttpd.defaults.days='730'uhttpd.defaults.bits='2048'uhttpd.defaults.country='ZZ'uhttpd.defaults.state='Somewhere'uhttpd.defaults.location='Unknown'uhttpd.defaults.commonname='LEDE'

细看一下,是不是和"/etc/config/uhttpd"里面的uhttpd的配置是一样的,没错,现在我们已经接触到Openwrt的UCI框架了。

实际上Openwrt里面的所有配置都是在"/etc/config"目录下,我们看一下有哪些配置:

root@LEDE:/etc/config# lsaria2 firewall luci network sysstat uhttpd

dhcp hd-idle mtkhnat qos system wireless

dropbear kdump mwan3 rpcd ucitrack

这些配置就构成了整个Openwrt的配置,而管理这些配置的框架正是UCI,我们可以简单去理解,就是UCI = /etc/config/,这样的好处就是方便统一配置,不过你配置什么,只管去"/etc/config"目录下找对应需要配置的服务就好了,而且都是使用uci的方式,十分方便;相比Ubuntu等Linux其它衍生系统的配置文件来讲是要方便和简单很多,后面讲Ubuntu系统的时候,大家就能感受到。

到这里大家应该对UCI有一个初步的认识了,接下来我们通过继续看uhttpd的那个问题,去认识lua语言,然后让大家更加理解 Luci = lua + uci 这个公式。

由上面uhttpd的配置来看,当我们通过web的方式访问R2时,uhttpd会导向"/www"的路径,那么我们来看看R2上的"/www"里面有什么。

root@LEDE:/www# ls/cgi-bin index.html /luci-static

root@LEDE:/www# catindex.html<?xml version="1.0" encoding="utf-8"?>

LuCI - Lua Configuration Interface

root@LEDE:/www#

能看到,"/www"路径下面有个index.html,同时打印出“index.html”的内容,可以看到这个内容“href="/cgi-bin/luci”,原来是这里把网关导向了“/cgi-bin/luci”;那么我们再来看看这个路径里面又有什么?

root@LEDE:/www/cgi-bin# ls #这里有个luci的脚本luci

root@LEDE:/www/cgi-bin# catluci #打印luci这个脚本的内容,可以看到这个脚本里的内容就是lua语言写的

#!/usr/bin/lua

require"luci.cacheloader"require"luci.sgi.cgi"luci.dispatcher.indexcache= "/tmp/luci-indexcache"luci.sgi.cgi.run()

这个路径下面放着一个lua的脚本,脚本里面调用了这个接口“luci.sgi.cgi.run()”,那么这个接口执行的函数在哪里呢,在这里:

root@LEDE:/usr/lib/lua/luci/sgi# lscgi.lua uhttpd.lua

root@LEDE:/usr/lib/lua/luci/sgi# catcgi.lua-- Copyright 2008 Steven Barth

-- Licensed to the public under the Apache License 2.0.***************

functionrun()

local r=luci.http.Request(

luci.sys.getenv(),

limitsource(io.stdin, tonumber(luci.sys.getenv("CONTENT_LENGTH"))),

ltn12.sink.file(io.stderr)

)

local x=coroutine.create(luci.dispatcher.httpdispatch)

local hcache= ""local active= true

while coroutine.status(x) ~= "dead" dolocal res,id, data1, data2 =coroutine.resume(x, r)if not res thenprint("Status: 500 Internal Server Error")

print("Content-Type: text/plain\n")

print(id)

break;

endif active then

if id == 1 thenio.write("Status:" .. tostring(data1) .. " " .. data2 .. "\r\n")

elseifid == 2 thenhcache= hcache .. data1 .. ":" .. data2 .. "\r\n"elseifid == 3 thenio.write(hcache)

io.write("\r\n")

elseifid == 4 thenio.write(tostring(data1 or ""))

elseifid == 5 thenio.flush()

io.close()

active= falseelseifid == 6 thendata1:copyz(nixio.stdout, data2)

data1:close()

end

end

end

end

run()函数就在cgi.lua里面;现在我们可以初步了解到,lua语言就是这样被Luci使用的。

那么我们再整体看一下整个访问流程:web(输入网关地址)==> uhttpd调用"/www/index.html" ==> index.html重定向到"/cgi-bin/luci" ==> luci被启动。讲到这里可能大家对Luci有一个初步的认识了,由于Luci涉及lua语言,这门语言不像Java,C普及率那么高,我这里暂时也点到为止,更多Luci的知识后续有时间我会继续和大家一起研究。

Luci Github:https://github.com/openwrt/luci

luci编程 openwrt_【玩转开源】BananaPi R2 —— 第四篇 Openwrt Luci 初探相关推荐

  1. luci编程 openwrt_openwrt开源系统LUCI配置界面

    转自:http://www.right.com.cn/forum/thread-131035-1-1.html 本人菜鸟,最近在学习这方面的知识,在参考资料的基础上总结如下内容. 这篇文章针对如何对o ...

  2. 《老码说编程之玩转Swift江湖》一书终于出版了

    今天我们的第一本基于XCode6.1最新版Swift语法编写的书籍上市发售了,它有个可爱的名字:<老码说编程之玩转Swift江湖>,还有个漂亮的封面: <老码说编程之玩转Swift江 ...

  3. 【玩转开源】Linux C 检测网口热插拔

    int NetDetect(char *net_name, int *statue) { int ret = 0;int skfd = 0;struct ifreq ifr;skfd = socket ...

  4. 视频教程-Scratch3.0趣味编程L2-边玩边学轻松探索-其他

    Scratch3.0趣味编程L2-边玩边学轻松探索 职位:教学总监 简介: 工学硕士研究生,精通C/C++.MFC.SQL,熟悉Java, php等编程语言,拥有十多年的软件研发和项目管理经验:  ...

  5. 编程书籍阅读随谈(第四篇)

    对于这个系列的博文,更新的很有些快.主要原因是这个系列讲解的是个人感悟,没有技术点,也就不用四处翻阅资料,去GitHub上下载源码.(说到这里还有一句话说,我曾经花了一个月多把我觉得GitHub上比较 ...

  6. Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次 ...

  7. android 测试工具,Android开源项目第四篇:开发及测试工具篇

    本文为那些不错的Android开源项目第四篇--开发工具篇,**主要介绍Android开发工具和测试工具相关的开源项目**. Android开源项目系列汇总已完成,包括: 1.Buck faceboo ...

  8. python空集_玩转Python集合,这一篇就够了!

    原标题:玩转Python集合,这一篇就够了! 点上方蓝色" 菜鸟学Python",选" 星标"公众号 重磅干货,第一时间送到 选自DataCamp, 作者:Mi ...

  9. Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射 下一篇:Farseer.net轻量级ORM开源 ...

  10. python线程通信 消息传递_Python并发编程之线程消息通信机制/任务协调(四)

    大家好,并发编程进入第四篇. 本文目录 前言 Event事件 Condition Queue队列 总结 .前言 前面我已经向大家介绍了,如何使用创建线程,启动线程.相信大家都会有这样一个想法,线程无非 ...

最新文章

  1. JS 事件冒泡和事件捕获
  2. 常考数据结构与算法:两数之和
  3. 数据仓库建设从0到1-一文带你深入建设金融数仓体系
  4. Spring Cloud Alibaba基础教程:Nacos 生产级版本 0.8.0
  5. CF1042F Leaf Sets (贪心+树上构造)
  6. Hbase block cache
  7. YARN调试过程中的常见问题
  8. 对于J2EE体系架构的理解
  9. ALSA声卡驱动二之声卡的创建
  10. 科学计算机恢复初始化,快速解决Windows 10系统还原一直初始化或卡住的方法!...
  11. week_07_数据库,JDBC,Utils,Html中文本,超链接,表格,表单,框架,图像标签
  12. 功能强大~带你走近Smartbi增强分析模块
  13. python 实现 Cmn 的排序 阶乘
  14. java get set写法_java get set方法的使用
  15. OpenOCD failed tor read memory at $addr 错误
  16. 实验二 语音信号基本时频分析(待更改)
  17. airpods耳机敲击没反应_苹果airpods蓝牙耳机使用感受与使用方法
  18. Java开发环境的搭建—Java JDK的下载与安装!
  19. open-vm-tools安装问题及解决方法
  20. 浅谈百度地图的简单开发之结合方向传感器实现定位功能(三)

热门文章

  1. AD中使用Net Label时,编译时为什么总是Floating。出现的原因。
  2. fst 共享后缀_trie、FSA、FST(转)
  3. 破除对 AWS Fargate 的幻觉
  4. selenium如何添加新标签页
  5. 2020-8-28平衡二叉树
  6. 动态优化模型/ 变分法:泛函、极值、变分
  7. 如何删除在System中打开的iso文件
  8. FZU 2158 数字密码
  9. 50个最新TypeScript面试题合集 – TypeScript开发教程
  10. ASPICE简介及适用范围-亚远景科技