luci-app-vssr: bump to v1.21
Signed-off-by: CN_SZTL <cnsztl@project-openwrt.eu.org>
This commit is contained in:
parent
b65bd6d007
commit
b74b888f56
@ -1,8 +1,8 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-vssr
|
||||
PKG_VERSION:=1.20
|
||||
PKG_RELEASE:=20201209
|
||||
PKG_VERSION:=1.21
|
||||
PKG_RELEASE:=20210114
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
|
||||
@ -1,3 +1,11 @@
|
||||
--[[
|
||||
Author: your name
|
||||
Date: 2019-11-11 09:33:07
|
||||
LastEditTime: 2021-01-14 18:50:06
|
||||
LastEditors: Please set LastEditors
|
||||
Description: In User Settings Edit
|
||||
FilePath: \luci-app-vssr\luasrc\model\cbi\vssr\socks5.lua
|
||||
--]]
|
||||
local vssr = 'vssr'
|
||||
local uci = luci.model.uci.cursor()
|
||||
local server_table = {}
|
||||
@ -34,4 +42,32 @@ if nixio.fs.access('/usr/bin/v2ray/v2ray') or nixio.fs.access('/usr/bin/v2ray')
|
||||
o.rmempty = false
|
||||
end
|
||||
|
||||
-- [[ Http Proxy ]]--
|
||||
if nixio.fs.access('/usr/bin/v2ray/v2ray') or nixio.fs.access('/usr/bin/v2ray') or nixio.fs.access('/usr/bin/xray') or nixio.fs.access('/usr/bin/xray/xray') then
|
||||
s = m:section(TypedSection, 'http_proxy', translate('V2ray HTTP Proxy'))
|
||||
s.anonymous = true
|
||||
|
||||
o = s:option(Flag, 'enable_server', translate('Enable Servers'))
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(Flag, 'enable_auth', translate('Enable Auth'))
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(Value, 'http_user', translate('HTTP user'))
|
||||
o.default = 'user'
|
||||
o.rmempty = true
|
||||
o:depends('enable_auth', '1')
|
||||
|
||||
o = s:option(Value, 'http_pass', translate('HTTP pass'))
|
||||
o.default = 'password'
|
||||
o.password = true
|
||||
o.rmempty = true
|
||||
o:depends('enable_auth', '1')
|
||||
|
||||
o = s:option(Value, 'local_port', translate('Local Port'))
|
||||
o.datatype = 'port'
|
||||
o.default = 1088
|
||||
o.rmempty = false
|
||||
end
|
||||
|
||||
return m
|
||||
|
||||
@ -5,7 +5,6 @@
|
||||
const GET_FLAG_URL = '<%=luci.dispatcher.build_url("admin", "services", "vssr","flag")%>';
|
||||
var sid;
|
||||
|
||||
|
||||
function getFlag(remark, hosts, sid) {
|
||||
XHR.get(GET_FLAG_URL,
|
||||
{ host: hosts, remark: remark },
|
||||
@ -67,7 +66,6 @@
|
||||
return document.getElementById('cbid.vssr.' + sid + id);
|
||||
}
|
||||
|
||||
|
||||
function import_ssr_url(btn, urlname, sids) {
|
||||
sid = sids;
|
||||
var s = document.getElementById(urlname + '-status');
|
||||
|
||||
@ -13,8 +13,8 @@
|
||||
|
||||
var _responseLen;
|
||||
var noChange = 0;
|
||||
var modal = '<div class="modals-bg">' +
|
||||
'<div class="modals">' +
|
||||
var modal = '<div class="modals-bg hide">' +
|
||||
'<div class="modals hide">' +
|
||||
'<h2><%:Subscription%></h2>' +
|
||||
'<h3 style="margin-left:0;"><%:Subscribing,Please do not refresh!%></h3>' +
|
||||
'<textarea cols="63" rows="28" wrap="on" readonly="readonly" id="log_content3" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"></textarea>' +
|
||||
@ -24,7 +24,10 @@
|
||||
//显示并开始刷新订阅
|
||||
function update_subscribe() {
|
||||
$("body").append(modal);
|
||||
$(".modals-bg").show();
|
||||
$(".modals-bg").removeClass("hide");
|
||||
setTimeout(function(){
|
||||
$(".modals").removeClass("hide");
|
||||
}, 200);
|
||||
setTimeout("get_realtime_log();", 500);
|
||||
}
|
||||
//保存订阅按钮
|
||||
|
||||
@ -173,7 +173,10 @@ msgid "Alias"
|
||||
msgstr "别名"
|
||||
|
||||
msgid "V2ray SOCKS5 Proxy"
|
||||
msgstr "V2ray SOCKS5代理"
|
||||
msgstr "V2ray SOCKS5 代理"
|
||||
|
||||
msgid "V2ray HTTP Proxy"
|
||||
msgstr "V2ray HTTP 代理"
|
||||
|
||||
msgid "Server"
|
||||
msgstr "服务器"
|
||||
@ -539,6 +542,12 @@ msgstr "用户名"
|
||||
msgid "Socks pass"
|
||||
msgstr "密码"
|
||||
|
||||
msgid "HTTP user"
|
||||
msgstr "用户名"
|
||||
|
||||
msgid "HTTP pass"
|
||||
msgstr "密码"
|
||||
|
||||
msgid "Enable Servers"
|
||||
msgstr "开启服务"
|
||||
|
||||
|
||||
@ -21,6 +21,14 @@ config socks5_proxy
|
||||
option Socks_user 'user'
|
||||
option Socks_pass 'password'
|
||||
|
||||
config http_proxy
|
||||
option enable_server '0'
|
||||
option local_port '1088'
|
||||
option local_address '0.0.0.0'
|
||||
option enable_auth '0'
|
||||
option http_user 'user'
|
||||
option http_pass 'password'
|
||||
|
||||
config access_control
|
||||
option wan_bp_list '/etc/vssr/china_ssr.txt'
|
||||
option lan_ac_mode 'b'
|
||||
|
||||
@ -20,7 +20,12 @@ NAME=vssr
|
||||
CONFIG_FILE=/var/etc/${NAME}_t.json
|
||||
CONFIG_UDP_FILE=/var/etc/${NAME}_u.json
|
||||
CONFIG_SOCK5_FILE=/var/etc/${NAME}_s.json
|
||||
CRON_FILE=/etc/crontabs/root
|
||||
|
||||
#定义可执行文件路径
|
||||
VSSR_RULES_BIN=/usr/bin/vssr-rules
|
||||
|
||||
#初始化配置
|
||||
server_count=0
|
||||
redir_tcp=0
|
||||
redir_udp=0
|
||||
@ -33,9 +38,10 @@ switch_enable=0
|
||||
shunt_enable=0
|
||||
switch_server=$1
|
||||
MAXFD=32768
|
||||
CRON_FILE=/etc/crontabs/root
|
||||
threads=1
|
||||
scount=0
|
||||
|
||||
|
||||
#读取 uci 数据
|
||||
uci_get_by_name() {
|
||||
local ret=$(uci get $NAME.$1.$2 2>/dev/null)
|
||||
echo ${ret:=$3}
|
||||
@ -46,6 +52,24 @@ uci_get_by_type() {
|
||||
echo ${ret:=$3}
|
||||
}
|
||||
|
||||
run_mode=$(uci_get_by_type global run_mode)
|
||||
is_xray=$(uci_get_by_type global use_xray)
|
||||
|
||||
#查找可执行文件
|
||||
find_bin() {
|
||||
case "$1" in
|
||||
ss) ret="ss-redir" ;;
|
||||
ss-local) ret="ss-local" ;;
|
||||
ssr) ret="ssr-redir" ;;
|
||||
ssr-local) ret="ssr-local" ;;
|
||||
ssr-server) ret="ssr-server" ;;
|
||||
v2ray | vless) [[ $is_xray = "1" ]] && ret="xray" || ret="v2ray" ;;
|
||||
trojan) ret="trojan" ;;
|
||||
esac
|
||||
echo $(find /usr -perm /+x -type f -name $ret)
|
||||
}
|
||||
|
||||
#添加定时执行脚本
|
||||
add_cron() {
|
||||
sed -i '/vssr.log/d' $CRON_FILE && echo '0 1 * * * echo "" > /tmp/vssr.log' >>$CRON_FILE
|
||||
[ $(uci_get_by_type server_subscribe auto_update 0) -eq 1 ] && echo "0 $(uci_get_by_type server_subscribe auto_update_time) * * * /usr/bin/lua /usr/share/vssr/subscribe.lua" >>$CRON_FILE
|
||||
@ -53,13 +77,16 @@ add_cron() {
|
||||
crontab $CRON_FILE
|
||||
}
|
||||
|
||||
#删除定时执行脚本
|
||||
del_cron() {
|
||||
sed -i '/vssr/d' $CRON_FILE
|
||||
sed -i '/vssr.log/d' $CRON_FILE
|
||||
/etc/init.d/cron restart
|
||||
}
|
||||
|
||||
#计算分流数量
|
||||
count_shunt() {
|
||||
scount=0
|
||||
snum=0
|
||||
eval shunt_array1="youtube"
|
||||
eval shunt_array2="tw_video"
|
||||
eval shunt_array3="netflix"
|
||||
@ -72,17 +99,16 @@ count_shunt() {
|
||||
local server_index=$(uci_get_by_type global ${a}_server)
|
||||
local server_type=$(uci_get_by_name $server_index type)
|
||||
if [ "$server_type" != "" ]; then
|
||||
scount=$(($scount + 1))
|
||||
snum=$(($snum + 1))
|
||||
fi
|
||||
done
|
||||
echo $snum
|
||||
}
|
||||
|
||||
count_shunt
|
||||
run_mode=$(uci_get_by_type global run_mode)
|
||||
is_xray=$(uci_get_by_type global use_xray)
|
||||
|
||||
#创建配置文件
|
||||
gen_config_file() {
|
||||
local hostip=$(uci_get_by_name $1 server)
|
||||
|
||||
[ $2 = "0" -a $kcp_flag = "1" ] && hostip="127.0.0.1"
|
||||
|
||||
if [ $2 = "0" ]; then
|
||||
@ -94,17 +120,12 @@ gen_config_file() {
|
||||
config_file=$CONFIG_UDP_FILE
|
||||
server_obj=$UDP_RELAY_SERVER
|
||||
fi
|
||||
if [ $(uci_get_by_name $1 fast_open 0) = "1" ]; then
|
||||
fastopen="true"
|
||||
else
|
||||
fastopen="false"
|
||||
fi
|
||||
[[ $(uci_get_by_name $1 fast_open 0) = "1" ]] && fastopen="true" || fastopen="false"
|
||||
|
||||
local stype=$(uci_get_by_name $1 type)
|
||||
local port=$(uci_get_by_name $1 local_port)
|
||||
if [ "$stype" == "vless" ]; then
|
||||
stype="v2ray"
|
||||
fi
|
||||
[[ "$stype" == "vless" ]] && stype="v2ray"
|
||||
|
||||
if [ "$stype" == "trojan" ]; then
|
||||
if [ "$re_type" == "udp" ]; then
|
||||
re_type="client"
|
||||
@ -113,16 +134,19 @@ gen_config_file() {
|
||||
re_type="nat"
|
||||
fi
|
||||
fi
|
||||
|
||||
local mport=0
|
||||
if [ $3 = "1" ]; then
|
||||
stype="v2ray"
|
||||
mport=1090
|
||||
re_type="tcp"
|
||||
fi
|
||||
|
||||
lua /usr/share/vssr/genconfig_${stype}.lua ${server_obj} ${re_type} ${port} ${hostip} ${mport} >${config_file}
|
||||
sed -i 's/\\//g' $config_file
|
||||
}
|
||||
|
||||
#获取arg输出
|
||||
get_arg_out() {
|
||||
case "$(uci_get_by_type access_control router_proxy 1)" in
|
||||
1) echo "-o" ;;
|
||||
@ -130,6 +154,7 @@ get_arg_out() {
|
||||
esac
|
||||
}
|
||||
|
||||
#启动规则
|
||||
start_rules() {
|
||||
local server=$(uci_get_by_name $GLOBAL_SERVER server)
|
||||
#resolve name
|
||||
@ -185,15 +210,12 @@ start_rules() {
|
||||
|
||||
#deal gfw firewall rule
|
||||
local gfwmode=""
|
||||
if [ "$run_mode" = "gfw" ]; then
|
||||
gfwmode="-g"
|
||||
elif [ "$run_mode" = "router" ]; then
|
||||
gfwmode="-r"
|
||||
elif [ "$run_mode" = "oversea" ]; then
|
||||
gfwmode="-c"
|
||||
elif [ "$run_mode" = "all" ]; then
|
||||
gfwmode="-z"
|
||||
fi
|
||||
case "$run_mode" in
|
||||
gfw) gfwmode="-g" ;;
|
||||
router) gfwmode="-r" ;;
|
||||
oversea) gfwmode="-c" ;;
|
||||
all) gfwmode="-z" ;;
|
||||
esac
|
||||
|
||||
local dports=$(uci_get_by_type global dports 1)
|
||||
if [ $dports = "1" ]; then
|
||||
@ -202,7 +224,7 @@ start_rules() {
|
||||
proxyport="-m multiport --dports 22,53,587,465,995,993,143,80,443 "
|
||||
fi
|
||||
|
||||
/usr/bin/vssr-rules \
|
||||
$VSSR_RULES_BIN \
|
||||
-s "$server" \
|
||||
-l "$local_port" \
|
||||
-S "$udp_server" \
|
||||
@ -218,6 +240,7 @@ start_rules() {
|
||||
return $?
|
||||
}
|
||||
|
||||
#启动PDNSD
|
||||
start_pdnsd() {
|
||||
local usr_dns="$1"
|
||||
local usr_port="$2"
|
||||
@ -265,24 +288,8 @@ start_pdnsd() {
|
||||
/usr/sbin/pdnsd -c /var/etc/pdnsd.conf &
|
||||
}
|
||||
|
||||
find_bin() {
|
||||
case "$1" in
|
||||
ss) ret="/usr/bin/ss-redir" ;;
|
||||
ss-local) ret="/usr/bin/ss-local" ;;
|
||||
ssr) ret="/usr/bin/ssr-redir" ;;
|
||||
ssr-local) ret="/usr/bin/ssr-local" ;;
|
||||
ssr-server) ret="/usr/bin/ssr-server" ;;
|
||||
v2ray | vless)
|
||||
ret="/usr/bin/v2ray/v2ray" && [ ! -f "$ret" ] && ret="/usr/bin/v2ray"
|
||||
if [ $is_xray = "1" ]; then
|
||||
ret="/usr/bin/xray" && [ ! -f "$ret" ] && ret="/usr/bin/xray/xray"
|
||||
fi
|
||||
;;
|
||||
trojan) ret="/usr/sbin/trojan" ;;
|
||||
esac
|
||||
echo $ret
|
||||
}
|
||||
#分流节点
|
||||
|
||||
#开启分流
|
||||
start_shunt() {
|
||||
eval shunt_type1="global"
|
||||
eval shunt_type2="youtube"
|
||||
@ -360,8 +367,7 @@ start_redir() {
|
||||
local stype=$(uci_get_by_name $GLOBAL_SERVER type)
|
||||
sscmd=$(find_bin $stype)
|
||||
|
||||
local utype=$(uci_get_by_name $UDP_RELAY_SERVER type)
|
||||
ucmd=$(find_bin $utype)
|
||||
|
||||
|
||||
if [ "$(uci_get_by_type global threads 0)" = "0" ]; then
|
||||
threads=$(cat /proc/cpuinfo | grep 'processor' | wc -l)
|
||||
@ -370,6 +376,7 @@ start_redir() {
|
||||
fi
|
||||
#转发TCP
|
||||
redir_tcp=1
|
||||
scount=$(count_shunt)
|
||||
if [ $scount == "0" ]; then
|
||||
local last_config_file=$CONFIG_FILE
|
||||
case "$stype" in
|
||||
@ -408,6 +415,8 @@ start_redir() {
|
||||
#转发UDP
|
||||
if [ -n "$UDP_RELAY_SERVER" ]; then
|
||||
redir_udp=1
|
||||
local utype=$(uci_get_by_name $UDP_RELAY_SERVER type)
|
||||
ucmd=$(find_bin $utype)
|
||||
gen_config_file $UDP_RELAY_SERVER 1 0
|
||||
last_config_file=$CONFIG_UDP_FILE
|
||||
case "$stype" in
|
||||
@ -467,11 +476,7 @@ start_redir() {
|
||||
}
|
||||
|
||||
gen_service_file() {
|
||||
if [ $(uci_get_by_name $1 fast_open) = "1" ]; then
|
||||
fastopen="true"
|
||||
else
|
||||
fastopen="false"
|
||||
fi
|
||||
[[ $(uci_get_by_name $1 fast_open) = "1" ]] && fastopen="true" || fastopen="false"
|
||||
cat <<-EOF >$2
|
||||
{
|
||||
"server": "0.0.0.0",
|
||||
@ -504,6 +509,7 @@ start_service() {
|
||||
iptables -t filter -A SSR-SERVER-RULE -p udp --dport $(uci_get_by_name $1 server_port) -j ACCEPT
|
||||
return 0
|
||||
}
|
||||
|
||||
gen_serv_include() {
|
||||
FWI=$(uci get firewall.vssr.path 2>/dev/null)
|
||||
[ -n "$FWI" ] || return 0
|
||||
@ -535,15 +541,17 @@ start_server() {
|
||||
}
|
||||
|
||||
start_local() {
|
||||
local local_server=$(uci_get_by_type socks5_proxy enable_server)
|
||||
local socks_server=$(uci_get_by_type socks5_proxy enable_server)
|
||||
local http_server=$(uci_get_by_type http_proxy enable_server)
|
||||
|
||||
[ "$local_server" = "0" ] && return 1
|
||||
if [ "$socks_server" = "0" -a "$http_server" = "0" ]; then
|
||||
return 1
|
||||
fi
|
||||
mkdir -p /var/run /var/etc
|
||||
|
||||
lua /usr/share/vssr/genconfig_v2ray_s.lua >$CONFIG_SOCK5_FILE
|
||||
sed -i 's/\\//g' $config_file
|
||||
socksbin=$(find_bin "v2ray")
|
||||
echo $socksbin
|
||||
$socksbin -config $CONFIG_SOCK5_FILE >/dev/null 2>&1 &
|
||||
local_enable=1
|
||||
}
|
||||
@ -639,7 +647,7 @@ stop() {
|
||||
killall -q -9 ss-redir ss-local obfs-local ssr-redir ssr-local ssr-server v2ray v2ray-plugin xray trojan microsocks ipt2socks dns2socks pdnsd
|
||||
|
||||
if [ -f "/tmp/dnsmasq.d/dnsmasq-ssr.conf" ]; then
|
||||
rm -f /tmp/dnsmasq.d/dnsmasq-ssr.conf /tmp/dnsmasq.ssr /tmp/dnsmasq.oversea
|
||||
rm -rf /tmp/dnsmasq.d/dnsmasq-ssr.conf /tmp/dnsmasq.ssr /tmp/dnsmasq.oversea
|
||||
/etc/init.d/dnsmasq restart >/dev/null 2>&1
|
||||
fi
|
||||
del_cron
|
||||
|
||||
@ -2,25 +2,47 @@ local ucursor = require 'luci.model.uci'.cursor()
|
||||
local name = 'vssr'
|
||||
local json = require 'luci.jsonc'
|
||||
local proto = 'socks'
|
||||
local socks_switch = ucursor:get_first(name, 'socks5_proxy', 'enable_server')
|
||||
local auth_type = ucursor:get_first(name, 'socks5_proxy', 'enable_auth')
|
||||
local local_port = ucursor:get_first(name, 'socks5_proxy', 'local_port')
|
||||
local Socks_user = ucursor:get_first(name, 'socks5_proxy', 'Socks_user')
|
||||
local Socks_pass = ucursor:get_first(name, 'socks5_proxy', 'Socks_pass')
|
||||
|
||||
local http_switch = ucursor:get_first(name, 'socks5_proxy', 'enable_server')
|
||||
local auth_typeh = ucursor:get_first(name, 'http_proxy', 'enable_auth')
|
||||
local local_porth = ucursor:get_first(name, 'http_proxy', 'local_port')
|
||||
local http_user = ucursor:get_first(name, 'http_proxy', 'http_user')
|
||||
local http_pass = ucursor:get_first(name, 'http_proxy', 'http_pass')
|
||||
|
||||
function gen_inbound(sw, auth_type, local_port, user, pass, proto)
|
||||
local bound = {}
|
||||
if sw == 0 then
|
||||
bound = nil
|
||||
else
|
||||
bound = {
|
||||
port = local_port,
|
||||
protocol = proto,
|
||||
settings = {
|
||||
auth = (auth_type == '1') and 'password' or 'noauth',
|
||||
accounts = (auth_type == '1') and {{user = (auth_type == '1') and user, pass = pass}} or nil
|
||||
}
|
||||
}
|
||||
end
|
||||
return bound
|
||||
end
|
||||
|
||||
inbounds_table = {}
|
||||
|
||||
table.insert(inbounds_table, gen_inbound(socks_switch, auth_type, local_port, Socks_user, Socks_pass, 'socks'))
|
||||
table.insert(inbounds_table, gen_inbound(http_switch, auth_typeh, local_porth, http_user, http_pass, 'http'))
|
||||
|
||||
local v2ray = {
|
||||
log = {
|
||||
-- error = "/var/log/v2ray.log",
|
||||
loglevel = 'warning'
|
||||
},
|
||||
-- 传入连接
|
||||
inbound = {
|
||||
port = local_port,
|
||||
protocol = proto,
|
||||
settings = {
|
||||
auth = (auth_type == '1') and 'password' or 'noauth',
|
||||
accounts = (auth_type == '1') and {{user = (auth_type == '1') and Socks_user, pass = Socks_pass}} or nil
|
||||
}
|
||||
},
|
||||
inbounds = inbounds_table,
|
||||
-- 传出连接
|
||||
outbound = {protocol = 'freedom'},
|
||||
-- 额外传出连接
|
||||
|
||||
@ -390,7 +390,7 @@ local execute = function()
|
||||
end
|
||||
-- diff
|
||||
do
|
||||
assert(next(nodeResult), 'node result is empty')
|
||||
assert(next(nodeResult), '获取不到节点信息,请检查路由器是否能够访问网络,或者订阅链接是否正确')
|
||||
local add, del = 0, 0
|
||||
ucic:foreach(
|
||||
name,
|
||||
@ -453,7 +453,7 @@ if subscribe_url and #subscribe_url > 0 then
|
||||
execute,
|
||||
function(e)
|
||||
log(e)
|
||||
log(debug.traceback())
|
||||
-- log(debug.traceback())
|
||||
log('发生错误, 正在恢复服务')
|
||||
log('END SUBSCRIBE')
|
||||
local firstServer = ucic:get_first(name, uciType)
|
||||
|
||||
@ -622,7 +622,12 @@ footer.mobile-hide {
|
||||
left: 0;
|
||||
top: 0;
|
||||
background: rgba(255, 255, 255, 0.8);
|
||||
display: none;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.modals-bg.hide{
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.modals {
|
||||
@ -642,6 +647,14 @@ footer.mobile-hide {
|
||||
/* Firefox */
|
||||
-webkit-box-sizing: border-box;
|
||||
/* Safari */
|
||||
transition: all 0.3s ease-in-out;
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
.modals.hide{
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
transform: scale(0.5);
|
||||
}
|
||||
|
||||
.modals h2 {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user