diff --git a/package/ctcgfw/luci-app-vssr/Makefile b/package/ctcgfw/luci-app-vssr/Makefile
index 5e1d83bb9f..afcb160070 100644
--- a/package/ctcgfw/luci-app-vssr/Makefile
+++ b/package/ctcgfw/luci-app-vssr/Makefile
@@ -1,8 +1,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-vssr
-PKG_VERSION:=1.18
-PKG_RELEASE:=20201204
+PKG_VERSION:=1.19
+PKG_RELEASE:=20201205
include $(INCLUDE_DIR)/package.mk
@@ -46,7 +46,7 @@ define Package/luci-app-vssr
SUBMENU:=3. Applications
TITLE:=A New SS/SSR/V2Ray/Trojan LuCI interface
PKGARCH:=all
- DEPENDS:=+shadowsocksr-libev-alt +ipset +ip-full +iptables-mod-tproxy +dnsmasq-full +coreutils +coreutils-base64 +bash +pdnsd-alt +wget +luasocket +coreutils-nohup +lua-maxminddb \
+ DEPENDS:=+shadowsocksr-libev-alt +ipset +ip-full +iptables-mod-tproxy +dnsmasq-full +coreutils +coreutils-base64 +bash +pdnsd-alt +wget +luasocket +lua-maxminddb \
+shadowsocks-libev-ss-local +shadowsocksr-libev-ssr-local +shadowsocks-libev-ss-redir +simple-obfs \
+PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_plugin:v2ray-plugin \
+PACKAGE_$(PKG_NAME)_INCLUDE_V2ray:v2ray \
diff --git a/package/ctcgfw/luci-app-vssr/luasrc/controller/vssr.lua b/package/ctcgfw/luci-app-vssr/luasrc/controller/vssr.lua
index dfd7964948..662cbfc169 100644
--- a/package/ctcgfw/luci-app-vssr/luasrc/controller/vssr.lua
+++ b/package/ctcgfw/luci-app-vssr/luasrc/controller/vssr.lua
@@ -28,7 +28,7 @@ function index()
end
entry({'admin', 'services', 'vssr', 'log'}, cbi('vssr/log'), _('Log'), 30).leaf = true
- entry({'admin', 'services', 'vssr', 'licence'}, template('vssr/licence'), _('Licence'), 40).leaf = true
+ --entry({'admin', 'services', 'vssr', 'licence'}, template('vssr/licence'), _('Licence'), 40).leaf = true
entry({'admin', 'services', 'vssr', 'refresh'}, call('refresh_data')) -- 更新白名单和GFWLIST
entry({'admin', 'services', 'vssr', 'checkport'}, call('check_port')) -- 检测单个端口并返回Ping
@@ -60,7 +60,7 @@ function get_subscribe()
uci:set(name, '@server_subscribe[0]', 'filter_words', filter_words)
uci:set_list(name, '@server_subscribe[0]', 'subscribe_url', cjson.parse(subscribe_url))
uci:commit(name)
- luci.sys.exec('nohup /usr/bin/lua /usr/share/vssr/subscribe.lua >/www/check_update.htm 2>/dev/null &')
+ luci.sys.exec('/usr/bin/lua /usr/share/vssr/subscribe.lua >/www/check_update.htm 2>/dev/null &')
e.error = 0
else
e.error = 1
@@ -215,6 +215,7 @@ function get_flag()
end
-- 刷新检测文件
+
function refresh_data()
local set = luci.http.formvalue('set')
local icount = 0
@@ -245,8 +246,7 @@ function refresh_data()
retstring = '-1'
end
elseif set == 'ip_data' then
- refresh_cmd =
- "wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' 2>/dev/null| awk -F\\| '/CN\\|ipv4/ { printf(\"%s/%d\\n\", $4, 32-log($5)/log(2)) }' > /tmp/china_ssr.txt"
+ refresh_cmd = "wget -O- 'https://ispip.clang.cn/all_cn.txt' > /tmp/china_ssr.txt"
sret = luci.sys.call(refresh_cmd)
icount = luci.sys.exec('cat /tmp/china_ssr.txt | wc -l')
if sret == 0 and tonumber(icount) > 1000 then
diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client.lua
index 5d4dfcebad..0c016becd4 100644
--- a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client.lua
+++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client.lua
@@ -5,7 +5,8 @@ local m, s, sec, o, kcp_enable
local vssr = 'vssr'
local gfwmode = 0
-if nixio.fs.access('/etc/vssr/gfw_list.conf') then
+
+if nixio.fs.access('/etc/dnsmasq.ssr/gfw_list.conf') then
gfwmode = 1
end
@@ -18,70 +19,26 @@ m:section(SimpleSection).template = 'vssr/status_top'
local server_table = {}
local tw_table = {}
local tvb_table = {}
+
+
+local server_table = {}
uci:foreach(
- vssr,
+ 'vssr',
'servers',
function(s)
- if s.alias then
- server_table[s['.name']] = '[%s]:%s' % {string.upper(s.type), s.alias}
- elseif s.server and s.server_port then
- server_table[s['.name']] =
- '[%s]:%s:%s' %
- {
- string.upper(s.type),
- s.server,
- s.server_port
- }
- end
-
- if s.flag == 'tw' then
- if s.alias then
- tw_table[s['.name']] = '[%s]:%s' % {string.upper(s.type), s.alias}
- elseif s.server and s.server_port then
- tw_table[s['.name']] =
- '[%s]:%s:%s' %
- {
- string.upper(s.type),
- s.server,
- s.server_port
- }
- end
- end
-
- if s.flag == 'hk' then
- if s.alias then
- tvb_table[s['.name']] = '[%s]:%s' % {string.upper(s.type), s.alias}
- elseif s.server and s.server_port then
- tvb_table[s['.name']] =
- '[%s]:%s:%s' %
- {
- string.upper(s.type),
- s.server,
- s.server_port
- }
- end
- end
+ s['name'] = s['.name']
+ s['gname'] = '[%s]:%s' % {string.upper(s.type), s.alias}
+ table.insert(server_table, s)
end
)
-
-local key_table = {}
-for key, _ in pairs(server_table) do
- table.insert(key_table, key)
+function my_sort(a,b)
+ if(a.alias ~= nil and b.alias ~= nil) then
+ return a.alias < b.alias
+ end
end
+table.sort(server_table, my_sort)
-local key_table_tw = {}
-for key, _ in pairs(tw_table) do
- table.insert(key_table_tw, key)
-end
-local key_table_tvb = {}
-for key, _ in pairs(tvb_table) do
- table.insert(key_table_tvb, key)
-end
-
-table.sort(key_table)
-table.sort(key_table_tw)
-table.sort(key_table_tvb)
local route_name = {
'youtube_server',
'tw_video_server',
@@ -107,8 +64,8 @@ s.anonymous = true
o = s:option(ListValue, 'global_server', translate('Main Server'))
o:value('nil', translate('Disable'))
-for _, key in pairs(key_table) do
- o:value(key, server_table[key])
+for _, key in pairs(server_table) do
+ o:value(key.name, key.gname)
end
o.default = 'nil'
o.rmempty = false
@@ -116,12 +73,14 @@ o.rmempty = false
o = s:option(ListValue, 'udp_relay_server', translate('Game Mode UDP Server'))
o:value('', translate('Disable'))
o:value('same', translate('Same as Main Server'))
-for _, key in pairs(key_table) do
- o:value(key, server_table[key])
+for _, key in pairs(server_table) do
+ o:value(key.name, key.gname)
+end
+if nixio.fs.access('/usr/bin/xray') or nixio.fs.access('/usr/bin/xray/xray') then
+ o = s:option(Flag, 'use_xray', translate('Use Xray instead of V2ray'))
+ o.rmempty = false
end
-o = s:option(Flag, 'use_xray', translate('Use Xray instead of V2ray'))
-o.rmempty = false
o = s:option(Flag, 'v2ray_flow', translate('Open v2ray route'))
o.rmempty = false
@@ -130,17 +89,15 @@ o.description = translate('When open v2ray routed,Apply may take more time.')
for i, v in pairs(route_name) do
o = s:option(ListValue, v, translate(route_label[i]))
o:value('nil', translate('Same as Main Server'))
- if (v == 'tw_video_server') then
- for _, key in pairs(key_table_tw) do
- o:value(key, tw_table[key])
+ for _, key in pairs(server_table) do
+ if(v == 'tw_video_server' and key.flag == "tw") then
+ o:value(key.name, key.gname)
end
- elseif (v == 'tvb_server') then
- for _, key in pairs(key_table_tvb) do
- o:value(key, tvb_table[key])
+ if(v == 'tvb_server' and key.flag == "hk") then
+ o:value(key.name, key.gname)
end
- else
- for _, key in pairs(key_table) do
- o:value(key, server_table[key])
+ if(v ~= 'tvb_server' and v ~= 'tw_video_server') then
+ o:value(key.name, key.gname)
end
end
o:depends('v2ray_flow', '1')
@@ -162,6 +119,7 @@ o:value('router', translate('IP Route Mode'))
o:value('all', translate('Global Mode'))
o:value('oversea', translate('Oversea Mode'))
o.default = 'router'
+
o = s:option(ListValue, 'dports', translate('Proxy Ports'))
o:value('1', translate('All Ports'))
o:value('2', translate('Only Common Ports'))
diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/servers.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/servers.lua
index 963aa35763..93e82b575c 100644
--- a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/servers.lua
+++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/servers.lua
@@ -24,7 +24,12 @@ uci:foreach(
name = s['.name']
end
)
-
+function my_sort(a,b)
+ if(a.alias ~= nil and b.alias ~= nil) then
+ return a.alias < b.alias
+ end
+end
+table.sort(server_table, my_sort)
m = Map(vssr)
m:section(SimpleSection).template = 'vssr/status_top'
@@ -37,6 +42,7 @@ s.sortable = false
s.des = server_count
s.current = uci:get('vssr', name, 'global_server')
+s.serverTable = server_table
s.servers = json.stringify(server_table)
s.template = 'vssr/tblsection'
s.extedit = luci.dispatcher.build_url('admin/services/vssr/servers/%s')
diff --git a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/tblsection.htm b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/tblsection.htm
index b23a504532..527055d268 100644
--- a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/tblsection.htm
+++ b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/tblsection.htm
@@ -11,34 +11,37 @@
<%- local isempty = true
- for i, k in ipairs(self:cfgsections()) do
+ for i, k in ipairs(self.serverTable) do
section = k
isempty = false
+ local fc = (section.name == self.current) and "fast" or ""
+ local flag_icon = (section.flag ~= nil) and "flag-icon-" .. section.flag or "flag-icon-un"
+ local switch_enable = (section.switch_enable == "1") and "" or "hidden"
scope = { valueheader = "cbi/cell_valueheader", valuefooter = "cbi/cell_valuefooter" }
-%>
-
+
-
-
-
+
+
+
<%=section.type%>
-
+
<%=section.alias%>
<%- if self.extedit or self.addremove then -%>
@@ -93,32 +96,10 @@
const CHECK_PING_URL = '<%=luci.dispatcher.build_url("admin", "services", "vssr","checkport")%>';
const SWITCH_NODE_URL = '<%=luci.dispatcher.build_url("admin", "services", "vssr","switch")%>';
- var servers = JSON.parse('<%= self.servers%>'.replace(/\t/g, ""));
var iploaded = false;
var ajaxArray = new Array();
var currentCheckCount = 0;
-
- //渲染节点列表
- $.each(servers, function (i, val) {
- var id = '#cbi-' + CONFIG + '-' + val.name;
- if (val.name == CURRENT) {
- $(id).addClass("fast");
- }
- val.flag = (val.flag == undefined) ? "un" : val.flag;
- $(id).attr("data-flag", val.flag);
- $(id).find(".type .tp").text(val.type);
- $(id).find(".type").addClass("flag-icon-" + val.flag);
- $(id).find(".alias").text(val.alias);
- $(id).attr("server", val.server);
- $(id).attr("server_port", val.server_port);
- if (val.switch_enable == "1") {
- $(id).find(".pure-imgw").removeClass("hidden");
- } else {
- $(id).find(".pure-imgw").addClass("hidden");
- }
- });
-
//转换节点名称的Emoji显示
$(".alias").emoji();
//适配方框的大小
diff --git a/package/ctcgfw/luci-app-vssr/root/etc/init.d/vssr b/package/ctcgfw/luci-app-vssr/root/etc/init.d/vssr
index 4052956e97..015b8da63d 100755
--- a/package/ctcgfw/luci-app-vssr/root/etc/init.d/vssr
+++ b/package/ctcgfw/luci-app-vssr/root/etc/init.d/vssr
@@ -555,7 +555,12 @@ start() {
if rules; then
start_redir
- mkdir -p /tmp/dnsmasq.d && cp -a /etc/vssr/ad.conf gfw_base.conf gfw_list.conf /tmp/ && cp -a /etc/vssr/oversea_list.conf /tmp/
+ mkdir -p /tmp/dnsmasq.d \
+ && cp -a /etc/vssr/gfw_list.conf /tmp/dnsmasq.ssr \
+ && cp -a /etc/vssr/gfw_base.conf /tmp/dnsmasq.ssr \
+ && cp -a /etc/vssr/ad.conf /tmp/dnsmasq.ssr \
+ && cp -a /etc/vssr/oversea_list.conf /tmp/dnsmasq.oversea
+
if ! [ "$run_mode" = "oversea" ]; then
cat >/tmp/dnsmasq.d/dnsmasq-ssr.conf <
------------------------------------------------
local _M = {}
-
+local icount = 0
-- Get country iso code with remark or host
-- Return String:iso_code
function _M.get_flag(remark, host)
@@ -158,5 +158,6 @@ function _M.wget(url)
return _M.trim(stdout)
end
+
return _M
diff --git a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/update.lua b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/update.lua
index a231dd358f..525970a7c8 100644
--- a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/update.lua
+++ b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/update.lua
@@ -43,7 +43,7 @@ else
end
log('正在更新【国内IP段】数据库')
-refresh_cmd = "wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' 2>/dev/null| awk -F\\| '/CN\\|ipv4/ { printf(\"%s/%d\\n\", $4, 32-log($5)/log(2)) }' > /tmp/china_ssr.txt"
+refresh_cmd ="wget -O- 'https://ispip.clang.cn/all_cn.txt' > /tmp/china_ssr.txt 2>/dev/null"
sret = luci.sys.call(refresh_cmd)
icount = luci.sys.exec('cat /tmp/china_ssr.txt | wc -l')
if sret == 0 then
diff --git a/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/vssr.css b/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/vssr.css
index df51473156..a523425925 100644
--- a/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/vssr.css
+++ b/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/vssr.css
@@ -648,6 +648,7 @@ footer.mobile-hide {
padding: 0 !important;
background-color: transparent !important;
color: #fff !important;
+ margin-bottom: 0.5em !important;
}
.modals h3 {
@@ -668,6 +669,7 @@ footer.mobile-hide {
background: transparent;
color: #FFFFFF;
outline: none;
+ margin-top: 10px;
padding-left: 3px;
padding-right: 22px;
overflow: hidden
diff --git a/package/ctcgfw/luci-theme-edge/Makefile b/package/ctcgfw/luci-theme-edge/Makefile
index abfe420d77..40587d5108 100644
--- a/package/ctcgfw/luci-theme-edge/Makefile
+++ b/package/ctcgfw/luci-theme-edge/Makefile
@@ -8,8 +8,8 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=Edge Theme
LUCI_DEPENDS:=
-PKG_VERSION:=2.2
-PKG_RELEASE:=20201029
+PKG_VERSION:=2.4
+PKG_RELEASE:=20201128
include $(TOPDIR)/feeds/luci/luci.mk
diff --git a/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/background/1.jpg b/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/background/1.jpg
new file mode 100644
index 0000000000..5f7ce31545
Binary files /dev/null and b/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/background/1.jpg differ
diff --git a/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/background/2.jpg b/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/background/2.jpg
new file mode 100644
index 0000000000..81462887fc
Binary files /dev/null and b/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/background/2.jpg differ
diff --git a/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/background/3.jpg b/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/background/3.jpg
new file mode 100644
index 0000000000..53b7fc5f38
Binary files /dev/null and b/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/background/3.jpg differ
diff --git a/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/cascade.css b/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/cascade.css
index e0ab483a10..43f0062476 100644
--- a/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/cascade.css
+++ b/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/cascade.css
@@ -364,46 +364,6 @@ a {
width: 100%;
}
-.col-1 {
- flex: 1 1 30px !important;
-}
-
-.col-2 {
- flex: 2 2 60px !important;
-}
-
-.col-3 {
- flex: 3 3 90px !important;
-}
-
-.col-4 {
- flex: 4 4 120px !important;
-}
-
-.col-5 {
- flex: 5 5 150px !important;
-}
-
-.col-6 {
- flex: 6 6 180px !important;
-}
-
-.col-7 {
- flex: 7 7 210px !important;
-}
-
-.col-8 {
- flex: 8 8 240px !important;
-}
-
-.col-9 {
- flex: 9 9 270px !important;
-}
-
-.col-10 {
- flex: 10 10 300px !important;
-}
-
* {
box-sizing: border-box;
margin: 0;
@@ -480,7 +440,7 @@ input:not([type]), input[type=text]:not(.browser-default), input[type=password]:
border-radius: 0;
outline: none;
margin: 0;
- padding: 0;
+ padding: 0 0.5rem;
-webkit-box-shadow: none;
box-shadow: none;
-webkit-box-sizing: content-box;
@@ -900,7 +860,7 @@ header .fill .status * {
.main .main-left .nav>li>a {
display: block;
- font-size: 0.9rem !important;
+ font-size: 0.93rem !important;
margin: 0.4rem 0.5rem !important;
padding: 0.5rem 0 0.5rem 2.5rem !important;
transition: box-shadow .25s, -webkit-box-shadow .25s;
@@ -1113,7 +1073,15 @@ body[class*="node-"] > .main > .main-left > .nav > .slide > .menu.active::before
}
#maincontent > .container {
- margin: 1rem 0 1rem 0;
+ margin: 0 2%;
+}
+
+.Overview.node-admin-status #maincontent > .container {
+ padding:0;
+}
+
+.Overview.node-admin-status #maincontent > .container h2{
+ padding-left:2rem;
}
ul {
@@ -1143,7 +1111,7 @@ h3 {
h4 {
font-size: 1.2rem;
- margin: 2rem 0 0 0;
+ margin: 1.2rem 0 0 0;
padding: 0rem 2rem 0.75rem 2rem;
}
@@ -1153,25 +1121,9 @@ h5 {
padding-bottom: 10px;
}
-.cbi-section,
-.cbi-section-error,
-#iptables,
-.Firewall form,
-#cbi-network > .cbi-section-node,
-#cbi-wireless > .cbi-section-node,
-#cbi-wireless > #wifi_assoclist_table,
-[data-tab-title],
-[data-page^="admin-system-admin"]:not(.node-main-login) .cbi-map:not(#cbi-dropbear),
-[data-page="admin-system-opkg"] #maincontent > .container {
- font-family: inherit;
- font-weight: normal;
- font-style: normal;
- line-height: normal;
- min-width: inherit;
- margin: 1rem 0;
- padding: 0rem;
- border: 0;
- background-color: #fff;
+.container .cbi-section{
+ margin-bottom:1rem;
+
}
.cbi-modal .cbi-section,
@@ -1188,7 +1140,7 @@ h5 {
.cbi-section-descr {
font-size: small;
line-height: 2rem;
- padding: 0 0 0.5rem 2rem;
+ padding: 0 0 0.5rem 0;
}
.cbi-section-node {
@@ -1212,6 +1164,10 @@ h5 {
text-decoration: underline;
}
+fieldset.cbi-section{
+border:none;
+}
+
.cbi-section > legend {
display: none !important;
}
@@ -1411,38 +1367,13 @@ td > table > tbody > tr > td,
-webkit-appearance: none !important;
}
-.btn:hover,
-.btn:focus,
-.btn:active,
-.cbi-button:hover,
-.cbi-button:focus,
-.cbi-button:active,
-.item:hover::after,
-.item:focus::after,
-.item:active::after,
-.cbi-page-actions .cbi-button-apply + .cbi-button-save:hover,
-.cbi-page-actions .cbi-button-apply + .cbi-button-save:focus,
-.cbi-page-actions .cbi-button-apply + .cbi-button-save:active {
- text-decoration: none;
- outline: 0;
-}
-
button:hover,
.waves-input-wrapper:hover,
.btn:hover,
-.btn:focus,
.cbi-button:hover,
-.cbi-button:focus,
-.item:hover::after,
-.item:focus::after {
- opacity: 0.7;
- top: 0.15rem;
-}
-
-.btn:active,
-.cbi-button:active,
-.item:active::after {
+.item:hover::after {
opacity: 0.7;
+ top: 0.1rem;
}
.cbi-button-up:hover,
@@ -1450,10 +1381,6 @@ button:hover,
opacity: 0.7;
}
-.cbi-button-up:active {
- opacity: 0.7;
-}
-
.btn:disabled,
.cbi-button:disabled {
cursor: not-allowed;
@@ -1598,7 +1525,7 @@ button:hover,
}
ul.tabs,.tabmenu .tabs,#tabmenu .tabs,ul.cbi-tabmenu {
- padding-left: 2rem;
+ padding-left: 2.5%;
box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.12);
transition: box-shadow .25s, -webkit-box-shadow .25s;
border-radius: 2px;
@@ -1608,6 +1535,11 @@ ul.tabs,.tabmenu .tabs,#tabmenu .tabs,ul.cbi-tabmenu {
padding-top: 1rem;
}
+#packages{
+ margin-left: -2%;
+ width: 105%;
+}
+
.cbi-tabmenu > li:hover {
background-color: rgba(246,178,181,0.2);
}
@@ -1873,7 +1805,7 @@ ul.tabs,.tabmenu .tabs,#tabmenu .tabs,ul.cbi-tabmenu {
outline: 0;
}
-.cbi-dropdown > ul.preview {
+#cbi-adblock-global-adb_sources .cbi-dropdown > ul.preview {
display: none;
}
@@ -1959,6 +1891,7 @@ ul.tabs,.tabmenu .tabs,#tabmenu .tabs,ul.cbi-tabmenu {
.cbi-dropdown > ul > li > form > input[type="checkbox"] {
height: auto;
margin: 0;
+ display:inline-block;
}
.cbi-dropdown > ul > li input[type="text"] {
@@ -1972,7 +1905,7 @@ ul.tabs,.tabmenu .tabs,#tabmenu .tabs,ul.cbi-tabmenu {
width: auto;
min-width: 100%;
max-width: none;
- max-height: 200px !important;
+ max-height: 200px;
border: thin solid #918e8c;
background: #f6f6f6;
box-shadow: 0 0 4px #918e8c;
@@ -2259,7 +2192,6 @@ body.modal-overlay-active #modal_overlay {
.cbi-page-actions {
padding-top: 1rem;
text-align: right;
- padding-right: 2rem;
}
.node-main-login .cbi-page-actions {
@@ -2347,8 +2279,12 @@ textarea {
transition: box-shadow .25s, -webkit-box-shadow .25s;
border-radius: 2px;
border: 0 !important;
- margin: 0 2rem;
- width: 95% !important;
+}
+
+textarea:focus{
+ outline: none;
+ border: 1px solid #5A8DEE !important;
+ box-shadow: 0 0px 5px 0 #5A8DEE;
}
.cbi-section textarea {
@@ -2647,8 +2583,8 @@ span[data-tooltip] .label {
background-color: #D2FFE8;
}
-label > input[type="checkbox"],
-label > input[type="radio"] {
+input[type="checkbox"],
+input[type="radio"] {
position: relative;
right: 0.2rem;
margin: 0;
@@ -2758,7 +2694,7 @@ input[name="nslookup"] {
transition: box-shadow .25s, -webkit-box-shadow .25s;
border-radius: 2px;
text-align: left;
- background: #faf5f3c2;
+ background: rgba(255, 255, 255, 0.75);
margin: 0;
}
@@ -2975,15 +2911,9 @@ input[name="nslookup"] {
color: #32325d;
color: var(--gray-dark);
}
-/* software */
-[data-page="admin-system-opkg"] h2 {
- margin-left: 1.5rem;
- color: #32325d;
- color: var(--gray-dark);
-}
.controls {
- margin: 0.5em 2rem 1em 2rem !important;
+ margin: 0.5em 0 1em 0 !important;
}
.controls > * > .btn:not([aria-label$="page"]) {
@@ -3008,12 +2938,6 @@ input[name="nslookup"] {
padding-top: 0.1rem;
}
-.td.version,
-.td.size {
- white-space: normal !important;
- word-break: break-word;
-}
-
.cbi-tabmenu + .cbi-section {
margin-top: 0;
}
@@ -3223,11 +3147,8 @@ input[type="checkbox"] {
padding: 0;
cursor: pointer;
transition: all 0.2s;
- position: absolute;
- opacity: 0;
- pointer-events: none;
+ display:none;
}
-
input[type="checkbox"]:checked {
border: 1px solid #5A8DEE;
background-image: url('data:image/svg+xml,%3csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 8 8\'%3e%3cpath fill=\'%23fff\' d=\'M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z\'/%3e%3c/svg%3e') !important;
@@ -3236,19 +3157,17 @@ input[type="checkbox"]:checked {
background-repeat: no-repeat;
background-position: center;
}
-/* IE hacks */
-@media all and (-ms-high-contrast: none) {
- .main > .main-left > .nav > .slide > .menu::before {
- top: 30.25%;
- }
+.cbi-dropdown[open]>ul.dropdown>li label {
+ margin-left: .5rem;
+}
- .main > .main-left > .nav > li:last-child::before {
- top: 20%;
- }
+#cbi-adblock-global-adb_sources .cbi-dropdown-open .cbi-dropdown[open] > ul.dropdown{
+ position:relative !important;
+ bottom:0 !important;
+}
- .showSide::before {
- top: -12px;
- }
+#cbi-adblock-global-adb_sources .cbi-dropdown-open .preview,#cbi-adblock-global-adb_sources .cbi-dropdown-open .more,.cbi-dropdown-open .open{
+display:none !important;
}
@media screen and (max-width: 1600px) {
@@ -3420,10 +3339,6 @@ input[type="checkbox"]:checked {
font-size: 1rem;
}
- .table {
- display: block;
- }
-
.Interfaces .table {
overflow-x: hidden;
}
@@ -3447,6 +3362,12 @@ input[type="checkbox"]:checked {
border-top: 0;
}
+.node-admin-status.Overview .tr {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+}
+
.th,
.td {
display: inline-block;
@@ -3548,6 +3469,14 @@ input[type="checkbox"]:checked {
width: 100% !important;
margin-left: 0 !important;
}
+#packages .tr {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+}
+#packages .td {
+ padding: 1em 2rem;
+}
}
@media screen and (max-width: 768px) {
@@ -3611,21 +3540,9 @@ input[type="checkbox"]:checked {
display: inline-block;
}
- .main > .main-left > .nav > .slide > .menu {
- font-size: 1.2rem;
- }
-
- .main > .main-left > .nav > .slide > .slide-menu > li > a {
- font-size: 0.8rem;
- }
-
.cbi-section > div {
overflow-x: auto;
}
-
- .cbi-map >.cbi-section {
- padding: 0 1rem !important;
- }
}
@media screen and (max-width: 600px) {
@@ -3722,6 +3639,7 @@ input[type="checkbox"]:checked {
margin: 0.5rem 0;
background: none;
padding: 0;
+ border:none;
}
.cbi-map style+fieldset.cbi-section:first-of-type p font {
@@ -4002,10 +3920,6 @@ code,.cbi-progressbar::after {
background-color: white !important;
}
-.cbi-map >.cbi-section {
- padding: 0 2rem;
-}
-
.cbi-map >.cbi-section .cbi-value {
padding-left: 1rem;
padding-right: 1rem;
@@ -4059,15 +3973,9 @@ i input {
flex-basis: auto !important;
}
-h2,.cbi-map-descr {
- padding-left: 2rem;
-}
-
-@media screen and (max-width: 1680px) and (min-width: 1280px) {
-.cbi-map >.cbi-section .cbi-section-table,.cbi-map >.cbi-section .cbi-tabmenu,.cbi-map >.cbi-section .table {
- margin-left: -1.95rem !important;
- width: 105.5% !important;
-}
+.cbi-map >.cbi-section .cbi-section-table,.container .cbi-tabmenu,.container #tabmenu,.cbi-map >.cbi-section .table {
+ margin-left: -2%;
+ width: 105%;
}
.admin-status-overview h2.content {
@@ -4137,10 +4045,14 @@ cbi-button.cbi-button-neutral {
}
input[type=password]+.cbi-button.cbi-button-neutral {
- padding: 0.1rem 0.4rem;
+ padding: 0 0.4rem;
color: #fff !important;
}
+.cbi-input-password[type=text]+.cbi-button.cbi-button-neutral {
+ padding: 0.2rem 0.5rem;
+}
+
.main-right>hr {
height: 6px;
background-color: rgba(255, 0, 27, 0.95);
@@ -4166,6 +4078,10 @@ div[id^="cbi-unblockmusic"] .cbi-button {
padding: 0 2rem;
}
+.cbi-section-table .tr>.td:last-child,#packages .tr>.td:last-child{
+ padding-right:3%;
+}
+
.chromeframe {
padding: 2rem 3rem;
margin: 0 auto;
@@ -4188,8 +4104,12 @@ div[id^="cbi-unblockmusic"] .cbi-button {
color: orangered;
}
-.landscape {
- position: absolute;
- width: 100%;
- height: 100%;
+[data-page="admin-network-wifi"] tr > td .cbi-button{
+ margin-left: 0 !important;
}
+[data-page="admin-network-wifi"] tr > td input[type="button"]{
+ padding: 0.5rem 1rem !important;
+}
+table.interfaces .th{
+ padding:1.1em 0.5rem !important;
+}
\ No newline at end of file
diff --git a/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/js/script.js b/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/js/script.js
index 54e288aff2..76c58c8114 100644
--- a/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/js/script.js
+++ b/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/js/script.js
@@ -282,36 +282,10 @@
var getaudio = $('#player')[0];
/* Get the audio from the player (using the player's ID), the [0] is necessary */
- var mouseovertimer;
/* Global variable for a timer. When the mouse is hovered over the speaker it will start playing after hovering for 1 second, if less than 1 second it won't play (incase you accidentally hover over the speaker) */
var audiostatus = 'off';
/* Global variable for the audio's status (off or on). It's a bit crude but it works for determining the status. */
- $(document).on('mouseenter', '.speaker', function() {
- /* Bonus feature, if the mouse hovers over the speaker image for more than 1 second the audio will start playing */
- if (!mouseovertimer) {
- mouseovertimer = window.setTimeout(function() {
- mouseovertimer = null;
- if (!$('.speaker').hasClass("speakerplay")) {
- getaudio.load();
- /* Loads the audio */
- getaudio.play();
- /* Play the audio (starting at the beginning of the track) */
- $('.speaker').addClass('speakerplay');
- return false;
- }
- }, 1000);
- }
- });
-
- $(document).on('mouseleave', '.speaker', function() {
- /* If the mouse stops hovering on the image (leaves the image) clear the timer, reset back to 0 */
- if (mouseovertimer) {
- window.clearTimeout(mouseovertimer);
- mouseovertimer = null;
- }
- });
-
$(document).on('click touchend', '.speaker', function() {
/* Touchend is necessary for mobile devices, click alone won't work */
if (!$('.speaker').hasClass("speakerplay")) {
@@ -319,7 +293,6 @@
$('.speaker').addClass('speakerplay');
getaudio.load();
getaudio.play();
- window.clearTimeout(mouseovertimer);
audiostatus = 'on';
return false;
} else if (audiostatus == 'on') {
@@ -329,7 +302,6 @@
} else if ($('.speaker').hasClass("speakerplay")) {
getaudio.pause();
$('.speaker').removeClass('speakerplay');
- window.clearTimeout(mouseovertimer);
audiostatus = 'on';
}
});
@@ -362,13 +334,13 @@ $(".waves-input-wrapper").filter(function () {
}
}).hide();
-$("div>select:first-child,div>input[type='text']:first-child,div>input[type='email']:first-child,div>input[type='url']:first-child,div>input[type='date']:first-child,div>input[type='datetime']:first-child,div>input[type='tel']:first-child,div>input[type='number']:first-child,div>input[type='search']:first-child").filter(function () {
-return (!$(this).parents(".cbi-dynlist").length&&!$("body.Diagnostics").length)
+$("div>select:first-child,div>input[type='text']:first-child").filter(function () {
+return (!$(this).parents(".cbi-dynlist").length&&!$("body.Diagnostics").length&&!$(this).hasClass("cbi-input-password"))
}).after(" ");
$("input[type='checkbox']").filter(function () {
return (!$(this).next("label").length)
-}).css({"position":"relative","opacity":"1","pointer-events":"auto"});
+}).show();
$("select,input").filter(function () {
return ($(this).next(".focus-input").length)
@@ -377,6 +349,6 @@ $("select,input").filter(function () {
}).blur(function(){
$(this).css("border-bottom","1px solid #9e9e9e");
});
- }, 400);
+ }, 0);
$(".cbi-value").has("textarea").css("background","none");
})(jQuery);
diff --git a/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/landscape.css b/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/landscape.css
index 05e3aaf63e..10817377b4 100644
--- a/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/landscape.css
+++ b/package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/landscape.css
@@ -1,1058 +1,57 @@
-/* Global Styles
- ---------------------------------------------- */
- html {font-family: 'Open Sans', sans-serif; background: #0D133A; height:100%; font-size: 100%; text-size-adjust: 100%; -ms-text-size-adjust: 100%; font-smoothing: antialiased;overflow: hidden;position: relative;}
- img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
- svg:not(:root) { overflow: hidden; }
-
-/* Animation globals
- ---------------------------------------------- */
- #landscape, .land, #bottom, .stags,.stag, .counter:before, #lensFlare, .sunMask{
- animation-duration: 15s;
- animation-iteration-count: infinite;
- animation-timing-function: linear;
- }
-
-/* Background gradients
- ---------------------------------------------- */
- #sky{
- height: 60%;
- margin-bottom: -6px;
- position: absolute;
- top: 0px;
- z-index: 2;
- }
-#sky-rect{height:100%;}
-
- #reflection, #sunMask{
- height: 40%;
- position: absolute;
- top: 60%;
- z-index: 4;
- }
-#reflection-rect{height:100%;}
- #sunMask{
- background: #0D133A;
- height: 40%;
- position: absolute;
- top: 60%;
- width: 100%;
- }
-
-/* Stag
- ---------------------------------------------- */
- #stag{
- position: absolute;
- bottom: 15.3%;
- width: 6.3%;
- left: 38%;
- z-index: 5;
- }
- .stag{
- width:100%;
- position: absolute;
- bottom: 0px;
- }
- .stags{
- animation-name: stags;
- animation-delay:1s;
- }
- @keyframes stags{
- 0% { fill:#0D141E;}
- 4% { fill:#101522;}
- 8% { fill:#121726;}
- 12% { fill:#141829;}
- 16% { fill:#1C1E3C;}
- 20% { fill:#22214F;}
- 24% { fill:#262262;}
- 28% { fill:#1D4065;}
- 32% { fill:#125768;}
- 36% { fill:#1E4553;}
- 40% { fill:#1E404E;}
- 44% { fill:#1E3B49;}
- 48% { fill:#1D3643;}
- 52% { fill:#1C313E;}
- 56% { fill:#1C3344;}
- 60% { fill:#1C3449;}
- 64% { fill:#1B344F;}
- 68% { fill:#183454;}
- 72% { fill:#242B4A;}
- 76% { fill:#2B2241;}
- 80% { fill:#24203C;}
- 84% { fill:#1D1D37;}
- 88% { fill:#151A32;}
- 92% { fill:#14192C;}
- 96% { fill:#111725;}
- 100% { fill:#0D141E;}
- }
- #stag1{
- animation-name: stag_one;
- width: 108%;
- left: -20%;
-
- }
- @keyframes stag_one{
- 0% {opacity:1.0;}
- 15% {opacity:1.0;}
- 20% {opacity:0.0;}
- 90% {opacity:0.0;}
- 95% {opacity:1.0;}
- 100% {opacity:1.0;}
- }
- #stag2{
- animation-name: stag_two;
- }
- @keyframes stag_two{
- 0% {opacity:0.0;}
- 17% {opacity:0.0;}
- 20% {opacity:1.0;}
- 40% {opacity:1.0;}
- 45% {opacity:0.0;}
- 65% {opacity:0.0;}
- 70% {opacity:1.0;}
- 90% {opacity:1.0;}
- 95% {opacity:0.0;}
- 100% {opacity:0.0;}
- }
- #stag3{
- animation-name: stag_three;
- width: 144%;
- left: -10%;
- bottom: -3%;
- }
- @keyframes stag_three{
- 0% {opacity:0.0;}
- 15% {opacity:0.0;}
- 20% {opacity:0.0;}
- 40% {opacity:0.0;}
- 45% {opacity:1.0;}
- 65% {opacity:1.0;}
- 70% {opacity:0.0;}
- 100% {opacity:0.0;}
- }
-
-/* Sun
- ---------------------------------------------- */
- .sunMask{
- position:absolute;
- width:100%;
- height:100%;
- -webkit-mask-image: gradient(linear, left 50%, left 60%, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)));
- z-index: 4;
- mix-blend-mode: screen;
- animation-name: sunFocus;
- }
- @keyframes sunFocus{
- 0% { filter: blur(10px);opacity:0;}
- 16% {filter: blur(10px);}
- 20% {filter: blur(10px);}
- 25% {filter: blur(5px);opacity:0;}
- 30% {filter: blur(0px);opacity:1;}
- 80% {filter: blur(0px);opacity:1;}
- 88% {filter: blur(5px);opacity:0;}
- 100% {filter: blur(10px);opacity:0;}
- }
- .sun{
- width: 100%;
- padding-bottom: 100%;
- position:absolute;
- right: -51%;
- top: -330%;
- }
- .sun div{
- background: transparent url(./sun.svg);
- position: absolute;
- top: 0; bottom: 0; left: 0; right: 0;
- }
- .suncrane{
- animation: suncrane 15s linear infinite;
- position:absolute;
- width: 21%;
- height: 4%;
- background: transparent;
- margin: auto;
- top: 40%;
- left: 0;
- right: 0;
- }
- @keyframes suncrane{
- 0% {transform:rotate(90deg);}
- 100% {transform:rotate(-270deg);}
- }
- .sun:before{
- display:block;
- content:' ';
- animation: glare 15s linear infinite;
- position:absolute;
- width: 120%;
- height: 120%;
- background: url(./glare.svg) no-repeat scroll center;
- top: -10%;
- left: -10%;
- background-size: 100%;
- }
-
- @keyframes glare{
- from {transform:rotate(90deg);opacity:0.0;}
- 30%{opacity:0.0;}
- 36%{opacity:1.0;}
- 68%{opacity:1.0;}
- 74%{opacity:0.0;}
- to {transform:rotate(450deg);opacity:0.0;}
- }
-
-
- .sun:after{display: block; content:' '; position:absolute;background: white;width: 10%;height: 10%;top: 45%;border-radius: 100%;margin: auto;left: 0;right: 0;box-shadow: 0px 0px 80px 30px white;}
-
-/* Clouds
- ---------------------------------------------- */
- .clouds{
- position: absolute;
- width: 100%;
- z-index: 4; mix-blend-mode: screen;
- height: 100%;
- }
- .clouds svg{
- width: 60%;
- position: absolute;
- top: 51%;
- filter: blur(2px);
- opacity: 0.4;
- left: -60%;
- animation-duration: 15s;
- animation-iteration-count: infinite;
- animation-timing-function: linear;
- animation-name: clouds;
- }
- @keyframes clouds{
- 0% {transform: translate3d(110%, 0px, 0px);opacity: 0.0;}
- 19%{opacity: 0.0;filter: blur(5px);}
- 25%{opacity: 0.3;filter: blur(2px);}
- 50%{opacity: 0.6;}
- 75%{opacity: 0.2;}
- 90%{opacity: 0.0;}
- 100% {transform: translate3d(150%, 0px, 0px);opacity: 0.0}
- }
-
-/* Lens flare
- ---------------------------------------------- */
- .lighting{
- width: 100%;
- height: 100%;
- position: absolute;
- z-index: 8;
- opacity: 0.3;
- -webkit-mask-image: gradient(linear, left 50%, left 60%, from(rgba(0,0,0,1)), to(rgba(0,0,0,1)));
- mix-blend-mode: screen;
- pointer-events: none;
- filter: blur(3px);
- }
- .lighting .suncrane{
- width: 100%;
- }
- #lensFlare{
- transform: rotate(16deg) translate3d(9%, -47%, 0px) scale(1);
- animation-name: flaring;
- }
-
- @keyframes flaring{
- 0% { transform: rotate(16deg) translate3d(9%, -47%, 0px) scale(1); opacity: 0.0;}
- 28% { transform: rotate(16deg) translate3d(9%, -47%, 0px) scale(1); opacity: 0.0; }
- 35% { transform: rotate(16deg) translate3d(9%, -47%, 0px) scale(1); opacity: 1.0; }
- 70% { transform: rotate(16deg) translate3d(9%, -47%, 0px) scale(1); opacity: 1.0; }
- 78% { transform: rotate(16deg) translate3d(9%, -47%, 0px) scale(1); opacity: 0.0; }
- 100% { transform: rotate(16deg) translate3d(9%, -47%, 0px) scale(1); opacity: 0.0; }
- }
-
-/* Sun on lake twinkles
- ---------------------------------------------- */
- .twinkleWrap{
- position: absolute;
- z-index: 4;
- width:100%;
- height:100%;
- top:0;
- opacity: 0.55;
- }
-
- .twinkles{
- width: 2.3%;
- position: absolute;
- right: 49.2%;
- top: 72.5%;
- animation: twinkles 15s linear infinite;
- }
- @keyframes twinkles{
- 0% {transform: translate(450%, 0%);opacity:0.0;}
- 32%{opacity:0.0;}
- 34%{opacity:1.0;}
- 36.5% {transform: translate(450%, 0%);}
- 54% {transform: translate(0%, 0%);}
- 72% {transform: translate(-450%, 0%);opacity:1.0;}
- 78%{opacity:0.0;}
- 100% {transform: translate(-450%, 0%);opacity:0.0;}
- }
- .twinkles:before{
- content:' ';
- display: none;
- position:absolute;
- height: 600px;
- width:3px;
- background:red;
- top: -600px;
- left: 50%;
- }
- .twinkles svg{
- width: 100%;
- position: absolute;
- top: 0;
- }
- #twinkle1{
- animation: twinkle1 2s linear infinite;
- }
- @keyframes twinkle1{
- 0% {opacity:1.0;}
- 33.33% {opacity:0.0;}
- 66.66% {opacity:0.0;}
- 99.99% {opacity:1.0;}
- 100% {opacity:1.0;}
- }
- #twinkle2{ animation: twinkle2 2s linear infinite;
- }
- @keyframes twinkle2{
- 0% {opacity:0.0;}
- 33.33% {opacity:1.0;}
- 66.66% {opacity:0.0;}
- 99.99% {opacity:0.0;}
- 100% {opacity:0.0;}
- }
- #twinkle3{ animation: twinkle3 2s linear infinite;
- }
- @keyframes twinkle3{
- 0% {opacity:0.0;}
- 33.33% {opacity:0.0;}
- 66.66% {opacity:1.0;}
- 99.99% {opacity:0.0;}
- 100% {opacity:0.0;}
- }
-
-/* Vignette
- ---------------------------------------------- */
- .vignette{
- background: radial-gradient(transparent 60%, rgb(1, 14, 39) 130%);
- background-size: cover;
- height: 100%;
- z-index: 9;
- position: absolute;
- width: 100%;
- pointer-events: none;
+#CrossFade {
+ background: #fff;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+}
+#CrossFade img {
+ position: absolute;
+ min-width: 100%;
+ min-height: 100%;
+ height: auto;
+ background: #fff;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ opacity: 0;
+ -webkit-transform: scale(1.4) rotate(12deg);
+ transform: scale(1.4) rotate(12deg);
+ -webkit-animation: CrossFade 12s infinite;
+ animation: CrossFade 12s infinite;
+}
+#CrossFade img:nth-child(3) {
+ -webkit-animation-delay: 8s;
+ animation-delay: 8s;
+}
+#CrossFade img:nth-child(2) {
+ -webkit-animation-delay: 4s;
+ animation-delay: 4s;
+}
+#CrossFade img:nth-child(1) {
+ -webkit-animation-delay: 0s;
+ animation-delay: 0s;
}
-/* Stars
- ---------------------------------------------- */
- .stars{
- height: 100%;
- z-index: 2;
- position: absolute;
- width: 100%;
-
- overflow: hidden;
+@-webkit-keyframes CrossFade {
+ 33.3% {
+ opacity: 1;
+ -webkit-transform: scale(1) rotate(0);
+ transform: scale(1) rotate(0);
}
- .starWrap{
- height: 60%;
- width: 100%;
- position:relative;
+ 45% {
+ opacity: 0;
+ }
+}
+@keyframes CrossFade {
+ 33.3% {
+ opacity: 1;
+ -webkit-transform: scale(1) rotate(0);
+ transform: scale(1) rotate(0);
+ }
+ 45% {
+ opacity: 0;
}
- .starProject{
- overflow: hidden;
- }
- .starReflect{
- overflow: hidden;
- height: 40%;
- opacity: 0.9;
- top: 1%;
- }
- #stars{
- position: absolute;
- width: 120%;
- border-radius: 100%;
- margin: auto;
- left: -10%;
- right: 0;
- animation: stars 30s linear infinite;
- transform: rotate(0deg);
- top: -35%;
- }
-
- @keyframes stars{
- 100% {transform: rotate(-360deg);}
- }
-
- #starReflection{
- position: absolute;
- width: 120%;
- border-radius: 100%;
- margin: auto;
- left: -10%;
- right: 0;
- animation: starsReflect 30s linear infinite;
- transform: rotate(0deg);
- top:initial;
- bottom: -102%;
- }
- @keyframes starsReflect{
- 100% {transform: rotate(360deg);}
- }
-
-/* Sprites
- ----------------------------------------------- */
- .spriteWrap{
- height: 100%;
- width: 100%;
- position: absolute;
- z-index: 13;
- animation: sprites 15s linear infinite;
- pointer-events: none;
- }
- @keyframes sprites{
- 0% {opacity:0.8;}
- 20% {opacity:0.8;}
- 25%{opacity:0.0;}
- 73% {opacity:0.0;}
- 90% {opacity:0.8;}
- 100% {opacity:0.8;}
- }
-
- #sprites{
- height: 100%;
- width: 100%;
- }
-
-
-
-/* Landscape
- ---------------------------------------------- */
- #landscape{
- width: 100.02%;
- position: absolute;
- bottom: 11%;
- z-index: 5;
- animation-name: focus;
- }
- @keyframes focus{
- 0% { filter: blur(5px);}
- 16% {filter: blur(2px);}
- 20% {filter: blur(0px);}
- 80% {filter: blur(0px);}
- 88% {filter: blur(2px);}
- 100% {filter: blur(5px);}
- }
-
- #bottom{
- animation-name: bottomFill;
- height: 100%;
- position: absolute;
- top: 88%;
- width: 100%;
- z-index: 5;
- animation-delay:1s;
- }
- @keyframes bottomFill{
- 0% { background:#0D141E; }
- 4% { background:#101522; }
- 8% { background:#121726; }
- 12% { background:#141829; }
- 16% { background:#1C1E3C; }
- 20% { background:#22214F; }
- 24% { background:#262262; }
- 28% { background:#1D4065; }
- 32% { background:#125768; }
- 36% { background:#1E4553; }
- 40% { background:#1E404E; }
- 44% { background:#1E3B49; }
- 48% { background:#1D3643; }
- 52% { background:#1C313E; }
- 56% { background:#1C3344; }
- 60% { background:#1C3449; }
- 64% { background:#1B344F; }
- 68% { background:#183454; }
- 72% { background:#242B4A; }
- 76% { background:#2B2241; }
- 80% { background:#24203C; }
- 84% { background:#1D1D37; }
- 88% { background:#151A32; }
- 92% { background:#14192C; }
- 96% { background:#111725; }
- 100% { background:#0D141E; }
- }
-
- /* Land - layer 1 animation */
- #landscape .layer1 {
- fill:#F1F2F2;
- animation-name: layer1;
- animation-delay:1s;
- }
- @keyframes layer1{
- 0% { fill:#244154; }
- 4% { fill:#344358; }
- 8% { fill:#42465D; }
- 12% { fill:#4F4761; }
- 16% { fill:#7E5773; }
- 20% { fill:#A3517F; }
- 24% { fill:#F3829F; }
- 28% { fill:#D4B2AF; }
- 32% { fill:#AEDABB; }
- 36% { fill:#A1D6D6; }
- 40% { fill:#9ED5DD; }
- 44% { fill:#9AD4E4; }
- 48% { fill:#97D3EA; }
- 52% { fill:#92D3F4; }
- 56% { fill:#95C8DA; }
- 60% { fill:#96BDC5; }
- 64% { fill:#96B3B2; }
- 68% { fill:#96AA9E; }
- 72% { fill:#AF866A; }
- 76% { fill:#C0633B; }
- 80% { fill:#9D5E51; }
- 84% { fill:#7B5960; }
- 88% { fill:#59546D; }
- 92% { fill:#484E64; }
- 96% { fill:#37475C; }
- 100% { fill:#244154; }
- }
-
- /* Land - layer 2 animation */
- #landscape .layer2 {
- fill:#E6E7E8;
- animation-name: layer2;
- animation-delay:1s;
- }
- @keyframes layer2{
- 0% { fill:#0F2B46; }
- 4% { fill:#1C2D4A; }
- 8% { fill:#272E4E; }
- 12% { fill:#302F52; }
- 16% { fill:#663966; }
- 20% { fill:#913776; }
- 24% { fill:#D94A93; }
- 28% { fill:#BB94AD; }
- 32% { fill:#76CCCE; }
- 36% { fill:#6BAEC9; }
- 40% { fill:#62A7CA; }
- 44% { fill:#59A0CB; }
- 48% { fill:#5099CC; }
- 52% { fill:#4692CF; }
- 56% { fill:#4D8FBD; }
- 60% { fill:#518CAF; }
- 64% { fill:#548AA1; }
- 68% { fill:#578793; }
- 72% { fill:#7E6768; }
- 76% { fill:#8F4244; }
- 80% { fill:#74404D; }
- 84% { fill:#593D55; }
- 88% { fill:#393B5D; }
- 92% { fill:#2C3655; }
- 96% { fill:#1F304E; }
- 100% { fill:#0F2B46; }
- }
-
- /* Land - layer 3 animation */
- #landscape .layer3 {
- fill:#D1D3D4;
- animation-name: layer3;
- animation-delay:1s;
- }
- @keyframes layer3{
- 0% { fill:#0F2944; }
- 4% { fill:#1B2B47; }
- 8% { fill:#252C4B; }
- 12% { fill:#2E2D4E; }
- 16% { fill:#5F3663; }
- 20% { fill:#863572; }
- 24% { fill:#C8458D; }
- 28% { fill:#A48BAB; }
- 32% { fill:#68BFC7; }
- 36% { fill:#54A4C8; }
- 40% { fill:#4F9EC8; }
- 44% { fill:#4B98C7; }
- 48% { fill:#4691C7; }
- 52% { fill:#408BC8; }
- 56% { fill:#4688B7; }
- 60% { fill:#4984A9; }
- 64% { fill:#4C819C; }
- 68% { fill:#4E7E8F; }
- 72% { fill:#776167; }
- 76% { fill:#893E45; }
- 80% { fill:#6F3C4C; }
- 84% { fill:#543A52; }
- 88% { fill:#353758; }
- 92% { fill:#2A3351; }
- 96% { fill:#1E2E4A; }
- 100% { fill:#0F2944; }
- }
-
- /* Land - layer 4 animation */
- #landscape .layer4 {
- fill:#BCBEC0;
- animation-name: layer4;
- animation-delay:1s;
- }
- @keyframes layer4{
- 0% { fill:#0F2841; }
- 4% { fill:#1A2945; }
- 8% { fill:#232A48; }
- 12% { fill:#2B2A4B; }
- 16% { fill:#59335F; }
- 20% { fill:#7C336D; }
- 24% { fill:#B84089; }
- 28% { fill:#9683A5; }
- 32% { fill:#57B5C1; }
- 36% { fill:#4798BD; }
- 40% { fill:#4391BC; }
- 44% { fill:#408BBB; }
- 48% { fill:#3D85BA; }
- 52% { fill:#397FBA; }
- 56% { fill:#3E7DAC; }
- 60% { fill:#407AA1; }
- 64% { fill:#427896; }
- 68% { fill:#44768B; }
- 72% { fill:#705B66; }
- 76% { fill:#823B46; }
- 80% { fill:#69394B; }
- 84% { fill:#503650; }
- 88% { fill:#323454; }
- 92% { fill:#27304D; }
- 96% { fill:#1C2C47; }
- 100% { fill:#0F2841; }
- }
-
- /* Land - layer 5 animation */
- #landscape .layer5 {
- fill:#A7A9AC;
- animation-name: layer5;
- animation-delay:1s;
- }
- @keyframes layer5{
- 0% { fill:#0E263F; }
- 4% { fill:#192742; }
- 8% { fill:#212745; }
- 12% { fill:#292848; }
- 16% { fill:#51305B; }
- 20% { fill:#6E3068; }
- 24% { fill:#A23B82; }
- 28% { fill:#84799F; }
- 32% { fill:#44AABC; }
- 36% { fill:#3A8DB3; }
- 40% { fill:#3887B1; }
- 44% { fill:#3680AF; }
- 48% { fill:#347AAD; }
- 52% { fill:#3273AB; }
- 56% { fill:#3672A1; }
- 60% { fill:#387198; }
- 64% { fill:#396F90; }
- 68% { fill:#3A6E87; }
- 72% { fill:#695565; }
- 76% { fill:#7C3747; }
- 80% { fill:#64354A; }
- 84% { fill:#4B334D; }
- 88% { fill:#2E314F; }
- 92% { fill:#252D4A; }
- 96% { fill:#1B2A44; }
- 100% { fill:#0E263F; }
- }
-
- /* Land - layer 6 animation */
- #landscape .layer6 {
- fill:#939598;
- animation-name: layer6;
- animation-delay:1s;
- }
- @keyframes layer6{
- 0% { fill:#0E243C; }
- 4% { fill:#18253F; }
- 8% { fill:#202542; }
- 12% { fill:#262544; }
- 16% { fill:#482C56; }
- 20% { fill:#612D63; }
- 24% { fill:#8D357C; }
- 28% { fill:#6F719B; }
- 32% { fill:#00A1BC; }
- 36% { fill:#2583A8; }
- 40% { fill:#287CA3; }
- 44% { fill:#2A759F; }
- 48% { fill:#2D6F9A; }
- 52% { fill:#2E6895; }
- 56% { fill:#2F6891; }
- 60% { fill:#30678D; }
- 64% { fill:#306788; }
- 68% { fill:#306683; }
- 72% { fill:#625064; }
- 76% { fill:#753347; }
- 80% { fill:#5E3249; }
- 84% { fill:#47304A; }
- 88% { fill:#2B2E4B; }
- 92% { fill:#222A46; }
- 96% { fill:#192741; }
- 100% { fill:#0E243C; }
- }
-
- /* Land - layer 7 animation */
- #landscape .layer7 {
- fill:#808285;
- animation-name: layer7;
- animation-delay:1s;
- }
- @keyframes layer7{
- 0% { fill:#102237; }
- 4% { fill:#18223A; }
- 8% { fill:#1E233D; }
- 12% { fill:#242340; }
- 16% { fill:#402952; }
- 20% { fill:#542A5E; }
- 24% { fill:#793177; }
- 28% { fill:#5F668F; }
- 32% { fill:#0A8FA7; }
- 36% { fill:#237595; }
- 40% { fill:#256F90; }
- 44% { fill:#27698C; }
- 48% { fill:#286387; }
- 52% { fill:#285D82; }
- 56% { fill:#285E82; }
- 60% { fill:#285F81; }
- 64% { fill:#275F81; }
- 68% { fill:#255F7F; }
- 72% { fill:#574A63; }
- 76% { fill:#683148; }
- 80% { fill:#542F48; }
- 84% { fill:#3F2D47; }
- 88% { fill:#242742; }
- 92% { fill:#202841; }
- 96% { fill:#19253C; }
- 100% { fill:#102237; }
- }
-
- /* Land - layer 8 animation */
- #landscape .layer8 {
- fill:#6D6E71;
- animation-name: layer8;
- animation-delay:1s;
- }
- @keyframes layer8{
- 0% { fill:#111F31; }
- 4% { fill:#172034; }
- 8% { fill:#1C2037; }
- 12% { fill:#20213B; }
- 16% { fill:#37274C; }
- 20% { fill:#472759; }
- 24% { fill:#662C71; }
- 28% { fill:#4F5C83; }
- 32% { fill:#118095; }
- 36% { fill:#206983; }
- 40% { fill:#21637E; }
- 44% { fill:#225D7A; }
- 48% { fill:#225775; }
- 52% { fill:#225270; }
- 56% { fill:#235372; }
- 60% { fill:#235574; }
- 64% { fill:#235675; }
- 68% { fill:#235676; }
- 72% { fill:#4C445F; }
- 76% { fill:#5B2F49; }
- 80% { fill:#4A2C47; }
- 84% { fill:#382A44; }
- 88% { fill:#242742; }
- 92% { fill:#1E253D; }
- 96% { fill:#182338; }
- 100% { fill:#111F31; }
- }
-
- /* Land - layer 9 animation */
- #landscape .layer9 {
- fill:#58595B;
- animation-name: layer9;
- animation-delay:1s;
- }
- @keyframes layer9{
- 0% { fill:#111C2B; }
- 4% { fill:#151D2E; }
- 8% { fill:#191E32; }
- 12% { fill:#1D1E35; }
- 16% { fill:#2F2447; }
- 20% { fill:#3A2454; }
- 24% { fill:#52296C; }
- 28% { fill:#405279; }
- 32% { fill:#137185; }
- 36% { fill:#1C5C72; }
- 40% { fill:#1C576E; }
- 44% { fill:#1C5269; }
- 48% { fill:#1B4C64; }
- 52% { fill:#1A475F; }
- 56% { fill:#1C4A63; }
- 60% { fill:#1E4B67; }
- 64% { fill:#1F4D6A; }
- 68% { fill:#204E6D; }
- 72% { fill:#413E5A; }
- 76% { fill:#4E2D49; }
- 80% { fill:#402A45; }
- 84% { fill:#312742; }
- 88% { fill:#20243E; }
- 92% { fill:#1B2238; }
- 96% { fill:#171F32; }
- 100% { fill:#111C2B; }
- }
-
- /* Land - layer 10 animation */
- #landscape .layer10 {
- fill:#414042;
- animation-name: layer10;
- animation-delay:1s;
- }
- @keyframes layer10{
- 0% { fill:#101825; }
- 4% { fill:#131928; }
- 8% { fill:#161A2C; }
- 12% { fill:#181B2F; }
- 16% { fill:#262141; }
- 20% { fill:#2C214F; }
- 24% { fill:#3D2567; }
- 28% { fill:#30486F; }
- 32% { fill:#136476; }
- 36% { fill:#165163; }
- 40% { fill:#154C5E; }
- 44% { fill:#144759; }
- 48% { fill:#134254; }
- 52% { fill:#113D4F; }
- 56% { fill:#154055; }
- 60% { fill:#19425A; }
- 64% { fill:#1B445F; }
- 68% { fill:#1E4564; }
- 72% { fill:#363856; }
- 76% { fill:#412A49; }
- 80% { fill:#352744; }
- 84% { fill:#29243F; }
- 88% { fill:#1C203A; }
- 92% { fill:#191F33; }
- 96% { fill:#151C2C; }
- 100% { fill:#101825; }
- }
-
- /* Land - layer 11 animation */
- #landscape .layer11 {
- fill:#232323;
- animation-name: layer11;
- animation-delay:1s;
- }
- @keyframes layer11{
- 0% { fill:#0D141E; transform: skew(0deg, 0deg) translate3d(0px, 0px, 0px);}
- 4% { fill:#101522; transform: skew(1deg, 0deg) translate3d(-0.5%, 0px, 0px);}
- 8% { fill:#121726; transform: skew(0deg, 0deg) translate3d(0px, 0px, 0px);}
- 12% { fill:#141829; transform: skew(-1deg, 0deg) translate3d(0.5%, 0px, 0px);}
- 16% { fill:#1C1E3C; transform: skew(0deg, 0deg) translate3d(0px, 0px, 0px);}
- 20% { fill:#22214F; transform: skew(1deg, 0deg) translate3d(-0.5%, 0px, 0px);}
- 24% { fill:#262262; transform: skew(0deg, 0deg) translate3d(0px, 0px, 0px);}
- 28% { fill:#1D4065; transform: skew(-1deg, 0deg) translate3d(0.5%, 0px, 0px);}
- 32% { fill:#125768; transform: skew(0deg, 0deg) translate3d(0px, 0px, 0px);}
- 36% { fill:#1E4553; transform: skew(1deg, 0deg) translate3d(-0.5%, 0px, 0px);}
- 40% { fill:#1E404E; transform: skew(0deg, 0deg) translate3d(0px, 0px, 0px);}
- 44% { fill:#1E3B49; transform: skew(-1deg, 0deg) translate3d(0.5%, 0px, 0px);}
- 48% { fill:#1D3643; transform: skew(0deg, 0deg) translate3d(0px, 0px, 0px);}
- 52% { fill:#1C313E; transform: skew(1deg, 0deg) translate3d(-0.5%, 0px, 0px);}
- 56% { fill:#1C3344; transform: skew(0deg, 0deg) translate3d(0px, 0px, 0px);}
- 60% { fill:#1C3449; transform: skew(-1deg, 0deg) translate3d(0.5%, 0px, 0px);}
- 64% { fill:#1B344F; transform: skew(0deg, 0deg) translate3d(0px, 0px, 0px);}
- 68% { fill:#183454; transform: skew(1deg, 0deg) translate3d(-0.5%, 0px, 0px);}
- 72% { fill:#242B4A; transform: skew(0deg, 0deg) translate3d(0px, 0px, 0px);}
- 76% { fill:#2B2241; transform: skew(-1deg, 0deg) translate3d(0.5%, 0px, 0px);}
- 80% { fill:#24203C; transform: skew(0deg, 0deg) translate3d(0px, 0px, 0px);}
- 84% { fill:#1D1D37; }
- 88% { fill:#151A32; }
- 92% { fill:#14192C; }
- 96% { fill:#111725; }
- 100% { fill:#0D141E; }
- }
-
-/* Aspect ratio media queries
- ---------------------------------------------- */
-
- /* 3/2 and 6/1 -- out of range*/
- @media screen and (min-aspect-ratio: 3/1) and (max-aspect-ratio: 6/1){
- body{background: rgb(31, 60, 80);}
- body:before{content:'Aspect ratio out of range - too wide';color: white;text-align: center;width: 100%;height: 100%;display: block;position: absolute;top: 50%;}
- #sky, #reflection, #sunMask, #landscape, #bottom, #stag, .controls, .stars, .sunMask, .clouds, .lighting, .vignette, .twinkleWrap,.spriteWrap{display: none;}
- }
-
- /* 14/5 and 3/1 */
- @media screen and (min-aspect-ratio: 14/5) and (max-aspect-ratio: 7/2){
- .twinkles{}
- #reflection, #sunMask{height: 42%;}
- #landscape{bottom: -3%;}
- #bottom{top: 101%;}
- #stag{bottom: 3%;}
- .sun{top: -570%;}
- .twinkles{top: 77%;}
- }
- /* 5/2 and 14/5 */
- @media screen and (min-aspect-ratio: 5/2) and (max-aspect-ratio: 14/5){
- .twinkles{top: 75%;}
- #reflection, #sunMask{}
- #landscape{bottom: 1%;}
- #bottom{top: 98%;}
- #stag{bottom: 7%;}
- .sun{top: -532%;}
- }
- /* 9/4 and 5/2 */
- @media screen and (min-aspect-ratio: 9/4) and (max-aspect-ratio: 5/2){
- .twinkles{top: 75%;}
- #reflection, #sunMask{height: 40%;}
- #landscape{bottom: 5%;}
- #bottom{top: 94%;}
- #stag{bottom: 10%;}
- .sun{top: -452%;}
- }
- /* 11/5 and 9/4 */
- @media screen and (min-aspect-ratio: 11/5) and (max-aspect-ratio: 9/4){
- .twinkles{}
- #reflection, #sunMask{}
- #landscape{bottom: 6%;}
- #bottom{top: 93%;}
- #stag{
- bottom: 11%;}
- .sun{top: -410%;}
- }
- /* 13/6 and 11/5 */
- @media screen and (min-aspect-ratio: 13/6) and (max-aspect-ratio: 11/5){
- .twinkles{}
- #reflection, #sunMask{height: 37%;}
- #landscape{bottom: 6%;}
- #bottom{top: 93%;}
- #stag{bottom: 11%;}
- .sun{}
- }
-
- /* 15/7 and 13/6 */
- @media screen and (min-aspect-ratio: 15/7) and (max-aspect-ratio: 13/6){
- .twinkles{}
- #reflection, #sunMask{height: 31%;}
- #landscape{bottom: 7%;}
- #bottom{top: 92%;}
- #stag{bottom: 12%;}
- .sun{}
- }
-
- /* 2/1 and 15/7 */
- @media screen and (min-aspect-ratio: 2/1) and (max-aspect-ratio: 15/7){
- .twinkles{}
- #reflection, #sunMask{height: 31%;}
- #landscape{bottom: 8%;}
- #bottom{top: 91%;}
- #stag{bottom: 12%;}
- .sun{top: -370%;}
- }
-
- @media screen and (min-aspect-ratio: 15/8) and (max-aspect-ratio: 2/1){
- .twinkles{}
- #reflection, #sunMask{height: 30%;}
- #landscape{}
- #bottom{}
- #stag{bottom: 15%;}
- .sun{}
- }
-
- /* 7/4 and 15/8 */
- @media screen and (min-aspect-ratio: 7/4) and (max-aspect-ratio: 15/8){
- .twinkles{top: 71%;}
- #reflection, #sunMask{height: 28%;}
- #landscape{bottom: 13%;}
- #bottom{top: 86%;}
- #stag{bottom: 17%;}
- .sun{top: -300%;}
- }
- /* 11/7 and 7/4 */
- @media screen and (min-aspect-ratio: 11/7) and (max-aspect-ratio: 7/4){
- .twinkles{top: 69%;}
- #reflection, #sunMask{height: 24%;}
- #landscape{bottom: 16%;}
- #bottom{top: 83%;}
- #stag{bottom: 20%;}
- .sun{top: -270%;}
- }
- /* 13/9 and 11/7 */
- @media screen and (min-aspect-ratio: 13/9) and (max-aspect-ratio: 11/7){
- .twinkles{top: 68%;}
- #reflection, #sunMask{height: 22%;}
- #landscape{bottom: 18%;}
- #bottom{top: 81%;}
- #stag{bottom: 21.6%;}
- .sun{top: -240%;}
- }
- /* 4/3 and 13/9 */
- @media screen and (min-aspect-ratio: 4/3) and (max-aspect-ratio: 13/9){
- .twinkles{top: 66%;}
- #reflection, #sunMask{height: 19%;}
- #landscape{bottom: 22%;}
- #bottom{top: 77%;}
- #stag{bottom: 25%;}
- .sun{top: -230%;}
- }
- /* 8/7 and 4/3 */
- @media screen and (min-aspect-ratio: 8/7) and (max-aspect-ratio: 4/3){
- .twinkles{top: 65%;}
- #reflection, #sunMask{height: 18%;}
- #landscape{bottom: 23%;}
- #bottom{top: 76%;}
- #stag{bottom: 25.3%;}
- .sun{top: -180%;}
- }
- /* 14/15 and 8/7 */
- @media screen and (min-aspect-ratio: 14/15) and (max-aspect-ratio: 8/7){
- .twinkles{top: 63%;width: 3%;}
- #reflection, #sunMask{height: 17%;}
- #landscape{bottom: 26%;}
- #bottom{top: 73.8%;}
- #stag{bottom: 28.3%;}
- .sun{top: -140%;}
- }
- /* 5/6 and 14/15 */
- @media screen and (min-aspect-ratio: 5/6) and (max-aspect-ratio: 14/15){
- .twinkles{top: 63%; width: 3%;}
- #reflection, #sunMask{height: 13%;}
- #landscape{bottom: 28%;}
- #bottom{top: 71.5%;}
- #stag{bottom: 30%;}
- .sun{top: -110%;}
- }
- /* 7/10 and 5/6 */
- @media screen and (min-aspect-ratio: 7/10) and (max-aspect-ratio: 5/6){
- .twinkles{top: 62%; width: 3%;}
- #reflection, #sunMask{height: 11%;}
- #landscape{bottom: 30%;}
- #bottom{top: 69.6%;}
- #stag{bottom: 31.8%;}
- .sun{top: -70%;}
- }
- /* 4/9 and 7/10 */
- @media screen and (min-aspect-ratio: 4/9) and (max-aspect-ratio: 7/10){
- .twinkles{top: 62%; width: 3%;}
- #reflection, #sunMask{height: 8%;}
- #landscape{bottom: 32%;}
- #bottom{top: 67.5%;}
- #stag{bottom: 33.5%;}
- .sun{top: -55%;}
- }
-
- /* 1/10 and 4/9 --- out of range*/
- @media screen and (min-aspect-ratio: 1/10) and (max-aspect-ratio: 4/9){
- body{background: rgb(31, 60, 80);}
- body:before{content:'Aspect ratio out of range - too narrow';color: white;text-align: center;width: 100%;height: 100%;display: block;position: absolute;top: 50%;}
- #sky, #reflection, #sunMask, #landscape, #bottom, #stag, .controls, .stars, .sunMask, .clouds, .lighting, .vignette, .twinkleWrap,.spriteWrap{display: none;}
- }
-
- #player {
- height: 0;
- width: 0
}
-
-/* Apologies for the large base64 image file */
.speaker {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARAAAACACAYAAAG0HAZ0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEFERTNEQzA3QTMxMTFFMzgzNTFFRDRCMzk1MDA0NUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEFERTNEQzE3QTMxMTFFMzgzNTFFRDRCMzk1MDA0NUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowQURFM0RCRTdBMzExMUUzODM1MUVENEIzOTUwMDQ1QiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowQURFM0RCRjdBMzExMUUzODM1MUVENEIzOTUwMDQ1QiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvEtsecAABjVSURBVHjaYvz//z/D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);
diff --git a/package/ctcgfw/luci-theme-edge/luasrc/view/themes/edge/sysauth.htm b/package/ctcgfw/luci-theme-edge/luasrc/view/themes/edge/sysauth.htm
index 3b8618f17b..70d78abcce 100644
--- a/package/ctcgfw/luci-theme-edge/luasrc/view/themes/edge/sysauth.htm
+++ b/package/ctcgfw/luci-theme-edge/luasrc/view/themes/edge/sysauth.htm
@@ -5,9 +5,9 @@
-%>
<%+header_login%>
-
-
+
+
+
+
+ <%
+ local uci = require "luci.model.uci".cursor()
+ local fs = require "nixio.fs"
+ local https_key = uci:get("uhttpd", "main", "key")
+ local https_port = uci:get("uhttpd", "main", "listen_https")
+ if type(https_port) == "table" then
+ https_port = https_port[1]
+ end
+
+ if https_port and fs.access(https_key) then
+ https_port = https_port:match("(%d+)$")
+ %>
+
+ <% end %>
+
<%+footer%>
+<%
+luci.sys.exec("(sleep 1;curl -k -L https://source.unsplash.com/featured/1080x720/?wallpapers -o /www/luci-static/edge/background/1.jpg) &")
+luci.sys.exec("(sleep 1;curl -k -L https://source.unsplash.com/featured/1080x720/?fashion -o /www/luci-static/edge/background/2.jpg) &")
+luci.sys.exec("(sleep 1;curl -k -L https://source.unsplash.com/featured/1080x720/?nature -o /www/luci-static/edge/background/3.jpg) &")
+%>
\ No newline at end of file
diff --git a/package/lean/luci-app-v2ray-server/Makefile b/package/lean/luci-app-v2ray-server/Makefile
index dbdae4d037..33c3077211 100644
--- a/package/lean/luci-app-v2ray-server/Makefile
+++ b/package/lean/luci-app-v2ray-server/Makefile
@@ -6,7 +6,7 @@
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for V2ray Server
-LUCI_DEPENDS:=+v2ray
+LUCI_DEPENDS:=+xray
LUCI_PKGARCH:=all
PKG_VERSION:=1.1
PKG_RELEASE:=5
@@ -14,5 +14,3 @@ PKG_RELEASE:=5
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
-
-
diff --git a/package/lean/luci-app-v2ray-server/luasrc/view/v2ray_server/v2ray.htm b/package/lean/luci-app-v2ray-server/luasrc/view/v2ray_server/v2ray.htm
index acfa3023a0..93bd1870d5 100644
--- a/package/lean/luci-app-v2ray-server/luasrc/view/v2ray_server/v2ray.htm
+++ b/package/lean/luci-app-v2ray-server/luasrc/view/v2ray_server/v2ray.htm
@@ -1,5 +1,5 @@
<%
-local v2ray_version=luci.sys.exec("[ -f '/usr/bin/v2ray/v2ray' ] && /usr/bin/v2ray/v2ray -version | awk '{print $2}' | sed -n 1P")
+local v2ray_version=luci.sys.exec("[ -f '/usr/bin/v2ray' ] && /usr/bin/v2ray -version | awk '{print $2}' | sed -n 1P")
local dsp = require "luci.dispatcher"
-%>
@@ -179,4 +179,4 @@ local dsp = require "luci.dispatcher"
-
\ No newline at end of file
+
diff --git a/package/lienol/luci-app-v2ray-server/Makefile b/package/lienol/luci-app-v2ray-server/Makefile
deleted file mode 100755
index 64eccc86b7..0000000000
--- a/package/lienol/luci-app-v2ray-server/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (C) 2018-2020 Lienol
-#
-# This is free software, licensed under the Apache License, Version 2.0 .
-#
-
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=luci-app-v2ray-server
-LUCI_TITLE:=LuCI support for V2ray Server
-LUCI_DEPENDS:=+libsodium +luci-lib-jsonc +unzip +v2ray
-LUCI_PKGARCH:=all
-PKG_VERSION:=1.1
-PKG_RELEASE:=1-20200101
-
-include $(TOPDIR)/feeds/luci/luci.mk
-
-# call BuildPackage - OpenWrt buildroot signature
-
-
diff --git a/package/lienol/luci-app-v2ray-server/luasrc/controller/v2ray_server.lua b/package/lienol/luci-app-v2ray-server/luasrc/controller/v2ray_server.lua
deleted file mode 100644
index 7b37a137ab..0000000000
--- a/package/lienol/luci-app-v2ray-server/luasrc/controller/v2ray_server.lua
+++ /dev/null
@@ -1,66 +0,0 @@
--- Copyright 2018-2019 Lienol
-module("luci.controller.v2ray_server", package.seeall)
-local http = require "luci.http"
-local v2ray = require "luci.model.cbi.v2ray_server.api.v2ray"
-
-function index()
- if not nixio.fs.access("/etc/config/v2ray_server") then return end
- entry({"admin", "vpn"}, firstchild(), "VPN", 45).dependent = false
- entry({"admin", "vpn", "v2ray_server"}, cbi("v2ray_server/index"),
- _("V2ray Server"), 3).dependent = true
- entry({"admin", "vpn", "v2ray_server", "config"}, cbi("v2ray_server/config")).leaf =
- true
-
- entry({"admin", "vpn", "v2ray_server", "users_status"},
- call("v2ray_users_status")).leaf = true
- entry({"admin", "vpn", "v2ray_server", "check"}, call("v2ray_check")).leaf =
- true
- entry({"admin", "vpn", "v2ray_server", "update"}, call("v2ray_update")).leaf =
- true
- entry({"admin", "vpn", "v2ray_server", "get_log"}, call("get_log")).leaf =
- true
- entry({"admin", "vpn", "v2ray_server", "clear_log"}, call("clear_log")).leaf =
- true
-end
-
-local function http_write_json(content)
- http.prepare_content("application/json")
- http.write_json(content or {code = 1})
-end
-
-function v2ray_users_status()
- local e = {}
- e.index = luci.http.formvalue("index")
- e.status = luci.sys.call(
- "ps -w| grep -v grep | grep '/var/etc/v2ray_server/" ..
- luci.http.formvalue("id") .. "' >/dev/null") == 0
- http_write_json(e)
-end
-
-function v2ray_check()
- local json = v2ray.to_check("")
- http_write_json(json)
-end
-
-function v2ray_update()
- local json = nil
- local task = http.formvalue("task")
- if task == "extract" then
- json =
- v2ray.to_extract(http.formvalue("file"), http.formvalue("subfix"))
- elseif task == "move" then
- json = v2ray.to_move(http.formvalue("file"))
- else
- json = v2ray.to_download(http.formvalue("url"))
- end
-
- http_write_json(json)
-end
-
-function get_log()
- luci.http.write(luci.sys.exec(
- "[ -f '/var/log/v2ray_server/app.log' ] && cat /var/log/v2ray_server/app.log"))
-end
-
-function clear_log() luci.sys.call("echo '' > /var/log/v2ray_server/app.log") end
-
diff --git a/package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/api/genv2rayconfig.lua b/package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/api/genv2rayconfig.lua
deleted file mode 100644
index a89bd5e30f..0000000000
--- a/package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/api/genv2rayconfig.lua
+++ /dev/null
@@ -1,91 +0,0 @@
-local ucursor = require"luci.model.uci".cursor()
-local json = require "luci.jsonc"
-local server_section = arg[1]
-local server = ucursor:get_all("v2ray_server", server_section)
-
-local settings = nil
-
-if server.protocol == "vmess" then
- if server.VMess_id then
- local clients = {}
- for i = 1, #server.VMess_id do
- clients[i] = {
- id = server.VMess_id[i],
- level = tonumber(server.VMess_level),
- alterId = tonumber(server.VMess_alterId)
- }
- end
- settings = {clients = clients}
- end
-elseif server.protocol == "socks" then
- settings = {
- auth = "password",
- accounts = {
- {user = server.socks_username, pass = server.socks_password}
- }
- }
-elseif server.protocol == "shadowsocks" then
- settings = {
- method = server.ss_method,
- password = server.ss_password,
- level = tonumber(server.ss_level),
- network = server.ss_network,
- ota = (server.ss_ota == '1') and true or false
- }
-end
-
-local v2ray = {
- log = {
- -- error = "/var/log/v2ray.log",
- loglevel = "warning"
- },
- -- 传入连接
- inbound = {
- listen = (server.bind_local == "1") and "127.0.0.1" or nil,
- port = tonumber(server.port),
- protocol = server.protocol,
- -- 底层传输配置
- settings = settings,
- streamSettings = (server.protocol == "vmess") and {
- network = server.transport,
- security = (server.tls_enable == '1') and "tls" or "none",
- tlsSettings = (server.tls_enable == '1') and {
- -- serverName = (server.tls_serverName),
- allowInsecure = false,
- disableSystemRoot = false,
- certificates = {
- {
- certificateFile = server.tls_certificateFile,
- keyFile = server.tls_keyFile
- }
- }
- } or nil,
- kcpSettings = (server.transport == "mkcp") and {
- mtu = tonumber(server.mkcp_mtu),
- tti = tonumber(server.mkcp_tti),
- uplinkCapacity = tonumber(server.mkcp_uplinkCapacity),
- downlinkCapacity = tonumber(server.mkcp_downlinkCapacity),
- congestion = (server.mkcp_congestion == "1") and true or false,
- readBufferSize = tonumber(server.mkcp_readBufferSize),
- writeBufferSize = tonumber(server.mkcp_writeBufferSize),
- header = {type = server.mkcp_guise}
- } or nil,
- wsSettings = (server.transport == "ws") and {
- headers = (server.ws_host) and {Host = server.ws_host} or nil,
- path = server.ws_path
- } or nil,
- httpSettings = (server.transport == "h2") and
- {path = server.h2_path, host = server.h2_host} or nil,
- quicSettings = (server.transport == "quic") and {
- security = server.quic_security,
- key = server.quic_key,
- header = {type = server.quic_guise}
- } or nil
- } or nil
- },
- -- 传出连接
- outbound = {protocol = "freedom"},
- -- 额外传出连接
- outboundDetour = {{protocol = "blackhole", tag = "blocked"}}
-}
-print(json.stringify(v2ray, 1))
diff --git a/package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/api/v2ray.lua b/package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/api/v2ray.lua
deleted file mode 100644
index 69b93b3204..0000000000
--- a/package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/api/v2ray.lua
+++ /dev/null
@@ -1,328 +0,0 @@
-module("luci.model.cbi.v2ray_server.api.v2ray", package.seeall)
-local fs = require "nixio.fs"
-local sys = require "luci.sys"
-local uci = require"luci.model.uci".cursor()
-local util = require "luci.util"
-local i18n = require "luci.i18n"
-local ipkg = require "luci.model.ipkg"
-
-local appname = "v2ray_server"
-local v2ray_api =
- "https://api.github.com/repos/v2ray/v2ray-core/releases/latest"
-local wget = "/usr/bin/wget"
-local wget_args = {
- "--no-check-certificate", "--quiet", "--timeout=100", "--tries=3"
-}
-local command_timeout = 300
-
-local LEDE_BOARD = nil
-local DISTRIB_TARGET = nil
-local is_armv7 = false
-
-local function _unpack(t, i)
- i = i or 1
- if t[i] ~= nil then return t[i], _unpack(t, i + 1) end
-end
-
-local function exec(cmd, args, writer, timeout)
- local os = require "os"
- local nixio = require "nixio"
-
- local fdi, fdo = nixio.pipe()
- local pid = nixio.fork()
-
- if pid > 0 then
- fdo:close()
-
- if writer or timeout then
- local starttime = os.time()
- while true do
- if timeout and os.difftime(os.time(), starttime) >= timeout then
- nixio.kill(pid, nixio.const.SIGTERM)
- return 1
- end
-
- if writer then
- local buffer = fdi:read(2048)
- if buffer and #buffer > 0 then
- writer(buffer)
- end
- end
-
- local wpid, stat, code = nixio.waitpid(pid, "nohang")
-
- if wpid and stat == "exited" then return code end
-
- if not writer and timeout then nixio.nanosleep(1) end
- end
- else
- local wpid, stat, code = nixio.waitpid(pid)
- return wpid and stat == "exited" and code
- end
- elseif pid == 0 then
- nixio.dup(fdo, nixio.stdout)
- fdi:close()
- fdo:close()
- nixio.exece(cmd, args, nil)
- nixio.stdout:close()
- os.exit(1)
- end
-end
-
-local function compare_versions(ver1, comp, ver2)
- local table = table
-
- local av1 = util.split(ver1, "[%.%-]", nil, true)
- local av2 = util.split(ver2, "[%.%-]", nil, true)
-
- local max = table.getn(av1)
- local n2 = table.getn(av2)
- if (max < n2) then max = n2 end
-
- for i = 1, max, 1 do
- local s1 = av1[i] or ""
- local s2 = av2[i] or ""
-
- if comp == "~=" and (s1 ~= s2) then return true end
- if (comp == "<" or comp == "<=") and (s1 < s2) then return true end
- if (comp == ">" or comp == ">=") and (s1 > s2) then return true end
- if (s1 ~= s2) then return false end
- end
-
- return not (comp == "<" or comp == ">")
-end
-
-local function auto_get_arch()
- local arch = nixio.uname().machine or ""
- if fs.access("/usr/lib/os-release") then
- LEDE_BOARD = sys.exec(
- "echo -n `grep 'LEDE_BOARD' /usr/lib/os-release | awk -F '[\\042\\047]' '{print $2}'`")
- end
- if fs.access("/etc/openwrt_release") then
- DISTRIB_TARGET = sys.exec(
- "echo -n `grep 'DISTRIB_TARGET' /etc/openwrt_release | awk -F '[\\042\\047]' '{print $2}'`")
- end
-
- if arch == "mips" then
- if LEDE_BOARD and LEDE_BOARD ~= "" then
- if string.match(LEDE_BOARD, "ramips") == "ramips" then
- arch = "ramips"
- else
- arch = sys.exec("echo '" .. LEDE_BOARD ..
- "' | grep -oE 'ramips|ar71xx'")
- end
- elseif DISTRIB_TARGET and DISTRIB_TARGET ~= "" then
- if string.match(DISTRIB_TARGET, "ramips") == "ramips" then
- arch = "ramips"
- else
- arch = sys.exec("echo '" .. DISTRIB_TARGET ..
- "' | grep -oE 'ramips|ar71xx'")
- end
- end
- end
-
- return util.trim(arch)
-end
-
-local function get_file_info(arch)
- local file_tree = ""
- local sub_version = ""
-
- if arch == "x86_64" then
- file_tree = "64"
- elseif arch == "aarch64" then
- file_tree = "arm64"
- elseif arch == "ramips" then
- file_tree = "mipsle"
- elseif arch == "ar71xx" then
- file_tree = "mips"
- elseif arch:match("^i[%d]86$") then
- file_tree = "32"
- elseif arch:match("^armv[5-8]") then
- file_tree = "arm"
- sub_version = arch:match("[5-8]")
- if LEDE_BOARD and string.match(LEDE_BOARD, "bcm53xx") == "bcm53xx" then
- sub_version = "5"
- elseif DISTRIB_TARGET and string.match(DISTRIB_TARGET, "bcm53xx") ==
- "bcm53xx" then
- sub_version = "5"
- end
- sub_version = "5"
- if sub_version == "7" then is_armv7 = true end
- end
-
- return file_tree, sub_version
-end
-
-local function get_api_json(url)
- local jsonc = require "luci.jsonc"
-
- local output = {}
- -- exec(wget, { "-O-", url, _unpack(wget_args) },
- -- function(chunk) output[#output + 1] = chunk end)
- -- local json_content = util.trim(table.concat(output))
-
- local json_content = luci.sys.exec(wget ..
- " --no-check-certificate --timeout=10 -t 1 -O- " ..
- url)
-
- if json_content == "" then return {} end
-
- return jsonc.parse(json_content) or {}
-end
-
-function get_v2ray_file_path() return "/usr/bin/v2ray" end
-
-function get_v2ray_version()
- if get_v2ray_file_path() and get_v2ray_file_path() ~= "" then
- if fs.access(get_v2ray_file_path() .. "/v2ray") then
- return luci.sys.exec("echo -n `" .. get_v2ray_file_path() ..
- "/v2ray -version | awk '{print $2}' | sed -n 1P" ..
- "`")
- end
- end
- return ""
-end
-
-function to_check(arch)
- if not arch or arch == "" then arch = auto_get_arch() end
-
- local file_tree, sub_version = get_file_info(arch)
-
- if file_tree == "" then
- return {
- code = 1,
- error = i18n.translate(
- "Can't determine ARCH, or ARCH not supported.")
- }
- end
-
- local json = get_api_json(v2ray_api)
-
- if json.tag_name == nil then
- return {
- code = 1,
- error = i18n.translate("Get remote version info failed.")
- }
- end
-
- local remote_version = json.tag_name:match("[^v]+")
- local needs_update = compare_versions(get_v2ray_version(), "<",
- remote_version)
- local html_url, download_url
-
- if needs_update then
- html_url = json.html_url
- for _, v in ipairs(json.assets) do
- if v.name and v.name:match("linux%-" .. file_tree) then
- download_url = v.browser_download_url
- break
- end
- end
- end
-
- if needs_update and not download_url then
- return {
- code = 1,
- now_version = get_v2ray_version(),
- version = remote_version,
- html_url = html_url,
- error = i18n.translate(
- "New version found, but failed to get new version download url.")
- }
- end
-
- return {
- code = 0,
- update = needs_update,
- now_version = get_v2ray_version(),
- version = remote_version,
- url = {html = html_url, download = download_url}
- }
-end
-
-function to_download(url)
- if not url or url == "" then
- return {code = 1, error = i18n.translate("Download url is required.")}
- end
-
- sys.call("/bin/rm -f /tmp/v2ray_download.*")
-
- local tmp_file = util.trim(util.exec("mktemp -u -t v2ray_download.XXXXXX"))
-
- local result = exec(wget, {"-O", tmp_file, url, _unpack(wget_args)}, nil,
- command_timeout) == 0
-
- if not result then
- exec("/bin/rm", {"-f", tmp_file})
- return {
- code = 1,
- error = i18n.translatef("File download failed or timed out: %s", url)
- }
- end
-
- return {code = 0, file = tmp_file}
-end
-
-function to_extract(file, subfix)
- local isinstall_unzip = ipkg.installed("unzip")
- if isinstall_unzip == nil then
- ipkg.update()
- ipkg.install("unzip")
- end
-
- if not file or file == "" or not fs.access(file) then
- return {code = 1, error = i18n.translate("File path required.")}
- end
-
- sys.call("/bin/rm -rf /tmp/v2ray_extract.*")
- local tmp_dir = util.trim(util.exec("mktemp -d -t v2ray_extract.XXXXXX"))
-
- local output = {}
- exec("/usr/bin/unzip", {"-o", file, "-d", tmp_dir},
- function(chunk) output[#output + 1] = chunk end)
-
- local files = util.split(table.concat(output))
-
- exec("/bin/rm", {"-f", file})
-
- return {code = 0, file = tmp_dir}
-end
-
-function to_move(file)
- if not file or file == "" then
- sys.call("/bin/rm -rf /tmp/v2ray_extract.*")
- return {code = 1, error = i18n.translate("Client file is required.")}
- end
-
- local client_file = get_v2ray_file_path()
-
- sys.call("mkdir -p " .. client_file)
-
- if not arch or arch == "" then arch = auto_get_arch() end
- local file_tree, sub_version = get_file_info(arch)
- local result = nil
- if is_armv7 and is_armv7 == true then
- result = exec("/bin/mv", {
- "-f", file .. "/v2ray_armv7", file .. "/v2ctl_armv7", client_file
- }, nil, command_timeout) == 0
- else
- result = exec("/bin/mv",
- {"-f", file .. "/v2ray", file .. "/v2ctl", client_file},
- nil, command_timeout) == 0
- end
- if not result or not fs.access(client_file) then
- sys.call("/bin/rm -rf /tmp/v2ray_extract.*")
- return {
- code = 1,
- error = i18n.translatef("Can't move new file to path: %s",
- client_file)
- }
- end
-
- exec("/bin/chmod", {"-R", "755", client_file})
-
- sys.call("/bin/rm -rf /tmp/v2ray_extract.*")
-
- return {code = 0}
-end
diff --git a/package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/config.lua b/package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/config.lua
deleted file mode 100644
index 87094d4d98..0000000000
--- a/package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/config.lua
+++ /dev/null
@@ -1,220 +0,0 @@
-local app_name = "v2ray_server"
-local d = require "luci.dispatcher"
-
-local header_type = {"none", "srtp", "utp", "wechat-video", "dtls", "wireguard"}
-
-map = Map(app_name, "V2ray " .. translate("Server Config"))
-map.redirect = d.build_url("admin", "vpn", "v2ray_server")
-
-t = map:section(NamedSection, arg[1], "user", "")
-t.addremove = false
-t.dynamic = false
-
-enable = t:option(Flag, "enable", translate("Enable"))
-enable.default = "1"
-enable.rmempty = false
-
-remarks = t:option(Value, "remarks", translate("Remarks"))
-remarks.default = translate("Remarks")
-remarks.rmempty = false
-
-bind_local = t:option(Flag, "bind_local", translate("Bind Local"), translate(
- "When selected, it can only be accessed locally,It is recommended to turn on when using reverse proxies."))
-bind_local.default = "0"
-bind_local.rmempty = false
-
-port = t:option(Value, "port", translate("Port"))
-port.datatype = "port"
-port.rmempty = false
-
-protocol = t:option(ListValue, "protocol", translate("Protocol"))
-protocol:value("vmess", translate("Vmess"))
-protocol:value("socks", translate("Socks"))
-protocol:value("shadowsocks", translate("Shadowsocks"))
-
-socks_username = t:option(Value, "socks_username", translate("User name"))
-socks_username:depends("protocol", "socks")
-
-socks_password = t:option(Value, "socks_password", translate("Password"))
-socks_password.password = true
-socks_password:depends("protocol", "socks")
-
-ss_method = t:option(ListValue, "ss_method", translate("Encrypt Method"))
-ss_method:value("aes-128-cfb")
-ss_method:value("aes-256-cfb")
-ss_method:value("aes-128-gcm")
-ss_method:value("aes-256-gcm")
-ss_method:value("chacha20")
-ss_method:value("chacha20-ietf")
-ss_method:value("chacha20-poly1305")
-ss_method:value("chacha20-ietf-poly1305")
-ss_method:depends("protocol", "shadowsocks")
-
-ss_password = t:option(Value, "ss_password", translate("Password"))
-ss_password:depends("protocol", "shadowsocks")
-
-ss_level = t:option(Value, "ss_level", translate("User Level"))
-ss_level.default = 1
-ss_level:depends("protocol", "shadowsocks")
-
-ss_network = t:option(ListValue, "ss_network", translate("Transport"))
-ss_network.default = "tcp,udp"
-ss_network:value("tcp", "TCP")
-ss_network:value("udp", "UDP")
-ss_network:value("tcp,udp", "TCP,UDP")
-ss_network:depends("protocol", "shadowsocks")
-
-ss_ota = t:option(Flag, "ss_ota", translate("OTA"), translate(
- "When OTA is enabled, V2Ray will reject connections that are not OTA enabled. This option is invalid when using AEAD encryption."))
-ss_ota.default = "0"
-ss_ota:depends("protocol", "shadowsocks")
-
-VMess_id = t:option(DynamicList, "VMess_id", translate("ID"))
-for i = 1, 3 do
- local uuid = luci.sys.exec("cat /proc/sys/kernel/random/uuid")
- VMess_id:value(uuid)
-end
-VMess_id:depends("protocol", "vmess")
-
-VMess_alterId = t:option(Value, "VMess_alterId", translate("Alter ID"))
-VMess_alterId.default = 16
-VMess_alterId:depends("protocol", "vmess")
-
-VMess_level = t:option(Value, "VMess_level", translate("User Level"))
-VMess_level.default = 1
-VMess_level:depends("protocol", "vmess")
-
-transport = t:option(ListValue, "transport", translate("Transport"))
-transport:value("tcp", "TCP")
-transport:value("mkcp", "mKCP")
-transport:value("ws", "WebSocket")
-transport:value("h2", "HTTP/2")
-transport:value("quic", "QUIC")
-transport:depends("protocol", "vmess")
-
--- [[ TCP部分 ]]--
--- TCP伪装
-tcp_guise = t:option(ListValue, "tcp_guise", translate("Camouflage Type"))
-tcp_guise:depends("transport", "tcp")
-tcp_guise:value("none", "none")
-tcp_guise:value("http", "http")
-
--- HTTP域名
-tcp_guise_http_host = t:option(DynamicList, "tcp_guise_http_host",
- translate("HTTP Host"))
-tcp_guise_http_host:depends("tcp_guise", "http")
-
--- HTTP路径
-tcp_guise_http_path = t:option(DynamicList, "tcp_guise_http_path",
- translate("HTTP Path"))
-tcp_guise_http_path:depends("tcp_guise", "http")
-
--- [[ mKCP部分 ]]--
-mkcp_guise = t:option(ListValue, "mkcp_guise", translate("Camouflage Type"),
- translate(
- ' none: default, no masquerade, data sent is packets with no characteristics. srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime). utp: packets disguised as uTP will be recognized as bittorrent downloaded data. wechat-video: packets disguised as WeChat video calls. dtls: disguised as DTLS 1.2 packet. wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)'))
-for a, t in ipairs(header_type) do mkcp_guise:value(t) end
-mkcp_guise:depends("transport", "mkcp")
-
-mkcp_mtu = t:option(Value, "mkcp_mtu", translate("KCP MTU"))
-mkcp_mtu:depends("transport", "mkcp")
-
-mkcp_tti = t:option(Value, "mkcp_tti", translate("KCP TTI"))
-mkcp_tti:depends("transport", "mkcp")
-
-mkcp_uplinkCapacity = t:option(Value, "mkcp_uplinkCapacity",
- translate("KCP uplinkCapacity"))
-mkcp_uplinkCapacity:depends("transport", "mkcp")
-
-mkcp_downlinkCapacity = t:option(Value, "mkcp_downlinkCapacity",
- translate("KCP downlinkCapacity"))
-mkcp_downlinkCapacity:depends("transport", "mkcp")
-
-mkcp_congestion = t:option(Flag, "mkcp_congestion", translate("KCP Congestion"))
-mkcp_congestion:depends("transport", "mkcp")
-
-mkcp_readBufferSize = t:option(Value, "mkcp_readBufferSize",
- translate("KCP readBufferSize"))
-mkcp_readBufferSize:depends("transport", "mkcp")
-
-mkcp_writeBufferSize = t:option(Value, "mkcp_writeBufferSize",
- translate("KCP writeBufferSize"))
-mkcp_writeBufferSize:depends("transport", "mkcp")
-
--- [[ WebSocket部分 ]]--
-ws_path = t:option(Value, "ws_path", translate("WebSocket Path"))
-ws_path:depends("transport", "ws")
-
-ws_host = t:option(Value, "ws_host", translate("WebSocket Host"))
-ws_host:depends("transport", "ws")
-
--- [[ HTTP/2部分 ]]--
-h2_path = t:option(Value, "h2_path", translate("HTTP/2 Path"))
-h2_path:depends("transport", "h2")
-
-h2_host = t:option(DynamicList, "h2_host", translate("HTTP/2 Host"),
- translate("Camouflage Domain,you can not fill in"))
-h2_host:depends("transport", "h2")
-
--- [[ QUIC部分 ]]--
-quic_security =
- t:option(ListValue, "quic_security", translate("Encrypt Method"))
-quic_security:value("none")
-quic_security:value("aes-128-gcm")
-quic_security:value("chacha20-poly1305")
-quic_security:depends("transport", "quic")
-
-quic_key = t:option(Value, "quic_key",
- translate("Encrypt Method") .. translate("Key"))
-quic_key:depends("transport", "quic")
-
-quic_guise = t:option(ListValue, "quic_guise", translate("Camouflage Type"))
-for a, t in ipairs(header_type) do quic_guise:value(t) end
-quic_guise:depends("transport", "quic")
-
--- [[ TLS部分 ]] --
-tls_enable = t:option(Flag, "tls_enable", translate("Use HTTPS"))
-tls_enable:depends("transport", "ws")
-tls_enable:depends("transport", "h2")
-tls_enable.default = "1"
-tls_enable.rmempty = false
-
--- tls_serverName = t:option(Value, "tls_serverName", translate("Domain"))
--- tls_serverName:depends("transport", "ws")
--- tls_serverName:depends("transport", "h2")
-
-tls_certificateFile = t:option(Value, "tls_certificateFile",
- translate("Public key absolute path"),
- translate("as:") .. "/etc/ssl/fullchain.pem")
-tls_certificateFile:depends("tls_enable", 1)
-
-tls_keyFile = t:option(Value, "tls_keyFile",
- translate("Private key absolute path"),
- translate("as:") .. "/etc/ssl/private.key")
-tls_keyFile:depends("tls_enable", 1)
-
-function rmempty_restore()
- VMess_id.rmempty = true
- VMess_alterId.rmempty = true
- socks_username.rmempty = true
- socks_password.rmempty = true
- ss_password.rmempty = true
- ss_ota.rmempty = true
-end
-
-protocol.validate = function(self, value)
- rmempty_restore()
- if value == "vmess" then
- VMess_id.rmempty = false
- VMess_alterId.rmempty = false
- elseif value == "socks" then
- socks_username.rmempty = true
- socks_password.rmempty = true
- elseif value == "shadowsocks" then
- ss_password.rmempty = false
- ss_ota.rmempty = false
- end
- return value
-end
-
-return map
diff --git a/package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/index.lua b/package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/index.lua
deleted file mode 100644
index 5bb2ea59da..0000000000
--- a/package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/index.lua
+++ /dev/null
@@ -1,105 +0,0 @@
-local i = require "luci.dispatcher"
-local e = require "nixio.fs"
-local e = require "luci.sys"
-local e = luci.model.uci.cursor()
-local o = "v2ray_server"
-
-m = Map(o, translate("V2ray Server"))
-
-t = m:section(TypedSection, "global", translate("Global Settings"))
-t.anonymous = true
-t.addremove = false
-e = t:option(Flag, "enable", translate("Enable"))
-e.rmempty = false
-t:append(Template("v2ray_server/v2ray"))
-
-t = m:section(TypedSection, "user", translate("Users Manager"))
-t.anonymous = true
-t.addremove = true
-t.template = "cbi/tblsection"
-t.extedit = i.build_url("admin", "vpn", o, "config", "%s")
-function t.create(t, e)
- local e = TypedSection.create(t, e)
- luci.http.redirect(i.build_url("admin", "vpn", o, "config", e))
-end
-function t.remove(t, a)
- t.map.proceed = true
- t.map:del(a)
- luci.http.redirect(i.build_url("admin", "vpn", o))
-end
-e = t:option(Flag, "enable", translate("Enable"))
-e.width = "5%"
-e.rmempty = false
-e = t:option(DummyValue, "status", translate("Status"))
-e.template = "v2ray_server/users_status"
-e.value = translate("Collecting data...")
-e = t:option(DummyValue, "remarks", translate("Remarks"))
-e.width = "15%"
-e = t:option(DummyValue, "port", translate("Port"))
-e.width = "10%"
-e = t:option(DummyValue, "protocol", translate("Protocol"))
-e.width = "15%"
-e.cfgvalue = function(self, section)
- local str = "未知"
- local protocol = m:get(section, "protocol") or ""
- if protocol ~= "" then str = (protocol:gsub("^%l", string.upper)) end
- return str
-end
-e = t:option(DummyValue, "transport", translate("Transport"))
-e.width = "10%"
-e.cfgvalue = function(self, section)
- local t = "未知"
- local b = ""
- local protocol = m:get(section, "protocol") or ""
- if protocol == "vmess" then
- b = "transport"
- elseif protocol == "shadowsocks" then
- b = "ss_network"
- end
- local a = m:get(section, b) or ""
- if a == "tcp" then
- t = "TCP"
- elseif a == "udp" then
- t = "UDP"
- elseif a == "tcp,udp" then
- t = "TCP,UDP"
- elseif a == "mkcp" then
- t = "mKCP"
- elseif a == "ws" then
- t = "WebSocket"
- elseif a == "h2" then
- t = "HTTP/2"
- elseif a == "quic" then
- t = "QUIC"
- else
- t = "TCP,UDP"
- end
- return t
-end
-e = t:option(DummyValue, "password", translate("Password"))
-e.width = "30%"
-e.cfgvalue = function(self, section)
- local e = ""
- local protocol = m:get(section, "protocol") or ""
- if protocol == "vmess" then
- e = "VMess_id"
- elseif protocol == "shadowsocks" then
- e = "ss_password"
- elseif protocol == "socks" then
- e = "socks_password"
- end
- local e = m:get(section, e) or ""
- local t = ""
- if type(e) == "table" then
- for a = 1, #e do t = t .. e[a] end
- else
- t = e
- end
- return t
-end
-
-m:append(Template("v2ray_server/log"))
-
-m:append(Template("v2ray_server/users_list_status"))
-return m
-
diff --git a/package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/log.htm b/package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/log.htm
deleted file mode 100644
index fbdd2289b2..0000000000
--- a/package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/log.htm
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
- <%:Logs%>
-
-
-
-
\ No newline at end of file
diff --git a/package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/users_list_status.htm b/package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/users_list_status.htm
deleted file mode 100644
index 09508aa72e..0000000000
--- a/package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/users_list_status.htm
+++ /dev/null
@@ -1,23 +0,0 @@
-<%
-local dsp = require "luci.dispatcher"
--%>
-
-
\ No newline at end of file
diff --git a/package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/users_status.htm b/package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/users_status.htm
deleted file mode 100644
index 40c2e3c58c..0000000000
--- a/package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/users_status.htm
+++ /dev/null
@@ -1,3 +0,0 @@
-<%+cbi/valueheader%>
---
-<%+cbi/valuefooter%>
\ No newline at end of file
diff --git a/package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/v2ray.htm b/package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/v2ray.htm
deleted file mode 100644
index 1b4fb455c5..0000000000
--- a/package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/v2ray.htm
+++ /dev/null
@@ -1,182 +0,0 @@
-<%
-local v2ray_version=luci.sys.exec("/usr/bin/v2ray/v2ray -version | awk '{print $2}' | sed -n 1P")
-local dsp = require "luci.dispatcher"
--%>
-
-
-
-
-
V2ray
- <%:Version%>
-
-
-
- 【 <%=v2ray_version%>】
-
-
-
-
-
\ No newline at end of file
diff --git a/package/lienol/luci-app-v2ray-server/po/zh-cn/v2ray_server.po b/package/lienol/luci-app-v2ray-server/po/zh-cn/v2ray_server.po
deleted file mode 100644
index d2737178cd..0000000000
--- a/package/lienol/luci-app-v2ray-server/po/zh-cn/v2ray_server.po
+++ /dev/null
@@ -1,137 +0,0 @@
-msgid "V2ray Server"
-msgstr "V2ray 服务器"
-
-msgid "Global Settings"
-msgstr "全局设置"
-
-msgid "Caddy path"
-msgstr "Caddy 路径"
-
-msgid "if you want to run from memory, change the path, such as /tmp/caddy, Then save the application and update it manually."
-msgstr "如果你希望从内存中运行,请更改路径,例如/tmp/caddy,然后保存应用后,再手动更新。"
-
-msgid "Server Config"
-msgstr "服务器配置"
-
-msgid "Users Manager"
-msgstr "用户管理"
-
-msgid "Remarks"
-msgstr "备注"
-
-msgid "Bind Local"
-msgstr "本机监听"
-
-msgid "When selected, it can only be accessed locally,It is recommended to turn on when using reverse proxies."
-msgstr "当勾选时,只能由本机访问此端口,当开启反向代理时建议勾选此项。"
-
-msgid "Port"
-msgstr "端口"
-
-msgid "Password"
-msgstr "密码"
-
-msgid "Protocol"
-msgstr "协议"
-
-msgid "Null"
-msgstr "无"
-
-msgid "Alter ID"
-msgstr "额外ID(AlterID)"
-
-msgid "User Level"
-msgstr "用户等级(Level)"
-
-msgid "When OTA is enabled, V2Ray will reject connections that are not OTA enabled. This option is invalid when using AEAD encryption."
-msgstr "开启 OTA 后,V2Ray 会拒绝未启用 OTA 的连接。当使用 AEAD 加密时,该选项无效。"
-
-msgid "Transport"
-msgstr "传输方式"
-
-msgid "Camouflage Type"
-msgstr "伪装类型"
-
-msgid "Camouflage Domain,you can not fill in"
-msgstr "伪装域名,也可以不填写"
-
-msgid "Reverse Proxy"
-msgstr "反向代理"
-
-msgid "Reverse Proxy Type"
-msgstr "反向代理类型"
-
-msgid "can not has conflict"
-msgstr "请不要冲突"
-
-msgid "Use HTTPS"
-msgstr "使用HTTPS"
-
-msgid "TLS Settings"
-msgstr "TLS配置"
-
-msgid "Nginx does not support HTTP/2 reverse proxies"
-msgstr "Nginx 不支持HTTP/2反向代理"
-
-msgid "as:"
-msgstr "如:"
-
-msgid "Public key absolute path"
-msgstr "公钥文件绝对路径"
-
-msgid "Private key absolute path"
-msgstr "私钥文件绝对路径"
-
-msgid " none: default, no masquerade, data sent is packets with no characteristics. srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime). utp: packets disguised as uTP will be recognized as bittorrent downloaded data. wechat-video: packets disguised as WeChat video calls. dtls: disguised as DTLS 1.2 packet. wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)"
-msgstr " none:默认值,不进行伪装,发送的数据是没有特征的数据包。 srtp:伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)。 utp:伪装成 uTP 数据包,会被识别为 BT 下载数据。 wechat-video:伪装成微信视频通话的数据包。 dtls:伪装成 DTLS 1.2 数据包。 wireguard:伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)"
-
-msgid "Logs"
-msgstr "日志"
-
-msgid "Clear logs"
-msgstr "清空日志"
-
-msgid "Can't determine ARCH, or ARCH not supported."
-msgstr "无法确认ARCH架构,或是不支持。"
-
-msgid "Get remote version info failed."
-msgstr "获取远程版本信息失败。"
-
-msgid "New version found, but failed to get new version download url."
-msgstr "发现新版本,但未能获得新版本的下载地址。"
-
-msgid "Download url is required."
-msgstr "请指定下载地址。"
-
-msgid "File download failed or timed out: %s"
-msgstr "文件下载失败或超时:%s"
-
-msgid "File path required."
-msgstr "请指定文件路径。"
-
-msgid "Can't find client in file: %s"
-msgstr "无法在文件中找到客户端:%s"
-
-msgid "Client file is required."
-msgstr "请指定客户端文件。"
-
-msgid "The client file is not suitable for current device."
-msgstr "客户端文件不适合当前设备。"
-
-msgid "Can't move new file to path: %s"
-msgstr "无法移动新文件到:%s"
-
-msgid "Enabled"
-msgstr "启用"
-
-msgid "Status"
-msgstr "状态"
-
-msgid "Current Condition"
-msgstr "当前状态"
-
-msgid "NOT RUNNING"
-msgstr "未运行"
-
-msgid "RUNNING"
-msgstr "运行中"
\ No newline at end of file
diff --git a/package/lienol/luci-app-v2ray-server/root/etc/config/v2ray_server b/package/lienol/luci-app-v2ray-server/root/etc/config/v2ray_server
deleted file mode 100644
index bd04ccfcb0..0000000000
--- a/package/lienol/luci-app-v2ray-server/root/etc/config/v2ray_server
+++ /dev/null
@@ -1,45 +0,0 @@
-
-config global
- option enable '0'
-
-config user
- option enable '1'
- option remarks '备注222'
- option bind_local '0'
- option protocol 'vmess'
- list VMess_id 'fd00927a-b0c2-4629-aef7-d9ff15a9d722'
- option VMess_alterId '16'
- option VMess_level '1'
- option transport 'tcp'
- option tcp_guise 'none'
- option port '12366'
-
-config user
- option enable '1'
- option remarks 'WebsocketDemo'
- option bind_local '0'
- option protocol 'vmess'
- option VMess_alterId '16'
- option VMess_level '1'
- list VMess_id 'fd00927a-b0c2-4629-aef7-d9ff15a9d722'
- option transport 'ws'
- option ws_path '/websocket'
- option tls_enable '1'
- option tls_certificateFile '/etc/config/ssl/fullchain.pem'
- option tls_keyFile '/etc/config/ssl/private.key'
- option port '30010'
-
-config user
- option enable '1'
- option remarks 'H2Demo'
- option bind_local '0'
- option protocol 'vmess'
- option VMess_alterId '16'
- option VMess_level '1'
- list VMess_id 'fd00927a-b0c2-4629-aef7-d9ff15a9d722'
- option tls_enable '1'
- option tls_certificateFile '/etc/config/ssl/fullchain.pem'
- option tls_keyFile '/etc/config/ssl/private.key'
- option transport 'h2'
- option h2_path '/h2'
- option port '30011'
diff --git a/package/lienol/luci-app-v2ray-server/root/etc/init.d/v2ray_server b/package/lienol/luci-app-v2ray-server/root/etc/init.d/v2ray_server
deleted file mode 100755
index 895a740198..0000000000
--- a/package/lienol/luci-app-v2ray-server/root/etc/init.d/v2ray_server
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2018-2020 Lienol
-
-START=99
-
-CONFIG=v2ray_server
-CONFIG_PATH=/var/etc/$CONFIG
-LOG_PATH=/var/log/$CONFIG
-LOG_APP_FILE=$LOG_PATH/app.log
-
-echolog() {
- echo -e "$(date "+%Y-%m-%d %H:%M:%S"): $1" >> $LOG_APP_FILE
-}
-
-gen_v2ray_config_file() {
- config_get enable $1 enable
- [ "$enable" = "0" ] && return 0
- config_get remarks $1 remarks
- config_get port $1 port
- config_get transport $1 transport
- lua /usr/lib/lua/luci/model/cbi/v2ray_server/api/genv2rayconfig.lua $1 > $CONFIG_PATH/$1.json
- echolog "$remarks $port 生成并运行 V2ray 配置文件 - $CONFIG_PATH/$1.json"
- /usr/bin/v2ray/v2ray -config $CONFIG_PATH/$1.json >/dev/null 2>&1 &
-}
-
-start_v2ray_server() {
- mkdir -p $CONFIG_PATH $LOG_PATH
- touch $LOG_APP_FILE
- caddy_file=$(uci get $CONFIG.@global[0].caddy_file)
- config_foreach gen_v2ray_config_file "user"
- fw3 reload >/dev/null 2>&1 &
-}
-
-stop_v2ray_server() {
- fw3 reload >/dev/null 2>&1 &
- ps -w | grep "$CONFIG_PATH/" | grep -v "grep" | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 &
- rm -rf $CONFIG_PATH
- rm -rf $LOG_PATH
-}
-
-start() {
- config_load $CONFIG
- enable=$(uci get $CONFIG.@global[0].enable)
- if [ "$enable" = "0" ];then
- stop_v2ray_server
- else
- start_v2ray_server
- fi
-}
-
-stop() {
- stop_v2ray_server
-}
-
-restart() {
- stop
- sleep 1
- start
-}
\ No newline at end of file
diff --git a/package/lienol/luci-app-v2ray-server/root/etc/uci-defaults/luci-app-v2ray-server b/package/lienol/luci-app-v2ray-server/root/etc/uci-defaults/luci-app-v2ray-server
deleted file mode 100755
index 364f7db225..0000000000
--- a/package/lienol/luci-app-v2ray-server/root/etc/uci-defaults/luci-app-v2ray-server
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/sh
-
-uci -q batch <<-EOF >/dev/null
- delete firewall.v2ray_server
- set firewall.v2ray_server=include
- set firewall.v2ray_server.type=script
- set firewall.v2ray_server.path=/usr/share/v2ray_server/firewall.include
- set firewall.v2ray_server.reload=1
-EOF
-
-uci -q batch <<-EOF >/dev/null
- delete ucitrack.@v2ray_server[-1]
- add ucitrack v2ray_server
- set ucitrack.@v2ray_server[-1].init=v2ray_server
- commit ucitrack
-EOF
-
-chmod a+x /usr/share/v2ray_server/* >/dev/null 2>&1
-
-rm -f /tmp/luci-indexcache
-exit 0
diff --git a/package/lienol/luci-app-v2ray-server/root/usr/share/v2ray_server/firewall.include b/package/lienol/luci-app-v2ray-server/root/usr/share/v2ray_server/firewall.include
deleted file mode 100755
index 694442a525..0000000000
--- a/package/lienol/luci-app-v2ray-server/root/usr/share/v2ray_server/firewall.include
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/sh
-
-. $IPKG_INSTROOT/lib/functions.sh
-. $IPKG_INSTROOT/lib/functions/service.sh
-
-gen_user_iptables() {
- config_get enable $1 enable
- [ "$enable" = "0" ] && return 0
- config_get remarks $1 remarks
- config_get bind_local $1 bind_local
- config_get port $1 port
- dport=$port
- [ "$bind_local" != "1" ] && {
- iptables -A V2RAY-SERVER -p tcp --dport $dport -m comment --comment "$remarks" -j ACCEPT
- iptables -A V2RAY-SERVER -p udp --dport $dport -m comment --comment "$remarks" -j ACCEPT
- }
-}
-
-iptables -F V2RAY-SERVER 2>/dev/null
-iptables -D INPUT -j V2RAY-SERVER 2>/dev/null
-iptables -X V2RAY-SERVER 2>/dev/null
-
-enable=$(uci get v2ray_server.@global[0].enable)
-if [ $enable -eq 1 ]; then
- iptables -N V2RAY-SERVER
- iptables -I INPUT -j V2RAY-SERVER
- config_load v2ray_server
- config_foreach gen_user_iptables "user"
-fi
\ No newline at end of file