详细入门教程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中

版权声明:本文为gooutlook原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/gooutlook/p/10781414.html