(1)
详细入门教程https://gitee.com/pipicold/OpenwrtLuaController
openwrt使用uci C API获取和修改wifi密码
https://blog.csdn.net/qq_19004627/article/details/79641238
我的openwrt学习笔记(二十八)webserver之lighttpd
https://blog.csdn.net/xushx_bigbear/article/details/48379759
https://github.com/grasses/OpenWRT-Util/blob/master/shell/aps.sh
https://blog.csdn.net/hui523hui523hui523/article/details/38943693
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文本也可以是纯文本。
本文将利用C语言编写一个CGI应用程序,并分析了CGI程序设计的方法、过程、技巧。
https://gitee.com/pipicold/OpenwrtLuaController
####UCI简介
“uci”是”Unified Configuration Interface”(统一配置界面)的缩写,意在OpenWrt整个系统的配置集中化。
系统配置应容易,更直接且在此有文档描述,从而使你的生活更轻松!
(它是White Russian系列OpenWrt基于nvram的配置的后继改进。)
许多程序在系统某处拥有自己的配置文件,
比如/etc/network/interfaces, /etc/exports, /etc/dnsmasq.conf或者 /etc/samba/samba.conf,
有时它们还使用稍有不同的语法。
在OpenWrt中你无需为此烦恼,我们只需更改UCI配置文件!
不需要为了某个更改起效而重启系统。
####查找设置并修改实例
以修改wifi模块的ssid名称为例:
首先使用
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程序的位置
Luci的入口就在/www/cgi-bin/下的luci文件
但是它的主程序在/usr/lib/lua/luci中