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/hYIkndHT0hCN06ZfmmUgOenwkvXfGc/+jg3R7B+k8+RAIGckM127PGUK5DjuB8lLZKS4uLyciSIEq9sxjZ1FTXoN5TdTaWU6+wNzT26e7cR3NA5rgTh5IrnXiVDWhqYpA7b8WSGdGLgaJ5fpatfntQGh7+wzanQyqofnpbsS0t8fAnc4y3W4cSB5EVNDsXRGBnL30ni6qRgSuofYT0XMwXvfuyxHXsbRWzp00adJ+1HqJ4JNejJs8RSCXy5IWsvtg6q4md/f+/ZfDRVSojURkLUFJSTAiT+/ff7WLfjIuJgI5G4uO8BQBrbl7DI2Z5GxwQLjWsP6/5fEY2EiukMY2dryUJl4m8wxGGOn1orazDEQ8M/JQeb5cX6s2b+JljZWqCE2YS6m5aOLbCB1BvAy4tSLYJWweiUhmrEbLlXY7MKqEuS14zq7BAMyZMsFeqyGfQ63dB7xocsvc4Zniem9KR+qUOWwyuWpiUwluxWK7nTxvpY7d/sVIuqaGAMP11YJDhxok23REFZ5i61OoYs8DZ9jxkMSfJVDrPPkrp9ggNoqGYYgnGYDFYLDmGwpQ43BYc5FrJVDb2TLQStd08h3lcOhr1ebkq8ra2Ggl3emOSCPHZLQZ8hsb8+vbMJlmDjQYEqwJhjZpdwyKCPYJ72I8XWsR24+KkMLpv+F5zZuvxsQpN9AclXzetwhedC0TV5+SlppqNqeOAW6z2/tgZqp50ofm1InkuM0ncMJMYLdHp86aQG6Ujhbc/S0ihDouKkKyobHYUWwjicaEPeRQiwUMzC8moeIklgFQ2kG+/Gsc8glqcQagI8mvgOhw6GvV5oMQk05pUREhHgUiLRcLuFzJVhJy7EnWiVAhI/peLCfLA5hoJgtwN6dr0aCkVNzmmhgSdERPNqC2wgc86eVEvmjaopahD0tJ+5A0OxL0LvpWVERg8FKa+GELHd0gT+gXXXF3Q8PiJRPlDckQ1utQiRg9QURgKxGBPUNtcmK7bCigGQBPaEclC1bq263fU4CxZGnCsFLPWrV5BiGa5lXetV5pUQUji9iMPLOaJ4ZKu2O4bJOC+4HCTZsaMHUpcYCXOEvOW02pxeCOIx4kOe1NPuBBEw1CzNR4iW+9lqXwLv1aqKG+Fh3doExocKmsFh4iZAOLLipClaJWpWw0VTLcYhSYCNq4twi2bLQuIn1wxqtWbZ6QVMD2Ok8jgqR5OxehSr87LsJmBZPiMGDz5kjcT50XcYyzzei7VUlp1pwUJG47mjf7gJ5OxKGQjs+pVfjWSIrrK2jKdh5dQg0gcTvDiWVfaGLkH/fTV93xd/Pb8oZkCMV6AJN1fjWeYeszqFaeFORsZGPgkxLyWb02rmSpsJJv9eKxKGj0qlWbWwixKIP8z26UW8xAPA/FY4YmU94dw2dbFBwfjMgtx/BBDnVasJ2z5IZWU25qaWZwIbK5WeLIaW/xAS1dmIg5IR3R1DwSPoTBzFKkGRG4jw4aPERCuBorBO5lXAuO6Qd4iNBJ/vz4Sna+mkZfU7i4COR355t6DktPRNgzF/OKW5FR6lWrNi/utFJh5lKCt3gfMTwSg/e7FWGrihvJxz8RscepfQKJjFsBLFUzzNIptWDZkCEStwvNW31AQxdGYM6ajiLufB7OUMRSdjHqAeDBrVtbcPpKCcfV2DFgyKql4ce3NuOYfoBg06HUBsSc5bbQus1mm46x1D47FtVk2caeFHWo44Y4CDMk7i7yQ+4ETdzIq3UgfxIZ0Wb1rlWbG8nPOUt+HY3yRl8D22xsA/hak1nNWY7PylSELcNiHApi9vVwFdK1D+LCybJi376+ZMkJ4ngbaUFBUtUu7JMb9NmnmBp6hQvvrAmKLvMCOWi2JuLF3mVlscAKqYD83IdEZqcAoxkXiRR9tYcINiu5FFvjhW3b6mLYe5O3rtu2Lb4V3YlwhnycZ5DEEcamOi8RpoEIeXayfsIgtCLe4l2rNkfT5GmkrJVugDcS69BK2hCqTuyJCGXkasbU3luoeWUcIlaUFQ4A3pLOYpcmca/spaSkJCKCPAs5DR/0XhxatuznuyhSPERw9Xk9pe8+MoNIFDQHrr4PlBW+nkibPAhXSllh37LwFxHRN4Vw+DYRzjmnDZJuqzbjWnJk8cw+MLk7EWyG7Dap4KdeItTzat2EzmGEWeSjVm0u76DOKjc65+SdEO88160IGzXIiQPGcDN8zRxeG2um7ivAy5rEvbKn3NKvcBo+6L3qXa7tsXHjyxJ7KHY28XqviZN94n36DjM3hoUcYsZNl/MRKoRSDzQ6ndnG5OTkumync09pqcWZUZBckGGwGWnmQqOcn25MlyyLU8z4a3X19Mk2kXhGozbeSaqrZ+TqJziMRqPVR63a3JmdG1odmmtzWpRBonNaZXV15TSnqN2GYFyo9r1Z+15FITvuXSXZ5qzYq/e+mTYmK4x6vZbtGKVJvEr2nn766bQdt5LnF5ze4YMmrIxRumMctWPk4NNHj06VZszOCklbsvfN9wZn0Q9BVmxc8xVphB0z9ejRf1yfFbuj1+cXF6F0j8HJ8aR4nrhWZhtE57U0xp78UES5wPKkVEAZp1MX59X6ASJhzvioVZvLO7BqBllVSs28ln5OFBE2aPCwOSurSLL/MjuLoTfzwrKycjSJQbKXJSOM01k+6CDF0/XYsCFHYofwGY+YZZ96NzJzw8PhQ5ixajYfoUJY5w2LmJCQYLVIXn1+Qn79uk6xntj8yXMsSv75eivJFzupLYr6OK0W9e07RVH0Vas25zvgDZVBFquyKSWznudw6ETYEJ7zqer0vjEoKEfSpCgnR3sGvWUvR0YRp3N80L0VL0d/jmE5YWFkxqoidTy59HPCHuIzzEFm2q5oFUkJJ12Kvl0EP8XND/srhPMBg5sf8lcEkgi/8lcI5wIG/X/jrwgkER7xVwgLOwMF/f/pp+gl3HJJhB8anwitAfOr0P8X/olep4SumMwzgQH/FOHRXhFdQldX6y2BIUP/R/0QvT451dX1PwEGANhK/H/+Sne9AAAAAElFTkSuQmCC \ 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 服务[$?]" }