天天看點

UCI、LuCI、go-uci概述和相關資料UCI、LuCI、go-uci概述和相關資料

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界面以及通過程式接口直接修改。