diff --git a/CONTRIBUTED.md b/CONTRIBUTED.md
index 42dc7e34a0..b445987448 100644
--- a/CONTRIBUTED.md
+++ b/CONTRIBUTED.md
@@ -60,7 +60,8 @@ luci-theme-edge source: [garypang13/luci-theme-edge](https://github.com//garypan
luci-app-beardropper source: [NateLol/natelol](https://github.com/NateLol/natelol).
luci-app-vssr source: [jerrykuku/luci-app-vssr](https://github.com/jerrykuku/luci-app-vssr).
luci-proto-modemmanager source: [nickberry17/luci-proto-modemmanager](https://github.com/nickberry17/luci-proto-modemmanager).
-luci-theme-infinityfreedom source: [xiaoqingfengATGH/luci-theme-infinityfreedom](https://github.com/xiaoqingfengATGH/luci-theme-infinityfreedom).
+luci-theme-infinityfreedom source: [xiaoqingfengATGH/luci-theme-infinityfreedom](https://github.com/xiaoqingfengATGH/luci-theme-infinityfreedom).
+luci-proto-minieap source: [ysc3839/luci-proto-minieap](https://github.com/ysc3839/luci-proto-minieap).
## License
### Depend on their own License.
diff --git a/package/ctcgfw/luci-app-openclash/Makefile b/package/ctcgfw/luci-app-openclash/Makefile
index 4f61615af6..25cbdb543a 100644
--- a/package/ctcgfw/luci-app-openclash/Makefile
+++ b/package/ctcgfw/luci-app-openclash/Makefile
@@ -1,7 +1,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-openclash
-PKG_VERSION:=0.41.12
+PKG_VERSION:=0.41.13
PKG_RELEASE:=beta
PKG_MAINTAINER:=vernesong
diff --git a/package/ctcgfw/luci-app-openclash/luasrc/controller/openclash.lua b/package/ctcgfw/luci-app-openclash/luasrc/controller/openclash.lua
index 2b7c304fd6..9c625fe284 100644
--- a/package/ctcgfw/luci-app-openclash/luasrc/controller/openclash.lua
+++ b/package/ctcgfw/luci-app-openclash/luasrc/controller/openclash.lua
@@ -462,6 +462,6 @@ function action_refresh_log()
end
function action_del_log()
- luci.sys.exec("echo '' > /tmp/openclash.log")
+ luci.sys.exec(": > /tmp/openclash.log")
return
end
\ No newline at end of file
diff --git a/package/ctcgfw/luci-app-openclash/luasrc/model/cbi/openclash/settings.lua b/package/ctcgfw/luci-app-openclash/luasrc/model/cbi/openclash/settings.lua
index 826b27d97a..f12c59e065 100644
--- a/package/ctcgfw/luci-app-openclash/luasrc/model/cbi/openclash/settings.lua
+++ b/package/ctcgfw/luci-app-openclash/luasrc/model/cbi/openclash/settings.lua
@@ -57,7 +57,7 @@ o = s:taboption("op_mode", Flag, "enable_udp_proxy", font_red..bold_on..translat
o.description = translate("Select Mode For UDP Traffics, The Servers Must Support UDP while Choose Proxy")
o:depends("en_mode", "redir-host")
o:depends("en_mode", "fake-ip")
-o.default = "1"
+o.default=1
o = s:taboption("op_mode", ListValue, "stack_type", translate("Select Stack Type"))
o.description = translate("Select Stack Type For Tun Mode, According To The Running Speed on Your Machine")
@@ -83,7 +83,7 @@ o.default=0
o = s:taboption("op_mode", Flag, "common_ports", font_red..bold_on..translate("Common Ports Proxy Mode")..bold_off..font_off)
o.description = translate("Only Common Ports, Prevent BT/P2P Passing")
-o.default = "0"
+o.default=0
o:depends("en_mode", "redir-host")
o:depends("en_mode", "redir-host-tun")
o:depends("en_mode", "redir-host-vpn")
@@ -91,7 +91,7 @@ o:depends("en_mode", "redir-host-mix")
o = s:taboption("op_mode", Flag, "china_ip_route", translate("China IP Route"))
o.description = translate("Bypass The China Network Flows, Improve Performance")
-o.default = "0"
+o.default=0
o:depends("en_mode", "redir-host")
o:depends("en_mode", "redir-host-tun")
o:depends("en_mode", "redir-host-vpn")
@@ -99,7 +99,7 @@ o:depends("en_mode", "redir-host-mix")
o = s:taboption("op_mode", Flag, "small_flash_memory", translate("Small Flash Memory"))
o.description = translate("Move Core And GEOIP Data File To /tmp/etc/openclash For Small Flash Memory Device")
-o.default = "0"
+o.default=0
---- Operation Mode
switch_mode = s:taboption("op_mode", DummyValue, "", nil)
@@ -145,7 +145,7 @@ o.default = "silent"
o = s:taboption("settings", Flag, "intranet_allowed", translate("Only intranet allowed"))
o.description = translate("When Enabled, The Control Panel And The Connection Broker Port Will Not Be Accessible From The Public Network")
-o.default = 0
+o.default=0
o = s:taboption("settings", Value, "proxy_port")
o.title = translate("Redir Port")
@@ -178,11 +178,11 @@ o.description = translate("Please Make Sure Ports Available")
---- DNS Settings
o = s:taboption("dns", Flag, "enable_redirect_dns", font_red..bold_on..translate("Redirect Local DNS Setting")..bold_off..font_off)
o.description = translate("Set Local DNS Redirect")
-o.default = 1
+o.default=1
o = s:taboption("dns", Flag, "enable_custom_dns", font_red..bold_on..translate("Custom DNS Setting")..bold_off..font_off)
o.description = font_red..bold_on..translate("Set OpenClash Upstream DNS Resolve Server")..bold_off..font_off
-o.default = 0
+o.default=0
o = s:taboption("dns", Flag, "ipv6_enable", translate("Enable ipv6 Resolve"))
o.description = font_red..bold_on..translate("Enable Clash to Resolve ipv6 DNS Requests")..bold_off..font_off
@@ -300,7 +300,7 @@ o.description = translate("In The Fake-IP Mode, Only Pure IP Requests Are Suppor
---- Rules Settings
o = s:taboption("rules", Flag, "rule_source", translate("Enable Other Rules"))
o.description = translate("Use Other Rules")
-o.default = 0
+o.default=0
if op_mode == "fake-ip" then
o = s:taboption("rules", Flag, "enable_custom_clash_rules", font_red..bold_on..translate("Custom Clash Rules(Access Control)")..bold_off..font_off)
@@ -308,7 +308,7 @@ else
o = s:taboption("rules", Flag, "enable_custom_clash_rules", font_red..bold_on..translate("Custom Clash Rules")..bold_off..font_off)
end
o.description = translate("Use Custom Rules")
-o.default = 0
+o.default=0
custom_rules = s:taboption("rules", Value, "custom_rules")
custom_rules:depends("enable_custom_clash_rules", 1)
diff --git a/package/ctcgfw/luci-app-openclash/luasrc/view/openclash/log.htm b/package/ctcgfw/luci-app-openclash/luasrc/view/openclash/log.htm
index 208fce667c..c6cbe2ef5b 100644
--- a/package/ctcgfw/luci-app-openclash/luasrc/view/openclash/log.htm
+++ b/package/ctcgfw/luci-app-openclash/luasrc/view/openclash/log.htm
@@ -52,7 +52,7 @@ function line_tolocal(str){
}else{
strt[i]=v;}})
var old_log_line = sessionStorage.log_line;
- if ( old_log_line != null) {
+ if ( old_log_line != null && strt.length != null ) {
if (old_log_line - strt.length < 0) {
sessionStorage.log_line = strt.length;
return strt.slice('-'+(strt.length-old_log_line))
@@ -68,11 +68,14 @@ function line_tolocal(str){
return strt
}
}
+ else if ( strt.length != null ) {
+ sessionStorage.log_line = strt.length;
+ return strt
+ }
else {
- sessionStorage.log_line = strt.length;
- return strt
- }
-
+ sessionStorage.log_line = "0";
+ return strt
+ }
}
function poll_log(){
diff --git a/package/ctcgfw/luci-app-openclash/root/etc/init.d/openclash b/package/ctcgfw/luci-app-openclash/root/etc/init.d/openclash
index 2986b5e9e3..4d790de579 100644
--- a/package/ctcgfw/luci-app-openclash/root/etc/init.d/openclash
+++ b/package/ctcgfw/luci-app-openclash/root/etc/init.d/openclash
@@ -922,15 +922,10 @@ do_run_file()
nohup /usr/share/openclash/openclash_core.sh "$core_type" &
}
- if [ "$china_ip_route" = "1" ]; then
- if [ ! -f "$chnr_path" ]; then
- echo "检测到大陆白名单列表不存在,准备开始下载..." >$START_LOG
- nofile=1
- nohup /usr/share/openclash/openclash_chnroute.sh &
- else
- ipset -! flush china_ip_route 2>/dev/null
- ipset -! restore /dev/null
- fi
+ if [ "$china_ip_route" = "1" ] && [ ! -f "$chnr_path" ]; then
+ echo "检测到大陆白名单列表不存在,准备开始下载..." >$START_LOG
+ nofile=1
+ nohup /usr/share/openclash/openclash_chnroute.sh &
fi
if [ "$nofile" = "1" ]; then
@@ -1238,6 +1233,11 @@ cat > "/var/etc/openclash.include" <<-EOF
/etc/init.d/openclash reload >/dev/null 2>&1
EOF
+if [ "$china_ip_route" = "1" ] && [ -f "/etc/openclash/china_ip_route.ipset" ]; then
+ ipset -! flush china_ip_route 2>/dev/null
+ ipset -! restore /dev/null
+fi
+
#lan_ac
if [ "$operation_mode" = "redir-host" ] && [ "$en_mode" = "redir-host" ]; then
if [ "$lan_ac_mode" = "0" ]; then
@@ -1356,7 +1356,7 @@ if [ -z "$en_mode_tun" ] || [ "$en_mode_tun" -eq 3 ]; then
fi
iptables -t nat -A openclash_output -m owner ! --uid-owner 65534 -m set ! --match-set common_ports dst -j RETURN >/dev/null 2>&1
if [ "$en_mode" = "redir-host" ]; then
- iptables -t mangle -A openclash -m set --match-set china_ip_route dst -j RETURN >/dev/null 2>&1
+ iptables -t nat -A openclash_output -m set --match-set china_ip_route dst -j RETURN >/dev/null 2>&1
fi
if [ "$intranet_allowed" -eq 1 ]; then
iptables -t nat -A openclash_output -m owner ! --uid-owner 65534 -p tcp -j DNAT --to-destination "$lan_ip:$proxy_port"
diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_debug.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_debug.sh
index d35acb57b4..1ad80e9531 100755
--- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_debug.sh
+++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_debug.sh
@@ -73,6 +73,7 @@ EOF
cat >> "$DEBUG_LOG" <<-EOF
#===================== 系统信息 =====================#
+
主机型号: $(cat /tmp/sysinfo/model 2>/dev/null)
固件版本: $(cat /usr/lib/os-release 2>/dev/null |grep OPENWRT_RELEASE 2>/dev/null |awk -F '"' '{print $2}' 2>/dev/null)
LuCI版本: $(opkg status luci 2>/dev/null |grep 'Version' |awk -F ': ' '{print $2}' 2>/dev/null)
@@ -92,6 +93,7 @@ EOF
cat >> "$DEBUG_LOG" <<-EOF
#===================== 依赖检查 =====================#
+
dnsmasq-full: $(ts_re "$(opkg status dnsmasq-full 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
coreutils: $(ts_re "$(opkg status coreutils 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
coreutils-nohup: $(ts_re "$(opkg status coreutils-nohup 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
@@ -102,11 +104,16 @@ ca-certificates: $(ts_re "$(opkg status ca-certificates 2>/dev/null |grep 'Statu
ipset: $(ts_re "$(opkg status ipset 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
ip-full: $(ts_re "$(opkg status ip-full 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
iptables-mod-tproxy: $(ts_re "$(opkg status iptables-mod-tproxy 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
+kmod-ipt-tproxy: $(ts_re "$(opkg status kmod-ipt-tproxy 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
iptables-mod-extra: $(ts_re "$(opkg status iptables-mod-extra 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
+kmod-ipt-extra: $(ts_re "$(opkg status kmod-ipt-extra 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
libcap: $(ts_re "$(opkg status libcap 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
libcap-bin: $(ts_re "$(opkg status libcap-bin 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
ruby: $(ts_re "$(opkg status ruby 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
ruby-yaml: $(ts_re "$(opkg status ruby-yaml 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
+ruby-psych: $(ts_re "$(opkg status ruby-psych 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
+ruby-pstore: $(ts_re "$(opkg status ruby-pstore 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
+ruby-dbm: $(ts_re "$(opkg status ruby-dbm 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
kmod-tun(TUN模式): $(ts_re "$(opkg status kmod-tun 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
luci-compat(Luci-19.07): $(ts_re "$(opkg status luci-compat 2>/dev/null |grep 'Status' |awk -F ': ' '{print $2}' 2>/dev/null)")
EOF
@@ -115,6 +122,7 @@ EOF
cat >> "$DEBUG_LOG" <<-EOF
#===================== 内核检查 =====================#
+
EOF
if pidof clash >/dev/null; then
cat >> "$DEBUG_LOG" <<-EOF
@@ -209,6 +217,7 @@ fi
cat >> "$DEBUG_LOG" <<-EOF
#===================== 插件设置 =====================#
+
当前配置文件: $RAW_CONFIG_FILE
启动配置文件: $CONFIG_FILE
运行模式: $en_mode
@@ -282,7 +291,15 @@ iptables-save -t mangle >> "$DEBUG_LOG" 2>/dev/null
cat >> "$DEBUG_LOG" <<-EOF
+#===================== IPSET状态 =====================#
+
+EOF
+ipset list |grep "Name:" >> "$DEBUG_LOG"
+
+cat >> "$DEBUG_LOG" <<-EOF
+
#===================== 路由表状态 =====================#
+
EOF
echo "#route -n" >> "$DEBUG_LOG"
route -n >> "$DEBUG_LOG" 2>/dev/null
@@ -295,6 +312,7 @@ if [ "$en_mode" != "fake-ip" ] && [ "$en_mode" != "redir-host" ]; then
cat >> "$DEBUG_LOG" <<-EOF
#===================== Tun设备状态 =====================#
+
EOF
ip tuntap list >> "$DEBUG_LOG" 2>/dev/null
fi
@@ -302,12 +320,14 @@ fi
cat >> "$DEBUG_LOG" <<-EOF
#===================== 端口占用状态 =====================#
+
EOF
netstat -nlp |grep clash >> "$DEBUG_LOG" 2>/dev/null
cat >> "$DEBUG_LOG" <<-EOF
#===================== 测试本机DNS查询 =====================#
+
EOF
nslookup www.baidu.com >> "$DEBUG_LOG" 2>/dev/null
@@ -315,6 +335,7 @@ if [ -s "/tmp/resolv.conf.auto" ]; then
cat >> "$DEBUG_LOG" <<-EOF
#===================== resolv.conf.auto =====================#
+
EOF
cat /tmp/resolv.conf.auto >> "$DEBUG_LOG"
fi
@@ -323,6 +344,7 @@ if [ -s "/tmp/resolv.conf.d/resolv.conf.auto" ]; then
cat >> "$DEBUG_LOG" <<-EOF
#===================== resolv.conf.d =====================#
+
EOF
cat /tmp/resolv.conf.d/resolv.conf.auto >> "$DEBUG_LOG"
fi
@@ -330,12 +352,14 @@ fi
cat >> "$DEBUG_LOG" <<-EOF
#===================== 测试本机网络连接 =====================#
+
EOF
curl -I -m 5 www.baidu.com >> "$DEBUG_LOG" 2>/dev/null
cat >> "$DEBUG_LOG" <<-EOF
#===================== 测试本机网络下载 =====================#
+
EOF
VERSION_URL="https://raw.githubusercontent.com/vernesong/OpenClash/master/version"
if pidof clash >/dev/null; then
@@ -347,6 +371,7 @@ fi
cat >> "$DEBUG_LOG" <<-EOF
#===================== 最近运行日志 =====================#
+
EOF
tail -n 50 "/tmp/openclash.log" >> "$DEBUG_LOG" 2>/dev/null
diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_history_set.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_history_set.sh
index 785c602151..c98c754c2f 100755
--- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_history_set.sh
+++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/openclash_history_set.sh
@@ -16,7 +16,7 @@ urlencode() {
if [ "$#" -eq "1" ]; then
data=$(curl -s -o /dev/null -w %{url_effective} --get --data-urlencode "$1" "")
if [ ! -z "$data" ]; then
- echo "${data##/?}"
+ echo "$(echo ${data##/?} |sed 's/\//%2f/g' |sed 's/:/%3a/g' |sed 's/?/%3f/g' |sed 's/(/%28/g' |sed 's/)/%29/g' |sed 's/\^/%5e/g' |sed 's/=/%3d/g' |sed 's/|/%7c/g')"
fi
fi
}
@@ -36,7 +36,7 @@ restore_history() {
GROUP_STATE_NUM=$(expr "$GROUP_STATE_NUM" + 1)
GROUP_STATE=$(GROUP_STATE "$GROUP_NAME")
done
- curl -m 5 --retry 2 -H "Authorization: Bearer ${SECRET}" -H "Content-Type:application/json" -X PUT -d '{"name":"'"$NOW_NAME"'"}' http://"$LAN_IP":"$PORT"/proxies/"$GROUP_NAME" >/dev/null 2>&1
+ curl -m 5 --retry 2 -H "Authorization: Bearer ${SECRET}" -H "Content-Type:application/json" -X PUT -d '{"name":"'"$NOW_NAME"'"}' http://"$LAN_IP":"$PORT"/proxies/"$GROUP_NAME" >> "$LOG_FILE"
}
close_all_conection() {
diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/openclash_version b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/openclash_version
index c5ff8af338..291c2a415d 100644
--- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/openclash_version
+++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/res/openclash_version
@@ -1,2 +1,2 @@
-v0.41.12-beta
-data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYQAAAAqCAMAAACEAtzLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYxRTAxMzM3M0ZDNzExRUJBQUM0RDg0MkJENzFBRjgwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYxRTAxMzM4M0ZDNzExRUJBQUM0RDg0MkJENzFBRjgwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RjFFMDEzMzUzRkM3MTFFQkFBQzREODQyQkQ3MUFGODAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjFFMDEzMzYzRkM3MTFFQkFBQzREODQyQkQ3MUFGODAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5Pf4DMAAADAFBMVEWKiooihLwFXI5Jns4FaaKUxeEdcqI1dZrR0dEFbak9PT3R4utkq9Kenp4GcKyCgoIHXpHR5vLh7/cxk8yGvt8KdbIJca7e3t5jlbGxytm1tbUVapo/Pz+izOVubm6y0eN1tdna2trn5+fOzs4HZp1Ui6sGVYIqjMWRkZFjnL0bhcFGRkZLS0tycnJFgKJFmsoHVoSCrsZ3d3eFhYVFkb0keqqcnJxiYmIEU4AkapK/v7+srKx4eHgFZZtYpdKhoaHg4OAJZJlDQ0Pw9PcKaqBBQUGixtqUlJTCwsIXYYwXgL2Stchqamq6urrIyMiiwNEIWolXlbnFxcVAQEDAwMA0fKYEWYnQ3+i2trbKysoJYZMFYJQgdaY7l8tlZWWTvtZgYGCz1enB2ecYbZ0IbaWnp6eDq8KCudk3k8iNjY0FcrCCqsCkzuY2kcZGirEJWIWvr68EYph0dHRHnMyJweJzn7l0sdUmbpdnrtYnisI1h7UUXokBcrNZWVlTU1NRUVFUVFRVVVUKe7wLfL1SUlIHeLkFdrdWVlYOgMAEdbYDdbUOf8AEdrYDdLUDdLQSg8MSg8QShMQThMUAcrIGd7hXV1cOf78Nfr8Nfr4Mfb4Mfb0Je7sJersJeroIeboIebk6OjqqqqrV1dXU1NSrq6vC3u6pqalISEg7OzuAgIB+fn7w9/v19fWEvN2BqcCBgYGEvd1JSUmDvNzq6urB3u7B1eD09PTz8/OFvt5MTEyCss5/f3+lpaXB3e0IV4XB3e7C3++EtNDo6OjC3u/v9PeXl5eFvd6Fvd3W1tbg6u9Hm8wJeLjA1N+Du9xEmcpGm8vD3++Eq8IHdbJVos+Dr8iFudeErMIrjsfB2+rv9vqixNdEf6HB1+Ohv9Dg6vAFdLSEsMqjo6PC1eEIaJ85lcm4uLgwk8t/uNjC3OsFZ6Aab6AId7cmcZwmhr2RuM8Cc7QRgsMPgMEQgcJaWlpfX19NTU1eXl5cXFxbW1tPT09QUFBYWFhdXV1OTk7///////+98cn1AAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAC8ZJREFUeNrsVwl0VNUZfiRgkpHJTNKQjSQCkUXeQDZoAiQkDERCWK3KooCAaDWAiCtKGcIkYWpr7SLR1rBMdmUGSMgGGoJsbqAoUhFc6latWtvaChUwX3qXt85MMKd6js4cvnPy7v9//3bf/SZzE6Gry33niK8CAaP/4If4yT2uri6hKy8wJCAi/N4v8XFEl+AecTZAMPp3/omPXcKdZwNGhN/6Ke4RRnwTKBj9Lz/Fx8I3l0T4wRFIIvzbXyH8N2BwSYQfAeZ/6a8Qvg4YXBLhxyDCL/0Vwn8CBvN/7a/wKYJp3Lhxtyd9/8e00GRaqDhJJlNParJN2T0V4bFucXJ1VFSw79CC4JOqE7zAZ45Kfzl8fNQ9A7yzohD12P8PYa0nMue6wZB3OHPtd4RpnEnnu3FYsQswryctXsALPRw2//Hu0Ie9T+QCH6HxQJTiBONVX+UqffJVfjQRnq2iNF28yqOCH784vETIbgIG1hiNyWSW6buKMA7jtK5jLPIUrYFh37MIf+wGUTi1445rroBruFdogYuIINknV7vwrHe1lg4GPnjjjZkTvVpFKV18je8+xiFc0CMzD21JBgqLsc104TuCiKDzk4AkyTyMttKetBANYg+Hzf+TbwwFQmZ1rFz5AZZ7hVyYiChus4/4s17VOjp45v0rCUJOYYA+K0ru4gMXi3EIXsfWlmmwNlososHgmNbTw0436fQymZJ8i1A/CLmSWYW5nb5qZbnkHqoImSZTpvbjoneJCE/4xgDEzVraL3rCSLg8IsMjENuC3dzZ/ef3WvCsV7WO7rdy5Q2TJk2YNdUzcTftMjT4I03v4OChmpiE4GBtjgxPEdwwJqxjlsNCjSrsZN5OVEnPw3lAzYUa1GTWkG8uGq2hl4i7huUBmcytymQOh9J9nRFN6u+EQ1+rNr9gyqNl7utIkxrwxulVlKpKlzKTrqPuXO3WLyuRMBwYyq3l6FNSshiv9aPODcBHJTocxMyOt7GbOx0dHa/hYIkndHT0hCN0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
\ No newline at end of file
+v0.41.13-beta
+data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYQAAAAqCAMAAACEAtzLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkFDMzkyQ0RDNDQ1MTExRUI4NjdBQTY3QjFBMTczMkI4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkFDMzkyQ0RENDQ1MTExRUI4NjdBQTY3QjFBMTczMkI4Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QUMzOTJDREE0NDUxMTFFQjg2N0FBNjdCMUExNzMyQjgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QUMzOTJDREI0NDUxMTFFQjg2N0FBNjdCMUExNzMyQjgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5OAPH3AAADAFBMVEWxytlISEgFXI5kq9OlpaWKiorh7/cihLw6lspJns6Gv98Fbakqjcbv9PcGXpGUxeEccaLR0dFjlbE9PT3R4uuenp6CgoLR5vJFgaIGVYLe3t61tbUVapo/Pz8GZp1ubm4Jca0GcKza2trn5+fOzs6StclFmsqRkZFFRUVLS0s1dZobhcFycnIkapKCrsd3d3eFhYUkeqoEU4CcnJwHVoRiYmJjnLy/v782kcasrKx4eHhWlrpFkb1YpdJ1tNmhoaHg4OBDQ0OizOVBQUEFZZsKdbOixtqy0eOUlJTCwsIIXIsKaqAFYJRqamq6urrIyMgEWYmz1urFxcUXYYxAQEAXgLzAwMA0fKYFaaK2trbKysoJYZMIZJjw9PcgdaZlZWVgYGCiwNLB2eekzubR3+gYbZ4JbaaDq8JUi6sJaJ50p8QFcrCNjY0GbKU1hrRIi7IHdLFkp81zn7kJWIWCqsAEYpivr690dHRHnMwFa6WJweKiv9GTvtZ0sdUmbphnrtYnisIJb6oBcrNZWVlTU1NRUVFUVFRVVVULfL0Ke7xSUlIFdrcHeLlWVlYDdbUOf8AEdrYDdLQDdLUEdbYOgMASg8MSg8QShMQThMUAcrIGd7hXV1cOf78Nfr8Nfr4Mfb4Mfb0Je7sJersIeboIebkJero6OjqqqqrV1dXU1NSrq6vC3u6pqanw9/s7OzuAgIB+fn719fWBgYGEvN2Evd3q6urB3u6DvNz09PTB1eDz8/OFvt5MTEyCss5/f3+CqcAIV4XB3e3B3e7g6vDC3++Fvd6EtNDo6OjA1N/g6u9Gm8vC3u+Fvd2Xl5cJeLjW1tZHm8xEmcpVos+Dr8iEq8IUXomCu9s3k8jB2+rC1eFEf6Gjo6PD3++DudcFdLSDsMmixNfB1+O4uLgwk8smh70vksvB1+QFZ5+RuM/C3OsKebkHd7ZGibCEscwmcZwCc7QRgsMPgMEQgcJaWlpfX19NTU1eXl5cXFxbW1tPT09QUFBYWFhdXV1OTk7///////90ZaeHAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAC+FJREFUeNrsVwtYVGUaPoOAgDYI0ww3CVDEGS+ALKRSCiNYInlbo0DxkpphVGua3bay1hEZZHZrt70UXRbF4TrlKCAXC9Tymna/b2Wbu+1u7T0tNV72v5wz55yZwXi2nqdmHt/n4fzf9363//zvzDmD0N/vvHPCF/6ASb/zQXxyr6O/X+jP9Q8JiAi/9Ul8EtUvOCec8RNM+o1v4hOHcOcZvxHh1z6Ke4UJX/sLJv3LR/En4euLInzv8CcR/uOrEL70G1wU4QeApf/2VQhf+Q0uivBDEOFRX4XwX7/B0l/4KryKYJg6deotCd/9MS0zGJa5nASDYTA12YbswYrwxEB4dPjGsLBQ76GQ0OGyFxriNUlJh4aF3TttvHtGGMKe+P8hbHJHVokTDLnHszZ9SximGlS+E8dddgEWDabFy3h5kMOWPjkQwtn9BId4CU0DwlxOKP7grVxBr+RH4whzSwlD2IDTQ8NCn7wwPETIbgNGNen1yWSW4duKMBVTla5tMnJdWgNjv2MRnhoA3Vhy80+uuBqO8R6hEAfQLdrDNzrwgme1igYOjHljzAG5yDWi+6mBxw8c4xDOq5GVi64EHYVJ32U4/y1BRFD5CUCCaB5HV9VgWhh1xkEOW/q0dwwHxq0neBcrPUIOLEE3t9lH/AWPajX9bjTttF5AsDqrW+riBReKcQgex9aVpTNrTCajTmebM9jDTjOo9DIYEryLoBmNHNFsQEmft1pJLqmHLEKWwZCl/LioXSLC773iqekQ1q+emVgaDYdbaHwUIjvRzZ3uDz7qxAse5Wp6/frZawrXzI4G3LJol+GhIYreoaHDFTERoaHKHAnuIjihj9/MLJuJGg3YxbxdaBCvx3OBpvNNaMpqIk8uGm2iLxFnE8sDspjbkMUcDlf3zXq0yd8Jm7pWbn7ekEvLnNeRJk3gjdMaKNWQJmYmXEfdEuXWRzxdyTEeGM6tlQivrFyAN2ZSZzEQUqnCMdzQ+2d0c6e3t/cNHKt0h5penMiGXIED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
\ No newline at end of file
diff --git a/package/ctcgfw/luci-proto-minieap/Makefile b/package/ctcgfw/luci-proto-minieap/Makefile
new file mode 100644
index 0000000000..f1e0a1f1da
--- /dev/null
+++ b/package/ctcgfw/luci-proto-minieap/Makefile
@@ -0,0 +1,16 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=luci-proto-minieap
+PKG_VERSION:=2.1
+PKG_RELEASE:=1
+PKG_MAINTAINER:=Richard Yu
+PKG_LICENSE:=GPLv3
+PKG_LICENSE_FILES:=LICENSE
+
+LUCI_TITLE:=LuCI support for MiniEAP
+LUCI_DEPENDS:=
+LUCI_PKGARCH:=all
+
+include $(TOPDIR)/feeds/luci/luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/package/ctcgfw/luci-proto-minieap/luasrc/model/cbi/admin_network/proto_minieap.lua b/package/ctcgfw/luci-proto-minieap/luasrc/model/cbi/admin_network/proto_minieap.lua
new file mode 100644
index 0000000000..a56fecadfa
--- /dev/null
+++ b/package/ctcgfw/luci-proto-minieap/luasrc/model/cbi/admin_network/proto_minieap.lua
@@ -0,0 +1,100 @@
+local map, section, net = ...
+
+local l = section.tab_names
+for i, v in ipairs(l) do
+ if v == "firewall" then
+ table.remove(l, i)
+ break
+ end
+end
+section.tabs["firewall"] = nil
+
+l = section.tabs["advanced"].childs
+for i, v in ipairs(l) do
+ if v.option == "delegate" then
+ table.remove(l, i)
+ break
+ end
+end
+
+section:tab("rjv3", translate("RJv3 Plugin Settings"), nil)
+
+local i = #section.tab_names
+local t = section.tab_names
+t[i], t[i-1] = t[i-1], t[i]
+
+local o = section:taboption("general", Value, "username", translate("Username"))
+
+o = section:taboption("general", Value, "password", translate("Password"))
+o.password = true
+
+o = section:taboption("general", DynamicList, "module", translate("Packet plugins"))
+o.rmempty = true
+o.datatype = "list(string)"
+o:value("rjv3", "rjv3")
+o:value("printer", "printer")
+
+o = section:taboption("advanced", Value, "max_fail", translate("Max fail"))
+o.datatype = "uinteger"
+o.placeholder = "3"
+
+o = section:taboption("advanced", Value, "max_retries", translate("Max retries"))
+o.datatype = "uinteger"
+o.placeholder = "3"
+
+o = section:taboption("advanced", Flag, "no_auto_reauth", translate("No auto reauth"))
+
+o = section:taboption("advanced", Value, "wait_after_fail", translate("Wait after fail"))
+o.datatype = "uinteger"
+o.placeholder = "30"
+
+o = section:taboption("advanced", Value, "stage_timeout", translate("Stage timeout"))
+o.datatype = "uinteger"
+o.placeholder = "5"
+
+o = section:taboption("advanced", Value, "auth_round", translate("Auth Round"))
+o.datatype = "uinteger"
+o.placeholder = "1"
+
+o = section:taboption("advanced", Value, "log_file", translate("Log file"))
+o.placeholder = "/var/log/minieap.log"
+
+-- rjv3 plugin
+o = section:taboption("rjv3", Value, "heartbeat", translate("Heartbeat interval"))
+o.datatype = "uinteger"
+o.placeholder = "60"
+
+o = section:taboption("rjv3", ListValue, "eap_bcast_addr", translate("EAP broadcast address"))
+o:value(0, translate("Standard")) -- BROADCAST_STANDARD
+o:value(1, translate("RJ private")) -- BROADCAST_RJ
+-- o:value(2, translate("BROADCAST_CER")) -- BROADCAST_CER
+
+o = section:taboption("rjv3", ListValue, "dhcp_type", translate("DHCP type"))
+o:value(0, translate("Disabled")) -- DHCP_NONE
+o:value(1, translate("Double Auth")) -- DHCP_DOUBLE_AUTH
+o:value(2, translate("DHCP After Auth")) -- DHCP_AFTER_AUTH
+o:value(3, translate("DHCP Before Auth")) -- DHCP_BEFORE_AUTH
+
+o = section:taboption("rjv3", DynamicList, "rj_option", translate("RJ option"))
+o.rmempty = true
+o.placeholder = ":[:r]"
+
+o = section:taboption("rjv3", Value, "service", translate("Service name"))
+o.placeholder = "internet"
+
+o = section:taboption("rjv3", Value, "version_str", translate("Version string"))
+o.placeholder = "RG-SU For Linux V1.0"
+
+o = section:taboption("rjv3", Value, "dhcp_script", translate("DHCP script"))
+
+o = section:taboption("rjv3", Value, "fake_dns1", translate("Fake DNS 1"))
+o.datatype = "ip4addr"
+
+o = section:taboption("rjv3", Value, "fake_dns2", translate("Fake DNS 2"))
+o.datatype = "ip4addr"
+
+o = section:taboption("rjv3", Value, "fake_serial", translate("Fake HDD serial"))
+
+o = section:taboption("rjv3", Value, "max_dhcp_count", translate("Max DHCP count"))
+o.datatype = "uinteger"
+o.placeholder = "3"
diff --git a/package/ctcgfw/luci-proto-minieap/luasrc/model/network/proto_minieap.lua b/package/ctcgfw/luci-proto-minieap/luasrc/model/network/proto_minieap.lua
new file mode 100644
index 0000000000..ee5705bb1d
--- /dev/null
+++ b/package/ctcgfw/luci-proto-minieap/luasrc/model/network/proto_minieap.lua
@@ -0,0 +1,20 @@
+local netmod = luci.model.network
+
+local proto = netmod:register_protocol("minieap")
+
+function proto.get_i18n(self)
+ return luci.i18n.translate("MiniEAP client")
+end
+
+function proto.is_installed(self)
+ return nixio.fs.access("/lib/netifd/proto/minieap.sh")
+end
+
+function proto.opkg_package(self)
+ return "minieap"
+end
+
+if netmod["register_error_code"] then
+ netmod:register_error_code("MISSING_USER_OR_PASS", luci.i18n.translate("Missing username or password"))
+ netmod:register_error_code("EXIT_FAILURE", luci.i18n.translate("Program exited with failure. See system log for more information."))
+end
diff --git a/package/ctcgfw/luci-proto-minieap/po/templates/minieap.pot b/package/ctcgfw/luci-proto-minieap/po/templates/minieap.pot
new file mode 100644
index 0000000000..028bd27f0a
--- /dev/null
+++ b/package/ctcgfw/luci-proto-minieap/po/templates/minieap.pot
@@ -0,0 +1,95 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "Auth Round"
+msgstr ""
+
+msgid "DHCP After Auth"
+msgstr ""
+
+msgid "DHCP Before Auth"
+msgstr ""
+
+msgid "DHCP script"
+msgstr ""
+
+msgid "DHCP type"
+msgstr ""
+
+msgid "Disabled"
+msgstr ""
+
+msgid "Double Auth"
+msgstr ""
+
+msgid "EAP broadcast address"
+msgstr ""
+
+msgid "Fake DNS 1"
+msgstr ""
+
+msgid "Fake DNS 2"
+msgstr ""
+
+msgid "Fake HDD serial"
+msgstr ""
+
+msgid "Heartbeat interval"
+msgstr ""
+
+msgid "Log file"
+msgstr ""
+
+msgid "Max DHCP count"
+msgstr ""
+
+msgid "Max fail"
+msgstr ""
+
+msgid "Max retries"
+msgstr ""
+
+msgid "MiniEAP client"
+msgstr ""
+
+msgid "Missing username or password"
+msgstr ""
+
+msgid "No auto reauth"
+msgstr ""
+
+msgid "Packet plugins"
+msgstr ""
+
+msgid "Password"
+msgstr ""
+
+msgid "Program exited with failure. See system log for more information."
+msgstr ""
+
+msgid "RJ option"
+msgstr ""
+
+msgid "RJ private"
+msgstr ""
+
+msgid "RJv3 Plugin Settings"
+msgstr ""
+
+msgid "Service name"
+msgstr ""
+
+msgid "Stage timeout"
+msgstr ""
+
+msgid "Standard"
+msgstr ""
+
+msgid "Username"
+msgstr ""
+
+msgid "Version string"
+msgstr ""
+
+msgid "Wait after fail"
+msgstr ""
diff --git a/package/ctcgfw/luci-proto-minieap/po/zh-cn/minieap.po b/package/ctcgfw/luci-proto-minieap/po/zh-cn/minieap.po
new file mode 100644
index 0000000000..95b6526a23
--- /dev/null
+++ b/package/ctcgfw/luci-proto-minieap/po/zh-cn/minieap.po
@@ -0,0 +1,95 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "Auth Round"
+msgstr "认证次数"
+
+msgid "DHCP After Auth"
+msgstr "认证后 DHCP"
+
+msgid "DHCP Before Auth"
+msgstr "认证前 DHCP"
+
+msgid "DHCP script"
+msgstr "DHCP 脚本"
+
+msgid "DHCP type"
+msgstr "DHCP 方式"
+
+msgid "Disabled"
+msgstr "禁用"
+
+msgid "Double Auth"
+msgstr "二次认证"
+
+msgid "EAP broadcast address"
+msgstr "EAP 广播地址"
+
+msgid "Fake DNS 1"
+msgstr "自定义主 DNS 地址"
+
+msgid "Fake DNS 2"
+msgstr "自定义次 DNS 地址"
+
+msgid "Fake HDD serial"
+msgstr "自定义硬盘序列号"
+
+msgid "Heartbeat interval"
+msgstr "心跳间隔"
+
+msgid "Log file"
+msgstr "日志文件"
+
+msgid "Max DHCP count"
+msgstr "最大 DHCP 次数"
+
+msgid "Max fail"
+msgstr "最大失败次数"
+
+msgid "Max retries"
+msgstr "最大重试次数"
+
+msgid "MiniEAP client"
+msgstr "MiniEAP 客户端"
+
+msgid "Missing username or password"
+msgstr "用户名或密码为空"
+
+msgid "No auto reauth"
+msgstr "不自动重新认证"
+
+msgid "Packet plugins"
+msgstr "数据包插件"
+
+msgid "Password"
+msgstr "密码"
+
+msgid "Program exited with failure. See system log for more information."
+msgstr "程序出错退出。查看系统日志获取更多信息。"
+
+msgid "RJ option"
+msgstr "锐捷选项"
+
+msgid "RJ private"
+msgstr "锐捷私有"
+
+msgid "RJv3 Plugin Settings"
+msgstr "RJv3 插件设置"
+
+msgid "Service name"
+msgstr "服务名称"
+
+msgid "Stage timeout"
+msgstr "阶段超时"
+
+msgid "Standard"
+msgstr "标准"
+
+msgid "Username"
+msgstr "用户名"
+
+msgid "Version string"
+msgstr "版本字符串"
+
+msgid "Wait after fail"
+msgstr "失败后等待时间"
diff --git a/package/lean/autocore/Makefile b/package/lean/autocore/Makefile
index 174bc31e0b..609960464d 100644
--- a/package/lean/autocore/Makefile
+++ b/package/lean/autocore/Makefile
@@ -17,7 +17,9 @@ define Package/autocore-arm
TITLE:=Arm auto core loadbalance script.
MAINTAINER:=CN_SZTL
DEPENDS:=@(TARGET_bcm27xx||TARGET_bcm53xx||TARGET_mvebu||TARGET_ipq40xx||TARGET_ipq806x||TARGET_rockchip) \
- +TARGET_bcm53xx:nvram +(TARGET_ipq40xx||TARGET_ipq806x):lm-sensors
+ +TARGET_bcm27xx:bcm27xx-userland \
+ +TARGET_bcm53xx:nvram \
+ +(TARGET_ipq40xx||TARGET_ipq806x):lm-sensors
VARIANT:=arm
endef
diff --git a/package/lean/autocore/files/arm/sbin/cpuinfo b/package/lean/autocore/files/arm/sbin/cpuinfo
index d101e4cbc1..0bf1818474 100755
--- a/package/lean/autocore/files/arm/sbin/cpuinfo
+++ b/package/lean/autocore/files/arm/sbin/cpuinfo
@@ -4,7 +4,9 @@ cpu_arch="$(cat "/proc/cpuinfo" | grep "model name" | sed -n "1p" | awk -F ': '
[ -z "${cpu_arch}" ] && cpu_arch="ARMv8 Processor"
cpu_cores="$(cat "/proc/cpuinfo" | grep "processor" | wc -l)"
-if grep -q "bcm53xx" "/etc/openwrt_release"; then
+if grep -q "bcm27xx" "/etc/openwrt_release"; then
+ cpu_freq="$(expr $(vcgencmd measure_clock arm | awk -F '=' '{print $2}') / 1000000)Mhz"
+elif grep -q "bcm53xx" "/etc/openwrt_release"; then
cpu_freq="$(nvram get clkfreq | awk -F ',' '{print $1}')MHz"
elif grep -q "mvebu" "/etc/openwrt_release"; then
cpu_freq="$(cat "/proc/cpuinfo" | grep "BogoMIPS" | sed -n "1p" | awk -F ': ' '{print $2}')MHz"
@@ -17,6 +19,10 @@ fi
if grep -q "ipq" "/etc/openwrt_release"; then
echo -n "${cpu_arch} x ${cpu_cores} (${cpu_freq})"
else
- cpu_temp="$(awk "BEGIN{printf (\"%.1f\n\",$(cat /sys/class/thermal/thermal_zone0/temp)/1000) }")°C"
+ if grep -q "bcm27xx" "/etc/openwrt_release"; then
+ cpu_temp="$(vcgencmd measure_temp | awk -F '=' '{print $2}' | awk -F "'" '{print $1}')°C"
+ else
+ cpu_temp="$(awk "BEGIN{printf (\"%.1f\n\",$(cat /sys/class/thermal/thermal_zone0/temp)/1000) }")°C"
+ fi
echo -n "${cpu_arch} x ${cpu_cores} (${big_cpu_freq}${cpu_freq}, ${cpu_temp})"
fi
diff --git a/package/lienol/luci-app-passwall/Makefile b/package/lienol/luci-app-passwall/Makefile
index 40aa9e835a..c57ca08c26 100644
--- a/package/lienol/luci-app-passwall/Makefile
+++ b/package/lienol/luci-app-passwall/Makefile
@@ -7,8 +7,8 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=4
-PKG_RELEASE:=3
-PKG_DATE:=20201211
+PKG_RELEASE:=4
+PKG_DATE:=20201221
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh b/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh
index d5e9729e29..6320fe6c72 100755
--- a/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh
+++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh
@@ -382,15 +382,15 @@ run_socks() {
;;
xray)
lua $API_GEN_XRAY -node $node -socks_proxy_port $socks_port > $config_file
- ln_start_bin "$(first_type $(config_t_get global_app xray_file notset)/xray xray)" xray $log_file -config="$config_file"
+ ln_start_bin "$(first_type $(config_t_get global_app xray_file) xray)" xray $log_file -config="$config_file"
;;
v2ray)
lua $API_GEN_XRAY -node $node -socks_proxy_port $socks_port > $config_file
- ln_start_bin "$(first_type $(config_t_get global_app v2ray_file notset)/v2ray v2ray)" v2ray $log_file -config="$config_file"
+ ln_start_bin "$(first_type $(config_t_get global_app v2ray_file) v2ray)" v2ray $log_file -config="$config_file"
;;
trojan-go)
lua $API_GEN_TROJAN -node $node -run_type client -local_addr $bind -local_port $socks_port -server_host $server_host -server_port $port > $config_file
- ln_start_bin "$(first_type $(config_t_get global_app trojan_go_file notset) trojan-go)" trojan-go $log_file -config "$config_file"
+ ln_start_bin "$(first_type $(config_t_get global_app trojan_go_file) trojan-go)" trojan-go $log_file -config "$config_file"
;;
trojan*)
lua $API_GEN_TROJAN -node $node -run_type client -local_addr $bind -local_port $socks_port -server_host $server_host -server_port $port > $config_file
@@ -406,7 +406,7 @@ run_socks() {
[ "$protocol" == "wsclient" ] && {
[ "$brook_tls" == "1" ] && server_host="wss://${server_host}" || server_host="ws://${server_host}"
}
- ln_start_bin "$(first_type $(config_t_get global_app brook_file notset) brook)" "brook_SOCKS_$id" $log_file "$protocol" --socks5 "$bind:$socks_port" -s "$server_host:$port" -p "$(config_n_get $node password)"
+ ln_start_bin "$(first_type $(config_t_get global_app brook_file) brook)" "brook_SOCKS_$id" $log_file "$protocol" --socks5 "$bind:$socks_port" -s "$server_host:$port" -p "$(config_n_get $node password)"
;;
ss|ssr)
lua $API_GEN_SS -node $node -local_addr "0.0.0.0" -local_port $socks_port -server_host $server_host -server_port $port > $config_file
@@ -418,7 +418,7 @@ run_socks() {
[ "$http_port" != "0" ] && [ "$http_config_file" != "nil" ] && {
lua $API_GEN_XRAY_PROTO -local_proto http -local_address "0.0.0.0" -local_port $http_port -server_proto socks -server_address "127.0.0.1" -server_port $socks_port -server_username $_username -server_password $_password > $http_config_file
echo lua $API_GEN_XRAY_PROTO -local_proto http -local_address "0.0.0.0" -local_port $http_port -server_proto socks -server_address "127.0.0.1" -server_port $socks_port -server_username $_username -server_password $_password
- ln_start_bin "$(first_type $(config_t_get global_app xray_file notset)/xray xray)" xray $log_file -config="$http_config_file"
+ ln_start_bin "$(first_type $(config_t_get global_app xray_file) xray)" xray $log_file -config="$http_config_file"
}
unset _username _password _auth
}
@@ -467,17 +467,17 @@ run_redir() {
xray)
local loglevel=$(config_t_get global loglevel "warning")
lua $API_GEN_XRAY -node $node -proto udp -redir_port $local_port -loglevel $loglevel > $config_file
- ln_start_bin "$(first_type $(config_t_get global_app xray_file notset)/xray xray)" xray $log_file -config="$config_file"
+ ln_start_bin "$(first_type $(config_t_get global_app xray_file) xray)" xray $log_file -config="$config_file"
;;
v2ray)
local loglevel=$(config_t_get global loglevel "warning")
lua $API_GEN_XRAY -node $node -proto udp -redir_port $local_port -loglevel $loglevel > $config_file
- ln_start_bin "$(first_type $(config_t_get global_app v2ray_file notset)/v2ray v2ray)" v2ray $log_file -config="$config_file"
+ ln_start_bin "$(first_type $(config_t_get global_app v2ray_file) v2ray)" v2ray $log_file -config="$config_file"
;;
trojan-go)
local loglevel=$(config_t_get global trojan_loglevel "2")
lua $API_GEN_TROJAN -node $node -run_type nat -local_addr "0.0.0.0" -local_port $local_port -loglevel $loglevel > $config_file
- ln_start_bin "$(first_type $(config_t_get global_app trojan_go_file notset) trojan-go)" trojan-go $log_file -config "$config_file"
+ ln_start_bin "$(first_type $(config_t_get global_app trojan_go_file) trojan-go)" trojan-go $log_file -config "$config_file"
;;
trojan*)
local loglevel=$(config_t_get global trojan_loglevel "2")
@@ -492,7 +492,7 @@ run_redir() {
if [ "$protocol" == "wsclient" ]; then
echolog "Brook的WebSocket不支持UDP转发!"
else
- ln_start_bin "$(first_type $(config_t_get global_app brook_file notset) brook)" "brook_udp_${index}" $log_file tproxy -l ":$local_port" -s "$server_host:$port" -p "$(config_n_get $node password)"
+ ln_start_bin "$(first_type $(config_t_get global_app brook_file) brook)" "brook_udp_${index}" $log_file tproxy -l ":$local_port" -s "$server_host:$port" -p "$(config_n_get $node password)"
fi
;;
ss|ssr)
@@ -517,7 +517,7 @@ run_redir() {
[ -n "$kcptun_server_host" ] && run_kcptun_ip=$(get_host_ip $network_type $kcptun_server_host)
KCPTUN_REDIR_PORT=$(get_new_port $KCPTUN_REDIR_PORT tcp)
kcptun_params="-l 0.0.0.0:$KCPTUN_REDIR_PORT -r $run_kcptun_ip:$kcptun_port $kcptun_config"
- ln_start_bin "$(first_type $(config_t_get global_app kcptun_client_file notset) kcptun-client)" "kcptun_tcp_${index}" $log_file $kcptun_params
+ ln_start_bin "$(first_type $(config_t_get global_app kcptun_client_file) kcptun-client)" "kcptun_tcp_${index}" $log_file $kcptun_params
fi
fi
local _socks_flag _socks_address _socks_port _socks_username _socks_password
@@ -534,19 +534,19 @@ run_redir() {
local extra_param="tcp"
[ "${index}" == 1 ] && [ "$UDP_NODE1" == "tcp" ] && extra_param="tcp,udp"
lua $API_GEN_XRAY -node $node -proto $extra_param -redir_port $local_port -loglevel $loglevel > $config_file
- ln_start_bin "$(first_type $(config_t_get global_app xray_file notset)/xray xray)" xray $log_file -config="$config_file"
+ ln_start_bin "$(first_type $(config_t_get global_app xray_file) xray)" xray $log_file -config="$config_file"
;;
v2ray)
local loglevel=$(config_t_get global loglevel "warning")
local extra_param="tcp"
[ "${index}" == 1 ] && [ "$UDP_NODE1" == "tcp" ] && extra_param="tcp,udp"
lua $API_GEN_XRAY -node $node -proto $extra_param -redir_port $local_port -loglevel $loglevel > $config_file
- ln_start_bin "$(first_type $(config_t_get global_app v2ray_file notset)/v2ray v2ray)" v2ray $log_file -config="$config_file"
+ ln_start_bin "$(first_type $(config_t_get global_app v2ray_file) v2ray)" v2ray $log_file -config="$config_file"
;;
trojan-go)
local loglevel=$(config_t_get global trojan_loglevel "2")
lua $API_GEN_TROJAN -node $node -run_type nat -local_addr "0.0.0.0" -local_port $local_port -loglevel $loglevel > $config_file
- ln_start_bin "$(first_type $(config_t_get global_app trojan_go_file notset) trojan-go)" trojan-go $log_file -config "$config_file"
+ ln_start_bin "$(first_type $(config_t_get global_app trojan_go_file) trojan-go)" trojan-go $log_file -config "$config_file"
;;
trojan*)
local loglevel=$(config_t_get global trojan_loglevel "2")
@@ -566,7 +566,7 @@ run_redir() {
if [ "$protocol" == "wsclient" ]; then
[ "$brook_tls" == "1" ] && server_ip="wss://${server_ip}" || server_ip="ws://${server_ip}"
socks_port=$(get_new_port 2081 tcp)
- ln_start_bin "$(first_type $(config_t_get global_app brook_file notset) brook)" "brook_tcp_${index}" $log_file wsclient --socks5 "127.0.0.1:$socks_port" -s "$server_ip:$port" -p "$(config_n_get $node password)"
+ ln_start_bin "$(first_type $(config_t_get global_app brook_file) brook)" "brook_tcp_${index}" $log_file wsclient --socks5 "127.0.0.1:$socks_port" -s "$server_ip:$port" -p "$(config_n_get $node password)"
_socks_flag=1
_socks_address="127.0.0.1"
_socks_port=$socks_port
@@ -577,12 +577,12 @@ run_redir() {
server_ip=127.0.0.1
port=$KCPTUN_REDIR_PORT
}
- ln_start_bin "$(first_type $(config_t_get global_app brook_file notset) brook)" "brook_tcp_${index}" $log_file tproxy -l ":$local_port" -s "$server_ip:$port" -p "$(config_n_get $node password)"
+ ln_start_bin "$(first_type $(config_t_get global_app brook_file) brook)" "brook_tcp_${index}" $log_file tproxy -l ":$local_port" -s "$server_ip:$port" -p "$(config_n_get $node password)"
fi
;;
ss|ssr)
if [ "$kcptun_use" == "1" ]; then
- lua $API_GEN_SS -node $node -local_addr "0.0.0.0" -local_port $socks_port -server_host "127.0.0.1" -server_port $KCPTUN_REDIR_PORT > $config_file
+ lua $API_GEN_SS -node $node -local_addr "0.0.0.0" -local_port $local_port -server_host "127.0.0.1" -server_port $KCPTUN_REDIR_PORT > $config_file
process=1
[ "${index}" == 1 ] && [ "$UDP_NODE1" == "tcp" ] && echolog "Kcptun不支持UDP转发!"
else
@@ -1260,7 +1260,7 @@ start() {
start_redir UDP udp
start_dns
add_dnsmasq
- source $APP_PATH/iptables.sh start
+ source $APP_PATH/iptables.sh start &
/etc/init.d/dnsmasq restart >/dev/null 2>&1
echolog "重启 dnsmasq 服务[$?]"
}