UCI、LuCI、go-uci概述和相關資料
文章目錄
- UCI、LuCI、go-uci概述和相關資料
-
- 1. 前言
- 2. 相關概念和資料
-
- uci
- luci
- go-uci
- 3. 最後
1. 前言
知道OpenWrt/LEDE應該知道利用frp做内網穿透,而frp是go語言開發的,内網穿透可以将OpenWrt的配置web友善穿透到外網,這樣的話遠端配置、控制和維護基于OpenWrt的裝置在某些情況下就變得容易了,此外,自帶路由功能也可以對這樣的裝置做更多的擴充,它可以作為一個路由器,也可以作為中繼裝置,加上輪子甚至可以成為一個帶WiFi的機器人。
基本上隻要接觸OpenWrt的話,那麼UCI是繞不過去的,是以這裡對相關概念和資料做下總結,預設路由器沒有複雜業務的話一般使用LuCI開發的配置web就足夠了,簡單的增加配置web的功能也可以基于該架構,但為了美觀或者其它考量會替代該架構重新開發web,而目前我們通過go語言開發網關web來替換原有的web以便于擴充更複雜的業務配置,但基于uci對網關的配置一般都是會保留的,是以我們找到了go-uci,是以這裡也一起做下簡單的總結。
2. 相關概念和資料
uci
UCI:可以在官網資料檢視相關内容,比如這裡對UCI的說明:https://openwrt.org/zh/docs/techref/uci
Unified Configuration Interface:
UCI
是一個用 C ([shell script](https://en.wikipedia.org/wiki/shell script)-已封裝) 寫的功能元件,為了 集中化 管理運作OpenWrt系統的裝置的配置檔案。 UCI 是在OpenWrt曆史版本 White Russian 中存在的基于 NVRAM 的配置檔案的 替代版本 和 其附帶的标準配置檔案程式的 封裝, 例如
/etc/network/interfaces
,
/etc/exports
,
/etc/dnsmasq.conf
,
/etc/samba/samba.conf
等。
他們可以通過任何文本編輯器、指令行功能元件
uci
、各種程式設計API (類似 Shell, Lua 和 C)實作更改。 luci這中網頁使用者界面就是用Lua對它們進行操作的。
主要功能是由
uci
and
libuci
這兩個包提供的。
libuci-lua
包也是可用的。
包名 | 大小(位元組) | 描述 |
---|---|---|
uci | 7196 | 統一配置接口 (UCI) 的功能元件 |
libuci | 18765 | 統一配置接口 (UCI) 的C語言庫 |
libuci-lua | ~6000 | C語言庫檔案的LuaLua插件庫, 例如 luci就用到了這個庫 |
luci
luci:https://openwrt.org/zh/docs/techref/luci
LuCI 成立于 2008 年 3 月,名稱為“FFLuCI”,作為從 OpenWrt 分支White Russian到其後繼分支Kamikaze建立 Freifunk-Firmware 端口的努力的一部分。
該項目的最初原因是缺乏免費、幹淨、可擴充且易于維護的嵌入式裝置Web 使用者界面。雖然大多數類似的配置界面大量使用 Shell 腳本語言,但 LuCI:
- 使用 Lua 程式設計語言
- 将界面拆分為模型和視圖等邏輯部分,使用面向對象的庫和模闆。
這確定了更好的性能、更小的安裝尺寸、更快的運作時間和簡單的可維護性。
與此同時,LuCI 從一個 MVC-Web 架構演變為一系列庫、應用程式和使用者界面的集合,為 Lua 程式員提供通用的用途,而重點仍然放在Web 使用者界面上,自 OpenWrt ‘Kamikaze’ 8.09 以來,它也成為 OpenWrt 版本的官方部分。
go-uci
https://github.com/digineo/go-uci
我們目前正在 OpenWRT 路由器硬體上試驗 Go 二進制檔案,需要一種與系統配置互動的方法。我們本可以為 建立綁定
libuci
,但是使用 CGO 開發的周轉周期有點乏味。此外,由于 Go 不能為我們的目标平台編譯,我們需要求助于 GCCGO,它有其他的怪癖。
是以,最簡單的解決方案是一個普通的 Go 庫,它可以在 Go(有或沒有 CGO)和 GCCGO 中使用,而無需擔心互操作性。庫還允許在 OpenWRT 系統之外使用 UCI(例如用于配置)。
3. 最後
其實就是對裝置配置參數修改提供了統一的配置接口,這類接口有基于C、Lua、Go、Shell等的API,便于我們直接調用,不用非得登入到裝置在指令行修改,可以基于Web界面以及通過程式接口直接修改。