https://gitee.com/pipicold/OpenwrtLuaController
config 'example' 'test' option 'string' 'some value' option 'boolean' '1' list 'collection' 'first item' list 'collection' 'second item' config 'example' 'test' 语句标志着一个节的开始。这里的配置类型是example,配置名是test。配置中也允许出现匿名节,即自定义了配置类型,而没有配置名的节。配置类型对应配置处理程序来说是十分重要的,因为配置程序需要根据这些信息来处理这些配置项。 option 'string' 'some value' 和 option 'boolean' '1' 定义了一些简单值。文本选项和布尔选项在语法上并没有差异。布尔选项中可以用'0' , 'no', 'off', 或者'false'来表示false值,或者也可以用'1', 'yes','on'或者'true'来表示真值。 以list关键字开头的多个行,可用于定义包含多个值的选项。所有共享一个名称的list语句,会组装形成一个值列表,列表中每个值出现的顺序,和它在配置文件中的顺序相同。如上例种中,列表的名称是'collection',它包含了两个值,即'first item'和'second item'。 'option'和'list'语句的缩进可以增加配置文件的可读性,但是在语法不是必须的。 通常不需要为标识符和值加引号,只有当值包括空格或者制表符的时候,才必须加引号。同时,在使用引号的时候,可以用双引号代替单引号。
1什么是CGI
CGI(Common Gateway Interface)是HTTP服务器与你的或其它机器
上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。
公共网关界面(CGI)是一种编程标准,它规定了Web服务器调用其它可执行程序(CGI程序)的接口协议标准。CGI程序通过Web服务器与运行Web服务器调用其它可执行程序交互,它接受Web浏览器发送给Web服务器的信息,并进行处理,然后将结果再送给Web服务器及Web浏览器。CGI程序可以用任何程序设计语言编写,如Shell、perl、C、Java等,用C语言编写的CGI程序具有速度快、安全性高等特点。
CGI程序通常用于加入查询机制、搜索机制、交互式应用及其它一些应用。
CGI接口标准包括输入、环境变量、标准输出三部分,CGI程序可以通过标准输入stdin)从Web服务器得到输入信息,例如从FORM中得到数据,这就是常用的POST方法。由于不同的操作系统采用了不同的信息交换机制,其参数传递的处理过程也有别,在Unix与DOS中,环境信息反映着本级程序运行时的某些系统状况,可用于父序与子程序间的信息传递,CGI正是通过设量环境变量在服务器与客户机间传递数据的,各操作系统都提供了许多环境变量,它们定义了程序的执行环境,应用程序可以存取它们。Web服务器和CGI接口也设置了一些环境变量用以传递一些重要的参数。CGI程序通过标准输出(stdout)将输出信息传送给Web服务器,传送给服务器的信息可以是HTML文本也可以是纯文本。
uci export
命令,显示结果如下:
package wireless
config wifi-device 'radio0'
option type 'mac80211'
option hwmode '11ng'
option path 'platform/ar933x_wmac' list ht_capab 'SHORT-GI-20' list ht_capab 'SHORT-GI-40' list ht_capab 'RX-STBC1' list ht_capab 'DSSS_CCK-40' option disabled '0' option channel 'auto' option htmode 'HT40+' option country 'CN' option noscan '1' config wifi-iface option device 'radio0' option network 'lan' option mode 'ap' option encryption 'none' option ssid 'OPENWRT'
可以看到在“wireless”配置文件下有可以修改SSID的选项
于是使用“uci show”命令输出具体的配置信息
命令显示如下:
wireless.radio0=wifi-device
wireless.radio0.type=mac80211
wireless.radio0.hwmode=11ng
wireless.radio0.path=platform/ar933x_wmac
wireless.radio0.ht_capab=SHORT-GI-20 SHORT-GI-40 RX-STBC1 DSSS_CCK-40
wireless.radio0.disabled=0 wireless.radio0.channel=auto wireless.radio0.htmode=HT40+ wireless.radio0.country=CN wireless.radio0.noscan=1 wireless.@wifi-iface[0]=wifi-iface wireless.@wifi-iface[0].device=radio0 wireless.@wifi-iface[0].network=lan wireless.@wifi-iface[0].mode=ap wireless.@wifi-iface[0].encryption=none wireless.@wifi-iface[0].ssid=OPENWRT
使用“uci set wireless.@wifi-iface[0].ssid=pipicoldnet”命令修改配置文件
再输入“uci commit”命令提交所进行的修改
最后,输入“wifi”命令,重新启动wifi服务
这是再次用其他设备搜索空间中的wifi信号,能看到原来的SSID为“OPENWRT”的AP已经被修改为“pipicoldnet”
(uci命令尝试)
####LuCI介绍
LuCI作为“FFLuCI”诞生于2008年3月份,目的是为OpenWrt固件从 Whiterussian 到 Kamikaze实现快速配置接口。Lua是一个小巧的脚本语言,很容易嵌入其它语言。轻量级 LUA语言的官方版本只包括一个精简的核心和最基本的库。这使得LUA体积小、启动速度快,从而适合嵌入在别的程序里。UCI是OpenWrt中为实现所有系统配置的一个统一接口,英文名Unified Configuration Interface,即统一配置接口。LuCI,即是这两个项目的合体,可以实现路由的网页配置界面。
最初开发这个项目的原因是没有一个应用于嵌入式的免费,干净,可扩展以及维护简单的网页用户界面接口。大部分相似的配置接口太依赖于大量的Shell脚本语言的应用,但是LuCi使用的是Lua编程语言,并将接口分为逻辑部分,如模板和视图。LuCI使用的是面向对象的库和模板,确保了高效的执行,轻量的安装体积,更快的执行速度以及最重要的一个特性————更好的可维护性。 与此同时,LuCI从MVC-Webframework衍生出一个包含了很多库、程序以及Lua程序用户接口的集合,但是LuCI仍然专注于实现网页用户界面并成为OpenWrt Kamikaze官方的一份子。 LuCI是一个开放源码的独立项目,欢迎任何人的加入。
#####模块Lua脚本和Luci快速配置接口的测试
#####Lua部分:
######1.lua解释器测试
在任意路径下输入
vim hellolua.lua
新建一个Lua脚本文件hellolua.lua
写入以下代码:
print("hello lua");
接着保存退出,在控制台上输入命令
lua hellolua.lua
就能在控制台上看到
hello lua
的输出,测试成功
######2.cgi解释lua文件测试
用cd /www/cgi-bin
命令进入uhttpd的cgi-bin文件夹
接着使用vim hellolua
新建一个名为“hellolua”的文件,注意没有后缀名
写入以下代码
#!/usr/bin/lua
print("hello lua")
之后在控制台用chmod 777 hellolua
命令修改“hellolua”文件的权限为最高
接着用网页浏览器访问
"192.168.1.1/cgi-bin/hellolua"
返回错误信息
Bad Gateway
The process did not produce any response
这是因为返回的消息没有http头消息导致了网页不能被浏览器正确的解析
修改代码如下:
#!/usr/bin/lua
print("Context-Type: test/plain\n")
print("hello lua")
保存后刷新网页.就可以看到网页上显示:
hello lua
测试成功。
######3.使用CGI环境变量
WEB 服务器和 CGI/FastCGI 程序之间交流信息的主要途径是环境变量 (以及标准输入输出流)
CGI环境变量列表:
【table】
环境变量 意义
SERVER_NAME CGI脚本运行时的主机名和IP地址.
SERVER_SOFTWARE 你的服务器的类型如: CERN/3.0 或 NCSA/1.3.
GATEWAY_INTERFACE 运行的CGI版本. 对于UNIX服务器, 这是CGI/1.1.
SERVER_PROTOCOL 服务器运行的HTTP协议. 这里当是HTTP/1.0.
SERVER_PORT 服务器运行的TCP口,通常Web服务器是80.
REQUEST_METHOD POST 或 GET, 取决于你的表单是怎样递交的.
HTTP_ACCEPT 浏览器能直接接收的Content-types, 可以有HTTP Accept header定义.
HTTP_USER_AGENT 递交表单的浏览器的名称、版本 和其他平台性的附加信息。
HTTP_REFERER 递交表单的文本的 URL,不是所有的浏览器都发出这个信息,不要依赖它
PATH_INFO 附加的路径信息, 由浏览器通过GET方法发出.
PATH_TRANSLATED 在PATH_INFO中系统规定的路径信息.
SCRIPT_NAME 指向这个CGI脚本的路径, 是在URL中显示的(如, /cgi-bin/thescript).
QUERY_STRING 脚本参数或者表单输入项(如果是用GET递交). QUERY_STRING 包含URL中问号后面的参数.
REMOTE_HOST 递交脚本的主机名,这个值不能被设置.
REMOTE_ADDR 递交脚本的主机IP地址.
REMOTE_USER 递交脚本的用户名. 如果服务器的authentication被激活,这个值可以设置。
REMOTE_IDENT 如果Web服务器是在ident (一种确认用户连接你的协议)运行, 递交表单的系统也在运行ident, 这个变量就含有ident返回值.
CONTENT_TYPE 如果表单是用POST递交, 这个值将是 application/x-www-form-urlencoded. 在上载文件的表单中, content-type 是个 multipart/form-data.
CONTENT_LENGTH 对于用POST递交的表单, 标准输入口的字节数.
通过查询Lua参考手册,得知Lua调用环境变量的函数为:
os.getenv(string) --string为环境变量的名称
让我们来继续测试,仍然在/www/cgi-bin
路径下,使用命令
vim hellowlua
修改为
#!/usr/bin/lua
print("Context-Type: text/plain\n")
print("your IP is "..os.getenv("REMOTE_ADDR"))
print("your querry is: "..os.getenv("QUERY_STRING"))
使用浏览器使用GET方法访问地址:
192.168.1.1/cgi-bin/hellolua?abc=123
页面将显示:
your IP is 192.168.1.102 your querry is: abc=123
如果需要调用模块上已经有的程序,可以通过以下Lua代码实现:
os.execute(string) --string为要执行的语句
如果要调用模块上的设备,需要使用Lua的IO读写相关函数
例如在模块“ttyATH0” 串口上输出字符串“test1”的代码:
io.output("/dev/ttyATH0");
io.write("test1");
至此,模块Lua脚本的部分测试结束
####LuCI部分
#####Luci程序的位置