diff --git a/CONTRIBUTED.md b/CONTRIBUTED.md
index 4b3ea3d128..7527b02139 100644
--- a/CONTRIBUTED.md
+++ b/CONTRIBUTED.md
@@ -34,6 +34,8 @@ luci-app-cupsd source: [F-Light/luci-app-cupsd](https://github.com/F-Light/luci-
ootoc-OpenWRT source: [ElonH/ootoc-OpenWRT](https://github.com/ElonH/ootoc-OpenWRT).
r8168 source: [BROBIRD/openwrt-r8168](https://github.com/BROBIRD/openwrt-r8168).
MentoHUST source: [KyleRicardo/MentoHUST-OpenWrt-ipk](https://github.com/KyleRicardo/MentoHUST-OpenWrt-ipk).
+luci-app-mentohust source: [BoringCat/luci-app-mentohust](https://github.com/BoringCat/luci-app-mentohust).
+luci-app-minieap source: [BoringCat/luci-app-minieap](https://github.com/BoringCat/luci-app-minieap).
scutclient source: [scutclient/scutclient](https://github.com/scutclient/scutclient).
luci-app-scutclient source: [scutclient/luci-app-scutclient](https://github.com/scutclient/luci-app-scutclient).
MT-Wifi 5.0.4.0: [MeIsReallyBa/mt7615-dbdc-linux5.4](https://github.com/MeIsReallyBa/mt7615-dbdc-linux5.4).
diff --git a/package/ctcgfw/luci-app-minieap/Makefile b/package/ctcgfw/luci-app-minieap/Makefile
new file mode 100644
index 0000000000..b34cfe877d
--- /dev/null
+++ b/package/ctcgfw/luci-app-minieap/Makefile
@@ -0,0 +1,13 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=luci-app-minieap
+PKG_VERSION=1.0.2
+PKG_RELEASE:=0
+
+LUCI_TITLE:=minieap 802.1X Client for LuCI
+LUCI_DESCRIPTION:=This package contains LuCI configuration pages for 8021xclient.
+LUCI_DEPENDS:=+minieap
+
+include $(TOPDIR)/feeds/luci/luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/package/ctcgfw/luci-app-minieap/luasrc/controller/minieap.lua b/package/ctcgfw/luci-app-minieap/luasrc/controller/minieap.lua
new file mode 100644
index 0000000000..16c11bd23e
--- /dev/null
+++ b/package/ctcgfw/luci-app-minieap/luasrc/controller/minieap.lua
@@ -0,0 +1,17 @@
+module("luci.controller.minieap", package.seeall)
+
+function index()
+ if not nixio.fs.access("/etc/config/minieap") then
+ return
+ end
+ if luci.sys.call("command -v minieap >/dev/null") ~= 0 then
+ return
+ end
+ entry({"admin", "services", "minieap"},
+ alias("admin", "services", "minieap", "general"),
+ _("minieap"), 10).dependent = true
+
+ entry({"admin", "services", "minieap", "general"}, cbi("minieap/general"), _("minieap Settings"), 10).leaf = true
+ -- entry({"admin", "services", "minieap", "customfile"}, cbi("minieap/customfile"), _("custom configfiles"), 20).leaf = true
+ entry({"admin", "services", "minieap", "log"}, cbi("minieap/log"), _("minieap LOG"), 30).leaf = true
+end
diff --git a/package/ctcgfw/luci-app-minieap/luasrc/model/cbi/minieap/customfile.lua b/package/ctcgfw/luci-app-minieap/luasrc/model/cbi/minieap/customfile.lua
new file mode 100644
index 0000000000..13484b1de2
--- /dev/null
+++ b/package/ctcgfw/luci-app-minieap/luasrc/model/cbi/minieap/customfile.lua
@@ -0,0 +1,8 @@
+
+require("luci.sys")
+
+local f = SimpleForm("minieap",
+ translate("minieap LOG"),
+ translate("Log file:/var/log/minieap.log"))
+
+return f
diff --git a/package/ctcgfw/luci-app-minieap/luasrc/model/cbi/minieap/general.lua b/package/ctcgfw/luci-app-minieap/luasrc/model/cbi/minieap/general.lua
new file mode 100644
index 0000000000..b238411d30
--- /dev/null
+++ b/package/ctcgfw/luci-app-minieap/luasrc/model/cbi/minieap/general.lua
@@ -0,0 +1,150 @@
+local function is_running(name)
+ if luci.sys.call("pidof %s >/dev/null" %{name}) == 0 then
+ return translate("RUNNING")
+ else
+ return translate("NOT RUNNING")
+ end
+end
+
+local function is_online(ipaddr)
+ if ipaddr == "0.0.0.0" or ipaddr == "nil" then
+ return translate("Pinghost not set")
+ end
+ if luci.sys.call("ping -c1 -w1 %s >/dev/null 2>&1" %{ipaddr}) == 0 then
+ return translate("ONLINE")
+ else
+ return translate("NOT ONLINE")
+ end
+end
+
+require("luci.sys")
+
+m = Map("minieap", translate("minieap"), translate("Configure minieap 802.11x."))
+
+s = m:section(TypedSection, "minieap", translate("Status"))
+s.anonymous = true
+status = s:option(DummyValue,"_minieap_status", "minieap")
+status.value = "%s" %{is_running("minieap")}
+status.rawhtml = true
+t = io.popen('uci get minieap.@minieap[0].pinghost')
+netstat=is_online(tostring(t:read("*line")))
+t:close()
+if netstat ~= "" then
+netstatus = s:option(DummyValue,"_network_status", translate("Network Status"))
+netstatus.value = "%s" %{netstat}
+netstatus.rawhtml = true
+end
+
+o = m:section(TypedSection, "minieap", translate("Settings"))
+o.addremove = false
+o.anonymous = true
+
+o:tab("base", translate("Normal Settings"))
+o:tab("advanced", translate("Advanced Settings"))
+o:tab("plugins", translate("Plugins List"))
+o:tab("ruijie", translate("Ruijie EAP Settings"))
+
+enable = o:taboption("base", Flag, "enable", translate("Enable"))
+name = o:taboption("base", Value, "username", translate("Username"),translate("The username given to you by your network administrator"))
+pass = o:taboption("base", Value, "password", translate("Password"), translate("The password you set or given to you by your network administrator"))
+pass.password = true
+
+ifname = o:taboption("base", ListValue, "nic", translate("Interfaces"), translate("Physical interface of WAN"))
+for k, v in ipairs(luci.sys.net.devices()) do
+ if v ~= "lo" then
+ ifname:value(v)
+ end
+end
+
+pinghost = o:taboption("base", Value, "pinghost", translate("PingHost"), translate("Ping host for drop detection, 0.0.0.0 to turn off this feature."))
+pinghost.default = "0.0.0.0"
+
+pingintval = o:taboption("base", Value, "pingintval", translate("Ping intval"), translate("Interval of each ping. (in second) [default: 30]"))
+pingintval.default = "30"
+
+pingcommand = o:taboption("base", Value, "pingcommand", translate("Offline command"), translate("Run Command when ping failed. [default: minieap -k 1]"))
+pingcommand:value("minieap -k 1")
+pingcommand.default = "minieap -k 1"
+
+stage_timeout = o:taboption("advanced", Value, "stage_timeout", translate("Auth Timeout"), translate("802.11X auth timeout (in second). [default: 5]"))
+stage_timeout.default = "5"
+
+wait_after_fail = o:taboption("advanced", Value, "wait_after_fail", translate("Wait after failed"), translate("Wait time between failed and next time (in second). [default: 30]"))
+wait_after_fail.default = "30"
+
+max_fail = o:taboption("advanced", Value, "max_fail", translate("Max fail"), translate("Maximum allowed number of failures. [default: 3]"))
+max_fail.default = "3"
+
+no_auto_reauth = o:taboption("advanced", ListValue, "no_auto_reauth", translate("Disable auto reauth"), translate("Disable auto reauth after offline. [default: True]"))
+no_auto_reauth:value(0, translate("False"))
+no_auto_reauth:value(1, translate("True"))
+no_auto_reauth.default = 1
+
+proxy_lan_iface = o:taboption("advanced", Value, "proxy_lan_iface", translate("Proxy LAN's name"), translate("Name of LAN interface when use proxy auth. [default: None]"))
+proxy_lan_iface.default = ""
+
+auth_round = o:taboption("advanced", Value, "auth_round", translate("Auth times"), translate("Number of times required for auth. [default: 1]"))
+auth_round.default = "1"
+
+max_retries = o:taboption("advanced", Value, "max_retries", translate("Max timeout"), translate("Maximum retry time after timeout. [default: 3]"))
+max_retries.default = "3"
+
+pid_file = o:taboption("advanced", Value, "pid_file", translate("PID file"), translate("Path of PID file. (Set 'None' to disable) [default: /var/run/minieap.pid]"))
+pid_file:value("/var/run/minieap.pid")
+pid_file.default = "/var/run/minieap.pid"
+
+if_impl = o:taboption("advanced", ListValue, "if_impl", translate("Network Module"), translate("Network module for send and recv packages (openwrt support sockraw only)"))
+if_impl:value("sockraw")
+if_impl.default = "sockraw"
+
+plugins = o:taboption("plugins", DynamicList, "module", translate("Plugins list"), translate("Packets flow through these plug-ins in sequence. Pay attention to the order in the environment where the package plug-in is modified"))
+plugins:value("printer", translate("printer: Print length of packets"))
+plugins:value("rjv3", translate('rjv3: Ruijie 802.11X. Support V3 verification algorithm'))
+
+heartbeat = o:taboption("ruijie", Value, "heartbeat", translate("Heartbeat interval"), translate("Interval for sending Heartbeat packets (seconds) [Default: 60]"))
+heartbeat.default = "60"
+
+eap_bcast_addr = o:taboption("ruijie", ListValue, "eap_bcast_addr", translate("Broadcast address"), translate("Broadcast address type when searching for servers [Default: Standard]"))
+eap_bcast_addr:value(0, translate("Standard"))
+eap_bcast_addr:value(1, translate("Ruijie private"))
+eap_bcast_addr.default = 0
+
+dhcp_type = o:taboption("ruijie", ListValue, "dhcp_type", translate("DhcpMode"), translate("DHCP method [Default: After certification]"))
+dhcp_type:value(0, translate("None"))
+dhcp_type:value(1, translate("Secondary authentication"))
+dhcp_type:value(2, translate("Before certification"))
+dhcp_type:value(3, translate("After certification"))
+dhcp_type.default = 3
+
+dhcp_script = o:taboption("ruijie", Value, "dhcp_script", translate("DhcpScript"), translate("DHCP script [Default: None]"))
+dhcp_script.default = ""
+
+service = o:taboption("ruijie", Value, "service", translate("Service"), translate("Service From Ruijie Server [Default: internet]"))
+service.default = "internet"
+
+version_str = o:taboption("ruijie", Value, "version_str", translate("Version String"), translate("Custom version [Default: RG-SU For Linux V1.0]"))
+version_str:value("RG-SU For Linux V1.0")
+version_str.default = "RG-SU For Linux V1.0"
+
+fake_dns1 = o:taboption("ruijie", Value, "fake_dns1", translate("Main DNS server"), translate("Custom main DNS server [Default: FromSystem]"))
+
+fake_dns2 = o:taboption("ruijie", Value, "fake_dns2", translate("Second DNS server"), translate("Custom second DNS server [Default: FromSystem]"))
+
+fake_serial = o:taboption("ruijie", Value, "fake_serial", translate("Disk serial"), translate("Custom disk serial [Default: From /etc/mtab]"))
+
+max_dhcp_count = o:taboption("ruijie", Value, "max_dhcp_count", translate("DHCP try times"), translate("DHCP try times [Default: 3]"))
+max_dhcp_count.default = "3"
+
+rj_option = o:taboption("ruijie", DynamicList, "rj_option", translate("Custom EAP Options"), translate("Format <type>:<value>[:r]. Add a option type: <type>, value: <value>. :r for replace"))
+
+if nixio.fs.mkdir("/etc/minieap.conf.d") == true then
+ nixio.fs.symlink("/etc/minieap.conf.d/minieap.conf.utf8", "/etc/minieap.conf")
+end
+
+local apply = luci.http.formvalue("cbi.apply")
+if apply then
+ luci.sys.call("minieap-conver | sort > /etc/minieap.conf.d/minieap.conf.utf8")
+ io.popen("/etc/init.d/minieap restart")
+end
+
+return m
diff --git a/package/ctcgfw/luci-app-minieap/luasrc/model/cbi/minieap/log.lua b/package/ctcgfw/luci-app-minieap/luasrc/model/cbi/minieap/log.lua
new file mode 100644
index 0000000000..c45c1d81af
--- /dev/null
+++ b/package/ctcgfw/luci-app-minieap/luasrc/model/cbi/minieap/log.lua
@@ -0,0 +1,23 @@
+local fs = require "nixio.fs"
+
+local f = SimpleForm("minieap",
+ translate("minieap LOG"),
+ translate("Log file:/var/log/minieap.log"))
+
+local o = f:field(Value, "minieap_log")
+
+o.template = "cbi/tvalue"
+o.rows = 32
+
+function o.cfgvalue(self, section)
+ return fs.readfile("/var/log/minieap.log")
+end
+
+function o.write(self, section, value)
+ require("luci.sys").call('cat /dev/null > /var/log/minieap.log 2>/dev/null')
+end
+
+f.submit = translate("Clear log")
+f.reset = false
+
+return f
diff --git a/package/ctcgfw/luci-app-minieap/po/zh_Hans/minieap.po b/package/ctcgfw/luci-app-minieap/po/zh_Hans/minieap.po
new file mode 100644
index 0000000000..e365eade64
--- /dev/null
+++ b/package/ctcgfw/luci-app-minieap/po/zh_Hans/minieap.po
@@ -0,0 +1,227 @@
+msgid "minieap Settings"
+msgstr "minieap 设置"
+
+msgid "minieap LOG"
+msgstr "minieap 日志"
+
+msgid "Log file:/var/log/minieap.log"
+msgstr "日志文件: /var/log/minieap.log"
+
+msgid "RUNNING"
+msgstr "运行中"
+
+msgid "NOT RUNNING"
+msgstr "未运行"
+
+msgid "Pinghost not set"
+msgstr "没有设置Ping主机"
+
+msgid "ONLINE"
+msgstr "能访问互联网"
+
+msgid "NOT ONLINE"
+msgstr "不能访问互联网"
+
+msgid "Configure minieap 802.11x."
+msgstr "配置minieap 802.11x验证。"
+
+msgid "Network Status"
+msgstr "网络状态"
+
+msgid "Settings"
+msgstr "设置"
+
+msgid "Normal Settings"
+msgstr "常规设置"
+
+msgid "Plugins List"
+msgstr "插件列表"
+
+msgid "Ruijie EAP Settings"
+msgstr "锐捷认证设置"
+
+msgid "The username given to you by your network administrator"
+msgstr "您的用户名(或管理员分配的用户名)"
+
+msgid "The password you set or given to you by your network administrator"
+msgstr "您的密码(或管理员分配的密码)"
+
+msgid "Physical interface of WAN"
+msgstr "WAN口的物理接口"
+
+msgid "PingHost"
+msgstr "Ping主机"
+
+msgid "Ping host for drop detection, 0.0.0.0 to turn off this feature."
+msgstr "Ping主机,用于掉线检测,0.0.0.0表示关闭该功能"
+
+msgid "Packets flow through these plug-ins in sequence. Pay attention to the order in the environment where the package plug-in is modified"
+msgstr "数据包会按顺序流经这些插件。在有修改数据包插件的环境中请注意顺序"
+
+msgid "printer: Print length of packets"
+msgstr "printer:打印流入流出数据包的大小"
+
+msgid "rjv3: Ruijie 802.11X. Support V3 verification algorithm"
+msgstr "rjv3:锐捷认证,支持V3算法"
+
+msgid "Heartbeat interval"
+msgstr "心跳间隔"
+
+msgid "Interval for sending Heartbeat packets (seconds) [Default: 60]"
+msgstr "发送心跳包的间隔(秒)[默认:60]"
+
+msgid "Broadcast address"
+msgstr "广播地址类型"
+
+msgid "Broadcast address type when searching for servers [Default: Standard]"
+msgstr "寻找服务器时的广播地址类型 [默认:标准]"
+
+msgid "Standard"
+msgstr "标准"
+
+msgid "Ruijie private"
+msgstr "锐捷私有"
+
+msgid "DhcpMode"
+msgstr "DHCP方式"
+
+msgid "DHCP method [Default: After certification]"
+msgstr "DHCP方式 [默认:认证后]"
+
+msgid "None"
+msgstr "无"
+
+msgid "Secondary authentication"
+msgstr "二次认证"
+
+msgid "Before certification"
+msgstr "认证前"
+
+msgid "After certification"
+msgstr "认证后"
+
+msgid "DhcpScript"
+msgstr "DHCP脚本"
+
+msgid "DHCP script [Default: None]"
+msgstr "DHCP脚本 [默认:无]"
+
+msgid "Service"
+msgstr "服务"
+
+msgid "Service From Ruijie Server [Default: internet]"
+msgstr "锐捷认证服务器上配置的用户服务"
+
+msgid "Version String"
+msgstr "版本信息"
+
+msgid "Custom version [Default: RG-SU For Linux V1.0]"
+msgstr "自定义版本信息 [默认:RG-SU For Linux V1.0]"
+
+msgid "Main DNS server"
+msgstr "主DNS服务器"
+
+msgid "Custom main DNS server [Default: FromSystem]"
+msgstr "自定义主DNS服务器 [默认:自动获取]"
+
+msgid "Second DNS server"
+msgstr "从DNS服务器"
+
+msgid "Custom second DNS server [Default: FromSystem]"
+msgstr "自定义从DNS服务器 [默认:自动获取]"
+
+msgid "Disk serial"
+msgstr "磁盘序列号"
+
+msgid "Custom disk serial [Default: From /etc/mtab]"
+msgstr "自定义磁盘序列号 [默认:自动获取]"
+
+msgid "DHCP try times"
+msgstr "DHCP尝试次数"
+
+msgid "DHCP try times [Default: 3]"
+msgstr "二次认证的DHCP尝试次数 [默认:3]"
+
+msgid "Custom EAP Options"
+msgstr "自定义EAP字段"
+
+msgid "Format <type>:<value>[:r]. Add a option type: <type>, value: <value>. :r for replace"
+msgstr "格式: <type>:<value>[:r]。 不带r为增加字段,带r为替换字段"
+
+msgid "Configfile encoding"
+msgstr "配置文件编码"
+
+msgid "Auth Timeout"
+msgstr "认证超时"
+
+msgid "802.11X auth timeout (in second). [default: 5]"
+msgstr "单个认证阶段的超时时间 [默认:5]"
+
+msgid "Wait after failed"
+msgstr "认证失败等待"
+
+msgid "Wait time between failed and next time (in second). [default: 30]"
+msgstr "认证失败后重新认证前的等待时间[默认:30]"
+
+msgid "Max fail"
+msgstr "最大失败次数"
+
+msgid "Maximum allowed number of failures. [default: 3]"
+msgstr "最大允许认证失败次数 [默认:3]"
+
+msgid "Disable auto reauth"
+msgstr "禁止自动重连"
+
+msgid "Disable auto reauth after offline. [default: True]"
+msgstr "认证掉线后不允许自动重连 [默认:是]"
+
+msgid "False"
+msgstr "否"
+
+msgid "True"
+msgstr "是"
+
+msgid "Daemon mode"
+msgstr "运行模式"
+
+msgid "Proxy LAN's name"
+msgstr "代理LAN口名称"
+
+msgid "Name of LAN interface when use proxy auth. [default: None]"
+msgstr "代理认证时的 LAN 网络界面名 [默认:无]"
+
+msgid "Auth times"
+msgstr "认证次数"
+
+msgid "Number of times required for auth. [default: 1]"
+msgstr "需要认证的次数 [默认:1]"
+
+msgid "Max timeout"
+msgstr "最大超时重试"
+
+msgid "Maximum retry time after timeout. [default: 3]"
+msgstr "最大超时重试的次数 [默认:3]"
+
+msgid "PID file"
+msgstr "PID文件"
+
+msgid "Path of PID file. (Set 'None' to disable) [default: /var/run/minieap.pid]"
+msgstr "PID 文件路径,设为none可禁用 [默认:/var/run/minieap.pid]"
+
+msgid "Network Module"
+msgstr "网络操作模块"
+
+msgid "Network module for send and recv packages (openwrt support sockraw only)"
+msgstr "选择此网络操作模块(openwrt只支持sockraw)"
+
+msgid "Ping intval"
+msgstr "Ping间隔"
+
+msgid "Interval of each ping. (in second) [default: 30]"
+msgstr "Ping Ping主机的间隔(秒) [默认:30]"
+
+msgid "Offline command"
+msgstr "掉线执行命令"
+
+msgid "Run Command when ping failed. [default: minieap -k 1]"
+msgstr "Ping 检测到掉线后执行的命令 [默认: minieap -k 1]"
diff --git a/package/ctcgfw/luci-app-minieap/root/etc/config/minieap b/package/ctcgfw/luci-app-minieap/root/etc/config/minieap
new file mode 100644
index 0000000000..cf4cdbadba
--- /dev/null
+++ b/package/ctcgfw/luci-app-minieap/root/etc/config/minieap
@@ -0,0 +1,18 @@
+config minieap
+ option pinghost '0.0.0.0'
+ option pingintval '30'
+ option pingcommand 'minieap -k 1'
+ option stage_timeout '5'
+ option wait_after_fail '30'
+ option max_fail '3'
+ option no_auto_reauth '1'
+ option auth_round '1'
+ option max_retries '3'
+ option pid_file '/var/run/minieap.pid'
+ option if_impl 'sockraw'
+ option heartbeat '60'
+ option eap_bcast_addr '0'
+ option dhcp_type '3'
+ option service 'internet'
+ option version_str 'RG-SU For Linux V1.0'
+ option max_dhcp_count '3'
diff --git a/package/ctcgfw/luci-app-minieap/root/etc/init.d/minieap b/package/ctcgfw/luci-app-minieap/root/etc/init.d/minieap
new file mode 100644
index 0000000000..9e2f5ec97e
--- /dev/null
+++ b/package/ctcgfw/luci-app-minieap/root/etc/init.d/minieap
@@ -0,0 +1,67 @@
+#!/bin/sh /etc/rc.common
+START=90
+
+run_minieap()
+{
+ kill $(cat /var/log/minieap-ping.pid 2>/dev/null) 2>/dev/null
+ local enable
+ local username
+ local password
+ local nic
+ local pinghost
+ config_get_bool enable $1 enable
+ config_get username $1 username
+ config_get password $1 password
+ config_get nic $1 nic
+ config_get pinghost $1 pinghost
+
+ if [ $enable ] && [ $username ] && [ $password ] && [ $nic ]; then
+ if [ $pinghost ]; then
+ /bin/ash -c "/usr/sbin/minieap-ping &"
+ fi
+ /bin/ash -c "minieap -b3"
+ else
+ /bin/ash -c "minieap -k"
+ fi
+}
+
+restart_minieap()
+{
+ kill $(cat /var/log/minieap-ping.pid 2>/dev/null) 2>/dev/null
+ local enable
+ local username
+ local password
+ local nic
+ local pinghost
+ config_get_bool enable $1 enable
+ config_get username $1 username
+ config_get password $1 password
+ config_get nic $1 nic
+ config_get pinghost $1 pinghost
+ if [ $enable ] && [ $username ] && [ $password ] && [ $nic ]; then
+ if [ $pinghost ]; then
+ /bin/ash -c "/usr/sbin/minieap-ping &"
+ fi
+ /bin/ash -c "minieap -k 1"
+ else
+ /bin/ash -c "minieap -k"
+ fi
+}
+
+start()
+{
+ config_load minieap
+ config_foreach run_minieap minieap
+}
+
+stop()
+{
+ kill $(cat /var/log/minieap-ping.pid 2>/dev/null) 2>/dev/null
+ /bin/ash -c "minieap -k"
+}
+
+restart()
+{
+ config_load minieap
+ config_foreach restart_minieap minieap
+}
diff --git a/package/ctcgfw/luci-app-minieap/root/usr/sbin/minieap-conver b/package/ctcgfw/luci-app-minieap/root/usr/sbin/minieap-conver
new file mode 100644
index 0000000000..2b2cc35c10
--- /dev/null
+++ b/package/ctcgfw/luci-app-minieap/root/usr/sbin/minieap-conver
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+default_config='''daemonize=3
+'''
+
+echo $default_config
+config_keys=$(uci show minieap | cut -d "." -f3- | awk -F "=" '{if ($0 != "") print $1}')
+for key in $config_keys
+do
+ if [[ "$key" != "pinghost" ]] && [[ "$key" != "pingintval" ]]; then
+ echo ${key//_/-}=$(uci get minieap.@minieap[0].$key)
+ fi
+done
diff --git a/package/ctcgfw/luci-app-minieap/root/usr/sbin/minieap-ping b/package/ctcgfw/luci-app-minieap/root/usr/sbin/minieap-ping
new file mode 100644
index 0000000000..fb56f2902e
--- /dev/null
+++ b/package/ctcgfw/luci-app-minieap/root/usr/sbin/minieap-ping
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+kill $(cat /var/log/minieap-ping.pid 2>/dev/null) 2>/dev/null
+
+echo $$ > /var/log/minieap-ping.pid
+
+ping_host=$(uci get minieap.@minieap[0].pinghost)
+ping_intval=$(uci get minieap.@minieap[0].pingintval)
+ping_command=$(uci get minieap.@minieap[0].pingcommand)
+ipint=$(echo $ping_host | awk -F "." '{print $1*2**8**3 + $2*2**8**2 + $3*2**8 + $4}')
+if [[ $ipint -le 0 ]] || [[ $ipint -ge 4294967295 ]]; then
+ exit
+fi
+
+if [ ! -z $ping_host ]; then
+ while true
+ do
+ ping -c1 -w1 $ping_host > /dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ $ping_command
+ fi
+ sleep $ping_intval
+ done
+fi
diff --git a/package/ctcgfw/luci-app-minieap/root/usr/share/rpcd/acl.d/luci-app-minieap.json b/package/ctcgfw/luci-app-minieap/root/usr/share/rpcd/acl.d/luci-app-minieap.json
new file mode 100644
index 0000000000..f897478a3f
--- /dev/null
+++ b/package/ctcgfw/luci-app-minieap/root/usr/share/rpcd/acl.d/luci-app-minieap.json
@@ -0,0 +1,11 @@
+{
+ "luci-app-minieap": {
+ "description": "Grant UCI access for luci-app-minieap",
+ "read": {
+ "uci": [ "minieap" ]
+ },
+ "write": {
+ "uci": [ "minieap" ]
+ }
+ }
+}