轉自:http://www.right.com.cn/forum/thread-131035-1-1.html
本人菜鳥,最近在學習這方面的知識,在參考資料的基礎上總結如下內容。
這篇文章針對如何對openwrt開源系統的LUCI界面進行配置!
主要如下三點:
第一,主要介紹了該如何修改luci源代碼,在哪里進行修改;
第二,在LuCI里如何寫一個自己的模塊;
第三,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的文件函數來得到與程序間的溝通,當然這個程序也得通過文件來交流,如果是自己的程序那好辦,如果不是那就期待它提供命令調用,不過一般都支持了。
參考資料:http://chaochaoblog.com/