diff --git a/package/lean/luci-app-ssr-plus/Makefile b/package/lean/luci-app-ssr-plus/Makefile
index ea8c7ff06b..5ec9f1c173 100644
--- a/package/lean/luci-app-ssr-plus/Makefile
+++ b/package/lean/luci-app-ssr-plus/Makefile
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-ssr-plus
PKG_VERSION:=1
-PKG_RELEASE:=126
+PKG_RELEASE:=127
PKG_CONFIG_DEPENDS:= CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks \
CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_V2ray \
diff --git a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua
index 5b7dc7fe32..abe8cf90ca 100644
--- a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua
+++ b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua
@@ -114,7 +114,7 @@ s = m:section(NamedSection, sid, "servers")
s.anonymous = true
s.addremove = false
-o = s:option(DummyValue,"ssr_url","SS/SSR/V2RAY URL")
+o = s:option(DummyValue,"ssr_url","SS/SSR/V2RAY/TROJAN URL")
o.rawhtml = true
o.template = "shadowsocksr/ssrurl"
o.value =sid
@@ -127,6 +127,9 @@ end
if nixio.fs.access("/usr/bin/v2ray/v2ray") then
o:value("v2ray", translate("V2Ray"))
end
+if nixio.fs.access("/usr/sbin/trojan") then
+o:value("trojan", translate("Trojan"))
+end
o.description = translate("Using incorrect encryption mothod may causes service fail to start")
o = s:option(Value, "alias", translate("Alias(optional)"))
@@ -149,6 +152,7 @@ o.password = true
o.rmempty = true
o:depends("type", "ssr")
o:depends("type", "ss")
+o:depends("type", "trojan")
o = s:option(ListValue, "encrypt_method", translate("Encrypt Method"))
for _, v in ipairs(encrypt_methods) do o:value(v) end
@@ -327,18 +331,26 @@ o.rmempty = true
o = s:option(Flag, "insecure", translate("allowInsecure"))
o.rmempty = true
o:depends("type", "v2ray")
+o:depends("type", "trojan")
-- [[ TLS ]]--
o = s:option(Flag, "tls", translate("TLS"))
o.rmempty = true
o.default = "0"
o:depends("type", "v2ray")
+o:depends("type", "trojan")
+
+o = s:option(Value, "tls_host", translate("TLS Host"))
+o:depends("tls", "1")
+o.rmempty = true
+o:depends("type", "trojan")
-- [[ Mux ]]--
o = s:option(Flag, "mux", translate("Mux"))
o.rmempty = true
o.default = "0"
o:depends("type", "v2ray")
+o:depends("type", "trojan")
o = s:option(Value, "concurrency", translate("Concurrency"))
o.datatype = "uinteger"
diff --git a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm
index 639ef70271..bc7f287172 100644
--- a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm
+++ b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm
@@ -88,7 +88,7 @@
var s = document.getElementById(urlname + '-status');
if (!s)
return false;
- var ssrurl = prompt("在这里黏贴配置链接 ssr:// | ss:// | vmess://", "");
+ var ssrurl = prompt("在这里黏贴配置链接 ssr:// | ss:// | vmess:// | trojan://", "");
if (ssrurl == null || ssrurl == "") {
s.innerHTML = "用户取消";
return false;
@@ -97,7 +97,7 @@
//var ssu = ssrurl.match(/ssr:\/\/([A-Za-z0-9_-]+)/i);
var ssu = ssrurl.split('://');
console.log(ssu.length);
- if ((ssu[0] != "ssr" && ssu[0] != "ss" && ssu[0] != "vmess") || ssu[1] == "") {
+ if ((ssu[0] != "ssr" && ssu[0] != "ss" && ssu[0] != "vmess" && ssu[0] != "trojan") || ssu[1] == "") {
s.innerHTML = "无效格式";
return false;
}
@@ -170,6 +170,29 @@
s.innerHTML = "导入Shadowsocks配置信息成功";
return false;
+ } else if (ssu[0] == "trojan") {
+ var ploc = ssu[1].indexOf("#");
+ if (ploc > 0) {
+ url0 = ssu[1].substr(0, ploc);
+ param = ssu[1].substr(ploc + 1);
+ } else {
+ url0 = ssu[1]
+ }
+ var sstr = b64decsafe(url0);
+ document.getElementById('cbid.shadowsocksr.' + sid + '.type').value = "trojan";
+ document.getElementById('cbid.shadowsocksr.' + sid + '.type').dispatchEvent(event);
+ var team = sstr.split('@');
+ console.log(param);
+ var part1 = team[0].split(':');
+ var part2 = team[1].split(':');
+ document.getElementById('cbid.shadowsocksr.' + sid + '.server').value = part2[0];
+ document.getElementById('cbid.shadowsocksr.' + sid + '.server_port').value = part2[1];
+ document.getElementById('cbid.shadowsocksr.' + sid + '.password').value = part1[1];
+ if (param != undefined) {
+ document.getElementById('cbid.shadowsocksr.' + sid + '.alias').value = decodeURI(param);
+ }
+ s.innerHTML = "导入Trojan配置信息成功";
+ return false;
} else if (ssu[0] == "vmess") {
var sstr = b64DecodeUnicode(ssu[1]);
var ploc = sstr.indexOf("/?");
diff --git a/package/lean/luci-app-ssr-plus/po/zh-cn/ssr-plus.po b/package/lean/luci-app-ssr-plus/po/zh-cn/ssr-plus.po
index 2d4c528587..b98c755ec1 100644
--- a/package/lean/luci-app-ssr-plus/po/zh-cn/ssr-plus.po
+++ b/package/lean/luci-app-ssr-plus/po/zh-cn/ssr-plus.po
@@ -378,7 +378,7 @@ msgid "GFW List"
msgstr "GFW列表"
msgid "ShadowSocksR Plus+ Settings"
-msgstr "ShadowSocksR Plus+ 设置(支持SS/SSR/V2RAY)"
+msgstr "ShadowSocksR Plus+ 设置(支持SS/SSR/V2RAY/TROJAN)"
msgid "Main Server"
msgstr "主服务器"
diff --git a/package/lean/luci-app-ssr-plus/root/etc/init.d/shadowsocksr b/package/lean/luci-app-ssr-plus/root/etc/init.d/shadowsocksr
index 6e962106af..196728bd1a 100755
--- a/package/lean/luci-app-ssr-plus/root/etc/init.d/shadowsocksr
+++ b/package/lean/luci-app-ssr-plus/root/etc/init.d/shadowsocksr
@@ -67,7 +67,7 @@ gen_config_file() {
elif [ "$host" != "${host#*:[0-9a-fA-F]}" ] ;then
hostip=${host}
else
- hostip=`nslookup ${host} | grep 'Address 1' | sed 's/Address 1: //g'`
+ hostip=`ping ${host} -s 1 -c 1 | grep PING | cut -d'(' -f 2 | cut -d')' -f1`
if echo $hostip|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$">/dev/null; then
hostip=${hostip}
else
@@ -125,6 +125,9 @@ EOF
elif [ "$stype" == "v2ray" ] ;then
lua /usr/share/shadowsocksr/genv2config.lua $GLOBAL_SERVER tcp $(uci_get_by_name $1 local_port) > /var/etc/v2-ssr-retcp.json
sed -i 's/\\//g' /var/etc/v2-ssr-retcp.json
+ elif [ "$stype" == "trojan" ] ;then
+ lua /usr/share/shadowsocksr/gentrojanconfig.lua $GLOBAL_SERVER $stype $usr_dns $usr_port $local_port > $config_file
+ sed -i 's/\\//g' $config_file
fi
}
@@ -143,7 +146,7 @@ start_rules() {
elif [ "$server" != "${server#*:[0-9a-fA-F]}" ] ;then
server=${server}
else
- server=`nslookup ${server} | grep 'Address 1' | sed 's/Address 1: //g'`
+ server=`ping ${server} -s 1 -c 1 | grep PING | cut -d'(' -f 2 | cut -d')' -f1`
if echo $server|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$">/dev/null; then
echo $server >/etc/ssr_ip
else
@@ -301,6 +304,8 @@ start_redir() {
sscmd="/usr/bin/ssr-redir"
elif [ "$stype" == "v2ray" ] ;then
sscmd="/usr/bin/v2ray/v2ray"
+ elif [ "$stype" == "trojan" ] ;then
+ sscmd="/usr/sbin/trojan"
fi
local utype=$(uci_get_by_name $UDP_RELAY_SERVER type)
@@ -310,6 +315,8 @@ start_redir() {
ucmd="/usr/bin/ssr-redir"
elif [ "$utype" == "v2ray" ] ;then
ucmd="/usr/bin/v2ray/v2ray"
+ elif [ "$utype" == "trojan" ] ;then
+ ucmd="/usr/sbin/trojan"
fi
if [ "$(uci_get_by_type global threads 0)" = "0" ] ;then
@@ -330,6 +337,9 @@ start_redir() {
elif [ "$stype" == "v2ray" ] ;then
$sscmd -config /var/etc/v2-ssr-retcp.json >/dev/null 2>&1 &
echo "$(date "+%Y-%m-%d %H:%M:%S") $($sscmd -version | head -1) Started!" >> /tmp/ssrplus.log
+ elif [ "$stype" == "trojan" ] ;then
+ $sscmd --config $CONFIG_FILE >> /tmp/ssrplus.log 2>&1 &
+ echo "$(date "+%Y-%m-%d %H:%M:%S") $($sscmd --version 2>&1 | head -1) Started!" >> /tmp/ssrplus.log
fi
if [ -n "$UDP_RELAY_SERVER" ] ;then
@@ -346,7 +356,10 @@ start_redir() {
elif [ "$utype" == "v2ray" ] ; then
lua /usr/share/shadowsocksr/genv2config.lua $UDP_RELAY_SERVER udp $(uci_get_by_name $UDP_RELAY_SERVER local_port) > /var/etc/v2-ssr-reudp.json
sed -i 's/\\//g' /var/etc/v2-ssr-reudp.json
- $ucmd -config /var/etc/v2-ssr-reudp.json >/dev/null 2>&1 &
+ $ucmd -config /var/etc/v2-ssr-reudp.json >/dev/null 2>&1 &
+ elif [ "$stype" == "trojan" ] ;then
+ gen_config_file $UDP_RELAY_SERVER 1
+ $ucmd --config $CONFIG_UDP_FILE >> /tmp/ssrplus.log 2>&1 &
fi
fi
@@ -539,6 +552,7 @@ stop() {
killall -q -9 ss-redir
killall -q -9 ssr-redir
killall -q -9 v2ray
+ killall -q -9 trojan
killall -q -9 ssr-server
killall -q -9 kcptun-client
killall -q -9 ssr-local
diff --git a/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gentrojanconfig.lua b/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gentrojanconfig.lua
new file mode 100644
index 0000000000..bca0cd41e2
--- /dev/null
+++ b/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gentrojanconfig.lua
@@ -0,0 +1,43 @@
+local ucursor = require "luci.model.uci".cursor()
+local json = require "luci.jsonc"
+local server_section = arg[1]
+local proto = arg[2]
+local usr_dns = arg[3]
+local usr_port = arg[4]
+local local_port = arg[5]
+
+local server = ucursor:get_all("shadowsocksr", server_section)
+
+local trojan = {
+ -- error = "/var/ssrplus.log",
+ log_level = 3,
+ run_type = proto,
+ local_addr = "0.0.0.0",
+ local_port = tonumber(local_port),
+ remote_addr = server.server,
+ remote_port = tonumber(server.server_port),
+ target_addr = usr_dns,
+ target_port = tonumber(usr_port),
+ udp_timeout = 60,
+ -- 传入连接
+ password = {server.password},
+ -- 传出连接
+ ssl = (server.tls) and {
+ verify = (server.insecure == "1") and false or true,
+ verify_hostname = (server.insecure == "1") and false or true,
+ cert = "",
+ ciper = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:RSA-AES128-GCM-SHA256:RSA-AES256-GCM-SHA384:RSA-AES128-SHA:RSA-AES256-SHA:RSA-3DES-EDE-SHA",
+ sni = server.tls_host,
+ alpn = {"h2", "http/1.1"},
+ curve = "",
+ reuse_session = true,
+ session_ticket = false,
+ },
+ tcp = {
+ no_delay = true,
+ keep_alive = true,
+ fast_open = (server.fast_open == "1") and true or false,
+ fast_open_qlen = 20
+ }
+}
+print(json.stringify(trojan, 1))