From fa5c401ebbbdf588ef023807b1db7371dc8b6bcd Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 26 Jan 2021 08:37:54 +0800
Subject: [PATCH] update@20210126
---
luci-app-jd-dailybonus/Makefile | 4 +-
luci-app-jd-dailybonus/README.md | 4 +-
.../luasrc/controller/jd-dailybonus.lua | 7 +
.../luasrc/model/cbi/jd-dailybonus/log.lua | 4 +-
.../luasrc/model/cbi/jd-dailybonus/script.lua | 1 -
.../view/jd-dailybonus/update_service.htm | 3 +-
.../root/usr/share/jd-dailybonus/newapp.sh | 12 +-
luci-app-ssr-plus/Makefile | 21 +-
.../model/cbi/shadowsocksr/client-config.lua | 53 +++--
.../luasrc/view/shadowsocksr/ssrurl.htm | 4 +-
.../root/etc/init.d/shadowsocksr | 8 +-
.../root/etc/uci-defaults/luci-ssr-plus | 1 +
.../usr/share/shadowsocksr/gen_config.lua | 207 ++++++++++++------
.../root/usr/share/shadowsocksr/subscribe.lua | 9 +-
.../htdocs/luci-static/edge/background/3.jpg | Bin 37438 -> 100094 bytes
naiveproxy/Makefile | 4 -
oaf/src/af_log.c | 3 +-
trojan-go/Makefile | 88 --------
18 files changed, 211 insertions(+), 222 deletions(-)
delete mode 100644 trojan-go/Makefile
diff --git a/luci-app-jd-dailybonus/Makefile b/luci-app-jd-dailybonus/Makefile
index 6d97b6092..ca5ad5bda 100644
--- a/luci-app-jd-dailybonus/Makefile
+++ b/luci-app-jd-dailybonus/Makefile
@@ -7,8 +7,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-jd-dailybonus
LUCI_PKGARCH:=all
-PKG_VERSION:=1.0.2
-PKG_RELEASE:=20210124
+PKG_VERSION:=1.0.3
+PKG_RELEASE:=20210125
include $(INCLUDE_DIR)/package.mk
diff --git a/luci-app-jd-dailybonus/README.md b/luci-app-jd-dailybonus/README.md
index f99256120..eec69c88d 100644
--- a/luci-app-jd-dailybonus/README.md
+++ b/luci-app-jd-dailybonus/README.md
@@ -2,7 +2,7 @@
Luci for JD dailybonus Script for Openwrt
一个运行在openwrt下的京东签到插件。
-### Update Log 2021-01-24 v1.0.2
+### Update Log 2021-01-25 v1.0.3
#### Updates
@@ -67,4 +67,4 @@ openwrt-nanopi-r1s-h5 : https://github.com/jerrykuku/openwrt-nanopi-r1s-h5
### 支持我
如果你觉得我做的不错,可以赞赏一下。
-
\ No newline at end of file
+
diff --git a/luci-app-jd-dailybonus/luasrc/controller/jd-dailybonus.lua b/luci-app-jd-dailybonus/luasrc/controller/jd-dailybonus.lua
index ca5195c0a..95f151588 100644
--- a/luci-app-jd-dailybonus/luasrc/controller/jd-dailybonus.lua
+++ b/luci-app-jd-dailybonus/luasrc/controller/jd-dailybonus.lua
@@ -15,6 +15,7 @@ function index()
entry({'admin', 'services', 'jd-dailybonus', 'check_update'}, call('check_update')) -- 检查更新
entry({'admin', 'services', 'jd-dailybonus', 'qrcode'}, call('qrcode')) -- 获取二维码
entry({'admin', 'services', 'jd-dailybonus', 'check_login'}, call('check_login')) -- 获取二维码
+ entry({'admin', 'services', 'jd-dailybonus', 'realtime_log'}, call('get_log')) -- 获取实时日志
end
-- 执行程序
@@ -122,4 +123,10 @@ function check_login()
luci.http.prepare_content('application/json')
luci.http.write_json(return_json)
+end
+
+function get_log()
+ local fs = require "nixio.fs"
+ local log = fs.readfile("/var/log/jd_dailybonus.log") or ""
+ luci.http.write(log)
end
\ No newline at end of file
diff --git a/luci-app-jd-dailybonus/luasrc/model/cbi/jd-dailybonus/log.lua b/luci-app-jd-dailybonus/luasrc/model/cbi/jd-dailybonus/log.lua
index 6d91c84b5..61f5f3111 100644
--- a/luci-app-jd-dailybonus/luasrc/model/cbi/jd-dailybonus/log.lua
+++ b/luci-app-jd-dailybonus/luasrc/model/cbi/jd-dailybonus/log.lua
@@ -1,6 +1,4 @@
local fs = require "nixio.fs"
-local jd = "jd-dailybonus"
-local conffile = "/www/JD_DailyBonus.htm"
log = SimpleForm("logview")
log.submit = false
@@ -11,7 +9,7 @@ t = log:field(TextValue, "1", nil)
t.rmempty = true
t.rows = 30
function t.cfgvalue()
- return fs.readfile(conffile) or ""
+ return fs.readfile("/var/log/jd_dailybonus.log") or ""
end
t.readonly="readonly"
diff --git a/luci-app-jd-dailybonus/luasrc/model/cbi/jd-dailybonus/script.lua b/luci-app-jd-dailybonus/luasrc/model/cbi/jd-dailybonus/script.lua
index 1a78257ff..50162cc5e 100644
--- a/luci-app-jd-dailybonus/luasrc/model/cbi/jd-dailybonus/script.lua
+++ b/luci-app-jd-dailybonus/luasrc/model/cbi/jd-dailybonus/script.lua
@@ -1,5 +1,4 @@
local fs = require "nixio.fs"
-local jd = "jd-dailybonus"
s = SimpleForm("scriptview")
diff --git a/luci-app-jd-dailybonus/luasrc/view/jd-dailybonus/update_service.htm b/luci-app-jd-dailybonus/luasrc/view/jd-dailybonus/update_service.htm
index f5290e99e..be6e3e08b 100644
--- a/luci-app-jd-dailybonus/luasrc/view/jd-dailybonus/update_service.htm
+++ b/luci-app-jd-dailybonus/luasrc/view/jd-dailybonus/update_service.htm
@@ -219,6 +219,7 @@
二维码已失效
const QRCODE_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","qrcode")%>';
const CHECK_LOGIN_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","check_login")%>';
const UPDATE_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","update")%>';
+ const LOG_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","realtime_log")%>';
const CHECKING_TEXT = '<%= translate("正在检查是否存在新的版本 ...") %>';
const UPDATING_TEXT = '<%= translate("正在更新脚本,请稍候 ...") %>';
const NEW_VERSION = '<%= translate("当前已是最新版本:") %>';
@@ -281,7 +282,7 @@ 服务正在执行中,请勿刷新!
//获取实时日志
function get_realtime_log() {
- XHR.poll(1, "/JD_DailyBonus.htm", null, x => {
+ XHR.poll(1, LOG_URL, null, x => {
let retArea = document.getElementById("log_content3");
if (x.response.search(" 秒") != -1) {
noChange++;
diff --git a/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/newapp.sh b/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/newapp.sh
index 759e8ec4b..91a7f3fc7 100755
--- a/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/newapp.sh
+++ b/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/newapp.sh
@@ -12,7 +12,7 @@
NAME=jd-dailybonus
TEMP_SCRIPT=/tmp/JD_DailyBonus.js
JD_SCRIPT=/usr/share/jd-dailybonus/JD_DailyBonus.js
-LOG_HTM=/www/JD_DailyBonus.htm
+LOG_FILE=/var/log/jd_dailybonus.log
CRON_FILE=/etc/crontabs/root
usage() {
cat <<-EOF
@@ -60,13 +60,13 @@ add_cron() {
# Run Script
notify() {
- grep "Cookie失效" /www/JD_DailyBonus.htm >/dev/null
+ grep "Cookie失效" ${LOG_FILE} >/dev/null
if [ $? -eq 0 ]; then
title="$(date '+%Y年%m月%d日') 京东签到 Cookie 失效"
else
title="$(date '+%Y年%m月%d日') 京东签到"
fi
- desc=$(cat /www/JD_DailyBonus.htm | grep -E '签到号|签到概览|签到奖励|其他奖励|账号总计|其他总计' | sed 's/$/&\n/g')
+ desc=$(cat ${LOG_FILE} | grep -E '签到号|签到概览|签到奖励|其他奖励|账号总计|其他总计' | sed 's/$/&\n/g')
#serverchan
sckey=$(uci_get_by_type global serverchan)
if [ ! -z $sckey ]; then
@@ -95,9 +95,9 @@ notify() {
}
run() {
- echo -e $(date '+%Y-%m-%d %H:%M:%S %A') >$LOG_HTM 2>/dev/null
- [ ! -f "/usr/bin/node" ] && echo -e "未安装node.js,请安装后再试!\nNode.js is not installed, please try again after installation!" >>$LOG_HTM && exit 1
- (cd /usr/share/jd-dailybonus/ && node $JD_SCRIPT >>$LOG_HTM 2>/dev/null && notify &)
+ echo -e $(date '+%Y-%m-%d %H:%M:%S %A') >$LOG_FILE 2>/dev/null
+ [ ! -f "/usr/bin/node" ] && echo -e "未安装node.js,请安装后再试!\nNode.js is not installed, please try again after installation!" >>$LOG_FILE && exit 1
+ (cd /usr/share/jd-dailybonus/ && node $JD_SCRIPT >>$LOG_FILE 2>/dev/null && notify &)
}
save() {
diff --git a/luci-app-ssr-plus/Makefile b/luci-app-ssr-plus/Makefile
index 3b57cd1d5..7aa475ea6 100644
--- a/luci-app-ssr-plus/Makefile
+++ b/luci-app-ssr-plus/Makefile
@@ -1,8 +1,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-ssr-plus
-PKG_VERSION:=182
-PKG_RELEASE:=10
+PKG_VERSION:=183
+PKG_RELEASE:=3
define Package/$(PKG_NAME)/conffiles
/etc/config/shadowsocksr
@@ -19,11 +19,11 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_plugin
default n
config PACKAGE_$(PKG_NAME)_INCLUDE_Xray
- bool "Include Xray"
+ bool "Include Xray (V2RAY/Trojan-GO implemented)"
default y if i386||x86_64||arm||aarch64
config PACKAGE_$(PKG_NAME)_INCLUDE_Trojan
- bool "Include Trojan"
+ bool "Include Trojan (OpenSSL)"
default n if i386||x86_64||arm||aarch64
config PACKAGE_$(PKG_NAME)_INCLUDE_Redsocks2
@@ -35,14 +35,6 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy
depends on !(arc||armeb||mips||mips64||powerpc)
default n
-config PACKAGE_$(PKG_NAME)_INCLUDE_V2ray
- bool "Include V2ray"
- default n
-
-config PACKAGE_$(PKG_NAME)_INCLUDE_Trojan-go
- bool "Include Trojan-go"
- default y if i386||x86_64||arm||aarch64
-
config PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun
bool "Include Kcptun"
default n
@@ -55,16 +47,13 @@ endef
LUCI_TITLE:=SS/SSR/V2Ray/Trojan/NaiveProxy/Socks5/Tun LuCI interface
LUCI_PKGARCH:=all
LUCI_DEPENDS:=+shadowsocksr-libev-alt +ipset +ip-full +iptables-mod-tproxy +dnsmasq-full +coreutils +coreutils-base64 +pdnsd-alt +wget-ssl +lua +libuci-lua \
- +microsocks +dns2socks +shadowsocksr-libev-ssr-local +tcping +resolveip\
+ +microsocks +dns2socks +shadowsocksr-libev-ssr-local +tcping +resolveip +ipt2socks-alt \
+PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks:shadowsocks-libev-ss-local \
+PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks:shadowsocks-libev-ss-redir \
+PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks:simple-obfs \
+PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_plugin:v2ray-plugin \
- +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray:v2ray \
+PACKAGE_$(PKG_NAME)_INCLUDE_Xray:xray \
+PACKAGE_$(PKG_NAME)_INCLUDE_Trojan:trojan \
- +PACKAGE_$(PKG_NAME)_INCLUDE_Trojan-go:trojan-go \
- +PACKAGE_$(PKG_NAME)_INCLUDE_Trojan:ipt2socks \
+PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy:naiveproxy \
+PACKAGE_$(PKG_NAME)_INCLUDE_Redsocks2:redsocks2 \
+PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun:kcptun-client \
diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua
index cbab259dc..a0e18ad33 100644
--- a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua
+++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua
@@ -66,11 +66,21 @@ local encrypt_methods_ss = {
}
local encrypt_methods_v2ray_ss = {
--- aead
-"aes-128-gcm",
-"aes-256-gcm",
-"chacha20-ietf-poly1305",
-"none"
+ -- xray_ss
+ "none",
+ "plain",
+ "aes-128-cfb",
+ "aes-256-cfb",
+ "chacha20",
+ "chacha20-ietf",
+ -- aead
+ "aes-128-gcm",
+ "aes-256-gcm",
+ "chacha20-poly1305",
+ "chacha20-ietf-poly1305",
+ "aead_aes_128_gcm",
+ "aead_aes_256_gcm",
+ "aead_chacha20_poly1305"
}
local protocol = {
@@ -142,7 +152,7 @@ end
if is_finded("xray") or is_finded("v2ray") then
o:value("v2ray", translate("V2Ray/XRay"))
end
-if is_finded("trojan")then
+if is_finded("trojan") then
o:value("trojan", translate("Trojan"))
end
if is_finded("trojan-go") then
@@ -152,10 +162,13 @@ end
if is_finded("naive") then
o:value("naiveproxy", translate("NaiveProxy"))
end
-if is_finded("redsocks2") then
+if is_finded("ipt2socks-alt") or is_finded("ipt2socks") then
o:value("socks5", translate("Socks5"))
+end
+if is_finded("redsocks2") then
o:value("tun", translate("Network Tunnel"))
end
+
o.description = translate("Using incorrect encryption mothod may causes service fail to start")
o = s:option(Value, "alias", translate("Alias(optional)"))
@@ -170,12 +183,12 @@ o:depends("type", "tun")
o.description = translate("Redirect traffic to this network interface")
o = s:option(ListValue, "v2ray_protocol", translate("V2Ray/XRay protocol"))
-o:value("vmess", translate("Vmess"))
+o:value("vmess", translate("VMess"))
o:value("vless", translate("VLESS"))
-o:value("http", translate("HTTP"))
-o:value("socks", translate("Socks"))
-o:value("shadowsocks", translate("Shadowsocks"))
o:value("trojan", translate("Trojan"))
+o:value("shadowsocks", translate("Shadowsocks"))
+o:value("socks", translate("Socks"))
+o:value("http", translate("HTTP"))
o:depends("type", "v2ray")
o = s:option(Value, "server", translate("Server Address"))
@@ -243,7 +256,9 @@ o.rmempty = true
o:depends("type", "ss")
o = s:option(ListValue, "encrypt_method_v2ray_ss", translate("Encrypt Method"))
-for _, v in ipairs(encrypt_methods_v2ray_ss) do o:value(v) end
+for _, v in ipairs(encrypt_methods_v2ray_ss) do
+ o:value(v)
+end
o.rmempty = true
o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"})
@@ -502,13 +517,13 @@ o:depends("type", "trojan-go")
-- XTLS
if is_finded("xray") then
-o = s:option(Flag, "xtls", translate("XTLS"))
-o.rmempty = true
-o.default = "0"
-o:depends({type = "v2ray", v2ray_protocol = "vless", transport = "tcp", tls = false})
-o:depends({type = "v2ray", v2ray_protocol = "vless", transport = "kcp", tls = false})
-o:depends({type = "v2ray", v2ray_protocol = "trojan", transport = "tcp", tls = false})
-o:depends({type = "v2ray", v2ray_protocol = "trojan", transport = "kcp", tls = false})
+ o = s:option(Flag, "xtls", translate("XTLS"))
+ o.rmempty = true
+ o.default = "0"
+ o:depends({type = "v2ray", v2ray_protocol = "vless", transport = "tcp", tls = false})
+ o:depends({type = "v2ray", v2ray_protocol = "vless", transport = "kcp", tls = false})
+ o:depends({type = "v2ray", v2ray_protocol = "trojan", transport = "tcp", tls = false})
+ o:depends({type = "v2ray", v2ray_protocol = "trojan", transport = "kcp", tls = false})
end
-- Flow
diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm
index 63133f0c1..fdcb3ddfd 100644
--- a/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm
+++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm
@@ -196,8 +196,10 @@
url0 = ssu[1]
}
var sstr = url0;
- document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];
+ document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = "v2ray";
document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
+ document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].value = "trojan";
+ document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].dispatchEvent(event);
var team = sstr.split('@');
var password = team[0]
var serverPart = team[1].split(':');
diff --git a/luci-app-ssr-plus/root/etc/init.d/shadowsocksr b/luci-app-ssr-plus/root/etc/init.d/shadowsocksr
index f76ccba59..ed7eb1e7f 100755
--- a/luci-app-ssr-plus/root/etc/init.d/shadowsocksr
+++ b/luci-app-ssr-plus/root/etc/init.d/shadowsocksr
@@ -359,7 +359,7 @@ start_udp() {
trojan) #client
gen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_local_port
ln_start_bin $(first_type trojan-go trojan) $type --config $udp_config_file
- ln_start_bin $(first_type ipt2socks) ipt2socks -U -b 0.0.0.0 -4 -s 127.0.0.1 -p $tmp_udp_local_port -l $tmp_udp_port
+ ln_start_bin $(first_type ipt2socks-alt ipt2socks) ipt2socks -U -b 0.0.0.0 -4 -s 127.0.0.1 -p $tmp_udp_local_port -l $tmp_udp_port
echolog "UDP TPROXY Relay:$($(first_type trojan-go trojan) --version 2>&1 | head -1) Started!"
;;
trojan-go)
@@ -376,7 +376,7 @@ start_udp() {
if [ "$(uci_get_by_name $UDP_RELAY_SERVER auth_enable 0)" == "1" ]; then
local auth="-a $(uci_get_by_name $UDP_RELAY_SERVER username) -k $(uci_get_by_name $UDP_RELAY_SERVER password)"
fi
- ln_start_bin $(first_type ipt2socks-alt) ipt2socks-alt $udp_config_file -U -4 -s $(uci_get_by_name $UDP_RELAY_SERVER server) -p $(uci_get_by_name $UDP_RELAY_SERVER server_port) -l $tmp_udp_port $auth
+ ln_start_bin $(first_type ipt2socks-alt ipt2socks) ipt2socks $udp_config_file -U -4 -s $(uci_get_by_name $UDP_RELAY_SERVER server) -p $(uci_get_by_name $UDP_RELAY_SERVER server_port) -l $tmp_udp_port $auth
#gen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_port
#ln_start_bin $(first_type redsocks2) redsocks2 -c $udp_config_file
echolog "UDP TPROXY Relay:Socks5 REDIRECT/TPROXY Started!"
@@ -444,7 +444,7 @@ start_shunt() {
if [ "$(uci_get_by_name $SHUNT_SERVER auth_enable 0)" == "1" ]; then
local auth="-a $(uci_get_by_name $SHUNT_SERVER username) -k $(uci_get_by_name $SHUNT_SERVER password)"
fi
- ln_start_bin $(first_type ipt2socks-alt) ipt2socks-alt $shunt_config_file -R -4 -s $(uci_get_by_name $SHUNT_SERVER server) -p $(uci_get_by_name $SHUNT_SERVER server_port) -l $tmp_shunt_port $auth
+ ln_start_bin $(first_type ipt2socks-alt ipt2socks) ipt2socks $shunt_config_file -R -4 -s $(uci_get_by_name $SHUNT_SERVER server) -p $(uci_get_by_name $SHUNT_SERVER server_port) -l $tmp_shunt_port $auth
#gen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port
#ln_start_bin $(first_type redsocks2) redsocks2 -c $shunt_config_file
if [ -n "$tmp_local_port" ]; then
@@ -563,7 +563,7 @@ Start_Run() {
if [ "$(uci_get_by_name $GLOBAL_SERVER auth_enable 0)" == "1" ]; then
local auth="-a $(uci_get_by_name $GLOBAL_SERVER username) -k $(uci_get_by_name $GLOBAL_SERVER password)"
fi
- ln_start_bin $(first_type ipt2socks-alt) ipt2socks-alt $tcp_config_file -R -4 -j $threads -s $(uci_get_by_name $GLOBAL_SERVER server) -p $(uci_get_by_name $GLOBAL_SERVER server_port) -l $tcp_port $auth
+ ln_start_bin $(first_type ipt2socks-alt ipt2socks) ipt2socks $tcp_config_file -R -4 -j $threads -s $(uci_get_by_name $GLOBAL_SERVER server) -p $(uci_get_by_name $GLOBAL_SERVER server_port) -l $tcp_port $auth
#gen_config_file $GLOBAL_SERVER $type 1 $tcp_port
#for i in $(seq 1 $threads); do
# ln_start_bin $(first_type redsocks2) redsocks2 -c $tcp_config_file
diff --git a/luci-app-ssr-plus/root/etc/uci-defaults/luci-ssr-plus b/luci-app-ssr-plus/root/etc/uci-defaults/luci-ssr-plus
index c372b8fa7..6e828b32c 100755
--- a/luci-app-ssr-plus/root/etc/uci-defaults/luci-ssr-plus
+++ b/luci-app-ssr-plus/root/etc/uci-defaults/luci-ssr-plus
@@ -28,5 +28,6 @@ if [ ! -s "/etc/config/shadowsocksr" ]; then
fi
sed -i "s/option type 'vmess'"/"option type 'v2ray'\n\toption v2ray_protocol 'vmess'/g" /etc/config/shadowsocksr
sed -i "s/option type 'vless'"/"option type 'v2ray'\n\toption v2ray_protocol 'vless'/g" /etc/config/shadowsocksr
+sed -i "s/option type 'trojan'"/"option type 'v2ray'\n\toption v2ray_protocol 'trojan'/g" /etc/config/shadowsocksr
rm -rf /tmp/luci-modulecache /tmp/luci-indexcache
exit 0
diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua b/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua
index 3c47ca193..bd1dbca1a 100644
--- a/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua
+++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua
@@ -1,4 +1,4 @@
-local ucursor = require "luci.model.uci".cursor()
+local ucursor = require"luci.model.uci".cursor()
local json = require "luci.jsonc"
local server_section = arg[1]
local proto = arg[2]
@@ -6,8 +6,7 @@ local local_port = arg[3] or "0"
local socks_port = arg[4] or "0"
local server = ucursor:get_all("shadowsocksr", server_section)
local outbound_settings = nil
-if (server.v2ray_protocol == "vmess" or server.v2ray_protocol == "vless" or not server.v2ray_protocol)
-then
+function vmess_vless()
outbound_settings = {
vnext = {
{
@@ -19,15 +18,14 @@ then
alterId = (server.v2ray_protocol == "vmess" or not server.v2ray_protocol) and tonumber(server.alter_id) or nil,
security = (server.v2ray_protocol == "vmess" or not server.v2ray_protocol) and server.security or nil,
encryption = (server.v2ray_protocol == "vless") and server.vless_encryption or nil,
- flow = (server.xtls == '1') and (server.vless_flow and server.vless_flow or "xtls-rprx-splice") or nil,
+ flow = (server.xtls == '1') and (server.vless_flow and server.vless_flow or "xtls-rprx-splice") or nil
}
}
}
}
}
-
-elseif (server.v2ray_protocol == "trojan" or server.v2ray_protocol == "shadowsocks")
-then
+end
+function trojan_shadowsocks()
outbound_settings = {
servers = {
{
@@ -35,28 +33,64 @@ then
port = tonumber(server.server_port),
password = server.password,
method = (server.v2ray_protocol == "shadowsocks") and server.encrypt_method_v2ray_ss or nil,
- flow = (server.v2ray_protocol == "trojan") and (server.xtls == '1') and (server.vless_flow and server.vless_flow or "xtls-rprx-splice") or nil,
+ flow = (server.v2ray_protocol == "trojan") and (server.xtls == '1') and (server.vless_flow and server.vless_flow or "xtls-rprx-splice") or nil
}
}
}
-
-elseif (server.v2ray_protocol == "socks" or server.v2ray_protocol == "http")
-then
+end
+function socks_http()
outbound_settings = {
+ --
servers = {
{
+ --
address = server.server,
port = tonumber(server.server_port),
users = (server.auth_enable == "1") and {
{
+ --
user = server.username,
- pass = server.password,
+ pass = server.password
}
- } or nil,
+ } or nil
}
}
}
end
+local outbound = {}
+function outbound:new(o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+end
+function outbound:handleIndex(index)
+ local switch = {
+ vmess = function()
+ vmess_vless()
+ end,
+ vless = function()
+ vmess_vless()
+ end,
+ trojan = function()
+ trojan_shadowsocks()
+ end,
+ shadowsocks = function()
+ trojan_shadowsocks()
+ end,
+ socks = function()
+ socks_http()
+ end,
+ http = function()
+ socks_http()
+ end
+ }
+ if switch[index] then
+ switch[index]()
+ end
+end
+local settings = outbound:new()
+settings:handleIndex(server.v2ray_protocol)
local Xray = {
log = {
-- error = "/var/ssrplus.log",
@@ -64,6 +98,7 @@ local Xray = {
},
-- 传入连接
inbound = (local_port ~= "0") and {
+ -- listening
port = tonumber(local_port),
protocol = "dokodemo-door",
settings = {network = proto, followRedirect = true},
@@ -72,6 +107,7 @@ local Xray = {
-- 开启 socks 代理
inboundDetour = (proto:find("tcp") and socks_port ~= "0") and {
{
+ -- socks
protocol = "socks",
port = tonumber(socks_port),
settings = {auth = "noauth", udp = true}
@@ -83,20 +119,24 @@ local Xray = {
settings = outbound_settings,
-- 底层传输配置
streamSettings = {
- network = server.transport,
- security = (server.xtls == '1') and "xtls" or (server.tls == '1') and "tls" or "none",
+ network = server.transport or "tcp",
+ security = (server.xtls == '1') and "xtls" or (server.tls == '1') and "tls" or nil,
tlsSettings = (server.tls == '1' and (server.insecure == "1" or server.tls_host)) and {
+ -- tls
allowInsecure = (server.insecure == "1") and true or nil,
serverName = server.tls_host
} or nil,
xtlsSettings = (server.xtls == '1' and (server.insecure == "1" or server.tls_host)) and {
+ -- xtls
allowInsecure = (server.insecure == "1") and true or nil,
serverName = server.tls_host
} or nil,
tcpSettings = (server.transport == "tcp" and server.tcp_guise == "http") and {
+ -- tcp
header = {
type = server.tcp_guise,
request = {
+ -- request
path = {server.http_path} or {"/"},
headers = {Host = {server.http_host} or {}}
}
@@ -114,28 +154,34 @@ local Xray = {
seed = server.seed or nil
} or nil,
wsSettings = (server.transport == "ws") and (server.ws_path or server.ws_host or server.tls_host) and {
+ -- ws
path = server.ws_path,
headers = (server.ws_host or server.tls_host) and {
+ -- headers
Host = server.ws_host or server.tls_host
} or nil
} or nil,
httpSettings = (server.transport == "h2") and {
+ -- h2
path = server.h2_path or "",
host = {server.h2_host} or nil
} or nil,
quicSettings = (server.transport == "quic") and {
+ -- quic
security = server.quic_security,
key = server.quic_key,
header = {type = server.quic_guise}
} or nil
},
mux = (server.mux == "1" and server.xtls ~= "1") and {
+ -- mux
enabled = true,
concurrency = tonumber(server.concurrency)
} or nil
} or nil
}
-local cipher = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA"
+local cipher =
+ "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA"
local cipher13 = "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384"
local trojan = {
log_level = 3,
@@ -161,12 +207,14 @@ local trojan = {
session_ticket = (server.tls_sessionTicket == "1") and true or false
},
udp_timeout = 60,
- mux = (server.mux == "1") and {
- enabled = true,
- concurrency = tonumber(server.concurrency),
- idle_timeout = 60,
- } or nil,
+ mux = (server.mux == "1") and {
+ -- mux
+ enabled = true,
+ concurrency = tonumber(server.concurrency),
+ idle_timeout = 60
+ } or nil,
tcp = {
+ -- tcp
no_delay = true,
keep_alive = true,
reuse_port = true,
@@ -190,55 +238,74 @@ local ss = {
fast_open = (server.fast_open == "1") and true or false,
reuse_port = true
}
-if server.type == "ss" then
- if server.plugin and server.plugin ~= "none" then
- ss.plugin = server.plugin
- ss.plugin_opts = server.plugin_opts or nil
- end
- print(json.stringify(ss, 1))
+local config = {}
+function config:new(o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
end
-if server.type == "ssr" then
- ss.protocol = server.protocol
- ss.protocol_param = server.protocol_param
- ss.method = server.encrypt_method
- ss.obfs = server.obfs
- ss.obfs_param = server.obfs_param
- print(json.stringify(ss, 1))
-end
-if server.type == "v2ray" then
- print(json.stringify(Xray, 1))
-end
-if server.type == "trojan" then
- print(json.stringify(trojan, 1))
-end
-if server.type == "trojan-go" then
- trojan.ssl.cipher = server.fingerprint == nil and cipher or (server.fingerprint == "disable" and cipher13 .. ":" .. cipher or "")
- trojan.ssl.cipher_tls13 = server.fingerprint == nil and cipher13 or nil
- trojan.ssl.fingerprint = (server.fingerprint ~= nil and server.fingerprint ~= "disable" ) and server.fingerprint or ""
- trojan.ssl.alpn = server.trojan_transport == 'ws' and {} or {"h2", "http/1.1"}
- if server.tls ~= "1" and server.trojan_transport == "original" then
- trojan.ssl = nil
- trojan.transport_plugin = server.trojan_transport == "original" and {
- enabled = server.plugin_type ~= nil,
- type = server.plugin_type or "plaintext",
- command = server.plugin_type ~= "plaintext" and server.plugin_cmd or nil,
- option = server.plugin_type ~= "plaintext" and server.plugin_option or nil,
- arg = server.plugin_type ~= "plaintext" and { server.plugin_arg } or nil,
- env = {}
- } or nil
+function config:handleIndex(index)
+ local switch = {
+ ss = function()
+ if server.plugin and server.plugin ~= "none" then
+ ss.plugin = server.plugin
+ ss.plugin_opts = server.plugin_opts or nil
+ end
+ print(json.stringify(ss, 1))
+ end,
+ ssr = function()
+ ss.protocol = server.protocol
+ ss.protocol_param = server.protocol_param
+ ss.method = server.encrypt_method
+ ss.obfs = server.obfs
+ ss.obfs_param = server.obfs_param
+ print(json.stringify(ss, 1))
+ end,
+ v2ray = function()
+ print(json.stringify(Xray, 1))
+ end,
+ trojan = function()
+ print(json.stringify(trojan, 1))
+ end,
+ trojan_go = function()
+ trojan.ssl.cipher = server.fingerprint == nil and cipher or (server.fingerprint == "disable" and cipher13 .. ":" .. cipher or "")
+ trojan.ssl.cipher_tls13 = server.fingerprint == nil and cipher13 or nil
+ trojan.ssl.fingerprint = (server.fingerprint ~= nil and server.fingerprint ~= "disable") and server.fingerprint or ""
+ trojan.ssl.alpn = server.trojan_transport == 'ws' and {} or {"h2", "http/1.1"}
+ if server.tls ~= "1" and server.trojan_transport == "original" then
+ --
+ trojan.ssl = nil
+ trojan.transport_plugin = server.trojan_transport == "original" and {
+ enabled = server.plugin_type ~= nil,
+ type = server.plugin_type or "plaintext",
+ command = server.plugin_type ~= "plaintext" and server.plugin_cmd or nil,
+ option = server.plugin_type ~= "plaintext" and server.plugin_option or nil,
+ arg = server.plugin_type ~= "plaintext" and {server.plugin_arg} or nil,
+ env = {}
+ } or nil
+ end
+ trojan.websocket = server.trojan_transport and server.trojan_transport:find('ws') and {
+ --
+ enabled = true,
+ path = server.ws_path or "/",
+ host = server.ws_host or (server.tls_host or server.server)
+ } or nil
+ trojan.shadowsocks = (server.ss_aead == "1") and {
+ --
+ enabled = true,
+ method = server.ss_aead_method or "aead_aes_128_gcm",
+ password = server.ss_aead_pwd or ""
+ } or nil
+ print(json.stringify(trojan, 1))
+ end,
+ naiveproxy = function()
+ print(json.stringify(naiveproxy, 1))
+ end
+ }
+ if switch[index] then
+ switch[index]()
end
- trojan.websocket = server.trojan_transport and server.trojan_transport:find('ws') and {
- enabled = true,
- path = server.ws_path or "/",
- host = server.ws_host or (server.tls_host or server.server)
- } or nil
- trojan.shadowsocks = (server.ss_aead == "1") and {
- enabled = true,
- method = server.ss_aead_method or "aead_aes_128_gcm",
- password = server.ss_aead_pwd or ""
- } or nil
- print(json.stringify(trojan, 1))
-end
-if server.type == "naiveproxy" then
- print(json.stringify(naiveproxy, 1))
end
+local f = config:new()
+f:handleIndex(server.type)
diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua b/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua
index fdfc820e2..26fd41acc 100755
--- a/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua
+++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua
@@ -232,7 +232,8 @@ local function processData(szType, content)
local userinfo = hostInfo[1]
local password = userinfo
result.alias = UrlDecode(alias)
- result.type = "trojan"
+ result.type = "v2ray"
+ result.v2ray_protocol = "trojan"
result.server = host[1]
-- 按照官方的建议 默认验证ssl证书
result.insecure = "0"
@@ -459,11 +460,11 @@ local execute = function()
end
else
if not old.alias then
- if not old.server or old.server_port then
- ucic:delete(name, old['.name'])
- else
+ if old.server or old.server_port then
old.alias = old.server .. ':' .. old.server_port
log('忽略手动添加的节点: ' .. old.alias)
+ else
+ ucic:delete(name, old['.name'])
end
else
log('忽略手动添加的节点: ' .. old.alias)
diff --git a/luci-theme-edge/htdocs/luci-static/edge/background/3.jpg b/luci-theme-edge/htdocs/luci-static/edge/background/3.jpg
index 53b7fc5f382be6e3dd6b0f60db974d188505360b..0da1d98f875cb723a7c5702b59da8d3d765ff225 100644
GIT binary patch
literal 100094
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