AX5安装原生luci折腾记录
一、前言
AX5官方固件基于 Openwrt 18.06 Snapshot 修改;
小米官方固件web界面使用 nginx + 修改版luci 提供服务。
小米固件自带uhttpd,但没有使用。
期望目标:安装原生luci,且不影响小米web界面。
二、 实施步骤
2.1 手动下载ipk,解压文件
由于小米固件已经有修改版luci,因此不能使用opkg在线安装,否则会覆盖掉。
在 Openwrt官方源 下载如下ipk包,下面是列好的 luci 依赖情况(重复的已剔除)。
luci
-> libc
-> uhttpd
-> libubox
-> libblobmsg-json
-> libjson-c
-> libjson-script
-> luci-mod-admin-full
-> luci-base
-> lua
-> liblua
-> luci-lib-nixio
-> luci-lib-ip
-> libnl-tiny
-> luci-lib-jsonc
-> liblucihttp-lua
-> liblucihttp
-> libubus-lua
-> libubus
-> rpcd
-> libuci
-> luci-theme-bootstrap
-> luci-app-firewall
-> firewall
-> libip4tc 官方源没有
-> libip6tc 官方源没有
-> libxtables 官方源没有
-> kmod-ipt-core 官方源没有
-> kmod-ipt-conntrack 官方源没有
-> kmod-nf-conntrack6 官方源没有
-> kmod-ipt-nat 官方源没有
-> luci-proto-ppp
-> luci-proto-ipv6
-> rpcd-mod-rrdns
-> libiwinfo-lua 官方源没有(官方源21.02的有,19.07、18.06等都没有)
主要需要下载的是:
luci-mod-admin-full、luci-base、luci-lib-nixio、luci-lib-ip、luci-lib-jsonc、liblucihttp-lua、liblucihttp、luci-theme-bootstrap、luci-app-firewall、luci-proto-ppp、luci-proto-ipv6
下载到自己电脑后,然后把每个包里面的data解压出来,按照路径合并到一起。
大概会得到类似下面的文件夹 (我下载了所有能下的包,用来尝试)
etc
config
hotplug.d
init.d
luci-uploads
uci-defaults
lib
sbin
usr
bin
lib
sbin
share
www
cgi-bin
luci-static
2.2 修改文件
把下面代码添加到 usr/lib/lua/luci/sgi/uhttpd.lua 开头,也就是 require 语句前面。
if ( not string.find(package.path, "/data/usr/lib/lua/?.lua") )
then
package.path="./?.lua;/data/usr/lib/lua/?.lua;/usr/share/lua/?.lua;/usr/share/lua/?/init.lua;/usr/lib/lua/?.lua;/usr/lib/lua/?/init.lua"
end
if ( not string.find(package.cpath, "/data/usr/lib/lua/?.so") )
then
package.cpath="./?.so;/data/usr/lib/lua/?.so;/usr/lib/lua/?.so;/usr/lib/lua/loadall.so"
end
这个操作是手动指定lua库搜索路径,因为我们自己的luci相关lua文件将来是在 /data/usr/lib/lua/luci下的。要让他优先用我们自己的,没有的再去 /usr/lib/lua 下面找(也就是使用小米固件中的一部分库)
同样的操作对 usr/lib/lua/luci/sgi/cgi.lua 、www/cgi-bin/luci 也加上。
把 www/cgi-bin/luci 中 luci.dispatcher.indexcache = "/tmp/luci-indexcache"
改个名字,例如:luci.dispatcher.indexcache = "/tmp/luci-indexcache_forme"
把 etc/config/luci 重命名为 luci_op,防止和小米的luci冲突
把 usr/lib/lua/luci/config.lua 中,get_all("luci", key)
改为 get_all("luci_op", key)
把 etc/uci-defaults/30_luci-theme-bootstrap、etc/uci_defaults/50_luci-mod-admin-full 中的uci 语句中 的luci 配置项 替换为 luci_op
编辑 etc/config/uhttpd,替换为以下内容。
config uhttpd 'main'
list listen_http '0.0.0.0:678'
list listen_http '[::]:678'
list listen_https '0.0.0.0:789'
list listen_https '[::]:789'
option redirect_https '0'
option home '/data/www'
option rfc1918_filter '1'
option max_connections '100'
option cert '/etc/uhttpd.crt'
option key '/etc/uhttpd.key'
option cgi_prefix '/cgi-bin'
list lua_prefix '/cgi-bin/luci=/data/usr/lib/lua/luci/sgi/uhttpd.lua'
option network_timeout '30'
option http_keepalive '20'
option tcp_keepalive '1'
option ubus_prefix '/ubus'
option ubus_socket '/var/run/ubus.sock'
option script_timeout '3600'
list index_page 'cgi-bin/luci'
option max_requests '50'
config cert 'defaults'
option days '730'
option key_type 'ec'
option bits '2048'
option ec_curve 'P-256'
option country 'ZZ'
option state 'Somewhere'
option location 'Unknown'
option commonname 'OpenWrt'
编辑 /etc/config/luci_op,把其中 option sessionpath "/tmp/luci-sessions"
改个名,例如:option sessionpath "/tmp/luci-sessions_forme"
2.3 复制文件到AX5
把整理好的文件(夹) 按照以下原则 全部复制到AX5。
- /etc/config/uhttpd 可以直接覆盖,因为小米固件不使用uhttpd。
- 本机 usr/lib/lua文件夹复制到 /data/usr/lib/lua
- 本机 www文件夹复制到 /data/www
- 其余文件按照对应路径复制到根目录下对应文件夹,小米固件已经有同名文件的,不要复制,跳过。
注意,二进制文件以及那些需要直接执行的脚本文件记得加上 可执行权限,不清楚的可无脑全加。
三、 测试
/etc/init.d/uhttpd restart
浏览器访问 http://192.168.31.1:678
结果:
勉强打开登陆页面,但是点击登陆没反应。
四、更新
尝试lighttpd,问题依然如上。
经过分析,是webserver没有正确把表单传递给luci脚本,在/data/usr/lib/lua/luci/dispatcher.lua中添加log输出,发现获取表单的 user、pass均为nil。
如何解决,还没有办法。