1. 程式人生 > >openwrt luci

openwrt luci

一、如何修改LUCI原始碼
如何修改該LuCI的原始碼,你首先需要了解一下LuCI基本知識,包括它的模組怎麼寫的,用的是lua語言等,LuCI實現啟動應用程式等指令碼命令,然後知道怎麼將luci編譯進韌體中去:輸入./scripts/feeds/ install luci。這樣子你就會發現feeds資料夾下面有luci了,但是裡面除了資料夾一無所有,回到menuconfig中去回發現有luci了,還可以選擇ddns等模組,還可以選擇中文語言了,可以編譯到韌體中去了。那麼我們就編譯一下試試。
在dl資料夾中,我們看到了luci-0.10+svn7976.tar.gz,這證明原始碼其實是在這裡的,我們又進入build_dir/target-mips_uClibc-0.9.30.1這個資料夾下面發現瞭解壓的上述檔案,其實這個就是編譯的資料夾,裡面有theme之類的等等,找個theme裡面的header.htm改改編譯後看看,發現在新的韌體中已經出現了改動,這裡說明修改成功了。我再模仿application資料夾下面的一些程式,如luci-ddns寫了一個luci-smustar的配置程式介面放到這個資料夾下面,回頭到menuconfig中發現沒有,怎麼辦?回到feeds/luci/luci中找到makefile加入$(eval $(call application,smustar,smustar for 802.1x,\+PACKAGE_luci-app-smustar:smustar-scipts))^_^,再回到menuconfig中就看到了,果斷的選了,然後就編譯到韌體中去了,折騰了我幾天的luci終於在bulder_dir下找到原始碼可以修改,不過最好別該這裡修改,要改就修改makefile和dl下的原始碼吧,省得有時候buldr_dir下面的原始碼會被dl下的那個壓縮檔案解壓過去,扔在裡面的檔案就會丟失。


二、在LUCI中如何寫一個模組
玩openwrt的人都會知道LuCI,因為每次進入系統的時候會有大大的字顯示了luci interface configuration,有了這個介面確實不錯,方便傻瓜般的配置我們的介面。主要參考資料如下:
官網資料: http://luci.subsignal.org/
在官網的resource中可以找到一個
Documentation: References and HowTos
別的先不說,直接就奔我們的主題吧

HowTo: Write Modules
硬是要翻譯的話,就是怎麼寫一個模組,ok,我就是想要寫802.1x的認證模組

按照官方的說法,要完成一個模組並用到裡面需要兩個東西,


第一個我們先找到usr/lib/lua/luci/controller在裡面建立一個資料夾,也就是我們的模組名稱smustar

在smustar下面再寫我們模組的主檔案smumodule.lua

參考官網,我們的模組寫法應該是這樣寫的

module(“luci.controller.smustar.smumodule”, package.seeall)

function index()
entry({“admin”, “network”, “802.1x”}, cbi(“smustar-smumodule/netifaces”), “Network interfaces”, 30).dependent=false
end


第一句話是宣告一下這個模組了。

第二句話就是我們模組的主函式,其中要告訴它我們的入口,與其說入口,不如說就是告訴它是要admin登入才能用的,是在network這個選單下,名字叫做802.1x。模組執行的程式在smustar-smumodule/netifaces這裡。
smustar-smumodule/netifaces是什麼東西?這是我們要建立的另外一個檔案。
我們找到路徑/usr/lib/lua/luci/module

在下面建立資料夾smustar-smmodule建立檔案netfaces.lua

好了接下來就是要在netfaces.lua寫我們的程式了,參考官網所說的這個什麼luci最酷的地方,也就是修改config檔案

不要說你不懂什麼是config檔案了,最簡單的比如network。

我們在/etc/config下面建立一個配置檔案叫smuset

那這就是一個config檔案的寫法

config ‘interface’ ‘smustar’

option ‘user’ ‘youruser’
option ‘pass’ ‘yourpass’

ok這個config檔案就是這樣子了,接下來寫netfaces.lua

m = Map(“smuset”, “smustar”) — We want to edit the uci config file /etc/config/smustar 這裡是我們要配置的檔案了,預設的路徑它已經能夠區別的,不用管了
s = m:section(TypedSection, “interface”, “smustar”) — Especially the “interface”-sections讀出裡面的interface區域來
s.addremove = true — Allow the user to create and remove the interfaces

sption(Value, “user”, “youruser”)這個能就是一個input即一個輸入框了讀取的是smuset中的user項。youruser是提示語羅

key=sption(Value, “pass”, “your password”)

key.password=true; 設定為星號的密碼輸入框

return m — Returns the map
好了檔案就完成了,之後我們進入luci配置介面

在network下可以看到了802.1x選項

進入後有賬號和密碼輸入框 改一下之後

save&apply一下,發現密碼被修改了。我們的802.1x配置介面就做好了!

三、LuCI實現啟動應用程式等指令碼命令
當我們點選這個按鍵時候,luci可以實現執行一個應用程式或者指令碼的話,你需要知道LuCI開發的一個函式luci.http.formvalue ,這個函式就是用來獲取我們的post過去表單的值的,假設你配置頁面是一個帳號和密碼,然後你需要在點選按鍵“儲存並應用”的時候啟動我們的應用程式(我這裡是smustar),那麼你只要檢測該按鍵的值是否傳遞過去了,如果傳遞過去了則是使用者提交後頁面,如果沒有這個值,那麼只是使用者第一次進入這個頁面而已,和wordpress何其相似。程式碼如下:
local reboot = luci.http.formvalue(“cbi.apply”)

if reboot then
sption(DummyValue,”xiugai”,”帳號和密碼修改成功!認證已經開啟,如果是還沒連上網,請確認帳號仍有餘額或未在別處登入。”)
luci.sys.call(“killall smustar”)
luci.sys.call(“smustarLogout &”)
luci.sys.call(“smustar &”)

end

如果你需要多個按鍵,並且這些按鍵都有不同作用的話,你需要加入一個按鈕,同樣只要檢測這個按鈕就知道是不是使用者點選了這個按鈕提交過去的頁面了,比如點選個按鈕重啟,程式碼如下:

sption(Button,”logout”,”重啟”)

local logout=luci.http.formvalue(“cbid.smuset.smustar.logout”)
if logout then
sption(DummyValue,”tuichu”,”重新啟動中!”)
luci.sys.call(“reboot”)
end

LuCI提供的這個函式luci.sys.call允許你呼叫shell等任何linux下的指令碼或者執行程式,你可以用它來進行更多的程式交換,也就是實現了web配置和linux執行程式之間的互動。如果你需要更加複雜的互動,你可以用luCI的檔案函式來得到與程式間的溝通,當然這個程式也得通過檔案來交流,如果是自己的程式那好辦,如果不是那就期待它提供命令呼叫,不過一般都支援了。