Luci介紹

  Lua做爲一門方便嵌入(其它應用程序)並可擴展的輕量級腳本語言來設計的,所以她一直聽從着簡單、小巧、可移植、快速的原則,官方實現徹底採用ANSI C編寫,能以C程序庫的形式嵌入到宿主程序中。Lua的每一個版本都保持着開放源碼的傳統,不過各版採用的許可協議並不相同,自5.0版(最新版是5.1)開始她採用的是著名的MIT許可協議。正因爲上述特色,因此Lua在遊戲開發、機器人控制、分佈式應用、圖像處理、生物信息學等各類各樣的領域中獲得了愈來愈普遍的應用。web

  Luci是 Lua ConfigurationInterface的簡稱,意在OpenWrt整個系統的配置集中化。見連接: http://wiki.openwrt.org/zh-cn/doc/uciapi

  1. Luci 的啓動--uhttpd緩存

    uhttpd是一個簡單的web服務器程序,主要就是cgi的處理,openwrt是利用uhttpd做爲web服務器,實現客戶端web頁面配置功能。對於request處理方式,採用的是cgi,而所用的cgi程序就是luci。服務器

  2. Luci 的啓動--luci分佈式

  在web server中的cgi-bin目錄下,運行 luci 文件(權限通常是 755 ),luci的代碼以下:函數

  #!/usr/bin/lua      --cgi的執行命令的路徑 
 
  require"luci.cacheloader"    --導入cacheloader包 

  require"luci.sgi.cgi"         --導入sgi.cgi包  

  luci.dispatcher.indexcache = "/tmp/luci-indexcache"  --cache緩存路徑地址 

  luci.sgi.cgi.run()  --執行run,此方法位於*/luci/sgi/cgi.lua中

  3. Luci-- Web學習

  a.登陸測試

  輸入: http://x.x.x.x/ 登陸LuCI.ui

  Calling /www/cgi-bin/luci.lua

  b. 進入主菜單‘status’

  輸入: http://x.x.x.x/cgi-bin/luci/admin/status/便可訪問status頁面。Luci則會calling /luci/admin/目錄下的status.lua腳本:

  module("luci.controller.admin.status", package.seeall)

  /usr/lib/lua/luci/controller/admin/status.lua->index()

  4. 以status模塊爲例進行說明

  模塊入口文件status.lua在目錄lua\luci\controller\admin下在index()函數中,使用entry函數來完成每一個模塊函數的註冊:

  entry(path, target, title=nil, order=nil)

    5. entry()函數

  第一個參數是定義菜單的顯示(Virtual path)。

  第二個參數定義相應的處理方式(target)。

  alias是指向別的entry的別名,from調用的某一個view,cbi調用某一個model,call直接調用函數。

  第三個參數是菜單的文本,_(「string」),國際化。

  第四個參數是是同級菜單下,此菜單項的位置,從大到小

  6. target主要分爲三類:call,template 和cbi。

  a. call用來調用函數。即語句

  entry({"admin", "status", "iptables"}, call("action_iptables"), _("Firewall"), 2)

  Firewall模塊調用了action_iptables函數

  b. template調用

  template用來調用已有的htm模版,模版目錄在lua\luci\view目錄下。即語句

  entry({"admin","status","overview"},template("admin_status/index"),_("Overview"), 1)

  調用lua\luci\view\admin_status\index.htm文件來顯示。

  7. cbi調用

  a. CBI瞭解 –- Configuration Binding Interface

  CBI模型是Lua文件描述UCI配置文件的結構和由此產生的HTML表單來評估CBI解析器,全部CBI  luci.cbi.Map類型的模型文件必須返回一個map對象,在cbi模塊中定義各類控件,Luci系統會自動執行大部分處理工做。其連接目錄在lua\luci\model\cbi下 entry({"admin", "status", "processes"}, cbi("admin_status/processes"), _("Processes"), 6),調用\lua\luci\model\cbi\admin_status\processes.lua來實現模塊。

  8. Luci API的使用

  官方文檔介紹:http://luci.subsignal.org/api/luci/

  好比:luci.sys luci.sys.net等對應的解析,由Luci源碼結構中的/luci-0.11/libs/sys/luasrc/sys.lua完成。

  9. Uci的使用

  Uci命令的使用

  Uci show <config>

  Uci get /uci set /uci commit

  Uci c API的使用

  在腳本中使用uci config文件:http://wiki.openwrt.org/doc/devel/config-scripting

  總結一下Luci、Lua、Uci、CBI的關係圖,以下圖:

  

  

  以上爲最近研究Luci開發的相關資料整理,同時本身也動手作了幾個測試頁面並經過luci.sys.call實現了腳本、系統程序的調用。

  爲了方便你們學習,順便整理出了openwrt的build root的使用官方文檔地址:http://wiki.openwrt.org/zh-cn/doc/howto/build 以及CBI模塊的section屬性設置,官方文檔介紹:http://luci.subsignal.org/trac/wiki/Documentation/CBI。後續有時間會繼續與你們分享openwrt的相關研究、筆記等等。也但願你們能多留言、多指導,謝謝!

相關文章
相關標籤/搜索