From 4f92143f08705c7e03b648a075d9b657933b3eb9 Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Sun, 6 Dec 2020 12:51:28 +0800 Subject: [PATCH 1/4] lienol/luci-app-v2ray-server: drop dupicate package --- package/lienol/luci-app-v2ray-server/Makefile | 19 - .../luasrc/controller/v2ray_server.lua | 66 ---- .../cbi/v2ray_server/api/genv2rayconfig.lua | 91 ----- .../model/cbi/v2ray_server/api/v2ray.lua | 328 ------------------ .../luasrc/model/cbi/v2ray_server/config.lua | 220 ------------ .../luasrc/model/cbi/v2ray_server/index.lua | 105 ------ .../luasrc/view/v2ray_server/log.htm | 31 -- .../view/v2ray_server/users_list_status.htm | 23 -- .../luasrc/view/v2ray_server/users_status.htm | 3 - .../luasrc/view/v2ray_server/v2ray.htm | 182 ---------- .../po/zh-cn/v2ray_server.po | 137 -------- .../root/etc/config/v2ray_server | 45 --- .../root/etc/init.d/v2ray_server | 59 ---- .../etc/uci-defaults/luci-app-v2ray-server | 21 -- .../usr/share/v2ray_server/firewall.include | 29 -- 15 files changed, 1359 deletions(-) delete mode 100755 package/lienol/luci-app-v2ray-server/Makefile delete mode 100644 package/lienol/luci-app-v2ray-server/luasrc/controller/v2ray_server.lua delete mode 100644 package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/api/genv2rayconfig.lua delete mode 100644 package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/api/v2ray.lua delete mode 100644 package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/config.lua delete mode 100644 package/lienol/luci-app-v2ray-server/luasrc/model/cbi/v2ray_server/index.lua delete mode 100644 package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/log.htm delete mode 100644 package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/users_list_status.htm delete mode 100644 package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/users_status.htm delete mode 100644 package/lienol/luci-app-v2ray-server/luasrc/view/v2ray_server/v2ray.htm delete mode 100644 package/lienol/luci-app-v2ray-server/po/zh-cn/v2ray_server.po delete mode 100644 package/lienol/luci-app-v2ray-server/root/etc/config/v2ray_server delete mode 100755 package/lienol/luci-app-v2ray-server/root/etc/init.d/v2ray_server delete mode 100755 package/lienol/luci-app-v2ray-server/root/etc/uci-defaults/luci-app-v2ray-server delete mode 100755 package/lienol/luci-app-v2ray-server/root/usr/share/v2ray_server/firewall.include 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%>】 - - -
-
-
\ 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 From 3255a69719ee6fa9786d8c0b518cf431f942ee73 Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Sun, 6 Dec 2020 12:53:51 +0800 Subject: [PATCH 2/4] luci-app-v2ray-server: use xray by default --- package/lean/luci-app-v2ray-server/Makefile | 4 +--- .../luci-app-v2ray-server/luasrc/view/v2ray_server/v2ray.htm | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) 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 + From 67180dfb9228506fe77b69f5c988848d6f85c116 Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Sun, 6 Dec 2020 13:08:09 +0800 Subject: [PATCH 3/4] luci-app-vssr: bump to v1.19 --- package/ctcgfw/luci-app-vssr/Makefile | 6 +- .../luci-app-vssr/luasrc/controller/vssr.lua | 8 +- .../luasrc/model/cbi/vssr/client.lua | 102 +++++------------ .../luasrc/model/cbi/vssr/servers.lua | 8 +- .../luasrc/view/vssr/tblsection.htm | 47 +++----- .../ctcgfw/luci-app-vssr/root/etc/init.d/vssr | 7 +- .../luci-app-vssr/root/etc/vssr/gfw_list.conf | 106 ++++++++++++++---- .../root/usr/share/lua/vssrutil.lua | 3 +- .../root/usr/share/vssr/update.lua | 2 +- .../root/www/luci-static/vssr/css/vssr.css | 2 + 10 files changed, 153 insertions(+), 138 deletions(-) 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 From 5ebb9ef15b4066de5e30926dfbfa4f60dce5b00a Mon Sep 17 00:00:00 2001 From: CN_SZTL Date: Sun, 6 Dec 2020 13:10:11 +0800 Subject: [PATCH 4/4] luci-theme-edge: bump to 2.4 --- package/ctcgfw/luci-theme-edge/Makefile | 4 +- .../htdocs/luci-static/edge/background/1.jpg | Bin 0 -> 27946 bytes .../htdocs/luci-static/edge/background/2.jpg | Bin 0 -> 21993 bytes .../htdocs/luci-static/edge/background/3.jpg | Bin 0 -> 37438 bytes .../htdocs/luci-static/edge/cascade.css | 252 ++-- .../htdocs/luci-static/edge/js/script.js | 36 +- .../htdocs/luci-static/edge/landscape.css | 1097 +---------------- .../luasrc/view/themes/edge/sysauth.htm | 50 +- 8 files changed, 179 insertions(+), 1260 deletions(-) create mode 100644 package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/background/1.jpg create mode 100644 package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/background/2.jpg create mode 100644 package/ctcgfw/luci-theme-edge/htdocs/luci-static/edge/background/3.jpg 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 0000000000000000000000000000000000000000..5f7ce31545229234dc76adf749653c398be68ca8 GIT binary patch literal 27946 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 Zxb@pP$QWBphnG9 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�+b{VNAr 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 literal 0 HcmV?d00001 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/DYABMDIMEEO2QjIwMioMOnxnEOOQ/FFMSmrjMIGzYnz9/3hPQ/Dc5ORmv4USYgeqQz58/H/758+dvEIb5gIWFRQCHHmYQcfny5Z9z586FC5JoBgZgARG8vLw2JATzHxChq6vLCLKMkZERmPH+M5JoBlVyDSNK5FMp+5OdfYEhsXCwlCP5A+2Q/9Ao+QANGeo5BGjYH1lZWQYQJi5WGO8hOYiRDDOw5xqgYazolklKSv54/vw5O9Yg+f9fGZpj4ImVVDOwOgQbABrAgRwV2EKGUI4hwgyS0ggjepYlM8vjNYNxsDQDAAKIcbQ9QqZDqBFs/ylxCDsVHEGUGSxk+uA/tgqQkpAEhwisHbFnz547RDoC7ICHDx/C1ZFoBtYQ+c/ODin8Xr9+rUxkGe/w9u3b3/Ly8rDSlGQzSIka3EHy//9+aKj8H7HZd3A6BNoGoW6RDCriZWRk/oOwsLAwqCEMEsMGGJDkwHRwcDBcnEQzMDC+uuY/nkYzueUIIzlRg6/qBrXSllG1CYEvuGDYxMTkHzHqKDFj0DQDAAJo0DhktDwb5gHSDhuKoca40kC6g4UCy/9TqI+RSoHwf6BSSMp/SIHzn4EOLXo6ugNrgPzHhpcvX45s4WwyhkHEYWb9+vXrP54KnIHG7hg0hepLIOYBMdjY2BiOHj2KESinTp0aVNUcPWqZrzCGtbU1qCmFMhBrZmY24qtdz5HeDoFPGKSlpYGoGiCGzxFMmjRpxAVIEogICAhgmDVrFiO0hngPk8zPz787qEKE2M4IELj+JwKkp6fj609WoHQ6wdaT1imikjtwYiYSAm43UreRceFCsqZoOkBEdXU1qHBVhE0ikBiB1HAH5SmEQKzVUxozg8Ud4N4uLRs6xEYK0tgT1c0d7f5TAAACaDRARsdDRgNkNEAGS4CIMEDWBrSQVIhRv4Yjyx3UGDHDNdjzZCBrcErdQVEK+ffv3y9SR62am5t1qR0K5LiD2i3Vclx9CKCRGXj0YcydUdhaJtcdODELhcmSXH3/GSgfZP4/0IUqpYO6KAFw8+ZNSgKWZq1JWIBw//nz5zdsgQXaok+Gly9frqQkJs3NzR+jB4q6ujqohkFPobR0B9EBAlqZ9oUFCNjZ2VEw0ME7qJGsT548KQMTOAsEMHZXV9dvJLW0dAfxAfLmzZu3tDK8t7f3BnrgGBsbm8AESktL4ZK0dAdJAQKssmiWH4uLizXRGmHiWJRlQ6vOQdHLpHnTHVh4NiNxX4BbTECAJDZlRPVlgIVnHYydm5sLpmVkZMpGO3dAoKWlBa8wRgMECPbs2QNrahuN2AD5+vXrVRh77dq1sKZ6x4gNEG5ubi0kLnjjDTMQIIfZoAqQv3//0rK6+4+cOrDsnQABDRBBY3cQHyCSkpK8tDL84MGDcHZISAhGIMnJycHHLWjpDnIGiBiBjvuPZQSeE9qgIitr2dvbMx45cuS/ra0tA7ZZusePH2N0AGnhDpqMh/T19REzpUrseMh/AwOD/+SMh1DJHbhn/8jQRJZDHj58+A1N3XsKB4hoEiBk7YwEglRSNQGzAteFCxdgBoAsF6QwcZPlDppUu0DPzAE5SE1N7S8p+oDZhBG2x5VK2Z0sd9CsHXLr1i1Qocy4fv16UjxB9YKRHHdQXKgSm69Jzbs0cAMDxYPMVJwsAhmkSa551HYHWRpHZ/8HsLc7FABAAPauJrSJIArvtptKck5IPGxpIQiNOUTaYCGxQsGLGDFgdWmwkIsI6kHw5r1H6cWTUOJ/LhVKQE8GiRFTc9BLekkPTQMSIaGFQC1paHyz7sbpupu2mN2dzc7AstnJ7Px8882beTNvZilDqKMthjpKEOpsSpCrqVTqm+79rMlGuqThQTRB9vf3vzJ/zR1WC4UCUo/v2LUFm40HCQSZxQDoOByOsM2lOlF4mEKQdrv9EQPhg87JielAq+NJZYTBeBBJkPN4q+A47qIBaR6yygN1fqter5Oi05uBB1kEgQrJYCAUSCis2+1mJGliuLUSiXgYTpDd3d1VTKRfMbIg+Xz+rVI5yWQyQY3Kugt9+57eeTITDz0I8oDROKSC0Ti4Agr9Do+s2WzuGZz/YTk/0Wg0LlVEQv4zFoshmyVWQzs4BWF75deKeOhDkEqlgpaeH1tJC0qn07cYyS5LIR1ehsPhYx2bBmERSdJKfyvioStBnE6n32oZFwThBar4g4ODf/4rFouMz+frKMT9ZbV4ksnkTaWfFfEY5HmQ/yvA0JCqdKjVamiGdIuVpkldLtd7tXDLy8votkWpMNgiUXW3IIxLeNyIsVqtPtd4n6dUGGyCqBqVzc3NISnysMsCnn9Fq9zmgyrcbW+Lh1/hW09ctMrtSRDV4wKXlpbQbUV+rtfr92mV25Mga0qPVqvF7OzsIFW2SxC32z2rDNdoNCgLBpwgqusr0scYbmOEeaMWLhQKodsTSoUeBMlms6+tlnHoLta0yCFptisgPZ5KXtMjIyOCMlypVGKkDeX3cH8r4qErQQRBQC2N3dzcPPaLTqfT1IxDd4FWRNlcLtf1K5fLMjmuATnkDY6X4PqiFkcwKC7VjCr9rYiHIfMHY2NjLNYKeeboQ2x+4Q8bGxvPvF7vDSMLMDMzI3/CDam6Q/i+rHa7/YPjuNM9pMx1CF/VMjm0Ih66EuRQxw7AnTSySCSCFqvkCvtULBajU1NTxgxEOh18n3wErjyQQ61rYjweD/p5Dt75foL4LYUH8YNUAPQCgMH+wYb1xeNxI8v1GTvjqevGx8dFciApcxJyDAAe/ZcgfQbnJ4OtqAJAJRgvBPx+/dbEJicnxfTW19c7aJ90IiFaATyCvCyarnaZgIel1FwA6CyAIbemMwsLC7J/39MKBALs/Pw8K0mNRRJbqZF4EClBjgCnjPXT4gpsrVbjYXBnS7WSNDw4AgEaxUTv9MTEBFJRh+06D2E2HnTzNnXkjUGoowShbkDcbwHYu76QyKowfse7YzQ2mzaDmTUKhmxCFu0IkzsIWlIESvQ0EAVuT2Ia0hJELxUGvQSxKIwY5EPsgz2FOS6LD7VS40r4kD64Ni3iw66kI665Ss7fvjN/5O7suXf+3nPOvX4/uBzm3HPO3Pu7v3O+79xzzzloYhDYgiBQIAgUCAIFgkCBIFAgCBQIG8RisbDFYvHgY+LHh6gCuSqlF1ZxSCqfC1YSBljEjikfSog2WPcmHLk7s1nOcKPBnQ9RBPIEHP+ecTEIyQd3EwN29TcIDlEcYvLBUyBfZOyqV88/2d/fN8qkKCZ8GEEgXVJ6+sDnDP7rp7q6uqHZ2VmRRyRZ8lE8dNitRfWA5vNBskikL7Gk//tZWc7o6GiM8a41ovFR0sFkuD8ej9+QZfmNUrugJWxSReajvJUb6XQ6l8Lh8CWV/2BWKTnwUforAJ2J+SjThy/rHUWRhJC5AyGN8mqhvANOAuHBh5A+yMWMXb0qscffPp/ve7WT4I/c53BNPPkQyweJRCI7yQqiVJs7NTX1j0aZ91j5IKLwIYoPUvF2upAm9fj4+JbNZnuVYuuTD29tnQZZAbGhocHCwMRw4UNPH2QEyP4K+uI2LcKsVivZU5zsBrzKmxA49yukyS6Gbyn0IVVVVcUSiYQ1j0AMx4eeJqYSTV3FodWkwgO+qUw7Pz//SNpgMBiilbu4uJhUVpBy70UEPnQzMWQYOTNSWK6SmdUYiPsdzj3SZa2vrz/c2dk5X8h1Qf67UM5zuS2IEfnQtRdTLBkiAJr+S7R4EIcdSHQq49bX17eorzC7up6lxRuRDzO9aq8IampqVGtRR0fHrvJ3W1tbKy3dxMQEqZFdKIP8TmrRTaEITerKysoLbrd7PTc+Go1K1dXVnZDvVgFmhoipPscJNSQfKBC6qUlAF9dCyUecudMWMhQKrbS2tl6klU/pzaFAjG5isgBxUM3HwMDAQySCOD6mpfN6vRLCxAIB3KFFDg8Pk9r2oSLqJi1db28vCd5BKZhXINLu7u6D3DjwTUjwWb68mVUH30UpmFggR0dH8yqnGvPlbW5uJsHLKAUTC8Tlct0oNa/dbieBE6VgYoHIshwpp1cAqEYpmFggsVis5C3FyLYhCJML5ODg4O1S85Khf0llSzOESQTicDg8FNEUlHdjY4ME91EKJhYIDdeupfYvVO6+QN31YWFhgQR/oRTMK5DvaJFjY2Mk+EERdZmW7vr11Ha6P6IUVJx4o4/FSNq7Tj0DeVNORjQa/c9qtT6mku48pDss5z5wLEZAwEO/TYv3+/3pp5MRBwFNHPH4qW96iG2F+QTyPjz0C7QTQ0NDKZ0ooj7QMEMJlIFW+1zit5MS/28wqRgfH6flUS1bysyJLfc+JJN+k5pqQaanpz8xmrCdTmcbLX5kJLV38oQi6hW1ipEJv8w9Z0Q+9G5ByE6P94xWY9xu95PKtLIsF9x69PT0kLQJta/ajciH7hOnwEO+Yrfbv6mtrZXyzAORNjc3hfDaPR6PY3l5OUw+/AkGgyTqHKTPep9fw/GpRi/nNUj7i9q8GCPyoVc3N/ciyBBnbZ4btELeTWXE0tJSorOz08KaEEjzEgR/wuGFtMFMNBmAO6Gl7+vrkwKBwGm5+WbWGY0P3QVSDhwOx9He3p5NAEKSWmUSnUC5gUIEYhI+xOjmAhk1cBNP9ff3c3Wt1E7YbLaszxFgcSGC8FG+k6rHAXjP7/ezdsouqJU1OTmZ7do+zmOFIU58lHfNjIj5Y3V1lRkhLS0tvbnlnJycZMUxyXsJKtZ8CC+Q7OFyuaKsCOnu7n6R8lIsItIaZSz5MIRAMg/D5fP5mBACXWC3QhxJ0RaxY82HIQSiIObKzMyM7oQAXs9XBk+BsOZDyFUO83Tb7mxtbbU0NTVx69axXuVQdD6EGs2Fm30eyLC0t7fjqKqAfAgz3L+2tiaTN6KDg4OoEpH44G17Vezxt3Nzc8xsrqg88OJDKB9EC42NjeHt7W3HWfJBROBDiXM54xOigUyJfJrHtYnMB1MecGt2hCGcVAQKBIECQaBAEGcK/wvQ3vnARJXccXx2AaFLhK3iqlj1WsX2xKL88Y76hxSFnrkCdyW0QpNLvYp/oLV6hiqp1ZiQeHDxz/knR8OaHLm2QSSWi2gPqWJRosu/CFRpCOa0p5ziYYHlivy73f5m2d1udXeZxwmy730/yeQ9wrx5781833dmZ96bQSMVAIAaBgAAAwEAwEAAADAQAACAgQAAYCCTDx2Fl5ENQKn6gIFIJ8o6ZwQf/+7YunXrLZVK1UjhVU++Kf7y7SR9ARf6gIF4PFuGhoYeW0VRR2J43fHZYyMrVYUjm6APpekDBuKcJRT+YhWEZa4ZHx+facgWAH3AQFzx1uDg4OdWQfyDYQVdAH3AQNzA13EvdqhFPpoyZcpsSAJAHzAQV6ynWuSuVRB8bbqfyeCezvL7qa+vHyaBR0LS0AcM5PnB11gudKhFTtFDNl8m91ZmvSfLtN5RUVFeJP7648ePm1QYToE+YCBj5k16kP5pFcRnFH4hs/uzGUeCs39u27aNf2FtiomJ6YK8FakPGIhE+CRdHzjUIqVUi3xPZuU0h0KtO+N4mitXrmjLysrM1BhJV7jGlaAPGIhEEqgWabQKgi+WnCHzcmpPTU39sLu7W9JBfNGi/v5+vU6n61aYrpWmDxjIKHyTwmGHWqSMapGlSiqoU6dO5Wu1WtXevXv/LuU4X19f9ujRo8C4uDjeGgmSafYoXh8wkGeJHhoaqrEK4t8U3kFxMZaTkxNLG1VjY+NXUo67ePEi27hx4xdkIm/JJCugj0mAt2A8kVWERfChYKTweLSIDx48+O3s2bNfUZCRV7CRpbDYpk2b/qXX619yd8CyZcu8i4qKitPS0oSHGk+ePMmoZv6ITORls9n8u+d4/dCHUnGxJsgbAwMD983jQGlpKRfZfQph7tYkefjwYbHZA9iyZYut2bx1DGuveJlMpipn6XZ0dJhnzpx5drQ0qGURL/Wak5OT+fXmPr0+jhs9QB8vRh+TPjz9E2ad9WY/pppqzngY1pMnT/iGp31Uwb7tQ5lfTdthag3EOIug0+n4Q5K4efNm3nehdZXQ2rVr/0ab70g5+ZkzZ1hoaOjuMYzQQB/AeR9IV1fXr2nzyQSee0CJGd7X18d/qgzSw7tSJH5BQQErKSnpovgfuIl2h0KolOs4f/48U6vVekpX6DjoA7g1kOHh4Rxkx/ij0Wh+lJGRUSjlmJSUFFZZWZlBD3ubm2gtxC9F05w/fz7Ly8vju7WU7qid6dAHcGsg1KT2QXZMDPn5+W/TRmUwGAZFj4mNjWVFRUUL6WG/7yrO4sWLP2xubhZuJWRlZbGQkBAN7f5RoK8M+gCuDQRMPNHR0b4X+fiqIKmpqWzHjh1zyETqXcUJCwv7SU9Pj7Ax7dq1i29+zka+PgUABuJJxMXFxdfV1Z0VjX/o0CE2b968SDKRd118NDfQ2dn5nmh669evZ9OnT+e7R1AaAAbigSxfvvyN27dvfyZUYGo127dvH9/dzUa+Jn2GBQsWvN/f3z8skt7UqVPZunV8cIW9RmE6SgPAQDyQhQsXJorGTUtL48O8vPWR7yLK446ODoNoevHx8XzDXyr8FUoCwEA8k+a7d+/eEImo0Wgsnaq81UC/YnQu4vxV9MQhIfbujx+jGAAMxEPx8/MT7gsJDbW8vuFFIdbZ/2fMmHFLNC3+0pqVeSgFAAPxUGbNmnV7DA99tIsoX4qm5e1t/yTKH6UAYCCeyxTRiNZXvjmuJvr1gR4ADERBdHd3/1A0blub/aXUXleNFNG0jEYjMh/AQDy99UEIj8Q0NDTYdp12vPb09MSIpnXnzh17wwbFAGAgnsk7Go1GKxLRYDCwmpoau5c4i2M2m9eKnri2tta2+zmKAcBAPI8wCrmikY8csb80eouMosZJlHitVvtt0fQqKipsu1dRFAAG4lnoTCZTg5SH/fTp07Y/nX4hazQa94mmV11dzerr7Z/WFKI4AAzEc+AT/3ao1WqhqSX7+vosn/bbWgvU+ih2Ei05ICBglegFnDhxwrbbRKEeRQLGZCAkYqxmNrEcotAo5YCIiAjW22sZdOGT7Th7a9R/eHj4T6LpXb9+nRUX2z3oXbdCgT6AOwNpb2//AtkxIaSykWkBd0o5aNGiRay1tdXecqHWR6+TFsp1b2/vb4immZGR4dj6KHYXF/oAbg1Er9dHdnZ2foUsGV927txZe/XqVZNo/K6uLubv7+/43sciMo/Wp+NRy6NCo9F8XzTdPXv2sKamJtufoy7vCH0AtwZCv4UfBwUFeR88eLAJ2TJ+HD58+NPVq1d7zZ0791tVVVVu4xYWFrJp06ZZ+j7YyAtj/mQebU7Mo4paHvGi11BWVsYOHDhg9xJKc9Qyhz6AM57pvMvKylrGtwEBAU0bNmwIS0hIYEuXLmWBgYHMZDKN6SS2ZQP8/PzY0NAQcp24d+9eO21UsbGx2pycnK5Vq/7X78n7OfjHchTH7iWUh287S2dwcPC+lBnSm5ubWVJSku3PTyjdA1KuG/oAbg3EhtFotCwNqFKp+AdWfPKan7KRrzWnPIfz8q9I3X7sRTVqoBIK4PLly3zdWlVERMSM3NzcRyUlJZYFoKz8hwJfBOqek0MjKDSQeQifq6WlxfKwW2mldF8f63VDH8Du/pM1cFGmp6eb2tvb7Qv1UC0n64WDiO+ykeHUdDfxiqRe57Vr12zXyUObk/NOej1AH5N/YanJZm4ler1eHRwczKf/fC8yMtJ07tw5uRs6bxlEUTjp5N8pVjGmSkkzPz+frVixwvZnHaUdIpO8Upw+Jm0nqgeIZXdDQ4NXYmIiF8srFB5s376ddXZ2KqGcoqzGUSL1QD7faWZmpt1LKB9luZ6swvUBA5EoFl6LBh89elQVFBTEBfOH6Ohoc3l5uVzLqX7JkiWvOnyBOyp82JdPwHzhwgW7l1CeZSrkZ7nS9AED+ZqCyTAYDGqqbblYVlPozM7OltU8Fzdv3qylJrqKHoTQGzfcT52anJxsefHM2k/wKS9n2r+g4H4+2esDBvL8xFJNgY9oqAICArhg/hwTE2OurKyUxf3Rg9ASHh6uWrlyZXhj4/+/CU81Lh8VYaWlpXYvobxYYHbsJVU4ctfHi8hQxQQi3tfXt3v//v3mgYEBWfSyZ2Zmxubl5TmOsPDw/hjyRnF6UII+xj3PFCwWXwofr1mzxlxVVeXxAiH4C17HvsbxijcQOetDkcO449zy4lXMm5cuXVJRE5Y3ZRMDAwO/pKYt88QWP11zI4XfoE0NfaAP5MUI5lxPT8/U7OxslVqt5j+OK/gQKJ8+EADoAwYiRSy9FF4rLy/nox689knR6XRPjh07hswB0IcD3pCDkGDO0IYHPsoRRJuzSUlJPygoKGDBwcHIIOhDufpw1pEGJPF7NrIcQp7c9OCqoxWMTR9y7ERVQRgAAPSBAABgIAAAGAgAAAYCAAAwEADAOPBfkpX+vjRnFw0AAAAASUVORK5CYII=); 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%> -

-
>
+
imgimgimg
+
+ + + <% + 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