/*****************************************************************************************************************
Document Author : ELvins Fu
Digtal technology park, A3 -06 , shenzhen, China
    *************************************************************************************************************/
    
   
    
     
      1.
     
    
    
     
      多语言
     
    
   
    
     1
    
    
     )检查:
    
   
    
     opkg list | grep luci-i18n-
    
   
    
     2
    
    
     )安装语言包:
    
   
    
     opkg install luci-i18n-hungarian
    
   
    
     
      2.uhttpd
     
    
   
    
     这个是LuCI所在的Web Server。docroot在/www下边,index-html指向了/cgi-bin/luci,注意这是相对于docroot而言的路径。
    
   
    
     openwrt
    
    
     中利用它作为
    
    
     web
    
    
     服务器,实现客户端
    
    
     web
    
    
     页面配置功能。对于
    
    
     request
    
    
     处理方式,采用的是
    
    
     cgi
    
    
     ,而所用的
    
    
     cgi
    
    
     程序就是
    
    
     luci
    
    
     。
    
   
    
     
      1
     
    
    
     
      )工作框架如下图所示:
     
    
   
     
   
    
     Client
    
    
     端和
    
    
     serv
    
    
     端采用
    
    
     cgi
    
    
     方式交互,
    
    
     uhttpd
    
    
     服务器的
    
    
     cgi
    
    
     方式中,
    
    
     fork
    
    
     出一个子进程,子进程利用
    
    
     execl
    
    
     替换为
    
    
     luci
    
    
     进程空间,并通过
    
    
     setenv
    
    
     环境变量的方式,传递一些固定格式的数据(如
    
    
     PATH_INFO
    
    
     )给
    
    
     luci
    
    
     。另外一些非固定格式的数据(
    
    
     post-data
    
    
     )则由父进程通过一个
    
    
     w_pipe
    
    
     写给
    
    
     luci
    
    
     的
    
    
     stdin
    
    
     ,而
    
    
     luci
    
    
     的返回数据则写在
    
    
     stdout
    
    
     上,由父进程通过一个
    
    
     r_pipe
    
    
     读取。
    
   
    
     
      2
     
    
    
     
      )
     
    
    
     
      luci
     
    
    
     
      文件(权限一般是
     
    
    
     
      755
     
    
    
     
      )
     
    
    
    
    
     
      ,
     
    
    
     
      luci
     
    
    
     
      的代码如下:
     
    
   
    
     #!/usr/bin/lua —
    
    
     执行命令的路径
    
   
    
     require”luci.cacheloader” —
    
    
     导入
    
    
     cacheloader
    
    
     包
    
   
    
     require”luci.sgi.cgi” —
    
    
     导入
    
    
     sgi.cgi
    
    
     包
    
   
    
     luci.dispatcher.indexcache = “/tmp/luci-indexcache” –cache
    
    
     缓存路径地址
    
   
    
     luci.sgi.cgi.run() —
    
    
     执
    
    
     行
    
    
     run
    
    
     方法,此方法位于
    
    
     /usr/lib/lua/luci/sgi/cgi.lua
    
    
     中
    
   
    
     
      3
     
    
    
     
      )
     
    
    
     
      web
     
    
    
     
      配置时的数据交互:
     
    
   
     
   
- 
     
 首次运行时,是以普通的
 
 
 file
 
 
 方式获得
 
 
 docroot/index.html
 
 
 ,该文件中以
 
 
 meta
 
 
 的方式自动跳转到
 
 
 cgi
 
 
 的
 
 
 url
 
 
 ,这是
 
 
 web
 
 
 服务器的一般做法。
 
- 
     
 然后第一次执行
 
 
 luci
 
 
 ,
 
 
 path_info=’/’
 
 
 ,会
 
 
 alise
 
 
 到
 
 
 ‘/admin’
 
 
 (
 
 
 ‘/’
 
 
 会索引到
 
 
 tree.rootnode
 
 
 ,并执行其
 
 
 target
 
 
 方法,即
 
 
 alise(‘/admin’)
 
 
 ,即重新去索引
 
 
 adminnode
 
 
 ,这在后面会详细描述),该节点需要认证,所以返回一个登录界面。
 
- 
     
 第
 
 
 3
 
 
 次交互,过程同上一次的,只是这时已
 
 
 post
 
 
 来了登录信息,所以
 
 
 serv
 
 
 端会生成一个
 
 
 session
 
 
 值,然后执行
 
 
 ‘/admin’
 
 
 的
 
 
 target
 
 
 (它的
 
 
 target
 
 
 为
 
 
 firstchild
 
 
 ,即索引第一个子节点),最终返回
 
 
 /admin/status.html
 
 
 ,同时会把
 
 
 session
 
 
 值以
 
 
 cookie
 
 
 的形式发给
 
 
 client
 
 
 。这就是从原始状态到得到显示页面的过程,之后主要就是点击页面上的连接,产生新的
 
 
 request
 
 
 。
 
- 
     
 每个链接的
 
 
 url
 
 
 中都会带有一个
 
 
 stok
 
 
 值(它是
 
 
 serv
 
 
 生成的,并放在
 
 
 html
 
 
 中的
 
 
 url
 
 
 里),并且每个新
 
 
 request
 
 
 都要带有
 
 
 session
 
 
 值,它和
 
 
 stok
 
 
 值一起供
 
 
 serv
 
 
 端联合认证。
 
    
     初始阶段
    
    
     http
    
    
     报文,可以看到从第
    
    
     2
    
    
     次交互开始,所有
    
    
     request
    
    
     都是
    
    
     cgi
    
    
     方式(除一些
    
    
     css
    
    
     、
    
    
     js
    
    
     等
    
    
     resource
    
    
     文件外),且执行的
    
    
     cgi
    
    
     程序都是
    
    
     luci
    
    
     ,只是带的参数不同,且即使所带参数相同(如都是
    
   
 
