🍕 Sync 2026-09-14 23:30:37
No files matched your search
@@ -10,12 +10,12 @@ AGENTFLOW_ARCH_x86_64:=amd64
|
||||
AGENTFLOW_ARCH_aarch64:=arm64
|
||||
AGENTFLOW_ARCH:=$(AGENTFLOW_ARCH_$(ARCH))
|
||||
|
||||
AGENTFLOW_HASH_x86_64:=454857022d555b23979bd7b9116ef926ce7117e9e6034116f3223bb72cae07db
|
||||
AGENTFLOW_HASH_aarch64:=34dfe07fd2a1bcb7de8eadb41dd0a67b46d5db78f4ca14d1835fe94608c0579a
|
||||
AGENTFLOW_HASH_x86_64:=ccf06c24eee59f9638bc0ba42d2ea420723317dccef980a42a51499844fbde2c
|
||||
AGENTFLOW_HASH_aarch64:=369017b7e7ea359018875cde2ee9260f0eb92d6fda329e82a219b98516bb6350
|
||||
|
||||
PKG_NAME:=agentflow
|
||||
PKG_VERSION:=0.3.1
|
||||
PKG_RELEASE:=9
|
||||
PKG_RELEASE:=10
|
||||
|
||||
AGENTFLOW_URL_FILE:=agentflow-linux-$(AGENTFLOW_ARCH)
|
||||
AGENTFLOW_DOWNLOAD:=$(AGENTFLOW_URL_FILE)-$(AGENTFLOW_HASH_$(ARCH))
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=brook
|
||||
PKG_VERSION:=20260101.0
|
||||
PKG_RELEASE:=4
|
||||
PKG_VERSION:=20270101
|
||||
PKG_RELEASE:=5
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://codeload.github.com/txthinking/brook/tar.gz/v$(PKG_VERSION)?
|
||||
|
||||
@@ -6,11 +6,11 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=cloudreve
|
||||
PKG_VERSION:=4.18.0
|
||||
PKG_RELEASE:=16
|
||||
PKG_RELEASE:=17
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://github.com/cloudreve/Cloudreve.git
|
||||
PKG_SOURCE_VERSION:=1c3fe4da3c4073e73a11ed93518b545bb8b8d5ce
|
||||
PKG_SOURCE_VERSION:=ade1866be54a3614bc643ab5f513e93a1e0dc82f
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
PKG_LICENSE:=GPL-3.0-only
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=dae
|
||||
PKG_VERSION:=2026.09.06
|
||||
PKG_RELEASE:=43
|
||||
PKG_VERSION:=2026.09.12
|
||||
PKG_RELEASE:=44
|
||||
|
||||
PKG_SOURCE:=dae-src-2026.09.06-80525dabf966.tar.gz
|
||||
PKG_SOURCE:=dae-src-2026.09.12-187058462a1f.tar.gz
|
||||
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/dae-src
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_HASH:=skip
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=daed
|
||||
PKG_VERSION:=2026.09.06
|
||||
PKG_RELEASE:=54
|
||||
PKG_VERSION:=2026.09.12
|
||||
PKG_RELEASE:=55
|
||||
|
||||
PKG_SOURCE:=daed-src-2026.09.06-62f2e24ac52a.tar.gz
|
||||
PKG_SOURCE:=daed-src-2026.09.12-a0181f729855.tar.gz
|
||||
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/daed-src
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_HASH:=skip
|
||||
|
||||
@@ -1,8 +1,65 @@
|
||||
#!/bin/sh
|
||||
# daed-cleanup.sh — reaper for stale daed kernel state.
|
||||
#
|
||||
# Removes:
|
||||
# 1. Processes inside the `daens` netns (SIGTERM, then SIGKILL after 1s)
|
||||
# 2. The `daens` network namespace itself (ip netns del, with
|
||||
# umount+rm as fallback for zombie nsfs mounts)
|
||||
# 3. The `dae0` veth pair in the host netns
|
||||
#
|
||||
# daed itself owns TC clsact detach. This opkg-side helper only
|
||||
# reaps stale daens/dae0 state and never removes /sys/fs/bpf/daed.
|
||||
# The pin directory is created during normal startup, so it is not
|
||||
# a reliable leak indicator and must not block service lifecycle.
|
||||
#
|
||||
# The function stays sourceable by both init.d/daed and daed-guard.
|
||||
|
||||
daed_process_probe() {
|
||||
if command -v pgrep >/dev/null 2>&1; then
|
||||
pgrep -f '^/usr/bin/daed([[:space:]]|$)' >/dev/null 2>&1
|
||||
case "$?" in
|
||||
0) return 0 ;;
|
||||
1) return 1 ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
if command -v pidof >/dev/null 2>&1; then
|
||||
pidof daed >/dev/null 2>&1
|
||||
case "$?" in
|
||||
0) return 0 ;;
|
||||
1) return 1 ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
return 2
|
||||
}
|
||||
|
||||
daed_cleanup_runtime() {
|
||||
local pid
|
||||
local pid rc=0 probe_rc
|
||||
|
||||
# If daed userspace is currently running, do not touch the
|
||||
# netns, the veth, or the eBPF dataplane. They are in active
|
||||
# use; removing them would make every connection through dae
|
||||
# hang.
|
||||
daed_process_probe
|
||||
probe_rc=$?
|
||||
case "$probe_rc" in
|
||||
0)
|
||||
if [ "${DAED_GUARD_CLEANUP:-start}" = "start" ]; then
|
||||
logger -t daed-init "cleanup: pre-start skipped because /usr/bin/daed is still running; refusing a second instance"
|
||||
return 1
|
||||
fi
|
||||
logger -t daed-init "cleanup: post-exit skipped because another /usr/bin/daed instance is still running"
|
||||
return 0
|
||||
;;
|
||||
1) ;;
|
||||
*)
|
||||
logger -t daed-init "cleanup: cannot determine whether daed is running; refusing to remove netns/veth"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# 1. Kill processes inside daens.
|
||||
for pid in $(ip netns pids daens 2>/dev/null); do
|
||||
kill "$pid" 2>/dev/null
|
||||
done
|
||||
@@ -14,14 +71,36 @@ daed_cleanup_runtime() {
|
||||
done
|
||||
fi
|
||||
|
||||
# 2. Remove the daens netns. ip netns del can fail if a
|
||||
# process still references it via /proc/<pid>/ns/net or
|
||||
# because the umount has already happened. Try the
|
||||
# umount/rm fallback.
|
||||
if ! ip netns del daens 2>/dev/null; then
|
||||
umount -l /run/netns/daens 2>/dev/null
|
||||
rm -f /run/netns/daens
|
||||
if [ -e /run/netns/daens ] && ! rm -f /run/netns/daens 2>/dev/null; then
|
||||
logger -t daed-init "cleanup: failed to remove /run/netns/daens (resource busy); a reboot may be required"
|
||||
rc=1
|
||||
fi
|
||||
fi
|
||||
|
||||
ip link del dae0 2>/dev/null || true
|
||||
# 3. Remove the dae0 veth pair.
|
||||
if ip link show dae0 >/dev/null 2>&1; then
|
||||
if ! ip link del dae0 2>/dev/null; then
|
||||
logger -t daed-init "cleanup: failed to remove dae0 veth pair"
|
||||
rc=1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 4. The pin root is normal persistent state. Never remove it or
|
||||
# make its existence change the cleanup result.
|
||||
if [ -e /sys/fs/bpf/daed ]; then
|
||||
logger -t daed-init "cleanup: /sys/fs/bpf/daed exists; leaving normal pin root unchanged"
|
||||
fi
|
||||
|
||||
# Final verification covers only netns and veth state.
|
||||
[ ! -e /run/netns/daens ] || return 1
|
||||
! ip netns list 2>/dev/null | awk '$1 == "daens" { found=1 } END { exit !found }' || return 1
|
||||
! ip netns list 2>/dev/null | grep -Eq '^daens([[:space:]]|$)' || return 1
|
||||
! ip link show dae0 >/dev/null 2>&1 || return 1
|
||||
|
||||
return $rc
|
||||
}
|
||||
@@ -1,29 +1,131 @@
|
||||
#!/bin/sh
|
||||
# Keep daed as a child so signals can be forwarded and stale netns/veth
|
||||
# state can be cleaned before start and after exit. daed owns TC detach;
|
||||
# /sys/fs/bpf/daed is normal persistent state and is never removed here.
|
||||
|
||||
. /usr/share/daed/cleanup.sh
|
||||
|
||||
# Pre-start cleanup refuses to remove runtime state while another
|
||||
# daed instance is active, and fails closed if that probe is broken.
|
||||
DAED_GUARD_CLEANUP=start
|
||||
if ! daed_cleanup_runtime; then
|
||||
echo "daed: stale network state could not be removed" >&2
|
||||
echo "daed: stale /usr/bin/daed or netns state could not be verified or removed; refusing to start. Check process and netns state." >&2
|
||||
logger -t daed-init "pre-start cleanup failed: refusing to start daed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Keep daed as a child so a panic or unexpected exit is followed by an
|
||||
# immediate teardown of all kernel/runtime state before procd can respawn us.
|
||||
# Keep daed as a child so post-exit cleanup runs before procd can
|
||||
# respawn it.
|
||||
child_pid=
|
||||
cleanup_child() {
|
||||
[ -n "$child_pid" ] && kill "$child_pid" 2>/dev/null
|
||||
pending_signal=
|
||||
shutdown_signal=
|
||||
shutdown_elapsed=0
|
||||
forced_kill=0
|
||||
child_term_timeout=20
|
||||
|
||||
forward_signal() {
|
||||
local sig="$1"
|
||||
if [ -z "$child_pid" ]; then
|
||||
pending_signal="$sig"
|
||||
logger -t daed-init "signal $sig received before daed child started; launch cancelled"
|
||||
return 0
|
||||
fi
|
||||
case "$sig" in
|
||||
TERM|INT|QUIT)
|
||||
if [ -z "$shutdown_signal" ]; then
|
||||
shutdown_signal="$sig"
|
||||
shutdown_elapsed=0
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
kill -"$sig" "$child_pid" 2>/dev/null
|
||||
}
|
||||
trap cleanup_child TERM INT
|
||||
|
||||
/usr/bin/daed "$@" &
|
||||
child_pid=$!
|
||||
wait "$child_pid"
|
||||
status=$?
|
||||
child_pid=
|
||||
trap - TERM INT
|
||||
exit_with_signal() {
|
||||
local sig="$1"
|
||||
trap - TERM INT HUP QUIT
|
||||
kill -"$sig" "$$" 2>/dev/null
|
||||
exit 1
|
||||
}
|
||||
|
||||
if ! daed_cleanup_runtime; then
|
||||
echo "daed: runtime cleanup after exit failed" >&2
|
||||
status=1
|
||||
child_is_running() {
|
||||
local state
|
||||
kill -0 "$child_pid" 2>/dev/null || return 1
|
||||
state=$(awk '{ print $3 }' "/proc/$child_pid/stat" 2>/dev/null)
|
||||
[ "$state" != "Z" ]
|
||||
}
|
||||
trap 'forward_signal TERM' TERM
|
||||
trap 'forward_signal INT' INT
|
||||
trap 'forward_signal HUP' HUP
|
||||
trap 'forward_signal QUIT' QUIT
|
||||
|
||||
start_child() {
|
||||
local sig
|
||||
# Keep this check inside the function as well as at the call site:
|
||||
# it closes the ordinary pre-start window, while the pending-signal
|
||||
# path below handles a signal arriving during the background fork.
|
||||
[ -z "$pending_signal" ] || return 125
|
||||
/usr/bin/daed "$@" &
|
||||
child_pid=$!
|
||||
if [ -n "$pending_signal" ]; then
|
||||
sig="$pending_signal"
|
||||
pending_signal=
|
||||
forward_signal "$sig"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ -n "$pending_signal" ]; then
|
||||
logger -t daed-init "refusing to start daed after pending signal $pending_signal"
|
||||
exit_with_signal "$pending_signal"
|
||||
fi
|
||||
exit "$status"
|
||||
|
||||
# Best-effort OOM preference; failure must not block startup.
|
||||
if ! echo -16 > /proc/self/oom_score_adj 2>/dev/null; then
|
||||
logger -t daed-init "warn: failed to set /proc/self/oom_score_adj; continuing without OOM preference"
|
||||
fi
|
||||
if ! start_child "$@"; then
|
||||
logger -t daed-init "refusing to start daed after pending signal $pending_signal"
|
||||
if [ -n "$pending_signal" ]; then
|
||||
exit_with_signal "$pending_signal"
|
||||
fi
|
||||
exit 1
|
||||
fi
|
||||
status=0
|
||||
reaped=0
|
||||
while [ "$reaped" -eq 0 ]; do
|
||||
if [ -n "$shutdown_signal" ] && child_is_running; then
|
||||
if [ "$shutdown_elapsed" -ge "$child_term_timeout" ]; then
|
||||
if [ "$forced_kill" -eq 0 ]; then
|
||||
logger -t daed-init "daed did not exit within ${child_term_timeout}s after $shutdown_signal; sending KILL"
|
||||
kill -KILL "$child_pid" 2>/dev/null
|
||||
forced_kill=1
|
||||
fi
|
||||
else
|
||||
sleep 1
|
||||
shutdown_elapsed=$((shutdown_elapsed + 1))
|
||||
continue
|
||||
fi
|
||||
sleep 1
|
||||
continue
|
||||
fi
|
||||
wait "$child_pid" 2>/dev/null
|
||||
status=$?
|
||||
if ! child_is_running; then
|
||||
reaped=1
|
||||
fi
|
||||
done
|
||||
child_pid=
|
||||
trap - TERM INT HUP QUIT
|
||||
|
||||
# Post-exit cleanup runs after the child is reaped.
|
||||
DAED_GUARD_CLEANUP=post-exit
|
||||
cleanup_status=0
|
||||
daed_cleanup_runtime || cleanup_status=$?
|
||||
if [ "$cleanup_status" -ne 0 ]; then
|
||||
echo "daed: runtime cleanup after exit failed" >&2
|
||||
logger -t daed-init "post-exit cleanup failed; check ip netns / ip link show"
|
||||
fi
|
||||
if [ "$status" -ne 0 ]; then
|
||||
exit "$status"
|
||||
fi
|
||||
exit "$cleanup_status"
|
||||
@@ -1,5 +1,7 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
# Copyright (C) 2023 Tianling Shen <cnsztl@immortalwrt.org>
|
||||
# daed-guard handles bounded child shutdown and post-exit netns/veth cleanup.
|
||||
# Keep the log file and a pre-stop state snapshot for diagnostics.
|
||||
|
||||
USE_PROCD=1
|
||||
START=99
|
||||
@@ -10,18 +12,28 @@ LOG="/var/log/daed/daed.log"
|
||||
|
||||
. /usr/share/daed/cleanup.sh
|
||||
|
||||
log() {
|
||||
logger -t daed-init "$@"
|
||||
}
|
||||
|
||||
start_service() {
|
||||
log "start: begin"
|
||||
config_load "$CONF"
|
||||
|
||||
local enabled
|
||||
config_get_bool enabled "config" "enabled" "0"
|
||||
[ "$enabled" -eq "1" ] || return 1
|
||||
if [ "$enabled" -ne "1" ]; then
|
||||
log "start: config disabled, exit"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local listen_addr log_maxbackups log_maxsize
|
||||
config_get listen_addr "config" "listen_addr" "0.0.0.0:2023"
|
||||
config_get log_maxbackups "config" "log_maxbackups" "1"
|
||||
config_get log_maxsize "config" "log_maxsize" "5"
|
||||
|
||||
log "start: listen=$listen_addr log_maxbackups=$log_maxbackups log_maxsize=$log_maxsize"
|
||||
|
||||
procd_open_instance "$CONF"
|
||||
procd_set_param env DAE_LOCATION_ASSET="/usr/share/v2ray" TZ="$(uci -q get system.@system[0].zonename)"
|
||||
procd_set_param command "$PROG" run
|
||||
@@ -33,25 +45,37 @@ start_service() {
|
||||
|
||||
procd_set_param limits core="unlimited"
|
||||
procd_set_param limits nofile="1000000 1000000"
|
||||
# Avoid an endless crash/respawn loop which can repeatedly reattach dae's
|
||||
# data-plane hooks and make the router management plane unreachable.
|
||||
procd_set_param respawn 3600 5 5
|
||||
# daed-guard escalates its child after 20 seconds. Leave time for
|
||||
# reap and post-exit cleanup before procd kills the wrapper.
|
||||
procd_set_param term_timeout 30
|
||||
# procd_set_param respawn: arguments are (threshold, timeout, retry).
|
||||
# threshold = runtime that resets the short-lived exit counter
|
||||
# timeout = seconds to wait between retries
|
||||
# retry = maximum short-lived exits before procd gives up
|
||||
# Reset the counter after one hour of stable runtime; otherwise retry
|
||||
# after 5 seconds and stop after 10 failures.
|
||||
procd_set_param respawn 3600 5 10
|
||||
# daed-guard sets oom_score_adj before forking; procd has no
|
||||
# oom_adj/oom_score_adj parameter.
|
||||
# procd_set_param stdout 1
|
||||
procd_set_param stderr 1
|
||||
|
||||
procd_close_instance
|
||||
log "start: procd_open_instance done"
|
||||
}
|
||||
|
||||
stop_service() {
|
||||
rm -f "$LOG"
|
||||
daed_cleanup_runtime
|
||||
}
|
||||
|
||||
restart() {
|
||||
stop
|
||||
sleep 1
|
||||
daed_cleanup_runtime
|
||||
start
|
||||
log "stop: begin"
|
||||
# Cleanup runs in daed-guard after its child exits. Record only a
|
||||
# pre-stop snapshot here; pin entries do not prove TC attachment.
|
||||
local pinned="" ns_left=""
|
||||
if [ -d /sys/fs/bpf/daed ]; then
|
||||
pinned=$(ls /sys/fs/bpf/daed 2>/dev/null | tr '\n' ' ')
|
||||
fi
|
||||
if ip netns list 2>/dev/null | grep -q '^daens'; then
|
||||
ns_left="daens"
|
||||
fi
|
||||
log "stop: pre-stop state — bpf_pin_entries=[${pinned:-none}] netns_left=[${ns_left:-none}]"
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
LUCI_TITLE:=LuCI support for EasyTier Next
|
||||
LUCI_URL:=https://github.com/EasyTier/EasyTier
|
||||
PKG_DESCRIPTION:=Provides a modern LuCI Web management interface for EasyTier decentralized mesh VPN.
|
||||
PKG_MAINTAINER:=Dante <dante@seckv.com>
|
||||
LUCI_DEPENDS:=+easytier-next +luci-base
|
||||
LUCI_PKGARCH:=all
|
||||
|
||||
define Package/luci-app-easytier-next/conffiles
|
||||
/etc/config/easytier
|
||||
/etc/easytier/
|
||||
endef
|
||||
|
||||
define Package/luci-app-easytier-next/postinst
|
||||
#!/bin/sh
|
||||
[ -n "$${IPKG_INSTROOT}" ] || {
|
||||
rm -f /tmp/luci-indexcache.* /tmp/luci-modulecache/* 2>/dev/null
|
||||
chmod 0755 /etc/init.d/easytier /etc/hotplug.d/iface/99-easytier-routes 2>/dev/null || true
|
||||
/etc/init.d/rpcd restart 2>/dev/null || true
|
||||
}
|
||||
exit 0
|
||||
endef
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
||||
@@ -0,0 +1,383 @@
|
||||
msgid "(Drag to pan, scroll to zoom)"
|
||||
msgstr ""
|
||||
|
||||
msgid "50 ~ 150ms (Good)"
|
||||
msgstr ""
|
||||
|
||||
msgid "< 50ms (Optimal)"
|
||||
msgstr ""
|
||||
|
||||
msgid "> 150ms (Fair)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Absolute path to the TOML configuration file (Corresponding flag: -c, --config-file). Ensure the file exists with valid EasyTier configuration."
|
||||
msgstr ""
|
||||
|
||||
msgid "Action"
|
||||
msgstr ""
|
||||
|
||||
msgid "Additional command-line parameters appended to easytier-core."
|
||||
msgstr ""
|
||||
|
||||
msgid "Advanced Options"
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow WAN Access"
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow other peers in the network to route their Internet traffic through this node (Corresponding flag: --enable-exit-node)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Allow resolving peer node domain names (such as hostname.et.net) without memorizing virtual IP addresses (Corresponding flag: --accept-dns). Automatically forwards DNS queries via dnsmasq. Note: If third-party DNS tools (e.g. MosDNS, AdGuard Home, SmartDNS) are active, ensure this domain zone is excluded from hijacking."
|
||||
msgstr ""
|
||||
|
||||
msgid "Automatically determine and assign a virtual IP address (Corresponding flag: -d, --dhcp)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Automatically open and manage firewall traffic rules on WAN zone to allow incoming connections for external peers."
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear Logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Client Version"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cloud Web Config"
|
||||
msgstr ""
|
||||
|
||||
msgid "Collecting data ..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Collecting logs..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Command-line"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configuration File"
|
||||
msgstr ""
|
||||
|
||||
msgid "Configuration File Path"
|
||||
msgstr ""
|
||||
|
||||
msgid "Connected Peer Nodes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Core Service Status"
|
||||
msgstr ""
|
||||
|
||||
msgid "Core Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cost"
|
||||
msgstr ""
|
||||
|
||||
msgid "Custom Command Parameters"
|
||||
msgstr ""
|
||||
|
||||
msgid "Directory to store SQLite database for easytier-web."
|
||||
msgstr ""
|
||||
|
||||
msgid "EasyTier"
|
||||
msgstr ""
|
||||
|
||||
msgid "EasyTier is a simple, secure, decentralized mesh VPN for intranet penetration, implemented in Rust."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable Core Service"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable DHCP IP Allocation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable Exit Node"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable Magic DNS"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable Tunnel Traffic SNAT"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable Web Console Service"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enable multi-threaded packet processing for higher throughput (Corresponding flag: --multi-thread)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Encryption Algorithm"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load logs: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load peers: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Failed to load topology: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "HTTP listen port for easytier-web embedded web dashboard."
|
||||
msgstr ""
|
||||
|
||||
msgid "Hostname"
|
||||
msgstr ""
|
||||
|
||||
msgid "Initial connection peer node URLs (Corresponding flag: -p, --peers)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Interface IPv4 Address"
|
||||
msgstr ""
|
||||
|
||||
msgid "Interface IPv6 Address"
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid URL format, must start with tcp://, udp://, ws://, wss://, wg://, or quic://"
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid UUID format (e.g. %s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid username format, only letters, digits, and _ - . @ are allowed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Latency"
|
||||
msgstr ""
|
||||
|
||||
msgid "Local Node Information"
|
||||
msgstr ""
|
||||
|
||||
msgid "Local service is not running."
|
||||
msgstr ""
|
||||
|
||||
msgid "Log Actions"
|
||||
msgstr ""
|
||||
|
||||
msgid "Logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Logs cleared."
|
||||
msgstr ""
|
||||
|
||||
msgid "Loss Rate"
|
||||
msgstr ""
|
||||
|
||||
msgid "Machine ID (UUID)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Magic DNS Domain Zone"
|
||||
msgstr ""
|
||||
|
||||
msgid "Multi-threaded Mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "NAT Type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network Name"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network Secret"
|
||||
msgstr ""
|
||||
|
||||
msgid "Network Topology"
|
||||
msgstr ""
|
||||
|
||||
msgid "No connected remote peers found."
|
||||
msgstr ""
|
||||
|
||||
msgid "No logs available."
|
||||
msgstr ""
|
||||
|
||||
msgid "No topology data available."
|
||||
msgstr ""
|
||||
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
|
||||
msgid "Not Installed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Open Console"
|
||||
msgstr ""
|
||||
|
||||
msgid "Peer Nodes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Port for local CLI and RPC management portal (Corresponding flag: --rpc-portal)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Proxy Network"
|
||||
msgstr ""
|
||||
|
||||
msgid "Proxy Networks"
|
||||
msgstr ""
|
||||
|
||||
msgid "Public Discovery Node"
|
||||
msgstr ""
|
||||
|
||||
msgid "Public discovery node URL (Corresponding flag: -e, --external-node)."
|
||||
msgstr ""
|
||||
|
||||
msgid "RPC Management Port"
|
||||
msgstr ""
|
||||
|
||||
msgid "RX"
|
||||
msgstr ""
|
||||
|
||||
msgid "Refresh"
|
||||
msgstr ""
|
||||
|
||||
msgid "Refresh Logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "Refresh Topology"
|
||||
msgstr ""
|
||||
|
||||
msgid "Remote web configuration server address or username (Corresponding flag: -w, --web-config). Supports complete URL (e.g. udp://127.0.0.1:22020/admin) or username only (e.g. admin, connecting to official cloud server)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Reset View"
|
||||
msgstr ""
|
||||
|
||||
msgid "Restart"
|
||||
msgstr ""
|
||||
|
||||
msgid "Restarting service..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Running"
|
||||
msgstr ""
|
||||
|
||||
msgid "Running (Unmanaged)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Service Status"
|
||||
msgstr ""
|
||||
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Specify the top-level domain zone for Magic DNS (Corresponding flag: --tld-dns-zone). Default is et.net. (FQDN ending with dot)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Startup Method"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stopped"
|
||||
msgstr ""
|
||||
|
||||
msgid "Subnet CIDRs to proxy and announce through this node (Corresponding flag: -n, --proxy-networks). Select from the detected local subnets below or enter custom CIDRs."
|
||||
msgstr ""
|
||||
|
||||
msgid "TUN Device Name"
|
||||
msgstr ""
|
||||
|
||||
msgid "TX"
|
||||
msgstr ""
|
||||
|
||||
msgid "The VPN network name to identify this virtual network (Corresponding flag: --network-name)."
|
||||
msgstr ""
|
||||
|
||||
msgid "The secret phrase used to authorize and encrypt traffic (Corresponding flag: --network-secret)."
|
||||
msgstr ""
|
||||
|
||||
msgid "The static IPv4 address of this node (Corresponding flag: -i, --ipv4). Ignored when DHCP is enabled."
|
||||
msgstr ""
|
||||
|
||||
msgid "The static IPv6 address of this node (Corresponding flag: --ipv6)."
|
||||
msgstr ""
|
||||
|
||||
msgid "The web console may consume significant memory, please enable as needed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Topology Actions"
|
||||
msgstr ""
|
||||
|
||||
msgid "Tunnel"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unique device identifier UUID in the cloud management console (Corresponding flag: --machine-id). Automatically generated on initial install. Changing UUID will automatically clear local cloud cache."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use OpenWrt system firewall to manage NAT for EasyTier tunnel and subnet traffic. Disabling this option disables source address masquerading to preserve real source IPs of remote peers and subnets in the local network."
|
||||
msgstr ""
|
||||
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
msgid "Virtual IP"
|
||||
msgstr ""
|
||||
|
||||
msgid "Virtual Interface"
|
||||
msgstr ""
|
||||
|
||||
msgid "Virtual TUN network interface name (Corresponding flag: --dev-name)."
|
||||
msgstr ""
|
||||
|
||||
msgid "Web Config Server URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Web Config Server URL cannot be empty."
|
||||
msgstr ""
|
||||
|
||||
msgid "Web Console"
|
||||
msgstr ""
|
||||
|
||||
msgid "Web Console Port"
|
||||
msgstr ""
|
||||
|
||||
msgid "Web Console Status"
|
||||
msgstr ""
|
||||
|
||||
msgid "Web Data Directory"
|
||||
msgstr ""
|
||||
|
||||
msgid "Zoom In"
|
||||
msgstr ""
|
||||
|
||||
msgid "Zoom Out"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reset Layout"
|
||||
msgstr ""
|
||||
|
||||
msgid "(Hover to highlight link, drag nodes/canvas to adjust)"
|
||||
msgstr ""
|
||||
|
||||
msgid "All Links"
|
||||
msgstr ""
|
||||
|
||||
msgid "Local Only"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show All Peer Links"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show Local Links Only"
|
||||
msgstr ""
|
||||
|
||||
msgid "Next Hop: %s (%s)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Next Hop: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Latency / Loss"
|
||||
msgstr ""
|
||||
|
||||
msgid "RX / TX"
|
||||
msgstr ""
|
||||
|
||||
msgid "(Hover/click node to trace path, drag to adjust)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear selection"
|
||||
msgstr ""
|
||||
|
||||
msgid "Local Node: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Path"
|
||||
msgstr ""
|
||||
@@ -0,0 +1 @@
|
||||
zh_Hans
|
||||
@@ -0,0 +1,383 @@
|
||||
msgid "(Drag to pan, scroll to zoom)"
|
||||
msgstr "(支持拖拽画布平移,滚轮缩放视图)"
|
||||
|
||||
msgid "50 ~ 150ms (Good)"
|
||||
msgstr "50 ~ 150ms (良)"
|
||||
|
||||
msgid "< 50ms (Optimal)"
|
||||
msgstr "< 50ms (优)"
|
||||
|
||||
msgid "> 150ms (Fair)"
|
||||
msgstr "> 150ms (一般)"
|
||||
|
||||
msgid "Absolute path to the TOML configuration file (Corresponding flag: -c, --config-file). Ensure the file exists with valid EasyTier configuration."
|
||||
msgstr "TOML 格式配置文件的绝对路径 (对应参数:-c, --config-file)。请确保该文件已存在并包含有效的 EasyTier 配置。"
|
||||
|
||||
msgid "Action"
|
||||
msgstr "操作"
|
||||
|
||||
msgid "Additional command-line parameters appended to easytier-core."
|
||||
msgstr "附加到 easytier-core 进程末尾的自定义参数。"
|
||||
|
||||
msgid "Advanced Options"
|
||||
msgstr "高级设置"
|
||||
|
||||
msgid "Allow WAN Access"
|
||||
msgstr "允许从 WAN 访问"
|
||||
|
||||
msgid "Allow other peers in the network to route their Internet traffic through this node (Corresponding flag: --enable-exit-node)."
|
||||
msgstr "允许网络中的其他对等节点通过本节点路由外网流量 (对应参数:--enable-exit-node)。"
|
||||
|
||||
msgid "Allow resolving peer node domain names (such as hostname.et.net) without memorizing virtual IP addresses (Corresponding flag: --accept-dns). Automatically forwards DNS queries via dnsmasq. Note: If third-party DNS tools (e.g. MosDNS, AdGuard Home, SmartDNS) are active, ensure this domain zone is excluded from hijacking."
|
||||
msgstr "允许直接通过主机名解析节点 (对应参数:--accept-dns)。自动通过 dnsmasq 转发解析请求至内置 DNS 服务器 (100.100.100.101)。注意:若启用了第三方 DNS 代理工具(如 MosDNS、AdGuard Home、SmartDNS 或分流插件),请确保将该域名区域加入直连/放行名单以防止被劫持导致解析失败。"
|
||||
|
||||
msgid "Automatically determine and assign a virtual IP address (Corresponding flag: -d, --dhcp)."
|
||||
msgstr "自动协商并分配虚拟网卡 IP 地址 (对应参数:-d, --dhcp)。"
|
||||
|
||||
msgid "Automatically open and manage firewall traffic rules on WAN zone to allow incoming connections for external peers."
|
||||
msgstr "自动在 WAN 防火墙区域创建并管理通信规则,放行外部节点连接本节点的入站流量。"
|
||||
|
||||
msgid "Clear Logs"
|
||||
msgstr "清空日志"
|
||||
|
||||
msgid "Client Version"
|
||||
msgstr "客户端版本"
|
||||
|
||||
msgid "Cloud Web Config"
|
||||
msgstr "云端集中配置"
|
||||
|
||||
msgid "Collecting data ..."
|
||||
msgstr "正在收集数据..."
|
||||
|
||||
msgid "Collecting logs..."
|
||||
msgstr "正在收集日志..."
|
||||
|
||||
msgid "Command-line"
|
||||
msgstr "命令行参数"
|
||||
|
||||
msgid "Configuration File"
|
||||
msgstr "配置文件"
|
||||
|
||||
msgid "Configuration File Path"
|
||||
msgstr "配置文件路径"
|
||||
|
||||
msgid "Connected Peer Nodes"
|
||||
msgstr "已连接对等节点"
|
||||
|
||||
msgid "Core Service Status"
|
||||
msgstr "核心服务状态"
|
||||
|
||||
msgid "Core Settings"
|
||||
msgstr "基本设置"
|
||||
|
||||
msgid "Cost"
|
||||
msgstr "开销"
|
||||
|
||||
msgid "Custom Command Parameters"
|
||||
msgstr "自定义启动参数"
|
||||
|
||||
msgid "Directory to store SQLite database for easytier-web."
|
||||
msgstr "用于存放 easytier-web SQLite 数据库文件的目录。"
|
||||
|
||||
msgid "EasyTier"
|
||||
msgstr "EasyTier"
|
||||
|
||||
msgid "EasyTier is a simple, secure, decentralized mesh VPN for intranet penetration, implemented in Rust."
|
||||
msgstr "EasyTier 是一款基于 Rust 实现的简单、安全、去中心化的网状异地组网工具。"
|
||||
|
||||
msgid "Enable Core Service"
|
||||
msgstr "启用核心服务"
|
||||
|
||||
msgid "Enable DHCP IP Allocation"
|
||||
msgstr "启用 DHCP 分配"
|
||||
|
||||
msgid "Enable Exit Node"
|
||||
msgstr "作为出口节点"
|
||||
|
||||
msgid "Enable Magic DNS"
|
||||
msgstr "启用魔法 DNS"
|
||||
|
||||
msgid "Enable Tunnel Traffic SNAT"
|
||||
msgstr "开启隧道流量 SNAT"
|
||||
|
||||
msgid "Enable Web Console Service"
|
||||
msgstr "启用 Web 控制台服务"
|
||||
|
||||
msgid "Enable multi-threaded packet processing for higher throughput (Corresponding flag: --multi-thread)."
|
||||
msgstr "启用多线程数据包处理以提升高吞吐性能 (对应参数:--multi-thread)。"
|
||||
|
||||
msgid "Encryption Algorithm"
|
||||
msgstr "加密算法"
|
||||
|
||||
msgid "Failed to load logs: %s"
|
||||
msgstr "加载日志失败:%s"
|
||||
|
||||
msgid "Failed to load peers: %s"
|
||||
msgstr "加载对等节点失败:%s"
|
||||
|
||||
msgid "Failed to load topology: %s"
|
||||
msgstr "加载拓扑失败:%s"
|
||||
|
||||
msgid "HTTP listen port for easytier-web embedded web dashboard."
|
||||
msgstr "easytier-web 内置 Web 控制台的 HTTP 监听端口。"
|
||||
|
||||
msgid "Hostname"
|
||||
msgstr "主机名"
|
||||
|
||||
msgid "Initial connection peer node URLs (Corresponding flag: -p, --peers)."
|
||||
msgstr "初始连接的对等节点地址 (对应参数:-p, --peers)。"
|
||||
|
||||
msgid "Interface IPv4 Address"
|
||||
msgstr "虚拟 IPv4 地址"
|
||||
|
||||
msgid "Interface IPv6 Address"
|
||||
msgstr "虚拟 IPv6 地址"
|
||||
|
||||
msgid "Invalid URL format, must start with tcp://, udp://, ws://, wss://, wg://, or quic://"
|
||||
msgstr "URL 格式无效,必须以 tcp://、udp://、ws://、wss://、wg:// 或 quic:// 开头"
|
||||
|
||||
msgid "Invalid UUID format (e.g. %s)"
|
||||
msgstr "UUID 格式无效(示例:%s)"
|
||||
|
||||
msgid "Invalid username format, only letters, digits, and _ - . @ are allowed."
|
||||
msgstr "用户名格式无效,仅支持字母、数字及 _ - . @"
|
||||
|
||||
msgid "Latency"
|
||||
msgstr "延迟"
|
||||
|
||||
msgid "Local Node Information"
|
||||
msgstr "本地节点信息"
|
||||
|
||||
msgid "Local service is not running."
|
||||
msgstr "本地服务未运行。"
|
||||
|
||||
msgid "Log Actions"
|
||||
msgstr "日志操作"
|
||||
|
||||
msgid "Logs"
|
||||
msgstr "运行日志"
|
||||
|
||||
msgid "Logs cleared."
|
||||
msgstr "日志已清空。"
|
||||
|
||||
msgid "Loss Rate"
|
||||
msgstr "丢包率"
|
||||
|
||||
msgid "Machine ID (UUID)"
|
||||
msgstr "设备唯一标识 (UUID)"
|
||||
|
||||
msgid "Magic DNS Domain Zone"
|
||||
msgstr "魔法 DNS 域名区域"
|
||||
|
||||
msgid "Multi-threaded Mode"
|
||||
msgstr "多线程模式"
|
||||
|
||||
msgid "NAT Type"
|
||||
msgstr "NAT 类型"
|
||||
|
||||
msgid "Network Name"
|
||||
msgstr "网络名称"
|
||||
|
||||
msgid "Network Secret"
|
||||
msgstr "网络密钥"
|
||||
|
||||
msgid "Network Topology"
|
||||
msgstr "网络拓扑"
|
||||
|
||||
msgid "No connected remote peers found."
|
||||
msgstr "未找到已连接的远程对等节点。"
|
||||
|
||||
msgid "No logs available."
|
||||
msgstr "暂无可用的日志记录。"
|
||||
|
||||
msgid "No topology data available."
|
||||
msgstr "暂无拓扑数据。"
|
||||
|
||||
msgid "None"
|
||||
msgstr "无"
|
||||
|
||||
msgid "Not Installed"
|
||||
msgstr "未安装"
|
||||
|
||||
msgid "Open Console"
|
||||
msgstr "打开控制台"
|
||||
|
||||
msgid "Peer Nodes"
|
||||
msgstr "对等节点"
|
||||
|
||||
msgid "Port for local CLI and RPC management portal (Corresponding flag: --rpc-portal)."
|
||||
msgstr "本地 CLI 与 RPC 交互端口 (对应参数:--rpc-portal)。"
|
||||
|
||||
msgid "Proxy Network"
|
||||
msgstr "子网代理"
|
||||
|
||||
msgid "Proxy Networks"
|
||||
msgstr "子网代理"
|
||||
|
||||
msgid "Public Discovery Node"
|
||||
msgstr "公共发现节点"
|
||||
|
||||
msgid "Public discovery node URL (Corresponding flag: -e, --external-node)."
|
||||
msgstr "公共发现节点 URL (对应参数:-e, --external-node)。"
|
||||
|
||||
msgid "RPC Management Port"
|
||||
msgstr "RPC 管理端口"
|
||||
|
||||
msgid "RX"
|
||||
msgstr "RX"
|
||||
|
||||
msgid "Refresh"
|
||||
msgstr "刷新"
|
||||
|
||||
msgid "Refresh Logs"
|
||||
msgstr "刷新日志"
|
||||
|
||||
msgid "Refresh Topology"
|
||||
msgstr "刷新拓扑"
|
||||
|
||||
msgid "Remote web configuration server address or username (Corresponding flag: -w, --web-config). Supports complete URL (e.g. udp://127.0.0.1:22020/admin) or username only (e.g. admin, connecting to official cloud server)."
|
||||
msgstr "远程 Web 配置服务器地址或用户名 (对应参数:-w, --web-config)。支持完整 URL(如 udp://127.0.0.1:22020/admin)或仅填用户名/网络名(如 admin,自动连接官方云端服务器)。"
|
||||
|
||||
msgid "Reset View"
|
||||
msgstr "重置视图"
|
||||
|
||||
msgid "Restart"
|
||||
msgstr "重启"
|
||||
|
||||
msgid "Restarting service..."
|
||||
msgstr "正在重启服务..."
|
||||
|
||||
msgid "Running"
|
||||
msgstr "运行中"
|
||||
|
||||
msgid "Running (Unmanaged)"
|
||||
msgstr "运行中 (非托管)"
|
||||
|
||||
msgid "Service Status"
|
||||
msgstr "服务运行状态"
|
||||
|
||||
msgid "Settings"
|
||||
msgstr "配置"
|
||||
|
||||
msgid "Specify the top-level domain zone for Magic DNS (Corresponding flag: --tld-dns-zone). Default is et.net. (FQDN ending with dot)."
|
||||
msgstr "指定魔法 DNS 的顶级域名区域 (对应参数:--tld-dns-zone)。默认值为 et.net.(以点结尾的 FQDN 根域)。"
|
||||
|
||||
msgid "Startup Method"
|
||||
msgstr "启动方式"
|
||||
|
||||
msgid "Stopped"
|
||||
msgstr "已停止"
|
||||
|
||||
msgid "Subnet CIDRs to proxy and announce through this node (Corresponding flag: -n, --proxy-networks). Select from the detected local subnets below or enter custom CIDRs."
|
||||
msgstr "通过此节点代理并通告的子网网段 (对应参数:-n, --proxy-networks)。可直接下拉选择探测到的本地网段或手动输入。"
|
||||
|
||||
msgid "TUN Device Name"
|
||||
msgstr "虚拟网卡名称"
|
||||
|
||||
msgid "TX"
|
||||
msgstr "TX"
|
||||
|
||||
msgid "The VPN network name to identify this virtual network (Corresponding flag: --network-name)."
|
||||
msgstr "VPN 虚拟网络名称 (对应参数:--network-name)。"
|
||||
|
||||
msgid "The secret phrase used to authorize and encrypt traffic (Corresponding flag: --network-secret)."
|
||||
msgstr "用于节点认证与加密的密钥短语 (对应参数:--network-secret)。"
|
||||
|
||||
msgid "The static IPv4 address of this node (Corresponding flag: -i, --ipv4). Ignored when DHCP is enabled."
|
||||
msgstr "本节点的静态 IPv4 地址 (对应参数:-i, --ipv4)。启用 DHCP 时自动忽略。"
|
||||
|
||||
msgid "The static IPv6 address of this node (Corresponding flag: --ipv6)."
|
||||
msgstr "本节点的静态 IPv6 地址 (对应参数:--ipv6)。"
|
||||
|
||||
msgid "The web console may consume significant memory, please enable as needed."
|
||||
msgstr "Web 控制台可能会消耗较多内存,请按需启用。"
|
||||
|
||||
msgid "Topology Actions"
|
||||
msgstr "拓扑操作"
|
||||
|
||||
msgid "Tunnel"
|
||||
msgstr "连接方式"
|
||||
|
||||
msgid "Unique device identifier UUID in the cloud management console (Corresponding flag: --machine-id). Automatically generated on initial install. Changing UUID will automatically clear local cloud cache."
|
||||
msgstr "用于在云端控制台中标识当前设备的唯一 UUID 标识符 (对应参数:--machine-id)。初始化安装时自动生成,修改更换 UUID 时将自动重置并清理云端缓存。"
|
||||
|
||||
msgid "Use OpenWrt system firewall to manage NAT for EasyTier tunnel and subnet traffic. Disabling this option disables source address masquerading to preserve real source IPs of remote peers and subnets in the local network."
|
||||
msgstr "使用 OpenWrt 系统防火墙接管 EasyTier 虚拟网卡与子网转发流量的 NAT。关闭此选项将禁用源地址伪装,保留远程对等节点及子网在本地局域网中的真实源 IP。"
|
||||
|
||||
msgid "Version"
|
||||
msgstr "版本"
|
||||
|
||||
msgid "Virtual IP"
|
||||
msgstr "虚拟 IP"
|
||||
|
||||
msgid "Virtual Interface"
|
||||
msgstr "虚拟网卡"
|
||||
|
||||
msgid "Virtual TUN network interface name (Corresponding flag: --dev-name)."
|
||||
msgstr "创建的虚拟 TUN 网卡接口名称 (对应参数:--dev-name)。"
|
||||
|
||||
msgid "Web Config Server URL"
|
||||
msgstr "云端配置服务器地址"
|
||||
|
||||
msgid "Web Config Server URL cannot be empty."
|
||||
msgstr "云端配置服务器地址不能为空。"
|
||||
|
||||
msgid "Web Console"
|
||||
msgstr "Web 控制台"
|
||||
|
||||
msgid "Web Console Port"
|
||||
msgstr "控制台监听端口"
|
||||
|
||||
msgid "Web Console Status"
|
||||
msgstr "控制台服务状态"
|
||||
|
||||
msgid "Web Data Directory"
|
||||
msgstr "控制台数据目录"
|
||||
|
||||
msgid "Zoom In"
|
||||
msgstr "放大"
|
||||
|
||||
msgid "Zoom Out"
|
||||
msgstr "缩小"
|
||||
|
||||
msgid "Reset Layout"
|
||||
msgstr "重置布局"
|
||||
|
||||
msgid "(Hover to highlight link, drag nodes/canvas to adjust)"
|
||||
msgstr "(悬停高亮链路,拖拽节点/画布以调整)"
|
||||
|
||||
msgid "All Links"
|
||||
msgstr "全部链路"
|
||||
|
||||
msgid "Local Only"
|
||||
msgstr "仅本端"
|
||||
|
||||
msgid "Show All Peer Links"
|
||||
msgstr "显示所有对端连接线"
|
||||
|
||||
msgid "Show Local Links Only"
|
||||
msgstr "仅聚焦本端连接线"
|
||||
|
||||
msgid "Next Hop: %s (%s)"
|
||||
msgstr "下一跳中继: %s (%s)"
|
||||
|
||||
msgid "Next Hop: %s"
|
||||
msgstr "下一跳中继: %s"
|
||||
|
||||
msgid "Latency / Loss"
|
||||
msgstr "延迟 / 丢包"
|
||||
|
||||
msgid "RX / TX"
|
||||
msgstr "接收 / 发送"
|
||||
|
||||
msgid "(Hover/click node to trace path, drag to adjust)"
|
||||
msgstr "(悬停/点击节点追踪路径,支持拖拽调整)"
|
||||
|
||||
msgid "Clear selection"
|
||||
msgstr "清除选中"
|
||||
|
||||
msgid "Local Node: %s"
|
||||
msgstr "本地节点: %s"
|
||||
|
||||
msgid "Path"
|
||||
msgstr "路径"
|
||||
@@ -0,0 +1,383 @@
|
||||
msgid "(Drag to pan, scroll to zoom)"
|
||||
msgstr "(支援拖拽畫布平移,滾輪縮放視圖)"
|
||||
|
||||
msgid "50 ~ 150ms (Good)"
|
||||
msgstr "50 ~ 150ms (良)"
|
||||
|
||||
msgid "< 50ms (Optimal)"
|
||||
msgstr "< 50ms (優)"
|
||||
|
||||
msgid "> 150ms (Fair)"
|
||||
msgstr "> 150ms (一般)"
|
||||
|
||||
msgid "Absolute path to the TOML configuration file (Corresponding flag: -c, --config-file). Ensure the file exists with valid EasyTier configuration."
|
||||
msgstr "TOML 格式配置檔案的絕對路徑 (對應參數:-c, --config-file)。請確保該檔案已存在並包含有效的 EasyTier 配置。"
|
||||
|
||||
msgid "Action"
|
||||
msgstr "操作"
|
||||
|
||||
msgid "Additional command-line parameters appended to easytier-core."
|
||||
msgstr "附加到 easytier-core 進程末尾的自定義參數。"
|
||||
|
||||
msgid "Advanced Options"
|
||||
msgstr "進階設定"
|
||||
|
||||
msgid "Allow WAN Access"
|
||||
msgstr "允許從 WAN 訪問"
|
||||
|
||||
msgid "Allow other peers in the network to route their Internet traffic through this node (Corresponding flag: --enable-exit-node)."
|
||||
msgstr "允許網路中的其他對等節點透過本節點路由外網流量 (對應參數:--enable-exit-node)。"
|
||||
|
||||
msgid "Allow resolving peer node domain names (such as hostname.et.net) without memorizing virtual IP addresses (Corresponding flag: --accept-dns). Automatically forwards DNS queries via dnsmasq. Note: If third-party DNS tools (e.g. MosDNS, AdGuard Home, SmartDNS) are active, ensure this domain zone is excluded from hijacking."
|
||||
msgstr "允許直接透過主機名解析節點 (對應參數:--accept-dns)。自動透過 dnsmasq 轉發解析請求至內置 DNS 伺服器 (100.100.100.101)。注意:若啟用了第三方 DNS 代理工具(如 MosDNS、AdGuard Home、SmartDNS 或分流插件),請確保將該網域區域加入直連/放行名單以防止被劫持導致解析失敗。"
|
||||
|
||||
msgid "Automatically determine and assign a virtual IP address (Corresponding flag: -d, --dhcp)."
|
||||
msgstr "自動協商並分配虛擬網卡 IP 位址 (對應參數:-d, --dhcp)。"
|
||||
|
||||
msgid "Automatically open and manage firewall traffic rules on WAN zone to allow incoming connections for external peers."
|
||||
msgstr "自動在 WAN 防火牆區域創建並管理通信規則,放行外部節點連接本節點的入站流量。"
|
||||
|
||||
msgid "Clear Logs"
|
||||
msgstr "清空日誌"
|
||||
|
||||
msgid "Client Version"
|
||||
msgstr "客戶端版本"
|
||||
|
||||
msgid "Cloud Web Config"
|
||||
msgstr "雲端集中配置"
|
||||
|
||||
msgid "Collecting data ..."
|
||||
msgstr "正在收集數據..."
|
||||
|
||||
msgid "Collecting logs..."
|
||||
msgstr "正在收集日誌..."
|
||||
|
||||
msgid "Command-line"
|
||||
msgstr "命令行參數"
|
||||
|
||||
msgid "Configuration File"
|
||||
msgstr "配置檔案"
|
||||
|
||||
msgid "Configuration File Path"
|
||||
msgstr "配置檔案路徑"
|
||||
|
||||
msgid "Connected Peer Nodes"
|
||||
msgstr "已連線對等節點"
|
||||
|
||||
msgid "Core Service Status"
|
||||
msgstr "核心服務狀態"
|
||||
|
||||
msgid "Core Settings"
|
||||
msgstr "基本設定"
|
||||
|
||||
msgid "Cost"
|
||||
msgstr "開銷"
|
||||
|
||||
msgid "Custom Command Parameters"
|
||||
msgstr "自定義啟動參數"
|
||||
|
||||
msgid "Directory to store SQLite database for easytier-web."
|
||||
msgstr "用於存放 easytier-web SQLite 資料庫檔案的目錄。"
|
||||
|
||||
msgid "EasyTier"
|
||||
msgstr "EasyTier"
|
||||
|
||||
msgid "EasyTier is a simple, secure, decentralized mesh VPN for intranet penetration, implemented in Rust."
|
||||
msgstr "EasyTier 是一款基於 Rust 實現的簡單、安全、去中心化的網狀異地組網工具。"
|
||||
|
||||
msgid "Enable Core Service"
|
||||
msgstr "啟用核心服務"
|
||||
|
||||
msgid "Enable DHCP IP Allocation"
|
||||
msgstr "啟用 DHCP 分配"
|
||||
|
||||
msgid "Enable Exit Node"
|
||||
msgstr "作為出口節點"
|
||||
|
||||
msgid "Enable Magic DNS"
|
||||
msgstr "啟用魔法 DNS"
|
||||
|
||||
msgid "Enable Tunnel Traffic SNAT"
|
||||
msgstr "開啟隧道流量 SNAT"
|
||||
|
||||
msgid "Enable Web Console Service"
|
||||
msgstr "啟用 Web 控制台服務"
|
||||
|
||||
msgid "Enable multi-threaded packet processing for higher throughput (Corresponding flag: --multi-thread)."
|
||||
msgstr "啟用多線程數據包處理以提升高吞吐性能 (對應參數:--multi-thread)。"
|
||||
|
||||
msgid "Encryption Algorithm"
|
||||
msgstr "加密演算法"
|
||||
|
||||
msgid "Failed to load logs: %s"
|
||||
msgstr "載入日誌失敗:%s"
|
||||
|
||||
msgid "Failed to load peers: %s"
|
||||
msgstr "載入對等節點失敗:%s"
|
||||
|
||||
msgid "Failed to load topology: %s"
|
||||
msgstr "載入拓撲失敗:%s"
|
||||
|
||||
msgid "HTTP listen port for easytier-web embedded web dashboard."
|
||||
msgstr "easytier-web 內建 Web 控制台的 HTTP 監聽連接埠。"
|
||||
|
||||
msgid "Hostname"
|
||||
msgstr "主機名稱"
|
||||
|
||||
msgid "Initial connection peer node URLs (Corresponding flag: -p, --peers)."
|
||||
msgstr "初始連線的對等節點位址 (對應參數:-p, --peers)。"
|
||||
|
||||
msgid "Interface IPv4 Address"
|
||||
msgstr "虛擬 IPv4 位址"
|
||||
|
||||
msgid "Interface IPv6 Address"
|
||||
msgstr "虛擬 IPv6 位址"
|
||||
|
||||
msgid "Invalid URL format, must start with tcp://, udp://, ws://, wss://, wg://, or quic://"
|
||||
msgstr "URL 格式無效,必須以 tcp://、udp://、ws://、wss://、wg:// 或 quic:// 開頭"
|
||||
|
||||
msgid "Invalid UUID format (e.g. %s)"
|
||||
msgstr "UUID 格式無效(示例:%s)"
|
||||
|
||||
msgid "Invalid username format, only letters, digits, and _ - . @ are allowed."
|
||||
msgstr "使用者名稱格式無效,僅支援字母、數字及 _ - . @"
|
||||
|
||||
msgid "Latency"
|
||||
msgstr "延遲"
|
||||
|
||||
msgid "Local Node Information"
|
||||
msgstr "本地節點資訊"
|
||||
|
||||
msgid "Local service is not running."
|
||||
msgstr "本地服務未運行。"
|
||||
|
||||
msgid "Log Actions"
|
||||
msgstr "日誌操作"
|
||||
|
||||
msgid "Logs"
|
||||
msgstr "運行日誌"
|
||||
|
||||
msgid "Logs cleared."
|
||||
msgstr "日誌已清空。"
|
||||
|
||||
msgid "Loss Rate"
|
||||
msgstr "丟包率"
|
||||
|
||||
msgid "Machine ID (UUID)"
|
||||
msgstr "設備唯一標識 (UUID)"
|
||||
|
||||
msgid "Magic DNS Domain Zone"
|
||||
msgstr "魔法 DNS 網域區域"
|
||||
|
||||
msgid "Multi-threaded Mode"
|
||||
msgstr "多線程模式"
|
||||
|
||||
msgid "NAT Type"
|
||||
msgstr "NAT 類型"
|
||||
|
||||
msgid "Network Name"
|
||||
msgstr "網路名稱"
|
||||
|
||||
msgid "Network Secret"
|
||||
msgstr "網路密鑰"
|
||||
|
||||
msgid "Network Topology"
|
||||
msgstr "網路拓撲"
|
||||
|
||||
msgid "No connected remote peers found."
|
||||
msgstr "未找到已連線的遠端對等節點。"
|
||||
|
||||
msgid "No logs available."
|
||||
msgstr "暫無可用的日誌記錄。"
|
||||
|
||||
msgid "No topology data available."
|
||||
msgstr "暫無拓撲數據。"
|
||||
|
||||
msgid "None"
|
||||
msgstr "無"
|
||||
|
||||
msgid "Not Installed"
|
||||
msgstr "未安裝"
|
||||
|
||||
msgid "Open Console"
|
||||
msgstr "開啟控制台"
|
||||
|
||||
msgid "Peer Nodes"
|
||||
msgstr "對等節點"
|
||||
|
||||
msgid "Port for local CLI and RPC management portal (Corresponding flag: --rpc-portal)."
|
||||
msgstr "本地 CLI 與 RPC 互動連接埠 (對應參數:--rpc-portal)。"
|
||||
|
||||
msgid "Proxy Network"
|
||||
msgstr "子網代理"
|
||||
|
||||
msgid "Proxy Networks"
|
||||
msgstr "子網代理"
|
||||
|
||||
msgid "Public Discovery Node"
|
||||
msgstr "公共發現節點"
|
||||
|
||||
msgid "Public discovery node URL (Corresponding flag: -e, --external-node)."
|
||||
msgstr "公共發現節點 URL (對應參數:-e, --external-node)。"
|
||||
|
||||
msgid "RPC Management Port"
|
||||
msgstr "RPC 管理連接埠"
|
||||
|
||||
msgid "RX"
|
||||
msgstr "RX"
|
||||
|
||||
msgid "Refresh"
|
||||
msgstr "重新整理"
|
||||
|
||||
msgid "Refresh Logs"
|
||||
msgstr "重新整理日誌"
|
||||
|
||||
msgid "Refresh Topology"
|
||||
msgstr "重新整理拓撲"
|
||||
|
||||
msgid "Remote web configuration server address or username (Corresponding flag: -w, --web-config). Supports complete URL (e.g. udp://127.0.0.1:22020/admin) or username only (e.g. admin, connecting to official cloud server)."
|
||||
msgstr "遠程 Web 配置伺服器位址或使用者名稱 (對應參數:-w, --web-config)。支援完整 URL(如 udp://127.0.0.1:22020/admin)或僅填使用者名稱/網路名稱(如 admin,自動連線官方雲端伺服器)。"
|
||||
|
||||
msgid "Reset View"
|
||||
msgstr "重置視圖"
|
||||
|
||||
msgid "Restart"
|
||||
msgstr "重啟"
|
||||
|
||||
msgid "Restarting service..."
|
||||
msgstr "正在重啟服務..."
|
||||
|
||||
msgid "Running"
|
||||
msgstr "運行中"
|
||||
|
||||
msgid "Running (Unmanaged)"
|
||||
msgstr "運行中 (非託管)"
|
||||
|
||||
msgid "Service Status"
|
||||
msgstr "服務運行狀態"
|
||||
|
||||
msgid "Settings"
|
||||
msgstr "配置"
|
||||
|
||||
msgid "Specify the top-level domain zone for Magic DNS (Corresponding flag: --tld-dns-zone). Default is et.net. (FQDN ending with dot)."
|
||||
msgstr "指定魔法 DNS 的頂級網域區域 (對應參數:--tld-dns-zone)。預設值為 et.net.(以點結尾的 FQDN 根域)。"
|
||||
|
||||
msgid "Startup Method"
|
||||
msgstr "啟動方式"
|
||||
|
||||
msgid "Stopped"
|
||||
msgstr "已停止"
|
||||
|
||||
msgid "Subnet CIDRs to proxy and announce through this node (Corresponding flag: -n, --proxy-networks). Select from the detected local subnets below or enter custom CIDRs."
|
||||
msgstr "透過此節點代理並通告的子網網段 (對應參數:-n, --proxy-networks)。可直接下拉選擇探測到的本地網段或手動輸入。"
|
||||
|
||||
msgid "TUN Device Name"
|
||||
msgstr "虛擬網卡名稱"
|
||||
|
||||
msgid "TX"
|
||||
msgstr "TX"
|
||||
|
||||
msgid "The VPN network name to identify this virtual network (Corresponding flag: --network-name)."
|
||||
msgstr "VPN 虛擬網路名稱 (對應參數:--network-name)。"
|
||||
|
||||
msgid "The secret phrase used to authorize and encrypt traffic (Corresponding flag: --network-secret)."
|
||||
msgstr "用於節點認證與加密的密鑰短語 (對應參數:--network-secret)。"
|
||||
|
||||
msgid "The static IPv4 address of this node (Corresponding flag: -i, --ipv4). Ignored when DHCP is enabled."
|
||||
msgstr "本節點的靜態 IPv4 位址 (對應參數:-i, --ipv4)。啟用 DHCP 時自動忽略。"
|
||||
|
||||
msgid "The static IPv6 address of this node (Corresponding flag: --ipv6)."
|
||||
msgstr "本節點的靜態 IPv6 位址 (對應參數:--ipv6)。"
|
||||
|
||||
msgid "The web console may consume significant memory, please enable as needed."
|
||||
msgstr "Web 控制台可能會消耗較多記憶體,請按需啟用。"
|
||||
|
||||
msgid "Topology Actions"
|
||||
msgstr "拓撲操作"
|
||||
|
||||
msgid "Tunnel"
|
||||
msgstr "連線方式"
|
||||
|
||||
msgid "Unique device identifier UUID in the cloud management console (Corresponding flag: --machine-id). Automatically generated on initial install. Changing UUID will automatically clear local cloud cache."
|
||||
msgstr "用於在雲端控制台中識別當前設備的唯一 UUID 識別碼 (對應參數:--machine-id)。初始化安裝時自動生成,修改更換 UUID 時將自動重置並清理雲端快取。"
|
||||
|
||||
msgid "Use OpenWrt system firewall to manage NAT for EasyTier tunnel and subnet traffic. Disabling this option disables source address masquerading to preserve real source IPs of remote peers and subnets in the local network."
|
||||
msgstr "使用 OpenWrt 系統防火牆接管 EasyTier 虛擬網卡與子網轉發流量的 NAT。關閉此選項將禁用源位址偽裝,保留遠端對等節點及子網在本地局域網中的真實源 IP。"
|
||||
|
||||
msgid "Version"
|
||||
msgstr "版本"
|
||||
|
||||
msgid "Virtual IP"
|
||||
msgstr "虛擬 IP"
|
||||
|
||||
msgid "Virtual Interface"
|
||||
msgstr "虛擬網卡"
|
||||
|
||||
msgid "Virtual TUN network interface name (Corresponding flag: --dev-name)."
|
||||
msgstr "創建的虛擬 TUN 網卡介面名稱 (對應參數:--dev-name)。"
|
||||
|
||||
msgid "Web Config Server URL"
|
||||
msgstr "雲端配置伺服器位址"
|
||||
|
||||
msgid "Web Config Server URL cannot be empty."
|
||||
msgstr "雲端配置伺服器位址不能為空。"
|
||||
|
||||
msgid "Web Console"
|
||||
msgstr "Web 控制台"
|
||||
|
||||
msgid "Web Console Port"
|
||||
msgstr "控制台監聽連接埠"
|
||||
|
||||
msgid "Web Console Status"
|
||||
msgstr "控制台服務狀態"
|
||||
|
||||
msgid "Web Data Directory"
|
||||
msgstr "控制台數據目錄"
|
||||
|
||||
msgid "Zoom In"
|
||||
msgstr "放大"
|
||||
|
||||
msgid "Zoom Out"
|
||||
msgstr "縮小"
|
||||
|
||||
msgid "Reset Layout"
|
||||
msgstr "重設佈局"
|
||||
|
||||
msgid "(Hover to highlight link, drag nodes/canvas to adjust)"
|
||||
msgstr "(懸停高亮鏈路,拖曳節點/畫布以調整)"
|
||||
|
||||
msgid "All Links"
|
||||
msgstr "全部鏈路"
|
||||
|
||||
msgid "Local Only"
|
||||
msgstr "僅本端"
|
||||
|
||||
msgid "Show All Peer Links"
|
||||
msgstr "顯示所有對端連接線"
|
||||
|
||||
msgid "Show Local Links Only"
|
||||
msgstr "僅聚焦本端連接線"
|
||||
|
||||
msgid "Next Hop: %s (%s)"
|
||||
msgstr "下一跳中繼: %s (%s)"
|
||||
|
||||
msgid "Next Hop: %s"
|
||||
msgstr "下一跳中繼: %s"
|
||||
|
||||
msgid "Latency / Loss"
|
||||
msgstr "延遲 / 丟包"
|
||||
|
||||
msgid "RX / TX"
|
||||
msgstr "接收 / 發送"
|
||||
|
||||
msgid "(Hover/click node to trace path, drag to adjust)"
|
||||
msgstr "(懸停/點擊節點追蹤路徑,支援拖曳調整)"
|
||||
|
||||
msgid "Clear selection"
|
||||
msgstr "清除選取"
|
||||
|
||||
msgid "Local Node: %s"
|
||||
msgstr "本地節點: %s"
|
||||
|
||||
msgid "Path"
|
||||
msgstr "路徑"
|
||||
@@ -0,0 +1,21 @@
|
||||
config easytier 'settings'
|
||||
option enabled '0'
|
||||
option etcmd 'etcmd'
|
||||
option network_name 'easytier'
|
||||
option network_secret ''
|
||||
option ip_dhcp '1'
|
||||
option ipaddr '10.144.144.1'
|
||||
option ip6addr ''
|
||||
option external_node 'tcp://public.easytier.top:11010'
|
||||
option rpc_port '15888'
|
||||
option dev_name 'easytier0'
|
||||
option encryption_algorithm 'aes-gcm'
|
||||
option multi_thread '0'
|
||||
option tunnel_snat '0'
|
||||
option allow_wan '0'
|
||||
option web_config 'udp://127.0.0.1:22020/admin'
|
||||
option machine_id ''
|
||||
option web_enabled '0'
|
||||
option web_html_port '22020'
|
||||
option web_dir '/etc/easytier'
|
||||
list peeradd 'tcp://public.easytier.top:11010'
|
||||
@@ -0,0 +1,15 @@
|
||||
instance_name = "default"
|
||||
instance_id = "f9f05421-7c6b-47d6-a67d-4d58d49f51d8"
|
||||
dhcp = true
|
||||
listeners = []
|
||||
exit_nodes = []
|
||||
rpc_portal = "0.0.0.0:15888"
|
||||
|
||||
[network_identity]
|
||||
network_name = "mynetwork"
|
||||
network_secret = "mysecret"
|
||||
|
||||
[[peer]]
|
||||
uri = "tcp://public.easytier.top:11010"
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
#!/bin/sh
|
||||
|
||||
dev_name=$(uci -q get easytier.settings.dev_name)
|
||||
[ -z "$dev_name" ] && dev_name="easytier0"
|
||||
|
||||
[ "$DEVICE" = "$dev_name" ] || exit 0
|
||||
[ "$ACTION" = "ifup" ] || exit 0
|
||||
|
||||
LOCK=/tmp/easytier_hotplug.lock
|
||||
|
||||
# Timestamp-based lock: bail out if another check fired within 10 s.
|
||||
if [ -f "$LOCK" ]; then
|
||||
ts=$(cat "$LOCK" 2>/dev/null)
|
||||
[ -n "$ts" ] && [ $(( $(date +%s) - ts )) -lt 10 ] && exit 0
|
||||
fi
|
||||
|
||||
# Skip if easytier is not configured or enabled
|
||||
[ "$(uci -q get easytier.settings.enabled)" = "1" ] || exit 0
|
||||
|
||||
date +%s > "$LOCK"
|
||||
|
||||
logger -t easytier-hotplug "${DEVICE} ifup detected: updating firewall rules"
|
||||
|
||||
/etc/init.d/easytier update_firewall >/dev/null 2>&1 &
|
||||
@@ -0,0 +1,557 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=90
|
||||
USE_PROCD=1
|
||||
EXTRA_COMMANDS="update_firewall"
|
||||
EXTRA_HELP=" update_firewall Update WAN firewall inbound rule from live easytier-cli listeners"
|
||||
|
||||
NAME="easytier"
|
||||
PROG="/usr/bin/easytier-core"
|
||||
WEB_PROG="/usr/bin/easytier-web"
|
||||
CONF_DIR="/etc/easytier"
|
||||
LOG_FILE="/tmp/easytier.log"
|
||||
WEB_LOG_FILE="/tmp/easytier-web.log"
|
||||
|
||||
setup_firewall_and_network() {
|
||||
local dev_name="$1"
|
||||
[ -z "$dev_name" ] && dev_name="easytier0"
|
||||
|
||||
local changed_net=0
|
||||
local changed_fw=0
|
||||
|
||||
# 1. Ensure network interface exists and is exactly synchronized with dev_name
|
||||
local cur_dev cur_ifname
|
||||
cur_dev=$(uci -q get network.easytier.device)
|
||||
cur_ifname=$(uci -q get network.easytier.device)
|
||||
|
||||
if ! uci -q get network.easytier >/dev/null; then
|
||||
uci -q set network.easytier=interface
|
||||
uci -q set network.easytier.proto='none'
|
||||
uci -q set network.easytier.device="$dev_name"
|
||||
uci -q set network.easytier.device="$dev_name"
|
||||
changed_net=1
|
||||
else
|
||||
if [ "$cur_dev" != "$dev_name" ] || [ "$cur_ifname" != "$dev_name" ]; then
|
||||
uci -q set network.easytier.proto='none'
|
||||
uci -q set network.easytier.device="$dev_name"
|
||||
uci -q set network.easytier.device="$dev_name"
|
||||
changed_net=1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 2. Zone MASQUERADE (controlled by tunnel_snat)
|
||||
local tunnel_snat target_masq="0"
|
||||
tunnel_snat=$(uci -q get easytier.settings.tunnel_snat)
|
||||
[ "$tunnel_snat" = "1" ] && target_masq="1"
|
||||
|
||||
# Ensure firewall zone exists
|
||||
if ! uci -q get firewall.easytier >/dev/null; then
|
||||
uci -q set firewall.easytier=zone
|
||||
uci -q set firewall.easytier.name='easytier'
|
||||
uci -q set firewall.easytier.input='ACCEPT'
|
||||
uci -q set firewall.easytier.output='ACCEPT'
|
||||
uci -q set firewall.easytier.forward='ACCEPT'
|
||||
uci -q set firewall.easytier.masq="$target_masq"
|
||||
uci -q set firewall.easytier.mtu_fix='1'
|
||||
uci -q add_list firewall.easytier.network='easytier'
|
||||
uci -q add_list firewall.easytier.device="$dev_name"
|
||||
|
||||
# Allow forwarding from LAN to EasyTier
|
||||
uci -q set firewall.easytier_fwd_lan=forwarding
|
||||
uci -q set firewall.easytier_fwd_lan.src='lan'
|
||||
uci -q set firewall.easytier_fwd_lan.dest='easytier'
|
||||
|
||||
# Allow forwarding from EasyTier to LAN
|
||||
uci -q set firewall.easytier_fwd_et=forwarding
|
||||
uci -q set firewall.easytier_fwd_et.src='easytier'
|
||||
uci -q set firewall.easytier_fwd_et.dest='lan'
|
||||
|
||||
# Allow forwarding from EasyTier to WAN
|
||||
uci -q set firewall.easytier_fwd_wan=forwarding
|
||||
uci -q set firewall.easytier_fwd_wan.src='easytier'
|
||||
uci -q set firewall.easytier_fwd_wan.dest='wan'
|
||||
changed_fw=1
|
||||
else
|
||||
local cur_masq
|
||||
cur_masq=$(uci -q get firewall.easytier.masq)
|
||||
if [ "$cur_masq" != "$target_masq" ]; then
|
||||
uci -q set firewall.easytier.masq="$target_masq"
|
||||
changed_fw=1
|
||||
fi
|
||||
|
||||
# Cleanly synchronize device list (remove stale devices, enforce single current dev_name)
|
||||
local cur_devices
|
||||
cur_devices=$(uci -q get firewall.easytier.device)
|
||||
if [ "$cur_devices" != "$dev_name" ]; then
|
||||
for d in $cur_devices; do
|
||||
uci -q del_list firewall.easytier.device="$d"
|
||||
done
|
||||
uci -q add_list firewall.easytier.device="$dev_name"
|
||||
changed_fw=1
|
||||
fi
|
||||
|
||||
local has_net=0
|
||||
for n in $(uci -q get firewall.easytier.network); do
|
||||
[ "$n" = "easytier" ] && has_net=1
|
||||
done
|
||||
if [ "$has_net" = "0" ]; then
|
||||
uci -q add_list firewall.easytier.network='easytier'
|
||||
changed_fw=1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$changed_net" = "1" ]; then
|
||||
uci -q commit network
|
||||
/etc/init.d/network reload 2>/dev/null
|
||||
fi
|
||||
|
||||
if [ "$changed_fw" = "1" ]; then
|
||||
uci -q commit firewall
|
||||
/etc/init.d/firewall reload 2>/dev/null
|
||||
fi
|
||||
|
||||
# 3. Kernel forwarding
|
||||
sysctl -w net.ipv4.ip_forward=1 >/dev/null 2>&1
|
||||
sysctl -w net.ipv6.conf.all.forwarding=1 >/dev/null 2>&1
|
||||
}
|
||||
|
||||
apply_wan_firewall() {
|
||||
local allow_wan
|
||||
allow_wan=$(uci -q get easytier.settings.allow_wan)
|
||||
|
||||
if [ "$allow_wan" != "1" ]; then
|
||||
if uci -q get firewall.easytier_wan_inbound >/dev/null; then
|
||||
uci -q delete firewall.easytier_wan_inbound
|
||||
uci -q commit firewall
|
||||
/etc/init.d/firewall reload 2>/dev/null
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
local rpc_port="$1"
|
||||
[ -z "$rpc_port" ] && rpc_port=$(uci -q get easytier.settings.rpc_port)
|
||||
[ -z "$rpc_port" ] && rpc_port="15888"
|
||||
local rpc_arg="-p 127.0.0.1:${rpc_port}"
|
||||
|
||||
# 纯净原子化探测:从运行态 easytier-core 查询实际生效的 listeners 端口
|
||||
local wan_ports=""
|
||||
if [ -x /usr/bin/easytier-cli ]; then
|
||||
local i=0 json_out=""
|
||||
while [ $i -lt 10 ]; do
|
||||
json_out=$(/usr/bin/easytier-cli $rpc_arg -o json node 2>/dev/null)
|
||||
if [ -n "$json_out" ]; then
|
||||
local extracted_ports=""
|
||||
if command -v jsonfilter >/dev/null 2>&1; then
|
||||
extracted_ports=$(echo "$json_out" | jsonfilter -e '@.listeners[*]' 2>/dev/null | grep -oE ':[0-9]{2,5}/?$' | tr -d ':/' | sort -n -u)
|
||||
else
|
||||
extracted_ports=$(echo "$json_out" | sed -n '/"listeners": \[/,/\]/p' | grep -oE ':[0-9]{2,5}/?$' | tr -d ':/' | sort -n -u)
|
||||
fi
|
||||
|
||||
if [ -n "$extracted_ports" ]; then
|
||||
set -- $extracted_ports
|
||||
wan_ports="$*"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
i=$((i + 1))
|
||||
sleep 1
|
||||
done
|
||||
fi
|
||||
|
||||
# 严格原子化:仅当核心成功运行且实际处于监听状态时才下发放行规则;未启动或无端口绝不下发
|
||||
if [ -n "$wan_ports" ]; then
|
||||
local cur_rule_ports cur_rule_enabled
|
||||
cur_rule_ports=$(uci -q get firewall.easytier_wan_inbound.dest_port)
|
||||
cur_rule_enabled=$(uci -q get firewall.easytier_wan_inbound.enabled)
|
||||
|
||||
if ! uci -q get firewall.easytier_wan_inbound >/dev/null || [ "$cur_rule_ports" != "$wan_ports" ] || [ "$cur_rule_enabled" != "1" ]; then
|
||||
uci -q set firewall.easytier_wan_inbound=rule
|
||||
uci -q set firewall.easytier_wan_inbound.name='Allow-EasyTier-WAN-Inbound'
|
||||
uci -q set firewall.easytier_wan_inbound.src='wan'
|
||||
uci -q set firewall.easytier_wan_inbound.proto='tcp udp'
|
||||
uci -q set firewall.easytier_wan_inbound.dest_port="$wan_ports"
|
||||
uci -q set firewall.easytier_wan_inbound.target='ACCEPT'
|
||||
uci -q set firewall.easytier_wan_inbound.enabled='1'
|
||||
uci -q commit firewall
|
||||
/etc/init.d/firewall reload 2>/dev/null
|
||||
logger -t "$NAME" "WAN firewall inbound rule applied for active listeners: $wan_ports"
|
||||
fi
|
||||
else
|
||||
logger -t "$NAME" "Warning: No active EasyTier listeners detected, keeping WAN firewall closed"
|
||||
if uci -q get firewall.easytier_wan_inbound >/dev/null; then
|
||||
uci -q delete firewall.easytier_wan_inbound
|
||||
uci -q commit firewall
|
||||
/etc/init.d/firewall reload 2>/dev/null
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
setup_dnsmasq() {
|
||||
local magic_dns tld_dns_zone
|
||||
config_get_bool magic_dns settings magic_dns 0
|
||||
config_get tld_dns_zone settings tld_dns_zone 'et.net.'
|
||||
[ -z "$tld_dns_zone" ] && tld_dns_zone='et.net.'
|
||||
|
||||
# 防呆机制:无论用户输入是否带点,核心规范为以点结尾的 FQDN
|
||||
case "$tld_dns_zone" in
|
||||
*.) ;;
|
||||
*) tld_dns_zone="${tld_dns_zone}." ;;
|
||||
esac
|
||||
local tld_clean
|
||||
tld_clean=$(echo "$tld_dns_zone" | sed 's/\.$//')
|
||||
|
||||
local changed_dhcp=0
|
||||
|
||||
# 1. Dynamically inspect all server rules pointing to 100.100.100.101, extract old zones, and clean corresponding rebind_domain
|
||||
local cur_servers
|
||||
cur_servers=$(uci -q get dhcp.@dnsmasq[0].server)
|
||||
if [ -n "$cur_servers" ]; then
|
||||
local s
|
||||
for s in $cur_servers; do
|
||||
case "$s" in
|
||||
*100.100.100.101*)
|
||||
local old_zone
|
||||
old_zone=$(echo "$s" | sed -n 's|^/\([^/]*\)/100\.100\.100\.101.*|\1|p')
|
||||
if [ -n "$old_zone" ]; then
|
||||
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="$old_zone"
|
||||
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="${old_zone}."
|
||||
fi
|
||||
uci -q del_list dhcp.@dnsmasq[0].server="$s"
|
||||
changed_dhcp=1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
# 2. Clean fallback domains
|
||||
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="$tld_dns_zone"
|
||||
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="$tld_clean"
|
||||
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="et.net"
|
||||
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="et.net."
|
||||
|
||||
# 3. Add new Magic DNS forwarding and rebind whitelist if enabled
|
||||
if [ "$magic_dns" -eq 1 ]; then
|
||||
uci -q add_list dhcp.@dnsmasq[0].server="/${tld_clean}/100.100.100.101"
|
||||
uci -q add_list dhcp.@dnsmasq[0].rebind_domain="${tld_clean}"
|
||||
changed_dhcp=1
|
||||
fi
|
||||
|
||||
if [ "$changed_dhcp" -eq 1 ]; then
|
||||
uci -q commit dhcp
|
||||
/etc/init.d/dnsmasq reload 2>/dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
cleanup_dnsmasq() {
|
||||
local tld_dns_zone
|
||||
config_get tld_dns_zone settings tld_dns_zone 'et.net.'
|
||||
[ -z "$tld_dns_zone" ] && tld_dns_zone='et.net.'
|
||||
|
||||
case "$tld_dns_zone" in
|
||||
*.) ;;
|
||||
*) tld_dns_zone="${tld_dns_zone}." ;;
|
||||
esac
|
||||
local tld_clean
|
||||
tld_clean=$(echo "$tld_dns_zone" | sed 's/\.$//')
|
||||
|
||||
local changed_dhcp=0
|
||||
|
||||
# 1. Dynamically inspect all server rules pointing to 100.100.100.101, extract old zones, and clean corresponding rebind_domain
|
||||
local cur_servers
|
||||
cur_servers=$(uci -q get dhcp.@dnsmasq[0].server)
|
||||
if [ -n "$cur_servers" ]; then
|
||||
local s
|
||||
for s in $cur_servers; do
|
||||
case "$s" in
|
||||
*100.100.100.101*)
|
||||
local old_zone
|
||||
old_zone=$(echo "$s" | sed -n 's|^/\([^/]*\)/100\.100\.100\.101.*|\1|p')
|
||||
if [ -n "$old_zone" ]; then
|
||||
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="$old_zone"
|
||||
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="${old_zone}."
|
||||
fi
|
||||
uci -q del_list dhcp.@dnsmasq[0].server="$s"
|
||||
changed_dhcp=1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
# 2. Clean fallback domains
|
||||
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="$tld_dns_zone"
|
||||
uci -q del_list dhcp.@dnsmasq[0].rebind_domain="$tld_clean"
|
||||
|
||||
if [ "$changed_dhcp" -eq 1 ]; then
|
||||
uci -q commit dhcp
|
||||
/etc/init.d/dnsmasq reload 2>/dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
atomic_clean_cloud_dir() {
|
||||
local target_dir="$1"
|
||||
local new_mid="$2"
|
||||
|
||||
# Security boundary guard: strictly disallow root /etc/easytier to protect config.toml and easytier.db
|
||||
case "$target_dir" in
|
||||
/etc/easytier|/etc/easytier/|/etc|/etc/|/tmp|/tmp/)
|
||||
logger -t "$NAME" "Security warning: Cannot clean root directory $target_dir"
|
||||
return 1
|
||||
;;
|
||||
/etc/easytier/*|/tmp/easytier/*) ;;
|
||||
*)
|
||||
logger -t "$NAME" "Security warning: Refusing to clean unsafe path: $target_dir"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
|
||||
local pid="$$"
|
||||
local new_tmp="${target_dir}.new.${pid}"
|
||||
local trash_tmp="${target_dir}.trash.${pid}"
|
||||
|
||||
mkdir -p "$new_tmp"
|
||||
[ -n "$new_mid" ] && echo "$new_mid" > "$new_tmp/.machine_id"
|
||||
|
||||
if [ -d "$target_dir" ]; then
|
||||
mv "$target_dir" "$trash_tmp" 2>/dev/null
|
||||
fi
|
||||
mv "$new_tmp" "$target_dir" 2>/dev/null
|
||||
rm -rf "${target_dir}.trash."* 2>/dev/null
|
||||
return 0
|
||||
}
|
||||
|
||||
start_core() {
|
||||
local enabled etcmd network_name network_secret ip_dhcp ipaddr ip6addr
|
||||
local external_node rpc_port encryption_algorithm dev_name proxy_cidrs
|
||||
local custom_params custom_config_file web_config multi_thread
|
||||
local magic_dns tld_dns_zone
|
||||
local machine_id config_dir
|
||||
|
||||
config_get_bool enabled settings enabled 0
|
||||
[ "$enabled" -eq 1 ] || return 0
|
||||
|
||||
[ -x "$PROG" ] || {
|
||||
logger -t "$NAME" "Core executable $PROG not found"
|
||||
return 1
|
||||
}
|
||||
|
||||
config_get etcmd settings etcmd 'etcmd'
|
||||
config_get network_name settings network_name ''
|
||||
config_get network_secret settings network_secret ''
|
||||
config_get_bool ip_dhcp settings ip_dhcp 1
|
||||
config_get ipaddr settings ipaddr ''
|
||||
config_get ip6addr settings ip6addr ''
|
||||
config_get external_node settings external_node ''
|
||||
config_get rpc_port settings rpc_port '15888'
|
||||
config_get encryption_algorithm settings encryption_algorithm ''
|
||||
config_get dev_name settings dev_name 'easytier0'
|
||||
config_get custom_config_file settings custom_config_file '/etc/easytier/config.toml'
|
||||
config_get web_config settings web_config ''
|
||||
config_get machine_id settings machine_id ''
|
||||
config_get custom_params settings custom_params ''
|
||||
config_get_bool multi_thread settings multi_thread 0
|
||||
config_get_bool magic_dns settings magic_dns 0
|
||||
config_get tld_dns_zone settings tld_dns_zone 'et.net.'
|
||||
[ -z "$tld_dns_zone" ] && tld_dns_zone='et.net.'
|
||||
case "$tld_dns_zone" in
|
||||
*.) ;;
|
||||
*) tld_dns_zone="${tld_dns_zone}." ;;
|
||||
esac
|
||||
config_get_bool enable_exit_node settings enable_exit_node 0
|
||||
|
||||
mkdir -p "$CONF_DIR"
|
||||
|
||||
procd_open_instance "core"
|
||||
procd_set_param command "$PROG"
|
||||
|
||||
if [ "$etcmd" = "config" ]; then
|
||||
[ -f "$custom_config_file" ] || {
|
||||
logger -t "$NAME" "Custom config file $custom_config_file not found"
|
||||
return 1
|
||||
}
|
||||
procd_append_param command -c "$custom_config_file"
|
||||
elif [ "$etcmd" = "web" ]; then
|
||||
[ -n "$web_config" ] || {
|
||||
logger -t "$NAME" "Web config URL is not configured"
|
||||
return 1
|
||||
}
|
||||
procd_append_param command -w "$web_config"
|
||||
|
||||
# Machine ID (ensure unique UUID exists)
|
||||
if [ -z "$machine_id" ]; then
|
||||
if [ -f /proc/sys/kernel/random/uuid ]; then
|
||||
machine_id=$(cat /proc/sys/kernel/random/uuid 2>/dev/null)
|
||||
fi
|
||||
if [ -z "$machine_id" ]; then
|
||||
machine_id=$(tr -dc 'a-f0-9' < /dev/urandom 2>/dev/null | head -c 32 | sed -r 's/(.{8})(.{4})(.{4})(.{4})(.{12})/\1-\2-\3-\4-\5/')
|
||||
fi
|
||||
if [ -n "$machine_id" ]; then
|
||||
uci -q set easytier.settings.machine_id="$machine_id"
|
||||
uci -q commit easytier
|
||||
fi
|
||||
fi
|
||||
[ -n "$machine_id" ] && procd_append_param command --machine-id "$machine_id"
|
||||
|
||||
# Internal cloud config directory (isolated storage)
|
||||
local config_dir='/etc/easytier/cloud'
|
||||
|
||||
# Atomic check & clean for Machine ID change
|
||||
local last_mid_file="$config_dir/.machine_id"
|
||||
local last_mid=""
|
||||
[ -f "$last_mid_file" ] && last_mid=$(cat "$last_mid_file" 2>/dev/null)
|
||||
|
||||
if [ -d "$config_dir" ] && [ -n "$last_mid" ] && [ "$last_mid" != "$machine_id" ]; then
|
||||
logger -t "$NAME" "Machine ID changed from $last_mid to $machine_id, atomically cleaning cloud config cache in $config_dir"
|
||||
atomic_clean_cloud_dir "$config_dir" "$machine_id"
|
||||
else
|
||||
mkdir -p "$config_dir"
|
||||
[ -n "$machine_id" ] && [ ! -f "$last_mid_file" ] && echo "$machine_id" > "$last_mid_file" 2>/dev/null
|
||||
fi
|
||||
|
||||
procd_append_param command --config-dir "$config_dir"
|
||||
|
||||
# System proxy forward & device name
|
||||
procd_append_param command --proxy-forward-by-system
|
||||
[ -n "$dev_name" ] && procd_append_param command --dev-name "$dev_name"
|
||||
|
||||
# Additional custom arguments
|
||||
if [ -n "$custom_params" ]; then
|
||||
for arg in $custom_params; do
|
||||
procd_append_param command "$arg"
|
||||
done
|
||||
fi
|
||||
else
|
||||
# Default command-line configuration
|
||||
[ -n "$network_name" ] && procd_append_param command --network-name "$network_name"
|
||||
[ -n "$network_secret" ] && procd_append_param command --network-secret "$network_secret"
|
||||
|
||||
if [ "$ip_dhcp" -eq 1 ]; then
|
||||
procd_append_param command -d
|
||||
elif [ -n "$ipaddr" ]; then
|
||||
procd_append_param command -i "$ipaddr"
|
||||
fi
|
||||
|
||||
[ -n "$ip6addr" ] && procd_append_param command --ipv6 "$ip6addr"
|
||||
[ -n "$external_node" ] && procd_append_param command -e "$external_node"
|
||||
[ -n "$rpc_port" ] && procd_append_param command --rpc-portal "0.0.0.0:${rpc_port}"
|
||||
[ -n "$encryption_algorithm" ] && procd_append_param command --encryption-algorithm "$encryption_algorithm"
|
||||
[ -n "$dev_name" ] && procd_append_param command --dev-name "$dev_name"
|
||||
[ "$multi_thread" -eq 1 ] && procd_append_param command --multi-thread
|
||||
|
||||
# Always disable user-space built-in NAT and delegate forwarding to Linux kernel
|
||||
procd_append_param command --proxy-forward-by-system
|
||||
|
||||
# Exit Node
|
||||
[ "$enable_exit_node" -eq 1 ] && procd_append_param command --enable-exit-node
|
||||
|
||||
# Magic DNS
|
||||
if [ "$magic_dns" -eq 1 ]; then
|
||||
procd_append_param command --accept-dns true
|
||||
[ -n "$tld_dns_zone" ] && procd_append_param command --tld-dns-zone "$tld_dns_zone"
|
||||
fi
|
||||
|
||||
# Peer nodes
|
||||
append_peer() {
|
||||
[ -n "$1" ] && procd_append_param command -p "$1"
|
||||
}
|
||||
config_list_foreach settings peeradd append_peer
|
||||
|
||||
# Proxy networks / Subnet routes
|
||||
append_proxy() {
|
||||
[ -n "$1" ] && procd_append_param command -n "$1"
|
||||
}
|
||||
config_list_foreach settings proxy_networks append_proxy
|
||||
|
||||
# Additional custom arguments
|
||||
if [ -n "$custom_params" ]; then
|
||||
for arg in $custom_params; do
|
||||
procd_append_param command "$arg"
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
procd_set_param respawn 3600 5 0
|
||||
procd_set_param stdout 1
|
||||
procd_set_param stderr 1
|
||||
procd_set_param user root
|
||||
procd_close_instance
|
||||
|
||||
setup_firewall_and_network "$dev_name" "$rpc_port"
|
||||
setup_dnsmasq
|
||||
logger -t "$NAME" "EasyTier core service started"
|
||||
|
||||
# 异步触发 WAN 放行策略更新(让 procd 优先 fork 启动核心进程,随后子进程原子联动查询 listeners 并下发规则)
|
||||
local allow_wan
|
||||
config_get_bool allow_wan settings allow_wan 0
|
||||
if [ "$allow_wan" -eq 1 ]; then
|
||||
(
|
||||
apply_wan_firewall "$rpc_port"
|
||||
) >/dev/null 2>&1 &
|
||||
else
|
||||
if uci -q get firewall.easytier_wan_inbound >/dev/null; then
|
||||
uci -q delete firewall.easytier_wan_inbound
|
||||
uci -q commit firewall
|
||||
/etc/init.d/firewall reload 2>/dev/null
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
update_firewall() {
|
||||
config_load easytier
|
||||
local dev_name rpc_port
|
||||
config_get dev_name settings dev_name 'easytier0'
|
||||
config_get rpc_port settings rpc_port '15888'
|
||||
setup_firewall_and_network "$dev_name" "$rpc_port"
|
||||
apply_wan_firewall "$rpc_port"
|
||||
}
|
||||
|
||||
start_web() {
|
||||
local web_enabled web_port web_dir
|
||||
|
||||
config_get_bool web_enabled settings web_enabled 0
|
||||
[ "$web_enabled" -eq 1 ] || return 0
|
||||
|
||||
[ -x "$WEB_PROG" ] || {
|
||||
logger -t "$NAME" "Web console executable $WEB_PROG not found"
|
||||
return 1
|
||||
}
|
||||
|
||||
config_get web_port settings web_html_port '22020'
|
||||
config_get web_dir settings web_dir '/etc/easytier'
|
||||
|
||||
mkdir -p "$web_dir"
|
||||
|
||||
procd_open_instance "web"
|
||||
procd_set_param command "$WEB_PROG" --db "$web_dir/easytier.db" --web-server-port "$web_port" --api-server-port "$web_port" --file-log-dir "$web_dir"
|
||||
procd_set_param respawn 3600 5 0
|
||||
procd_set_param stdout 1
|
||||
procd_set_param stderr 1
|
||||
procd_set_param user root
|
||||
procd_close_instance
|
||||
|
||||
logger -t "$NAME" "EasyTier web console started on port $web_port"
|
||||
}
|
||||
|
||||
start_service() {
|
||||
config_load easytier
|
||||
start_core
|
||||
start_web
|
||||
}
|
||||
|
||||
stop_service() {
|
||||
cleanup_dnsmasq
|
||||
# 停止服务联动清理 WAN 防火墙放行,防止离线后端口空置暴露
|
||||
if uci -q get firewall.easytier_wan_inbound >/dev/null; then
|
||||
uci -q delete firewall.easytier_wan_inbound
|
||||
uci -q commit firewall
|
||||
/etc/init.d/firewall reload 2>/dev/null
|
||||
fi
|
||||
logger -t "$NAME" "EasyTier services stopped"
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "easytier"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
#!/bin/sh
|
||||
|
||||
[ -z "$(uci -q get easytier.settings.machine_id)" ] && {
|
||||
new_uuid=""
|
||||
if [ -f /proc/sys/kernel/random/uuid ]; then
|
||||
new_uuid=$(cat /proc/sys/kernel/random/uuid 2>/dev/null)
|
||||
fi
|
||||
if [ -z "$new_uuid" ]; then
|
||||
new_uuid=$(tr -dc 'a-f0-9' < /dev/urandom 2>/dev/null | head -c 32 | sed -r 's/(.{8})(.{4})(.{4})(.{4})(.{12})/\1-\2-\3-\4-\5/')
|
||||
fi
|
||||
if [ -n "$new_uuid" ]; then
|
||||
uci -q set easytier.settings.machine_id="$new_uuid"
|
||||
uci -q commit easytier
|
||||
fi
|
||||
}
|
||||
|
||||
rm -f /tmp/luci-indexcache* 2>/dev/null
|
||||
rm -f /tmp/luci-modulecache/* 2>/dev/null
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,471 @@
|
||||
#!/usr/bin/env lua
|
||||
|
||||
local json = require "luci.jsonc"
|
||||
local nixio = require "nixio"
|
||||
local fs = require "nixio.fs"
|
||||
|
||||
local function trim(s)
|
||||
if type(s) ~= 'string' then return '' end
|
||||
return s:gsub("^%s+", ""):gsub("%s+$", "")
|
||||
end
|
||||
|
||||
local function exec_cmd(cmd)
|
||||
local f = io.popen(cmd)
|
||||
if not f then
|
||||
return { code = -1, stdout = {}, raw = "" }
|
||||
end
|
||||
local content = f:read("*a") or ""
|
||||
local success, msg, code = f:close()
|
||||
content = trim(content)
|
||||
local lines = {}
|
||||
for line in string.gmatch(content .. "\n", "(.-)\r?\n") do
|
||||
if line ~= "" then
|
||||
table.insert(lines, line)
|
||||
end
|
||||
end
|
||||
return {
|
||||
code = (type(success) == "number" and success) or (code or 0),
|
||||
stdout = lines,
|
||||
raw = content
|
||||
}
|
||||
end
|
||||
|
||||
local function get_procd_status(instance_name)
|
||||
local ubus_res = exec_cmd("ubus call service list '{\"name\":\"easytier\"}' 2>/dev/null")
|
||||
if ubus_res.raw and #ubus_res.raw > 0 then
|
||||
local parsed = json.parse(ubus_res.raw)
|
||||
if parsed and parsed.easytier and parsed.easytier.instances then
|
||||
local inst = parsed.easytier.instances[instance_name or 'core']
|
||||
if inst and inst.running then
|
||||
return { running = true, pid = inst.pid }
|
||||
end
|
||||
end
|
||||
end
|
||||
return { running = false }
|
||||
end
|
||||
|
||||
local function get_rogue_pid(bin_name, managed_pid)
|
||||
local res = exec_cmd("pidof " .. bin_name .. " 2>/dev/null")
|
||||
if res.raw and #res.raw > 0 then
|
||||
for pid in string.gmatch(res.raw, "%d+") do
|
||||
local num_pid = tonumber(pid)
|
||||
if num_pid and (managed_pid == nil or num_pid ~= managed_pid) then
|
||||
return num_pid
|
||||
end
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
local function get_service_state(bin_name, instance_name)
|
||||
local procd_st = get_procd_status(instance_name)
|
||||
local rogue_pid = get_rogue_pid(bin_name, procd_st.pid)
|
||||
|
||||
local state = "stopped"
|
||||
if procd_st.running then
|
||||
state = "managed"
|
||||
elseif rogue_pid then
|
||||
state = "unmanaged"
|
||||
end
|
||||
|
||||
return {
|
||||
state = state,
|
||||
running = (state ~= "stopped"),
|
||||
pid = procd_st.pid or rogue_pid
|
||||
}
|
||||
end
|
||||
|
||||
local function get_cached_version()
|
||||
local cache_file = '/tmp/easytier_version.cache'
|
||||
local bin_path = '/usr/bin/easytier-core'
|
||||
if not fs.access(bin_path) then return 'Unknown' end
|
||||
|
||||
local bin_st = fs.stat(bin_path)
|
||||
local cache_st = fs.stat(cache_file)
|
||||
|
||||
if cache_st and (cache_st.size or 0) > 0 and bin_st and (cache_st.mtime or 0) >= (bin_st.mtime or 0) then
|
||||
local cached = trim(fs.readfile(cache_file) or '')
|
||||
if cached ~= '' then return cached end
|
||||
end
|
||||
|
||||
local ver_res = exec_cmd(bin_path .. ' --version 2>/dev/null')
|
||||
if ver_res.stdout and #ver_res.stdout > 0 then
|
||||
local ver_line = trim(ver_res.stdout[1])
|
||||
if ver_line ~= '' then
|
||||
fs.writefile(cache_file, ver_line .. '\n')
|
||||
return ver_line
|
||||
end
|
||||
end
|
||||
return 'Unknown'
|
||||
end
|
||||
|
||||
local function get_route_info_map()
|
||||
local route_map = {}
|
||||
if not fs.access('/usr/bin/easytier-cli') then return route_map end
|
||||
local r_res = exec_cmd('/usr/bin/easytier-cli -o json route 2>/dev/null')
|
||||
if r_res.code == 0 and r_res.raw and #r_res.raw > 0 then
|
||||
local r_data = json.parse(r_res.raw)
|
||||
if r_data and type(r_data) == 'table' and #r_data > 0 then
|
||||
for _, item in ipairs(r_data) do
|
||||
local cidrs = trim(item.proxy_cidrs or '')
|
||||
local ip = trim(item.ipv4 or '')
|
||||
local host = trim(item.hostname or '')
|
||||
local next_hop_host = trim(item.next_hop_hostname_lat_first or item.next_hop_hostname or '')
|
||||
local next_hop_ip = trim(item.next_hop_ipv4_lat_first or item.next_hop_ipv4 or '')
|
||||
local path_len = item.path_len_lat_first ~= nil and item.path_len_lat_first or item.path_len
|
||||
local path_lat = item.path_latency_lat_first ~= nil and item.path_latency_lat_first or item.path_latency
|
||||
|
||||
local entry = {
|
||||
proxy_cidrs = cidrs,
|
||||
next_hop_hostname = next_hop_host,
|
||||
next_hop_ipv4 = next_hop_ip,
|
||||
path_len = path_len,
|
||||
path_latency = path_lat
|
||||
}
|
||||
|
||||
if ip ~= '' then
|
||||
route_map[ip] = entry
|
||||
local ip_clean = ip:match("^([^/]+)") or ip
|
||||
route_map[ip_clean] = entry
|
||||
end
|
||||
if host ~= '' then
|
||||
route_map[host] = entry
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return route_map
|
||||
end
|
||||
|
||||
local methods = {
|
||||
get_status = {
|
||||
args = {},
|
||||
call = function(args)
|
||||
local core_st = get_service_state('/usr/bin/easytier-core', 'core')
|
||||
local web_st = get_service_state('/usr/bin/easytier-web', 'web')
|
||||
|
||||
local data = {
|
||||
installed = fs.access('/usr/bin/easytier-core') and true or false,
|
||||
web_installed = fs.access('/usr/bin/easytier-web') and true or false,
|
||||
version = get_cached_version(),
|
||||
core = core_st,
|
||||
web = web_st,
|
||||
node_info = nil
|
||||
}
|
||||
|
||||
if core_st.running and fs.access('/usr/bin/easytier-cli') then
|
||||
local node_res = exec_cmd('/usr/bin/easytier-cli node 2>/dev/null')
|
||||
if node_res.raw and #node_res.raw > 0 then
|
||||
data.node_info = node_res.raw
|
||||
end
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
},
|
||||
|
||||
get_peers = {
|
||||
args = {},
|
||||
call = function(args)
|
||||
if not fs.access('/usr/bin/easytier-cli') then
|
||||
return { peers = {}, raw = '' }
|
||||
end
|
||||
|
||||
local route_map = get_route_info_map()
|
||||
|
||||
local json_res = exec_cmd('/usr/bin/easytier-cli -o json peer 2>/dev/null')
|
||||
if json_res.code == 0 and json_res.raw and #json_res.raw > 0 then
|
||||
local j_data = json.parse(json_res.raw)
|
||||
if j_data and type(j_data) == 'table' and #j_data > 0 then
|
||||
local peers = {}
|
||||
for _, item in ipairs(j_data) do
|
||||
local p_ip = trim(item.cidr or item.ipv4 or '')
|
||||
local p_host = trim(item.hostname or '')
|
||||
local p_ip_clean = p_ip:match("^([^/]+)") or p_ip
|
||||
local r_entry = route_map[p_ip] or route_map[p_ip_clean] or route_map[p_host] or {}
|
||||
local proxy_cidrs = r_entry.proxy_cidrs or ''
|
||||
local next_hop_hostname = r_entry.next_hop_hostname or ''
|
||||
local next_hop_ipv4 = r_entry.next_hop_ipv4 or ''
|
||||
local path_latency = r_entry.path_latency ~= nil and r_entry.path_latency or ''
|
||||
|
||||
table.insert(peers, {
|
||||
ipv4 = p_ip,
|
||||
hostname = p_host,
|
||||
proxy_cidrs = proxy_cidrs,
|
||||
next_hop_hostname = next_hop_hostname,
|
||||
next_hop_ipv4 = next_hop_ipv4,
|
||||
path_latency = path_latency,
|
||||
cost = trim(item.cost or ''),
|
||||
latency = (item.lat_ms ~= nil and item.lat_ms ~= '-') and tostring(item.lat_ms) or '-',
|
||||
loss_rate = trim(item.loss_rate or '-'),
|
||||
rx = trim(item.rx_bytes or '-'),
|
||||
tx = trim(item.tx_bytes or '-'),
|
||||
tunnel = trim(item.tunnel_proto or '-'),
|
||||
nat = trim(item.nat_type or '-'),
|
||||
version = trim(item.version or '-')
|
||||
})
|
||||
end
|
||||
return { peers = peers, raw = '' }
|
||||
end
|
||||
end
|
||||
|
||||
local peer_res = exec_cmd('/usr/bin/easytier-cli peer 2>/dev/null')
|
||||
local raw_output = peer_res.raw or ''
|
||||
local peers = {}
|
||||
|
||||
if peer_res.stdout and #peer_res.stdout > 0 then
|
||||
for _, line in ipairs(peer_res.stdout) do
|
||||
local trimmed = trim(line)
|
||||
if trimmed ~= '' and not (trimmed:match("[Ii]pv4") and trimmed:match("|")) and not trimmed:match("^[%-%+─━%=| ]+$") then
|
||||
local cols = {}
|
||||
for part in string.gmatch(trimmed, "[^|]+") do
|
||||
table.insert(cols, trim(part))
|
||||
end
|
||||
if #cols >= 2 then
|
||||
local peer_ip = trim(cols[1] or '')
|
||||
local peer_host = trim(cols[2] or '')
|
||||
local peer_ip_clean = peer_ip:match("^([^/]+)") or peer_ip
|
||||
local r_entry = route_map[peer_ip] or route_map[peer_ip_clean] or route_map[peer_host] or {}
|
||||
local proxy_cidrs = r_entry.proxy_cidrs or ''
|
||||
local next_hop_hostname = r_entry.next_hop_hostname or ''
|
||||
local next_hop_ipv4 = r_entry.next_hop_ipv4 or ''
|
||||
local path_latency = r_entry.path_latency ~= nil and r_entry.path_latency or ''
|
||||
|
||||
table.insert(peers, {
|
||||
ipv4 = peer_ip,
|
||||
hostname = peer_host,
|
||||
proxy_cidrs = proxy_cidrs,
|
||||
next_hop_hostname = next_hop_hostname,
|
||||
next_hop_ipv4 = next_hop_ipv4,
|
||||
path_latency = path_latency,
|
||||
cost = cols[3] or '-',
|
||||
latency = cols[4] or '-',
|
||||
loss_rate = cols[5] or '-',
|
||||
rx = cols[6] or '-',
|
||||
tx = cols[7] or '-',
|
||||
tunnel = cols[8] or '-',
|
||||
nat = cols[9] or '-',
|
||||
version = cols[10] or '-'
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return { peers = peers, raw = raw_output }
|
||||
end
|
||||
},
|
||||
|
||||
get_topology = {
|
||||
args = {},
|
||||
call = function(args)
|
||||
if not fs.access('/usr/bin/easytier-cli') then
|
||||
return { nodes = {} }
|
||||
end
|
||||
|
||||
local route_map = get_route_info_map()
|
||||
local res = exec_cmd('/usr/bin/easytier-cli -o json peer-center 2>/dev/null')
|
||||
if res.code == 0 and res.raw and #res.raw > 0 then
|
||||
local data = json.parse(res.raw)
|
||||
if data and type(data) == 'table' and #data > 0 then
|
||||
local valid_nodes = {}
|
||||
for _, n in ipairs(data) do
|
||||
local n_ip = trim(n.ipv4 or '')
|
||||
local n_host = trim(n.hostname or '')
|
||||
if n_host ~= '' and not n_host:lower():match("^unknown$") and n_ip ~= '' and n_ip ~= '-' then
|
||||
local n_ip_clean = n_ip:match("^([^/]+)") or n_ip
|
||||
local r_entry = route_map[n_ip] or route_map[n_ip_clean] or route_map[n_host] or {}
|
||||
n.proxy_cidrs = r_entry.proxy_cidrs or ''
|
||||
table.insert(valid_nodes, n)
|
||||
end
|
||||
end
|
||||
return { nodes = valid_nodes }
|
||||
end
|
||||
end
|
||||
return { nodes = {} }
|
||||
end
|
||||
},
|
||||
|
||||
get_subroutes = {
|
||||
args = {},
|
||||
call = function(args)
|
||||
local subnets = {}
|
||||
local seen = {}
|
||||
|
||||
local res = exec_cmd("ip -j route 2>/dev/null")
|
||||
if res.code == 0 and res.raw and #res.raw > 0 then
|
||||
local routes_json = json.parse(res.raw)
|
||||
if routes_json and type(routes_json) == 'table' then
|
||||
for _, r in ipairs(routes_json) do
|
||||
if r.dst and r.dst ~= 'default' and r.scope == 'link' and r.dst:find("%.") and r.dev ~= 'easytier0' and r.dev ~= 'lo' then
|
||||
if not seen[r.dst] then
|
||||
seen[r.dst] = true
|
||||
table.insert(subnets, r.dst)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if #subnets == 0 then
|
||||
local txt_res = exec_cmd("ip route 2>/dev/null")
|
||||
if txt_res.stdout and #txt_res.stdout > 0 then
|
||||
for _, line in ipairs(txt_res.stdout) do
|
||||
line = trim(line)
|
||||
if line ~= '' and not line:lower():match("^default") and not line:find("easytier0") and not line:find("lo") then
|
||||
local subnet, dev = line:match("^(%d+%.%d+%.%d+%.%d+/%d+)%s+dev%s+([^%s]+)")
|
||||
if subnet and dev and dev ~= 'easytier0' and dev ~= 'lo' and not seen[subnet] then
|
||||
seen[subnet] = true
|
||||
table.insert(subnets, subnet)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if #subnets == 0 then
|
||||
local net_res = exec_cmd("ubus call network.interface dump 2>/dev/null")
|
||||
if net_res.raw and #net_res.raw > 0 then
|
||||
local net_data = json.parse(net_res.raw)
|
||||
if net_data and net_data.interface then
|
||||
for _, iface in ipairs(net_data.interface) do
|
||||
if iface.interface ~= 'loopback' and iface.interface ~= 'easytier' and iface['ipv4-address'] then
|
||||
for _, addr in ipairs(iface['ipv4-address']) do
|
||||
local ip_str = addr.address
|
||||
local mask = addr.mask
|
||||
if ip_str and mask then
|
||||
local p1, p2, p3, p4 = ip_str:match("^(%d+)%.(%d+)%.(%d+)%.(%d+)$")
|
||||
if p1 and p2 and p3 and p4 then
|
||||
local subnet = ''
|
||||
if mask == 24 then
|
||||
subnet = string.format("%s.%s.%s.0/24", p1, p2, p3)
|
||||
elseif mask == 16 then
|
||||
subnet = string.format("%s.%s.0.0/16", p1, p2)
|
||||
elseif mask == 8 then
|
||||
subnet = string.format("%s.0.0.0/8", p1)
|
||||
else
|
||||
subnet = string.format("%s/%s", ip_str, mask)
|
||||
end
|
||||
if subnet ~= '' and not seen[subnet] then
|
||||
seen[subnet] = true
|
||||
table.insert(subnets, subnet)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return { routes = subnets }
|
||||
end
|
||||
},
|
||||
|
||||
get_logs = {
|
||||
args = {},
|
||||
call = function(args)
|
||||
local logs = {}
|
||||
local res = exec_cmd("logread -e easytier 2>/dev/null | tail -n 80")
|
||||
if res.stdout and #res.stdout > 0 then
|
||||
logs = res.stdout
|
||||
elseif fs.access('/tmp/easytier.log') then
|
||||
local f_res = exec_cmd("tail -n 80 /tmp/easytier.log 2>/dev/null")
|
||||
if f_res.stdout then logs = f_res.stdout end
|
||||
end
|
||||
return { logs = logs }
|
||||
end
|
||||
},
|
||||
|
||||
clear_logs = {
|
||||
args = {},
|
||||
call = function(args)
|
||||
fs.writefile('/tmp/easytier.log', '')
|
||||
fs.writefile('/tmp/easytier-web.log', '')
|
||||
return { success = true }
|
||||
end
|
||||
},
|
||||
|
||||
service_action = {
|
||||
args = { action = "action" },
|
||||
call = function(args)
|
||||
local action = args and args.action
|
||||
if not action then return { success = false, error = "Missing action" } end
|
||||
|
||||
if action == "restart" or action == "stop" then
|
||||
os.execute("killall -9 easytier-core easytier-web 2>/dev/null")
|
||||
end
|
||||
|
||||
if action == "start" or action == "restart" then
|
||||
os.execute("/etc/init.d/easytier restart >/dev/null 2>&1")
|
||||
elseif action == "stop" then
|
||||
os.execute("/etc/init.d/easytier stop >/dev/null 2>&1")
|
||||
end
|
||||
|
||||
return { success = true }
|
||||
end
|
||||
}
|
||||
}
|
||||
|
||||
local function parseInput()
|
||||
local parse = json.new()
|
||||
local done, err
|
||||
|
||||
while true do
|
||||
local chunk = io.read(4096)
|
||||
if not chunk or #chunk == 0 then
|
||||
break
|
||||
end
|
||||
done, err = parse:parse(chunk)
|
||||
if done then
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if not done then
|
||||
print(json.stringify({ error = err or "Incomplete input" }))
|
||||
os.exit(1)
|
||||
end
|
||||
|
||||
return parse:get()
|
||||
end
|
||||
|
||||
local function validateArgs(func, uargs)
|
||||
local method = methods[func]
|
||||
if not method then
|
||||
print(json.stringify({ error = "Method not found" }))
|
||||
os.exit(1)
|
||||
end
|
||||
|
||||
if type(uargs) ~= "table" then
|
||||
print(json.stringify({ error = "Invalid arguments" }))
|
||||
os.exit(1)
|
||||
end
|
||||
|
||||
uargs.ubus_rpc_session = nil
|
||||
|
||||
local margs = method.args or {}
|
||||
for k, _ in pairs(uargs) do
|
||||
if margs[k] == nil then
|
||||
print(json.stringify({ error = "Invalid argument: " .. tostring(k) }))
|
||||
os.exit(1)
|
||||
end
|
||||
end
|
||||
|
||||
return method
|
||||
end
|
||||
|
||||
if arg[1] == "list" then
|
||||
local rv = {}
|
||||
for name, method in pairs(methods) do
|
||||
rv[name] = method.args or {}
|
||||
end
|
||||
print((json.stringify(rv):gsub(":%[%]", ":{}")))
|
||||
elseif arg[1] == "call" then
|
||||
local args = parseInput()
|
||||
local method = validateArgs(arg[2], args)
|
||||
local result, code = method.call(args)
|
||||
print((json.stringify(result):gsub("^%[%]$", "{}")))
|
||||
os.exit(code or 0)
|
||||
end
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"admin/vpn/easytier": {
|
||||
"title": "EasyTier",
|
||||
"order": 92,
|
||||
"action": {
|
||||
"type": "view",
|
||||
"path": "easytier/main"
|
||||
},
|
||||
"depends": {
|
||||
"acl": [ "luci-app-easytier" ]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"luci-app-easytier": {
|
||||
"description": "Allow user access to EasyTier",
|
||||
"read": {
|
||||
"ubus": {
|
||||
"easytier": [
|
||||
"get_status",
|
||||
"get_peers",
|
||||
"get_topology",
|
||||
"get_config",
|
||||
"get_logs",
|
||||
"get_subroutes",
|
||||
"get_web_status",
|
||||
"get_version_info"
|
||||
]
|
||||
},
|
||||
"uci": [ "easytier" ],
|
||||
"file": {
|
||||
"/etc/easytier/config.toml": [ "read" ]
|
||||
}
|
||||
},
|
||||
"write": {
|
||||
"ubus": {
|
||||
"easytier": [
|
||||
"set_config",
|
||||
"clear_logs",
|
||||
"service_action",
|
||||
"toggle_service",
|
||||
"reset_web_db"
|
||||
]
|
||||
},
|
||||
"uci": [ "easytier" ],
|
||||
"file": {
|
||||
"/etc/easytier/config.toml": [ "write" ]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
'use strict';
|
||||
'require view';
|
||||
'require fs';
|
||||
'require poll';
|
||||
'require rpc';
|
||||
'require uci';
|
||||
'require form';
|
||||
@@ -15,10 +17,16 @@ return view.extend({
|
||||
expect: { result: [] }
|
||||
}),
|
||||
|
||||
getRuntimeStatus() {
|
||||
return L.resolveDefault(
|
||||
fs.exec_direct('/usr/libexec/luci-firewall-status', [], 'json'), {});
|
||||
},
|
||||
|
||||
load() {
|
||||
return Promise.all([
|
||||
this.callConntrackHelpers(),
|
||||
firewall.getDefaults()
|
||||
firewall.getDefaults(),
|
||||
this.getRuntimeStatus()
|
||||
]);
|
||||
},
|
||||
|
||||
@@ -29,9 +37,24 @@ return view.extend({
|
||||
return this.renderZones(data);
|
||||
},
|
||||
|
||||
renderZones([ctHelpers, fwDefaults]) {
|
||||
renderZones([ctHelpers, fwDefaults, runtimeStatus]) {
|
||||
let m, s, o, out;
|
||||
const fw4 = L.hasSystemFeature('firewall4');
|
||||
const runtimeStatusText = E('span', {}, [ '-' ]);
|
||||
const updateRuntimeStatus = (status) => {
|
||||
const natModes = {
|
||||
fullcone: 'FULLCONENAT',
|
||||
nat1: _('Broadcom Fullcone NAT1'),
|
||||
disabled: _('Disabled')
|
||||
};
|
||||
const natMode = natModes[status?.nat_mode] || _('Unknown');
|
||||
const tcpcca = status?.tcp_cca
|
||||
? status.tcp_cca.toUpperCase()
|
||||
: _('Unknown');
|
||||
|
||||
runtimeStatusText.textContent =
|
||||
_('Running status: %s, TCP congestion control algorithm is %s').format(natMode, tcpcca);
|
||||
};
|
||||
const addTCPCCAOption = () => {
|
||||
const tcpcca = s.option(form.ListValue, 'tcpcca', _('TCP CCA'),
|
||||
_('TCP congestion control algorithm.'));
|
||||
@@ -42,6 +65,8 @@ return view.extend({
|
||||
tcpcca.rmempty = false;
|
||||
};
|
||||
|
||||
updateRuntimeStatus(runtimeStatus);
|
||||
|
||||
m = new form.Map('firewall', _('Firewall - Zone Settings'),
|
||||
_('The firewall creates zones over your network interfaces to control network traffic flow.'));
|
||||
|
||||
@@ -462,6 +487,24 @@ return view.extend({
|
||||
o.filter = out.filter;
|
||||
o.cfgvalue = out.cfgvalue;
|
||||
|
||||
return m.render();
|
||||
return m.render().then(L.bind(function(mapEl) {
|
||||
const firstSection = mapEl.querySelector('.cbi-section');
|
||||
const statusSection = E('div', {
|
||||
'class': 'cbi-section firewall-runtime-status',
|
||||
'style': 'overflow-x:auto'
|
||||
}, [
|
||||
E('div', {
|
||||
'style': 'padding:.75em 1.5em;color:#008000;font-size:1em;font-weight:600;white-space:nowrap'
|
||||
}, [ runtimeStatusText ])
|
||||
]);
|
||||
|
||||
firstSection.parentNode.insertBefore(statusSection, firstSection);
|
||||
|
||||
poll.add(L.bind(function() {
|
||||
return this.getRuntimeStatus().then(updateRuntimeStatus);
|
||||
}, this), 5);
|
||||
|
||||
return mapEl;
|
||||
}, this));
|
||||
}
|
||||
});
|
||||
@@ -260,6 +260,22 @@ msgstr ""
|
||||
msgid "Destination zone"
|
||||
msgstr ""
|
||||
|
||||
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:49
|
||||
msgid "Disabled"
|
||||
msgstr ""
|
||||
|
||||
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:48
|
||||
msgid "Broadcom Fullcone NAT1"
|
||||
msgstr ""
|
||||
|
||||
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:56
|
||||
msgid "Running status: %s, TCP congestion control algorithm is %s"
|
||||
msgstr ""
|
||||
|
||||
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:54
|
||||
msgid "Unknown"
|
||||
msgstr ""
|
||||
|
||||
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:263
|
||||
msgid "Device name"
|
||||
msgstr ""
|
||||
|
||||
@@ -344,6 +344,18 @@ msgstr "TCP 拥塞控制算法"
|
||||
msgid "TCP congestion control algorithm."
|
||||
msgstr "TCP 拥塞控制算法。"
|
||||
|
||||
msgid "Running status: %s, TCP congestion control algorithm is %s"
|
||||
msgstr "当前运行状态:%s,TCP 拥塞控制算法为 %s"
|
||||
|
||||
msgid "Broadcom Fullcone NAT1"
|
||||
msgstr "Broadcom Fullcone NAT1"
|
||||
|
||||
msgid "Disabled"
|
||||
msgstr "已禁用"
|
||||
|
||||
msgid "Unknown"
|
||||
msgstr "未知"
|
||||
|
||||
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js:346
|
||||
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js:463
|
||||
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js:339
|
||||
|
||||
@@ -328,6 +328,18 @@ msgstr "啟用"
|
||||
msgid "Enable NAT Loopback"
|
||||
msgstr "啟用 NAT 回送"
|
||||
|
||||
msgid "Running status: %s, TCP congestion control algorithm is %s"
|
||||
msgstr "目前執行狀態:%s,TCP 壅塞控制演算法為 %s"
|
||||
|
||||
msgid "Broadcom Fullcone NAT1"
|
||||
msgstr "Broadcom Fullcone NAT1"
|
||||
|
||||
msgid "Disabled"
|
||||
msgstr "已停用"
|
||||
|
||||
msgid "Unknown"
|
||||
msgstr "未知"
|
||||
|
||||
#: applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js:43
|
||||
msgid "Enable SYN-flood protection"
|
||||
msgstr "啟用 SYN 洪水保護"
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
#!/bin/sh
|
||||
|
||||
tcp_cca="$(cat /proc/sys/net/ipv4/tcp_congestion_control 2>/dev/null)"
|
||||
nat_mode="disabled"
|
||||
|
||||
rules="$(iptables-save -t nat 2>/dev/null)"
|
||||
|
||||
if printf '%s\n' "$rules" | grep -q -- '--mode fullcone'; then
|
||||
nat_mode="nat1"
|
||||
elif printf '%s\n' "$rules" | grep -q -- '-j FULLCONENAT'; then
|
||||
nat_mode="fullcone"
|
||||
else
|
||||
rules="$(nft list ruleset 2>/dev/null)"
|
||||
|
||||
if printf '%s\n' "$rules" | grep -Eq 'masquerade[[:space:]]+fullcone'; then
|
||||
nat_mode="nat1"
|
||||
elif printf '%s\n' "$rules" | grep -Eq '(^|[[:space:]])fullcone([[:space:]]|$)'; then
|
||||
nat_mode="fullcone"
|
||||
fi
|
||||
fi
|
||||
|
||||
printf '{"nat_mode":"%s","tcp_cca":"%s"}\n' "$nat_mode" "$tcp_cca"
|
||||
@@ -2,8 +2,10 @@
|
||||
"luci-app-firewall": {
|
||||
"description": "Grant access to firewall configuration",
|
||||
"read": {
|
||||
"cgi-io": [ "exec" ],
|
||||
"file": {
|
||||
"/etc/firewall.user": [ "read" ]
|
||||
"/etc/firewall.user": [ "read" ],
|
||||
"/usr/libexec/luci-firewall-status": [ "exec" ]
|
||||
},
|
||||
"ubus": {
|
||||
"file": [ "read" ],
|
||||
|
||||
@@ -345,7 +345,7 @@ msgstr "启用 pprof"
|
||||
|
||||
#: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:132
|
||||
msgid "Enable service"
|
||||
msgstr ""
|
||||
msgstr "启用服务"
|
||||
|
||||
#: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:427
|
||||
msgid "Enable web HTTPS"
|
||||
|
||||
@@ -344,7 +344,7 @@ msgstr "啟用 pprof"
|
||||
|
||||
#: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:132
|
||||
msgid "Enable service"
|
||||
msgstr ""
|
||||
msgstr "啟用服務"
|
||||
|
||||
#: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:427
|
||||
msgid "Enable web HTTPS"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"PO-Revision-Date: 2026-09-01 13:11+0000\n"
|
||||
"Last-Translator: Martin Olmer <m_iv@seznam.cz>\n"
|
||||
"PO-Revision-Date: 2026-09-11 21:27+0000\n"
|
||||
"Last-Translator: Daniel Nylander <yeagersthlm@gmail.com>\n"
|
||||
"Language-Team: Swedish <https://hosted.weblate.org/projects/openwrt/"
|
||||
"luciapplicationsfrps/sv/>\n"
|
||||
"Language: sv\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 2026.9.dev0\n"
|
||||
"X-Generator: Weblate 2026.10.dev0\n"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:1000
|
||||
msgid "Access Control"
|
||||
@@ -16,11 +16,11 @@ msgstr "Åtkomstkontroll"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:1026
|
||||
msgid "Add new HTTP plugin..."
|
||||
msgstr ""
|
||||
msgstr "Lägg till nytt HTTP-insticksprogram …"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:266
|
||||
msgid "Additional auth scopes"
|
||||
msgstr ""
|
||||
msgstr "Ytterligare autentiseringsomfattningar"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:154
|
||||
msgid "Additional configs"
|
||||
@@ -28,15 +28,15 @@ msgstr "Ytterligare konfigurationer"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:267
|
||||
msgid "Additional scopes to include authentication information."
|
||||
msgstr ""
|
||||
msgstr "Ytterligare omfattningar som ska inkludera autentiseringsinformation."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:164
|
||||
msgid "Address that frps binds to."
|
||||
msgstr ""
|
||||
msgstr "Adress som frps binder till."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:210
|
||||
msgid "Address that proxy listeners bind to."
|
||||
msgstr ""
|
||||
msgstr "Adress som proxymottagare binder till."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:569
|
||||
msgid "Allow ports"
|
||||
@@ -44,11 +44,11 @@ msgstr "Tillåt portar"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:459
|
||||
msgid "Assets dir"
|
||||
msgstr ""
|
||||
msgstr "Resurskatalog"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:360
|
||||
msgid "Audience OIDC tokens should contain."
|
||||
msgstr ""
|
||||
msgstr "Målgrupp som OIDC-token ska innehålla."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:996
|
||||
msgid "Authentication"
|
||||
@@ -56,15 +56,15 @@ msgstr "Autentisering"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:247
|
||||
msgid "Authentication method"
|
||||
msgstr ""
|
||||
msgstr "Autentiseringsmetod"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:248
|
||||
msgid "Authentication method used to authenticate frpc."
|
||||
msgstr ""
|
||||
msgstr "Autentiseringsmetod som används för att autentisera frpc."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:601
|
||||
msgid "Authorized keys file for SSH tunnel gateway."
|
||||
msgstr ""
|
||||
msgstr "Fil med auktoriserade nycklar för SSH-tunnelgatewayen."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:163
|
||||
msgid "Bind address"
|
||||
@@ -76,21 +76,19 @@ msgstr "Bindningsport"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:987
|
||||
msgid "Collecting data ..."
|
||||
msgstr "Samlar in data ..."
|
||||
msgstr "Samlar in data …"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:333
|
||||
msgid "Command arguments passed to token source exec."
|
||||
msgstr ""
|
||||
"BindAddr anger adressen som servern binds till.<br />Som standard är värdet ”"
|
||||
"0.0.0.0”."
|
||||
msgstr "Kommandoargument som skickas till tokenkällans exec."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:310
|
||||
msgid ""
|
||||
"Command used to obtain the token. The init script adds --allow-"
|
||||
"unsafe=TokenSourceExec when this source type is used."
|
||||
msgstr ""
|
||||
"BindKcpPort anger KCP-porten som servern lyssnar på. Om värdet är 0 lyssnar "
|
||||
"servern inte efter KCP-anslutningar.<br />Som standard är värdet 0."
|
||||
"Kommando som används för att hämta token. Init-skriptet lägger till --allow-"
|
||||
"unsafe=TokenSourceExec när den här källtypen används."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:995
|
||||
msgid "Common Settings"
|
||||
@@ -98,34 +96,27 @@ msgstr "Vanliga inställningar"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:378
|
||||
msgid "Configuration key: log.level."
|
||||
msgstr ""
|
||||
"BindPort anger porten som servern lyssnar på.<br />Som standard är värdet "
|
||||
"7000."
|
||||
msgstr "Konfigurationsnyckel: log.level."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:556
|
||||
msgid "Configuration key: transport.quic.keepalivePeriod."
|
||||
msgstr ""
|
||||
"BindQuicPort anger QUIC-porten som servern lyssnar på. Om värdet är 0 "
|
||||
"lyssnar servern inte efter QUIC-anslutningar.<br />Som standard är värdet 0."
|
||||
msgstr "Konfigurationsnyckel: transport.quic.keepalivePeriod."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:560
|
||||
msgid "Configuration key: transport.quic.maxIdleTimeout."
|
||||
msgstr ""
|
||||
"BindUdpPort anger UDP-porten som servern lyssnar på. Om värdet är 0 lyssnar "
|
||||
"servern inte efter UDP-anslutningar.<br />Som standard är värdet 0."
|
||||
msgstr "Konfigurationsnyckel: transport.quic.maxIdleTimeout."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:564
|
||||
msgid "Configuration key: transport.quic.maxIncomingStreams."
|
||||
msgstr ""
|
||||
"Konfigurationsfiler som inkluderas i den tillfälliga konfigurationsfilen"
|
||||
msgstr "Konfigurationsnyckel: transport.quic.maxIncomingStreams."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:237
|
||||
msgid "Custom 404 page"
|
||||
msgstr ""
|
||||
msgstr "Anpassad 404-sida"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:517
|
||||
msgid "Detailed errors to client"
|
||||
msgstr ""
|
||||
msgstr "Detaljerade fel till klienten"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:385
|
||||
msgid "Disable log color"
|
||||
@@ -133,7 +124,7 @@ msgstr "Inaktivera logg-färg"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:386
|
||||
msgid "Disable log colors when log output is console."
|
||||
msgstr ""
|
||||
msgstr "Inaktivera loggfärger när loggutdata går till konsolen."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:274
|
||||
msgid "Disabled"
|
||||
@@ -147,31 +138,37 @@ msgstr ""
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:234
|
||||
msgid "Domain suffix for subdomain-based HTTP/HTTPS proxies."
|
||||
msgstr ""
|
||||
msgstr "Domänsuffix för HTTP/HTTPS-proxyer baserade på underdomäner."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:464
|
||||
msgid ""
|
||||
"Enable Go pprof debug/profiling endpoints on the web server. It only takes "
|
||||
"effect when web server port is set."
|
||||
msgstr ""
|
||||
"Aktivera Go pprof-slutpunkter för felsökning/profilering på webbservern. Det "
|
||||
"får endast effekt när webbserverporten är angiven."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:413
|
||||
msgid ""
|
||||
"Enable HTTPS for the frps web server. This switch controls whether "
|
||||
"webServer.tls.certFile and webServer.tls.keyFile are emitted."
|
||||
msgstr ""
|
||||
"Aktivera HTTPS för frps-webbservern. Den här växeln styr om "
|
||||
"webServer.tls.certFile och webServer.tls.keyFile genereras."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:473
|
||||
msgid "Enable Prometheus"
|
||||
msgstr ""
|
||||
msgstr "Aktivera Prometheus"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:490
|
||||
msgid "Enable TCP stream multiplexing. This setting must match frpc."
|
||||
msgstr ""
|
||||
"Aktivera TCP-strömmultiplexering. Den här inställningen måste stämma överens "
|
||||
"med frpc."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:463
|
||||
msgid "Enable pprof"
|
||||
msgstr ""
|
||||
msgstr "Aktivera pprof"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:102
|
||||
msgid "Enable service"
|
||||
@@ -179,7 +176,7 @@ msgstr ""
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:412
|
||||
msgid "Enable web HTTPS"
|
||||
msgstr ""
|
||||
msgstr "Aktivera HTTPS för webben"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:145
|
||||
msgid "Environment variable"
|
||||
@@ -187,15 +184,11 @@ msgstr "Miljövariabel"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:773
|
||||
msgid "Environment variable must use KEY=value format."
|
||||
msgstr ""
|
||||
"DashboardPort anger porten som instrumentpanelen lyssnar på. Om värdet är 0 "
|
||||
"startas inte instrumentpanelen.<br />Som standard är värdet 0."
|
||||
msgstr "Miljövariabeln måste använda formatet NYCKEL=värde."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:343
|
||||
msgid "Environment variables passed to token source exec. Use KEY=value."
|
||||
msgstr ""
|
||||
"DashboardPwd anger lösenordet som instrumentpanelen använder för "
|
||||
"inloggning.<br />Som standard är värdet ”admin”."
|
||||
msgstr "Miljövariabler som skickas till tokenkällans exec. Använd NYCKEL=värde."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:474
|
||||
msgid ""
|
||||
@@ -215,23 +208,23 @@ msgstr ""
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:531
|
||||
msgid "Force TLS"
|
||||
msgstr ""
|
||||
msgstr "Tvinga TLS"
|
||||
|
||||
#: applications/luci-app-frps/root/usr/share/rpcd/acl.d/luci-app-frps.json:3
|
||||
msgid "Grant access to LuCI app frps"
|
||||
msgstr ""
|
||||
msgstr "Ge åtkomst till LuCI-appen frps"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:1021
|
||||
msgid "HTTP Plugin Settings"
|
||||
msgstr ""
|
||||
msgstr "Inställningar för HTTP-insticksprogram"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:799
|
||||
msgid "HTTP plugin URL must include a host."
|
||||
msgstr ""
|
||||
msgstr "URL:en för HTTP-insticksprogrammet måste innehålla en värd."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:795
|
||||
msgid "HTTP plugin address must be a single address."
|
||||
msgstr ""
|
||||
msgstr "Adressen till HTTP-insticksprogrammet måste vara en enda adress."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:807
|
||||
msgid "HTTP plugin address must be host:port or an http:// or https:// URL."
|
||||
@@ -239,29 +232,31 @@ msgstr ""
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:611
|
||||
msgid "HTTP plugin backend address."
|
||||
msgstr ""
|
||||
msgstr "Serverdelsadress för HTTP-insticksprogrammet."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:815
|
||||
msgid ""
|
||||
"HTTP plugin operation must be a frps operation name, for example Login or "
|
||||
"NewProxy."
|
||||
msgstr ""
|
||||
"Åtgärden för HTTP-insticksprogrammet måste vara ett frps-åtgärdsnamn, till "
|
||||
"exempel Login eller NewProxy."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:783
|
||||
msgid "HTTP plugin path must start with /."
|
||||
msgstr ""
|
||||
msgstr "Sökvägen för HTTP-insticksprogrammet måste börja med /."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:622
|
||||
msgid "HTTP plugin request path."
|
||||
msgstr ""
|
||||
msgstr "Sökväg för HTTP-insticksprogrammets begäran."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:509
|
||||
msgid "Heartbeat timeout"
|
||||
msgstr ""
|
||||
msgstr "Tidsgräns för hjärtslag"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:510
|
||||
msgid "Heartbeat timeout in seconds."
|
||||
msgstr ""
|
||||
msgstr "Tidsgräns för hjärtslag i sekunder."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:171
|
||||
msgid "KCP bind port"
|
||||
@@ -270,11 +265,11 @@ msgstr "KCP-bindningsport"
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:184
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:203
|
||||
msgid "KCP bind port and QUIC bind port must be different."
|
||||
msgstr ""
|
||||
msgstr "KCP-bindningsporten och QUIC-bindningsporten måste vara olika."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:502
|
||||
msgid "Keepalive interval for TCP mux."
|
||||
msgstr ""
|
||||
msgstr "Keepalive-intervall för TCP-multiplexering."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:271
|
||||
msgid ""
|
||||
@@ -282,10 +277,13 @@ msgid ""
|
||||
"exec runs a command and requires frp unsafe permission. Mutually exclusive "
|
||||
"with auth.token."
|
||||
msgstr ""
|
||||
"Läs in token från en extern källa. File läser token från en lokal fil; exec "
|
||||
"kör ett kommando och kräver frp:s osäkra behörighet. Kan inte användas "
|
||||
"tillsammans med auth.token."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:1002
|
||||
msgid "Log Settings"
|
||||
msgstr ""
|
||||
msgstr "Logginställningar"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:377
|
||||
msgid "Log level"
|
||||
@@ -293,15 +291,15 @@ msgstr "Loggnivå"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:381
|
||||
msgid "Log max days"
|
||||
msgstr ""
|
||||
msgstr "Maximalt antal loggdagar"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:373
|
||||
msgid "Log output"
|
||||
msgstr ""
|
||||
msgstr "Loggutdata"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:374
|
||||
msgid "Log output path or console."
|
||||
msgstr ""
|
||||
msgstr "Sökväg för loggutdata eller konsol."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:122
|
||||
msgid "Log stderr"
|
||||
@@ -313,19 +311,19 @@ msgstr "Logga stdout"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:485
|
||||
msgid "Max pool count"
|
||||
msgstr ""
|
||||
msgstr "Maximalt antal pooler"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:578
|
||||
msgid "Max ports per client"
|
||||
msgstr ""
|
||||
msgstr "Maximalt antal portar per klient"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:382
|
||||
msgid "Maximum number of days to keep logs."
|
||||
msgstr ""
|
||||
msgstr "Maximalt antal dagar som loggar ska behållas."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:486
|
||||
msgid "Maximum pool count for each proxy."
|
||||
msgstr ""
|
||||
msgstr "Maximalt antal pooler för varje proxy."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:579
|
||||
msgid "Maximum ports each client can use. 0 means no limit."
|
||||
@@ -336,7 +334,7 @@ msgstr ""
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:514
|
||||
msgid "Maximum time to wait for a work connection."
|
||||
msgstr ""
|
||||
msgstr "Längsta väntetid för en arbetsanslutning."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:582
|
||||
msgid "NAT hole analysis reserve hours"
|
||||
@@ -351,141 +349,145 @@ msgstr "KÖRS INTE"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:359
|
||||
msgid "OIDC audience"
|
||||
msgstr ""
|
||||
msgstr "OIDC-målgrupp"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:355
|
||||
msgid "OIDC issuer"
|
||||
msgstr ""
|
||||
msgstr "OIDC-utfärdare"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:356
|
||||
msgid "OIDC issuer used to verify tokens."
|
||||
msgstr ""
|
||||
msgstr "OIDC-utfärdare som används för att verifiera token."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:363
|
||||
msgid "OIDC skip expiry check"
|
||||
msgstr ""
|
||||
msgstr "Hoppa över kontroll av OIDC-utgångstid"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:367
|
||||
msgid "OIDC skip issuer check"
|
||||
msgstr ""
|
||||
msgstr "Hoppa över kontroll av OIDC-utfärdare"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:146
|
||||
msgid "OS environments passed to frp for config file template, see %s."
|
||||
msgstr ""
|
||||
msgstr "OS-miljöer som skickas till frp för konfigurationsfilsmallen, se %s."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:532
|
||||
msgid "Only accept TLS-encrypted frpc connections."
|
||||
msgstr ""
|
||||
msgstr "Acceptera endast TLS-krypterade frpc-anslutningar."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:597
|
||||
msgid "Path for auto-generated private key."
|
||||
msgstr ""
|
||||
msgstr "Sökväg för automatiskt genererad privat nyckel."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:287
|
||||
msgid "Path of token file."
|
||||
msgstr ""
|
||||
msgstr "Sökväg till tokenfilen."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:238
|
||||
msgid "Path to custom 404 page for HTTP requests."
|
||||
msgstr ""
|
||||
msgstr "Sökväg till anpassad 404-sida för HTTP-begäranden."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:544
|
||||
msgid "Path to the TLS certificate file."
|
||||
msgstr ""
|
||||
msgstr "Sökväg till TLS-certifikatfilen."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:548
|
||||
msgid "Path to the TLS private key file."
|
||||
msgstr ""
|
||||
msgstr "Sökväg till TLS-filen med privat nyckel."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:424
|
||||
msgid "Path to the certificate file used by the HTTPS web server."
|
||||
msgstr ""
|
||||
msgstr "Sökväg till certifikatfilen som används av HTTPS-webbservern."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:442
|
||||
msgid "Path to the private key file used by the HTTPS web server."
|
||||
msgstr ""
|
||||
msgstr "Sökväg till filen med privat nyckel som används av HTTPS-webbservern."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:552
|
||||
msgid "Path to the trusted CA certificate file."
|
||||
msgstr ""
|
||||
msgstr "Sökväg till filen med betrott CA-certifikat."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:610
|
||||
msgid "Plugin address"
|
||||
msgstr ""
|
||||
msgstr "Insticksprogramadress"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:606
|
||||
msgid "Plugin name"
|
||||
msgstr ""
|
||||
msgstr "Insticksprogramnamn"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:632
|
||||
msgid "Plugin operations"
|
||||
msgstr ""
|
||||
msgstr "Insticksprogramåtgärder"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:621
|
||||
msgid "Plugin path"
|
||||
msgstr ""
|
||||
msgstr "Insticksprogramsökväg"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:214
|
||||
msgid "Port for HTTP virtual host requests. Empty or 0 disables it."
|
||||
msgstr ""
|
||||
"Port för HTTP-begäranden till virtuella värdar. Tom eller 0 inaktiverar den."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:218
|
||||
msgid "Port for HTTPS virtual host requests. Empty or 0 disables it."
|
||||
msgstr ""
|
||||
"Port för HTTPS-begäranden till virtuella värdar. Tom eller 0 inaktiverar den."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:226
|
||||
msgid "Port for TCPMUX HTTP CONNECT requests. Empty or 0 disables it."
|
||||
msgstr ""
|
||||
msgstr "Port för TCPMUX HTTP CONNECT-begäranden. Tom eller 0 inaktiverar den."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:737
|
||||
msgid "Port must be a number between 0 and 65535."
|
||||
msgstr ""
|
||||
msgstr "Porten måste vara ett tal mellan 0 och 65535."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:741
|
||||
msgid "Port must be between 0 and 65535."
|
||||
msgstr ""
|
||||
msgstr "Porten måste vara mellan 0 och 65535."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:760
|
||||
msgid "Port must be between 1 and 65535."
|
||||
msgstr ""
|
||||
msgstr "Porten måste vara mellan 1 och 65535."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:763
|
||||
msgid "Port range start must not be greater than end."
|
||||
msgstr ""
|
||||
msgstr "Starten för portintervallet får inte vara större än slutet."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:168
|
||||
msgid "Port that frps listens on."
|
||||
msgstr ""
|
||||
msgstr "Port som frps lyssnar på."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:570
|
||||
msgid ""
|
||||
"Ports clients are allowed to bind. Use single port like 3001 or range like "
|
||||
"2000-3000."
|
||||
msgstr ""
|
||||
"Portar som klienter får binda till. Använd en enskild port, till exempel "
|
||||
"3001, eller ett intervall som 2000–3000."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:593
|
||||
msgid "Private key file for SSH tunnel gateway."
|
||||
msgstr ""
|
||||
msgstr "Fil med privat nyckel för SSH-tunnelgatewayen."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:209
|
||||
msgid "Proxy bind address"
|
||||
msgstr ""
|
||||
msgstr "Bindningsadress för proxy"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:190
|
||||
msgid "QUIC bind port"
|
||||
msgstr ""
|
||||
msgstr "QUIC-bindningsport"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:555
|
||||
msgid "QUIC keepalive period"
|
||||
msgstr ""
|
||||
msgstr "QUIC-keepalive-period"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:559
|
||||
msgid "QUIC max idle timeout"
|
||||
msgstr ""
|
||||
msgstr "Högsta inaktivitetstid för QUIC"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:563
|
||||
msgid "QUIC max incoming streams"
|
||||
msgstr ""
|
||||
msgstr "Maximalt antal inkommande QUIC-strömmar"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:960
|
||||
msgid "RUNNING"
|
||||
@@ -493,15 +495,15 @@ msgstr "KÖRS"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:135
|
||||
msgid "Respawn when crashed"
|
||||
msgstr ""
|
||||
msgstr "Starta om efter krasch"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:222
|
||||
msgid "Response header timeout for vhost HTTP server, in seconds."
|
||||
msgstr ""
|
||||
msgstr "Tidsgräns i sekunder för svarshuvud från HTTP-server för virtuell värd."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:583
|
||||
msgid "Retention time for NAT hole punching strategy data."
|
||||
msgstr ""
|
||||
msgstr "Lagringstid för data om strategi för NAT-håltagning."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:133
|
||||
msgid "Run daemon as group"
|
||||
@@ -513,31 +515,31 @@ msgstr "Kör demonen som användare"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:1001
|
||||
msgid "SSH Tunnel"
|
||||
msgstr ""
|
||||
msgstr "SSH-tunnel"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:600
|
||||
msgid "SSH tunnel authorized keys file"
|
||||
msgstr ""
|
||||
msgstr "Fil med auktoriserade SSH-tunnelnycklar"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:596
|
||||
msgid "SSH tunnel auto-generated private key path"
|
||||
msgstr ""
|
||||
msgstr "Sökväg till automatiskt genererad privat nyckel för SSH-tunnel"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:588
|
||||
msgid "SSH tunnel bind port"
|
||||
msgstr ""
|
||||
msgstr "Bindningsport för SSH-tunnel"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:589
|
||||
msgid "SSH tunnel gateway bind port. Empty disables this feature."
|
||||
msgstr ""
|
||||
msgstr "Bindningsport för SSH-tunnelgateway. Tomt värde inaktiverar funktionen."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:592
|
||||
msgid "SSH tunnel private key file"
|
||||
msgstr ""
|
||||
msgstr "Fil med privat SSH-tunnelnyckel"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:518
|
||||
msgid "Send specific error details to frpc."
|
||||
msgstr ""
|
||||
msgstr "Skicka specifika feldetaljer till frpc."
|
||||
|
||||
#: applications/luci-app-frps/root/usr/share/luci/menu.d/luci-app-frps.json:11
|
||||
msgid "Server"
|
||||
@@ -546,10 +548,12 @@ msgstr "Server"
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:368
|
||||
msgid "Skip checking whether OIDC token issuer matches configured issuer."
|
||||
msgstr ""
|
||||
"Hoppa över kontrollen av att OIDC-tokenutfärdaren motsvarar den "
|
||||
"konfigurerade utfärdaren."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:364
|
||||
msgid "Skip checking whether the OIDC token is expired."
|
||||
msgstr ""
|
||||
msgstr "Hoppa över kontrollen av om OIDC-token har löpt ut."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:1003
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:1014
|
||||
@@ -558,57 +562,57 @@ msgstr "Inställningar för uppstart"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:233
|
||||
msgid "Subdomain host"
|
||||
msgstr ""
|
||||
msgstr "Värd för underdomäner"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:505
|
||||
msgid "TCP keepalive"
|
||||
msgstr ""
|
||||
msgstr "TCP-keepalive"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:506
|
||||
msgid "TCP keepalive interval. Negative value disables keepalive."
|
||||
msgstr ""
|
||||
msgstr "TCP-keepalive-intervall. Negativt värde inaktiverar keepalive."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:489
|
||||
msgid "TCP mux"
|
||||
msgstr ""
|
||||
msgstr "TCP-multiplexering"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:501
|
||||
msgid "TCP mux keepalive interval"
|
||||
msgstr ""
|
||||
msgstr "Keepalive-intervall för TCP-multiplexering"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:225
|
||||
msgid "TCPMUX HTTP CONNECT port"
|
||||
msgstr ""
|
||||
msgstr "TCPMUX HTTP CONNECT-port"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:229
|
||||
msgid "TCPMUX passthrough"
|
||||
msgstr ""
|
||||
msgstr "TCPMUX-genomsläpp"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:998
|
||||
msgid "TLS / QUIC"
|
||||
msgstr ""
|
||||
msgstr "TLS / QUIC"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:423
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:543
|
||||
msgid "TLS certificate path"
|
||||
msgstr ""
|
||||
msgstr "Sökväg till TLS-certifikat"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:435
|
||||
msgid "TLS certificate path is required when web HTTPS is enabled."
|
||||
msgstr ""
|
||||
msgstr "Sökväg till TLS-certifikat krävs när HTTPS för webben är aktiverat."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:441
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:547
|
||||
msgid "TLS private key path"
|
||||
msgstr ""
|
||||
msgstr "Sökväg till TLS-privatnyckel"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:453
|
||||
msgid "TLS private key path is required when web HTTPS is enabled."
|
||||
msgstr ""
|
||||
msgstr "Sökväg till TLS-privatnyckel krävs när HTTPS för webben är aktiverat."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:551
|
||||
msgid "TLS trusted CA path"
|
||||
msgstr ""
|
||||
msgstr "Sökväg till betrott TLS-CA"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:251
|
||||
msgid "Token"
|
||||
@@ -617,149 +621,156 @@ msgstr "Tecken"
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:260
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:280
|
||||
msgid "Token and token source are mutually exclusive."
|
||||
msgstr ""
|
||||
msgstr "Token och tokenkälla kan inte användas tillsammans."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:309
|
||||
msgid "Token source command"
|
||||
msgstr ""
|
||||
msgstr "Kommando för tokenkälla"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:332
|
||||
msgid "Token source command arguments"
|
||||
msgstr ""
|
||||
msgstr "Kommandoargument för tokenkälla"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:326
|
||||
msgid "Token source command is required when token source type is exec."
|
||||
msgstr ""
|
||||
msgstr "Kommandot för tokenkälla krävs när tokenkälltypen är exec."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:342
|
||||
msgid "Token source environment"
|
||||
msgstr ""
|
||||
msgstr "Miljö för tokenkälla"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:286
|
||||
msgid "Token source file"
|
||||
msgstr ""
|
||||
msgstr "Fil för tokenkälla"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:303
|
||||
msgid "Token source file path is required when token source type is file."
|
||||
msgstr ""
|
||||
msgstr "Sökväg till fil för tokenkälla krävs när tokenkälltypen är file."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:270
|
||||
msgid "Token source type"
|
||||
msgstr ""
|
||||
msgstr "Typ av tokenkälla"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:252
|
||||
msgid "Token used for authentication."
|
||||
msgstr ""
|
||||
msgstr "Token som används för autentisering."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:997
|
||||
msgid "Transport Settings"
|
||||
msgstr ""
|
||||
msgstr "Transportinställningar"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:241
|
||||
msgid "UDP packet size"
|
||||
msgstr ""
|
||||
msgstr "UDP-paketstorlek"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:242
|
||||
msgid "UDP packet size in bytes. Should match frpc."
|
||||
msgstr ""
|
||||
msgstr "UDP-paketstorlek i byte. Måste stämma överens med frpc."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:172
|
||||
msgid ""
|
||||
"UDP port used for KCP. Empty disables KCP. Do not reuse the same UDP port as "
|
||||
"QUIC."
|
||||
msgstr ""
|
||||
"UDP-port som används för KCP. Tomt värde inaktiverar KCP. Återanvänd inte "
|
||||
"samma UDP-port som QUIC."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:191
|
||||
msgid ""
|
||||
"UDP port used for QUIC. Empty disables QUIC. Do not reuse the same UDP port "
|
||||
"as KCP."
|
||||
msgstr ""
|
||||
"UDP-port som används för QUIC. Tomt värde inaktiverar QUIC. Återanvänd inte "
|
||||
"samma UDP-port som KCP."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:607
|
||||
msgid "Unique HTTP plugin name."
|
||||
msgstr ""
|
||||
msgstr "Unikt namn för HTTP-insticksprogram."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:754
|
||||
msgid "Use a single port like 3001 or a range like 2000-3000."
|
||||
msgstr ""
|
||||
"Använd en enskild port, till exempel 3001, eller ett intervall som 2000–3000."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:513
|
||||
msgid "User connection timeout"
|
||||
msgstr ""
|
||||
msgstr "Tidsgräns för användaranslutning"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:644
|
||||
msgid "Verify plugin TLS"
|
||||
msgstr ""
|
||||
msgstr "Verifiera TLS för insticksprogram"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:645
|
||||
msgid ""
|
||||
"Verify the HTTP plugin TLS certificate when the plugin address uses HTTPS."
|
||||
msgstr ""
|
||||
"Verifiera HTTP-insticksprogrammets TLS-certifikat när "
|
||||
"insticksprogramadressen använder HTTPS."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:213
|
||||
msgid "Vhost HTTP port"
|
||||
msgstr ""
|
||||
msgstr "HTTP-port för virtuell värd"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:221
|
||||
msgid "Vhost HTTP timeout"
|
||||
msgstr ""
|
||||
msgstr "HTTP-tidsgräns för virtuell värd"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:217
|
||||
msgid "Vhost HTTPS port"
|
||||
msgstr ""
|
||||
msgstr "HTTPS-port för virtuell värd"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:999
|
||||
msgid "Web Server"
|
||||
msgstr ""
|
||||
msgstr "Webbserver"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:391
|
||||
msgid "Web server address"
|
||||
msgstr ""
|
||||
msgstr "Webbserveradress"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:460
|
||||
msgid "Web server assets directory."
|
||||
msgstr ""
|
||||
msgstr "Resurskatalog för webbservern."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:392
|
||||
msgid "Web server bind address."
|
||||
msgstr ""
|
||||
msgstr "Webbserverns bindningsadress."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:405
|
||||
msgid "Web server password"
|
||||
msgstr ""
|
||||
msgstr "Webbserverlösenord"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:406
|
||||
msgid "Web server password."
|
||||
msgstr ""
|
||||
msgstr "Webbserverlösenord."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:395
|
||||
msgid "Web server port"
|
||||
msgstr ""
|
||||
msgstr "Webbserverport"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:396
|
||||
msgid "Web server port. Leave empty or set to 0 to disable the web server."
|
||||
msgstr ""
|
||||
msgstr "Webbserverport. Lämna tomt eller ange 0 för att inaktivera webbservern."
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:399
|
||||
msgid "Web server user"
|
||||
msgstr ""
|
||||
msgstr "Webbserveranvändare"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:400
|
||||
msgid "Web server username."
|
||||
msgstr ""
|
||||
msgstr "Webbserveranvändarnamn."
|
||||
|
||||
#: applications/luci-app-frps/root/usr/share/luci/menu.d/luci-app-frps.json:4
|
||||
msgid "frp"
|
||||
msgstr ""
|
||||
msgstr "frp"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:963
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:970
|
||||
msgid "frp Server"
|
||||
msgstr ""
|
||||
msgstr "frp-server"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:633
|
||||
msgid "frps operations handled by this HTTP plugin."
|
||||
msgstr ""
|
||||
msgstr "frps-åtgärder som hanteras av detta HTTP-insticksprogram."
|
||||
|
||||
#~ msgid "Advanced"
|
||||
#~ msgstr "Avancerat"
|
||||
@@ -171,7 +171,7 @@ msgstr "启用 pprof"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:102
|
||||
msgid "Enable service"
|
||||
msgstr ""
|
||||
msgstr "启用服务"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:412
|
||||
msgid "Enable web HTTPS"
|
||||
|
||||
@@ -170,7 +170,7 @@ msgstr "啟用 pprof"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:102
|
||||
msgid "Enable service"
|
||||
msgstr ""
|
||||
msgstr "啟用服務"
|
||||
|
||||
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:412
|
||||
msgid "Enable web HTTPS"
|
||||
|
||||
@@ -12,7 +12,7 @@ LUCI_DEPENDS:=+luci-base +logd +jsonfilter
|
||||
LUCI_PKGARCH:=all
|
||||
|
||||
PKG_VERSION:=0.1.41
|
||||
PKG_RELEASE:=14
|
||||
PKG_RELEASE:=15
|
||||
|
||||
# Reproducible build: honor SOURCE_DATE_EPOCH from the build environment (set by docker-sdk.sh / CI).
|
||||
ifdef SOURCE_DATE_EPOCH
|
||||
|
||||
@@ -18,6 +18,13 @@ return baseclass.extend({
|
||||
FETCH_LINES_MAX: 2000 /* ubus poll / logd ring cap (~2000 lines ≈ typical ring) */,
|
||||
/* DOM budget: ~250 new/updated rows painted per second on typical LuCI routers */
|
||||
RENDER_CAP_PER_SEC: 250,
|
||||
/* #306 Layer 2 — measured client RTT → poll cadence (seconds). */
|
||||
POLL_CADENCE_FAST_S: 1,
|
||||
POLL_CADENCE_MID_S: 2,
|
||||
POLL_CADENCE_SLOW_S: 5,
|
||||
POLL_RTT_FAST_MS: 300,
|
||||
POLL_RTT_SLOW_MS: 1500,
|
||||
POLL_RTT_STREAK: 3,
|
||||
VIEW_MODES: ['simple', 'detailed'],
|
||||
COLUMN_SETS: {
|
||||
simple: ['action', 'time', 'iface', 'flow', 'proto', 'rule'],
|
||||
|
||||
@@ -11,5 +11,5 @@
|
||||
* GENERATED — do not edit. Edit fwlive.css and run: node scripts/embed-fwlive-css.js
|
||||
*/
|
||||
return baseclass.extend({
|
||||
styleText: "\n.fwlive-map {\n\tmax-width: none;\n\twidth: 100%;\n\t--fwlive-pass-color: var(--success-color-high, var(--success-color, #46a546));\n\t--fwlive-deny-color: var(--error-color-high, var(--error-color, #ca3c3c));\n\t--fwlive-bg-medium: var(--background-color-medium, var(--white-color-low, #f9f9f9));\n\t--fwlive-paused-color: #b45309;\n}\n/* Wide page in Detail only — Simple keeps LuCI’s 940px column. */\n#maincontent.container:has(.fwlive-map[data-view=\"detailed\"]) {\n\tmax-width: none;\n\tpadding-left: 16px;\n\tpadding-right: 16px;\n}\n.fwlive-map[data-row-tint=\"accessible\"] {\n\t--fwlive-pass-color: #0d9488;\n\t--fwlive-deny-color: #c2410c;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row,\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tbackground: rgba(180, 83, 9, 0.08);\n\tbackground: color-mix(in srgb, var(--fwlive-paused-color) 8%, transparent);\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row {\n\tmargin: 0 -8px;\n\tpadding: 6px 8px 0;\n\tborder-radius: 3px 3px 0 0;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tmargin: 0 -8px 10px;\n\tpadding: 8px;\n\tborder-radius: 0 0 3px 3px;\n\tborder-bottom-color: transparent;\n}\n.fwlive-title-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: baseline;\n\tjustify-content: space-between;\n\tgap: 8px 16px;\n\tmargin: 0 0 4px;\n}\n.fwlive-title-row h2 {\n\tmargin: 0;\n\tflex: 0 1 auto;\n}\n.fwlive-title-status {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tflex-wrap: wrap;\n\tmin-width: 0;\n\tmargin-left: auto;\n}\n.fwlive-watch-strip {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: stretch;\n\tjustify-content: flex-start;\n\tgap: 0;\n\tmin-height: 40px;\n\tpadding: 8px 0 10px;\n\tborder-bottom: 1px solid var(--border-color-medium);\n\tmargin-bottom: 10px;\n}\n.fwlive-watch-group {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tmin-height: 28px;\n\tpadding: 0 10px;\n\tborder-left: 1px solid var(--border-color-medium);\n\tflex-wrap: wrap;\n}\n.fwlive-watch-group:last-child {\n\tpadding-right: 0;\n}\n.fwlive-watch-group-label {\n\tmargin-right: 2px;\n\tcolor: var(--text-color-medium);\n\tfont-size: 0.72em;\n\tfont-weight: 700;\n\tletter-spacing: 0.08em;\n\ttext-transform: uppercase;\n\twhite-space: nowrap;\n}\n.fwlive-watch-seg {\n\tdisplay: inline-flex;\n\talign-items: stretch;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\toverflow: hidden;\n}\n.fwlive-watch-seg .fwlive-seg-btn {\n\tmargin: 0;\n\tborder: 0;\n\tborder-radius: 0;\n\tborder-right: 1px solid var(--border-color-medium);\n\tbackground: transparent;\n\tpadding: 4px 10px;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n}\n.fwlive-watch-seg .fwlive-seg-btn:last-child {\n\tborder-right: 0;\n}\n.fwlive-watch-seg .fwlive-seg-btn[aria-pressed=\"true\"] {\n\tbackground: rgba(26, 111, 156, 0.12);\n\tbackground: color-mix(in srgb, var(--primary-color-high) 12%, transparent);\n\tcolor: var(--primary-color-high);\n\tfont-weight: 600;\n}\n.fwlive-watch-label { font-weight: 600; }\n.fwlive-watch-paused .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-map.fwlive-watch-paused .fwlive-title-status .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-dot {\n\twidth: 8px;\n\theight: 8px;\n\tborder-radius: 50%;\n\tbackground: var(--text-color-low, var(--border-color-high));\n\tdisplay: inline-block;\n\tflex-shrink: 0;\n}\n.fwlive-dot.fwlive-dot-on {\n\tbackground: var(--fwlive-pass-color);\n\tbox-shadow: 0 0 0 3px color-mix(in srgb, var(--fwlive-pass-color) 22%, transparent);\n}\n.fwlive-btn-ghost {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n}\n.fwlive-btn-quiet {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n\tcolor: var(--text-color-medium);\n\tfont-weight: 500;\n}\n.fwlive-log-merged {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 10px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-medium, var(--white-color-low, var(--background-color-high)));\n\tcolor: var(--text-color-high);\n\tfont-weight: 500;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n\tcursor: pointer;\n}\n.fwlive-log-merged:hover {\n\tbackground: var(--background-color-low, var(--background-color-medium));\n}\n.fwlive-log-merged:disabled {\n\topacity: 0.65;\n\tcursor: default;\n}\n.fwlive-log-on-dot {\n\twidth: 6px;\n\theight: 6px;\n\tborder-radius: 50%;\n\tbackground: var(--fwlive-pass-color);\n\tflex-shrink: 0;\n}\n.fwlive-log-rate {\n\tcolor: var(--text-color-medium);\n\tfont-weight: 400;\n}\n.fwlive-display-bar {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px 14px;\n\tmargin: 0 0 12px;\n\tpadding: 8px 12px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-high);\n}\n.fwlive-display-bar-label {\n\tflex: 0 0 auto;\n\tfoLine truncated
|
||||
styleText: "\n.fwlive-map {\n\tmax-width: none;\n\twidth: 100%;\n\t--fwlive-pass-color: var(--success-color-high, var(--success-color, #46a546));\n\t--fwlive-deny-color: var(--error-color-high, var(--error-color, #ca3c3c));\n\t--fwlive-bg-medium: var(--background-color-medium, var(--white-color-low, #f9f9f9));\n\t--fwlive-paused-color: #b45309;\n}\n/* Wide page in Detail only — Simple keeps LuCI’s 940px column. */\n#maincontent.container:has(.fwlive-map[data-view=\"detailed\"]) {\n\tmax-width: none;\n\tpadding-left: 16px;\n\tpadding-right: 16px;\n}\n.fwlive-map[data-row-tint=\"accessible\"] {\n\t--fwlive-pass-color: #0d9488;\n\t--fwlive-deny-color: #c2410c;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row,\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tbackground: rgba(180, 83, 9, 0.08);\n\tbackground: color-mix(in srgb, var(--fwlive-paused-color) 8%, transparent);\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row {\n\tmargin: 0 -8px;\n\tpadding: 6px 8px 0;\n\tborder-radius: 3px 3px 0 0;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tmargin: 0 -8px 10px;\n\tpadding: 8px;\n\tborder-radius: 0 0 3px 3px;\n\tborder-bottom-color: transparent;\n}\n.fwlive-title-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: baseline;\n\tjustify-content: space-between;\n\tgap: 8px 16px;\n\tmargin: 0 0 4px;\n}\n.fwlive-title-row h2 {\n\tmargin: 0;\n\tflex: 0 1 auto;\n}\n.fwlive-title-status {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tflex-wrap: wrap;\n\tmin-width: 0;\n\tmargin-left: auto;\n}\n.fwlive-watch-strip {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: stretch;\n\tjustify-content: flex-start;\n\tgap: 0;\n\tmin-height: 40px;\n\tpadding: 8px 0 10px;\n\tborder-bottom: 1px solid var(--border-color-medium);\n\tmargin-bottom: 10px;\n}\n.fwlive-watch-group {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tmin-height: 28px;\n\tpadding: 0 10px;\n\tborder-left: 1px solid var(--border-color-medium);\n\tflex-wrap: wrap;\n}\n.fwlive-watch-group:last-child {\n\tpadding-right: 0;\n}\n.fwlive-watch-group-label {\n\tmargin-right: 2px;\n\tcolor: var(--text-color-medium);\n\tfont-size: 0.72em;\n\tfont-weight: 700;\n\tletter-spacing: 0.08em;\n\ttext-transform: uppercase;\n\twhite-space: nowrap;\n}\n.fwlive-watch-seg {\n\tdisplay: inline-flex;\n\talign-items: stretch;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\toverflow: hidden;\n}\n.fwlive-watch-seg .fwlive-seg-btn {\n\tmargin: 0;\n\tborder: 0;\n\tborder-radius: 0;\n\tborder-right: 1px solid var(--border-color-medium);\n\tbackground: transparent;\n\tpadding: 4px 10px;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n}\n.fwlive-watch-seg .fwlive-seg-btn:last-child {\n\tborder-right: 0;\n}\n.fwlive-watch-seg .fwlive-seg-btn[aria-pressed=\"true\"] {\n\tbackground: rgba(26, 111, 156, 0.12);\n\tbackground: color-mix(in srgb, var(--primary-color-high) 12%, transparent);\n\tcolor: var(--primary-color-high);\n\tfont-weight: 600;\n}\n.fwlive-watch-label { font-weight: 600; }\n.fwlive-watch-paused .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-map.fwlive-watch-paused .fwlive-title-status .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-dot {\n\twidth: 8px;\n\theight: 8px;\n\tborder-radius: 50%;\n\tbackground: var(--text-color-low, var(--border-color-high));\n\tdisplay: inline-block;\n\tflex-shrink: 0;\n}\n.fwlive-dot.fwlive-dot-on {\n\tbackground: var(--fwlive-pass-color);\n\tbox-shadow: 0 0 0 3px color-mix(in srgb, var(--fwlive-pass-color) 22%, transparent);\n}\n.fwlive-btn-ghost {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n}\n.fwlive-btn-quiet {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n\tcolor: var(--text-color-medium);\n\tfont-weight: 500;\n}\n.fwlive-log-merged {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 10px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-medium, var(--white-color-low, var(--background-color-high)));\n\tcolor: var(--text-color-high);\n\tfont-weight: 500;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n\tcursor: pointer;\n}\n.fwlive-log-merged:hover {\n\tbackground: var(--background-color-low, var(--background-color-medium));\n}\n.fwlive-log-merged:disabled {\n\topacity: 0.65;\n\tcursor: default;\n}\n.fwlive-log-on-dot {\n\twidth: 6px;\n\theight: 6px;\n\tborder-radius: 50%;\n\tbackground: var(--fwlive-pass-color);\n\tflex-shrink: 0;\n}\n.fwlive-log-rate {\n\tcolor: var(--text-color-medium);\n\tfont-weight: 400;\n}\n.fwlive-display-bar {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px 14px;\n\tmargin: 0 0 12px;\n\tpadding: 8px 12px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-high);\n}\n.fwlive-display-bar-label {\n\tflex: 0 0 auto;\n\tfoLine truncated
|
||||
});
|
||||
@@ -660,6 +660,16 @@
|
||||
color: var(--text-color-high);
|
||||
font-size: 0.92em;
|
||||
}
|
||||
.fwlive-adaptive {
|
||||
display: none;
|
||||
margin: 0 0 10px;
|
||||
padding: 8px 12px;
|
||||
background: var(--background-color-low);
|
||||
border: 1px solid var(--border-color-medium);
|
||||
border-radius: 3px;
|
||||
color: var(--text-color-high);
|
||||
font-size: 0.92em;
|
||||
}
|
||||
.fwlive-tint-warn {
|
||||
display: none;
|
||||
color: var(--warn-color-high);
|
||||
|
||||
@@ -35,8 +35,8 @@ const callFwliveRules = rpc.declare({
|
||||
const callFwliveResolve = rpc.declare({
|
||||
object: 'fwlive',
|
||||
method: 'resolve',
|
||||
params: ['addresses'],
|
||||
expect: { names: {} }
|
||||
params: ['addresses']
|
||||
/* Full reply kept so disabled:"load" reaches the view (#306 Layer 2). */
|
||||
});
|
||||
|
||||
const callFwliveLoggingStatus = rpc.declare({
|
||||
@@ -102,12 +102,25 @@ return view.extend({
|
||||
resumeMerge: false,
|
||||
pollFn: null,
|
||||
pollDataInFlight: false,
|
||||
/* #306 Layer 2 — visibility / RTT cadence / shed surfacing. */
|
||||
pollEpoch: 0,
|
||||
pollCadenceSec: 1,
|
||||
rttStreakKind: null,
|
||||
rttStreakCount: 0,
|
||||
serverAdaptive: 1,
|
||||
serverTruncated: 0,
|
||||
serverShed: null,
|
||||
degradedSampling: false,
|
||||
resolveLoadShed: false,
|
||||
visibilityBound: false,
|
||||
renderRaf: 0,
|
||||
filterInputTimer: null,
|
||||
messageLayout: 'wrap',
|
||||
renderBucket: constants.RENDER_CAP_PER_SEC,
|
||||
renderBucketMs: 0,
|
||||
floodSuppressed: false,
|
||||
pendingForceRender: false,
|
||||
pendingRenderEpoch: null,
|
||||
lastPollNewEvents: 0,
|
||||
showHostnames: false,
|
||||
rowTint: constants.DEFAULT_ROW_TINT,
|
||||
@@ -702,7 +715,11 @@ return view.extend({
|
||||
async fetchEntries() {
|
||||
if (!this.sessionSeen) this.sessionSeen = new Set();
|
||||
|
||||
const epoch = this.pollEpoch;
|
||||
const resumeMerge = !!this.resumeMerge;
|
||||
const t0 = this.nowMs();
|
||||
let reply;
|
||||
let errored = false;
|
||||
try {
|
||||
/* Raw logd lines, not post-filter rows. Fetch a multiple of the
|
||||
* display limit so mixed syslog still fills the table; pause
|
||||
@@ -714,25 +731,44 @@ return view.extend({
|
||||
addresses: [String(fetchLines)]
|
||||
});
|
||||
} catch (e) {
|
||||
this.lastPollError = true;
|
||||
return;
|
||||
errored = true;
|
||||
reply = null;
|
||||
}
|
||||
/* Full poll object (no rpc expect strip). error → banner; log → rows. */
|
||||
|
||||
if (epoch !== this.pollEpoch) return;
|
||||
|
||||
const rtt = this.nowMs() - t0;
|
||||
|
||||
if (!reply || typeof reply !== 'object' || Array.isArray(reply)) {
|
||||
this.lastPollError = true;
|
||||
this.notePollRtt(rtt, true);
|
||||
this.updateAdaptiveBanner();
|
||||
return;
|
||||
}
|
||||
if (reply.error) {
|
||||
this.lastPollError = true;
|
||||
this.notePollRtt(rtt, true);
|
||||
this.updateAdaptiveBanner();
|
||||
return;
|
||||
}
|
||||
const raw = reply.log;
|
||||
if (!Array.isArray(raw)) {
|
||||
this.lastPollError = true;
|
||||
this.notePollRtt(rtt, true);
|
||||
this.updateAdaptiveBanner();
|
||||
return;
|
||||
}
|
||||
|
||||
this.lastPollError = false;
|
||||
this.serverAdaptive = reply.adaptive === 0 || reply.adaptive === false ? 0 : 1;
|
||||
this.serverTruncated = reply.truncated ? 1 : 0;
|
||||
this.serverShed =
|
||||
reply.shed && typeof reply.shed === 'object' && !Array.isArray(reply.shed)
|
||||
? reply.shed
|
||||
: null;
|
||||
|
||||
this.notePollRtt(rtt, errored);
|
||||
this.updateAdaptiveBanner();
|
||||
|
||||
const batch = this.normalizePollBatch(raw);
|
||||
this.lastPollNewEvents = batch.pollNew;
|
||||
@@ -740,10 +776,13 @@ return view.extend({
|
||||
/* Oldest-first ring buffer; filteredRows() reverses for newest-first display. */
|
||||
this.entries = buffer.applyFetchedEntries(this.entries, batch.rows, {
|
||||
paused: this.paused,
|
||||
resumeMerge: this.resumeMerge,
|
||||
resumeMerge: resumeMerge,
|
||||
rowLimit: this.rowLimit,
|
||||
fetchLinesMax: constants.FETCH_LINES_MAX
|
||||
});
|
||||
/* A stale request returns above. Keep this obligation until a current
|
||||
* request has actually applied the merged batch. */
|
||||
if (resumeMerge) this.resumeMerge = false;
|
||||
},
|
||||
|
||||
rememberSessionId(id) {
|
||||
@@ -772,11 +811,217 @@ return view.extend({
|
||||
const cap = this.ingestCap();
|
||||
if (this.entries.length >= cap && cap > 0) bits.push(_('buffer full'));
|
||||
if (this.floodSuppressed) bits.push(_('render paused (high rate)'));
|
||||
if (this.degradedSampling && this.serverAdaptive !== 0) bits.push(_('Degraded — sampling'));
|
||||
if (this.serverTruncated && this.serverAdaptive !== 0) bits.push(_('truncated'));
|
||||
if (this.resolveLoadShed && this.serverAdaptive !== 0)
|
||||
bits.push(_('resolve paused (load)'));
|
||||
if (!this.paused && !this.followLive)
|
||||
bits.push(_('scroll frozen — scroll to top to follow live'));
|
||||
return bits.length ? ' — ' + bits.join(', ') : '';
|
||||
},
|
||||
|
||||
nowMs() {
|
||||
if (typeof performance !== 'undefined' && performance.now) return performance.now();
|
||||
return Date.now();
|
||||
},
|
||||
|
||||
isTabHidden() {
|
||||
return typeof document !== 'undefined' && !!document.hidden;
|
||||
},
|
||||
|
||||
/* Classify one RTT sample into hysteresis buckets (#306).
|
||||
* error and >1.5s share the slow/degraded streak so mixed failures still trip N=3. */
|
||||
rttKindFromMs(ms, errored) {
|
||||
if (errored) return 'slow';
|
||||
if (!(ms >= 0)) return 'slow';
|
||||
if (ms < constants.POLL_RTT_FAST_MS) return 'fast';
|
||||
if (ms <= constants.POLL_RTT_SLOW_MS) return 'mid';
|
||||
return 'slow';
|
||||
},
|
||||
|
||||
cadenceForKind(kind) {
|
||||
if (kind === 'fast') return constants.POLL_CADENCE_FAST_S;
|
||||
if (kind === 'mid') return constants.POLL_CADENCE_MID_S;
|
||||
return constants.POLL_CADENCE_SLOW_S;
|
||||
},
|
||||
|
||||
resetRttHistory() {
|
||||
this.rttStreakKind = null;
|
||||
this.rttStreakCount = 0;
|
||||
},
|
||||
|
||||
bumpPollEpoch() {
|
||||
this.pollEpoch = (this.pollEpoch || 0) + 1;
|
||||
return this.pollEpoch;
|
||||
},
|
||||
|
||||
clientBackoffEnabled() {
|
||||
return this.serverAdaptive !== 0;
|
||||
},
|
||||
|
||||
setPollCadence(sec) {
|
||||
const next = sec > 0 ? sec : constants.POLL_CADENCE_FAST_S;
|
||||
if (!this.pollFn) {
|
||||
this.pollCadenceSec = next;
|
||||
return;
|
||||
}
|
||||
if (this.isTabHidden()) {
|
||||
this.pollCadenceSec = next;
|
||||
return;
|
||||
}
|
||||
try {
|
||||
poll.remove(this.pollFn);
|
||||
} catch (e) {
|
||||
/* poll gone */
|
||||
}
|
||||
this.pollCadenceSec = next;
|
||||
try {
|
||||
poll.add(this.pollFn, next);
|
||||
} catch (e) {
|
||||
/* poll gone */
|
||||
}
|
||||
},
|
||||
|
||||
notePollRtt(ms, errored) {
|
||||
if (!this.clientBackoffEnabled()) {
|
||||
this.degradedSampling = false;
|
||||
/* Drop any partial streak so a slow sample from before the
|
||||
* adaptive:0 window cannot trip degraded on re-enable. */
|
||||
this.resetRttHistory();
|
||||
if (this.pollCadenceSec !== constants.POLL_CADENCE_FAST_S)
|
||||
this.setPollCadence(constants.POLL_CADENCE_FAST_S);
|
||||
return;
|
||||
}
|
||||
|
||||
const kind = this.rttKindFromMs(ms, errored);
|
||||
if (kind === this.rttStreakKind) this.rttStreakCount++;
|
||||
else {
|
||||
this.rttStreakKind = kind;
|
||||
this.rttStreakCount = 1;
|
||||
}
|
||||
|
||||
if (this.rttStreakCount < constants.POLL_RTT_STREAK) return;
|
||||
|
||||
const cadence = this.cadenceForKind(kind);
|
||||
this.degradedSampling = cadence === constants.POLL_CADENCE_SLOW_S;
|
||||
if (cadence !== this.pollCadenceSec) this.setPollCadence(cadence);
|
||||
},
|
||||
|
||||
stopPollingForHidden() {
|
||||
if (!this.pollFn) return;
|
||||
try {
|
||||
poll.remove(this.pollFn);
|
||||
} catch (e) {
|
||||
/* poll gone */
|
||||
}
|
||||
},
|
||||
|
||||
resumePollingAfterVisible() {
|
||||
this.bumpPollEpoch();
|
||||
this.resetRttHistory();
|
||||
/* In-flight poll from the hidden epoch must not apply after catch-up. */
|
||||
this.pollDataInFlight = false;
|
||||
if (!this.pollFn) this.pollFn = this.pollData.bind(this);
|
||||
this.setPollCadence(this.pollCadenceSec || constants.POLL_CADENCE_FAST_S);
|
||||
this.pollData();
|
||||
},
|
||||
|
||||
onVisibilityChange() {
|
||||
if (this.isTabHidden()) {
|
||||
this.stopPollingForHidden();
|
||||
this.bumpPollEpoch();
|
||||
return;
|
||||
}
|
||||
this.resumePollingAfterVisible();
|
||||
},
|
||||
|
||||
bindVisibility() {
|
||||
if (this.visibilityBound) return;
|
||||
if (typeof document === 'undefined' || !document.addEventListener) return;
|
||||
this.visibilityBound = true;
|
||||
this.visibilityHandler = function () {
|
||||
this.onVisibilityChange();
|
||||
}.bind(this);
|
||||
document.addEventListener('visibilitychange', this.visibilityHandler);
|
||||
},
|
||||
|
||||
unbindVisibility() {
|
||||
if (
|
||||
typeof document !== 'undefined' &&
|
||||
document.removeEventListener &&
|
||||
this.visibilityHandler
|
||||
) {
|
||||
try {
|
||||
document.removeEventListener('visibilitychange', this.visibilityHandler);
|
||||
} catch (e) {
|
||||
/* document gone */
|
||||
}
|
||||
}
|
||||
this.visibilityHandler = null;
|
||||
this.visibilityBound = false;
|
||||
},
|
||||
|
||||
updateAdaptiveBanner() {
|
||||
const el = document.getElementById('fwlive-adaptive');
|
||||
if (!el) return;
|
||||
if (!el.style) el.style = { display: '' };
|
||||
|
||||
if (!this.clientBackoffEnabled()) {
|
||||
el.style.display = 'none';
|
||||
el.textContent = '';
|
||||
return;
|
||||
}
|
||||
|
||||
const parts = [];
|
||||
if (this.degradedSampling)
|
||||
parts.push(_('Degraded — sampling (slow poll RTT; cadence reduced).'));
|
||||
if (this.serverShed && this.serverShed.limit)
|
||||
parts.push(
|
||||
_('Server shedding — at most %d log lines per poll.').format(this.serverShed.limit)
|
||||
);
|
||||
else if (this.serverTruncated) parts.push(_('Server truncated this poll (adaptive cap).'));
|
||||
if (this.resolveLoadShed)
|
||||
parts.push(_('Hostname resolve paused while the router is under load.'));
|
||||
|
||||
if (parts.length) {
|
||||
el.style.display = 'block';
|
||||
el.textContent = parts.join(' ');
|
||||
} else {
|
||||
el.style.display = 'none';
|
||||
el.textContent = '';
|
||||
}
|
||||
},
|
||||
|
||||
scheduleRenderRows(force) {
|
||||
const doForce = !!force;
|
||||
const epoch = this.pollEpoch;
|
||||
if (typeof requestAnimationFrame !== 'function') {
|
||||
this.renderRows(doForce);
|
||||
return;
|
||||
}
|
||||
if (this.renderRaf) {
|
||||
this.pendingForceRender = this.pendingForceRender || doForce;
|
||||
this.pendingRenderEpoch = epoch;
|
||||
return;
|
||||
}
|
||||
this.renderRaf = requestAnimationFrame(
|
||||
function () {
|
||||
this.renderRaf = 0;
|
||||
const f = doForce || !!this.pendingForceRender;
|
||||
const pendingEpoch = this.pendingRenderEpoch;
|
||||
this.pendingForceRender = false;
|
||||
this.pendingRenderEpoch = null;
|
||||
if (epoch !== this.pollEpoch) {
|
||||
/* A newer epoch may have requested a render while this frame was
|
||||
* queued. Drop stale paint and requeue only that current request. */
|
||||
if (pendingEpoch === this.pollEpoch) this.scheduleRenderRows(f);
|
||||
return;
|
||||
}
|
||||
this.renderRows(f);
|
||||
}.bind(this)
|
||||
);
|
||||
},
|
||||
|
||||
refillRenderBucket() {
|
||||
const now = Date.now();
|
||||
if (!this.renderBucketMs) this.renderBucketMs = now;
|
||||
@@ -828,6 +1073,7 @@ return view.extend({
|
||||
updateFloodBanner() {
|
||||
const el = document.getElementById('fwlive-flood');
|
||||
if (!el) return;
|
||||
if (!el.style) el.style = { display: '' };
|
||||
|
||||
if (this.floodSuppressed) {
|
||||
el.style.display = 'block';
|
||||
@@ -879,11 +1125,13 @@ return view.extend({
|
||||
if (this.lastPollError) {
|
||||
status.className = 'fwlive-status fwlive-status-error';
|
||||
status.textContent = _('Connection lost — retrying…') + suffix;
|
||||
this.updateAdaptiveBanner();
|
||||
return;
|
||||
}
|
||||
|
||||
status.className = this.paused ? 'fwlive-status fwlive-status-paused' : 'fwlive-status';
|
||||
status.textContent = this.compactCountText(matchCount);
|
||||
this.updateAdaptiveBanner();
|
||||
},
|
||||
|
||||
readRowLimit() {
|
||||
@@ -960,13 +1208,13 @@ return view.extend({
|
||||
this.followLive = true;
|
||||
/* Merge pause buffer with the first live poll — do not replace (#43). */
|
||||
this.resumeMerge = true;
|
||||
const epoch = this.pollEpoch;
|
||||
this.fetchEntries()
|
||||
.then(() => this.renderRows(true))
|
||||
.finally(
|
||||
function () {
|
||||
this.resumeMerge = false;
|
||||
}.bind(this)
|
||||
);
|
||||
.then(() => {
|
||||
/* A hide/show bump abandons this epoch; the catch-up poll paints. */
|
||||
if (epoch === this.pollEpoch) this.renderRows(true);
|
||||
})
|
||||
.catch(function () {});
|
||||
}
|
||||
},
|
||||
|
||||
@@ -983,8 +1231,11 @@ return view.extend({
|
||||
this.pendingForceRender = true;
|
||||
if (!this.paused) this.renderRows(true);
|
||||
else this.updateStatus();
|
||||
const epoch = this.pollEpoch;
|
||||
this.fetchEntries()
|
||||
.then(() => {
|
||||
/* A hide/show bump abandons this epoch; the catch-up poll paints. */
|
||||
if (epoch !== this.pollEpoch) return;
|
||||
if (this.paused) this.updateStatus();
|
||||
else this.renderRows(true);
|
||||
})
|
||||
@@ -1063,6 +1314,9 @@ return view.extend({
|
||||
const ips = this.collectIpsFromEntries(entries);
|
||||
const need = [];
|
||||
const now = Date.now();
|
||||
/* While the router sheds resolve load, hold the paused banner without
|
||||
* re-asking every poll — retry after the cooldown expires. */
|
||||
if (this.resolveLoadShed && now < (this.resolveShedUntil || 0)) return;
|
||||
|
||||
for (let i = 0; i < ips.length && need.length < 32; i++) {
|
||||
const ip = ips[i];
|
||||
@@ -1081,8 +1335,28 @@ return view.extend({
|
||||
const res = await callFwliveResolve({ addresses: need });
|
||||
if (gen !== this.resolveGeneration) return;
|
||||
|
||||
/* rpc.declare expect: { names: {} } already unwraps — res IS the map (#243). */
|
||||
const names = res || {};
|
||||
if (res && typeof res === 'object' && res.disabled === 'load') {
|
||||
this.resolveLoadShed = true;
|
||||
this.resolveShedUntil = Date.now() + 60000;
|
||||
this.updateAdaptiveBanner();
|
||||
return;
|
||||
}
|
||||
|
||||
this.resolveLoadShed = false;
|
||||
this.resolveShedUntil = 0;
|
||||
/* RPC-level failure (no_resolver, jshn_missing, invalid_input): the
|
||||
* reply carries no per-address signal, so return without failMark —
|
||||
* otherwise every address looks like "no PTR" and retries stall
|
||||
* for the failure TTL. */
|
||||
if (res && typeof res === 'object' && typeof res.error === 'string' && res.error)
|
||||
return;
|
||||
/* Full reply: names map under .names; legacy expect-unwrap was the map. */
|
||||
const names =
|
||||
res && typeof res === 'object' && res.names && typeof res.names === 'object'
|
||||
? res.names
|
||||
: res && typeof res === 'object' && !Array.isArray(res)
|
||||
? res
|
||||
: {};
|
||||
let updated = false;
|
||||
|
||||
for (let i = 0; i < need.length; i++) {
|
||||
@@ -1096,7 +1370,8 @@ return view.extend({
|
||||
}
|
||||
}
|
||||
|
||||
if (updated) this.renderRows(true);
|
||||
this.updateAdaptiveBanner();
|
||||
if (updated) this.scheduleRenderRows(true);
|
||||
} catch (e) {
|
||||
/* resolve unavailable — show IPs */
|
||||
} finally {
|
||||
@@ -1221,7 +1496,7 @@ return view.extend({
|
||||
|
||||
renderRows(force) {
|
||||
const el = document.getElementById('fwlive-table');
|
||||
if (!el) return;
|
||||
if (!el || typeof el.querySelector !== 'function') return;
|
||||
|
||||
const body = el.querySelector('tbody');
|
||||
const empty = document.getElementById('fwlive-empty');
|
||||
@@ -1369,18 +1644,25 @@ return view.extend({
|
||||
},
|
||||
|
||||
async pollData() {
|
||||
if (this.isTabHidden()) return;
|
||||
if (this.pollDataInFlight) return;
|
||||
|
||||
const epoch = this.pollEpoch;
|
||||
this.pollDataInFlight = true;
|
||||
try {
|
||||
try {
|
||||
await this.fetchEntries();
|
||||
} catch (e) {
|
||||
/* fetchEntries already accounts the poll RTT for every rpc
|
||||
* outcome; a throw here is a local normalize/buffer bug, not
|
||||
* network slowness, so count nothing further. */
|
||||
this.lastPollError = true;
|
||||
}
|
||||
|
||||
if (epoch !== this.pollEpoch) return;
|
||||
|
||||
if (this.paused) this.updateStatus();
|
||||
else this.renderRows(!!this.pendingForceRender);
|
||||
else this.scheduleRenderRows(!!this.pendingForceRender);
|
||||
|
||||
try {
|
||||
await this.resolveHostnamesForEntries(this.filteredRows());
|
||||
@@ -1388,19 +1670,25 @@ return view.extend({
|
||||
/* resolve unavailable — show IPs */
|
||||
}
|
||||
} finally {
|
||||
this.pollDataInFlight = false;
|
||||
/* Only the owning epoch clears — a stale hidden-era poll must not
|
||||
* drop the catch-up guard after resume (Grok #331). Resume clears
|
||||
* explicitly before starting the catch-up poll. */
|
||||
if (epoch === this.pollEpoch) this.pollDataInFlight = false;
|
||||
}
|
||||
},
|
||||
|
||||
load() {
|
||||
this.bindVisibility();
|
||||
if (!this.pollFn) {
|
||||
this.pollFn = this.pollData.bind(this);
|
||||
poll.add(this.pollFn, 1);
|
||||
this.pollCadenceSec = constants.POLL_CADENCE_FAST_S;
|
||||
if (!this.isTabHidden()) poll.add(this.pollFn, this.pollCadenceSec);
|
||||
/* Best-effort teardown when leaving the page (LuCI SPA may full-reload). */
|
||||
if (typeof window !== 'undefined' && window.addEventListener) {
|
||||
window.addEventListener(
|
||||
'pagehide',
|
||||
function () {
|
||||
this.unbindVisibility();
|
||||
if (this.pollFn) {
|
||||
try {
|
||||
poll.remove(this.pollFn);
|
||||
@@ -1553,6 +1841,7 @@ return view.extend({
|
||||
)
|
||||
]),
|
||||
E('div', { 'id': 'fwlive-flood', 'class': 'fwlive-flood' }, ['']),
|
||||
E('div', { 'id': 'fwlive-adaptive', 'class': 'fwlive-adaptive' }, ['']),
|
||||
E('div', { 'id': 'fwlive-display-drawer', 'class': 'fwlive-display-bar' }, [
|
||||
E('span', { 'class': 'fwlive-display-bar-label' }, [_('Display options')]),
|
||||
E('div', { 'class': 'fwlive-display-controls' }, [
|
||||
|
||||
@@ -12,78 +12,78 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:926
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:926
|
||||
msgid "%d matching · %d/%d stored"
|
||||
msgstr "%d matching · %d/%d stored"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:929
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:929
|
||||
msgid "0 matching · %d/%d stored"
|
||||
msgstr "0 matching · %d/%d stored"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:251
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:251
|
||||
msgid "Accessible (teal/orange)"
|
||||
msgstr "Barrierefrei (teal/orange)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:32
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:32
|
||||
msgid "Action"
|
||||
msgstr "Aktion"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:618
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:618
|
||||
msgid "Administrator access is required to disable logging."
|
||||
msgstr ""
|
||||
"Zum Deaktivieren der Protokollierung sind Administratorrechte erforderlich."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:586
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:586
|
||||
msgid "Administrator access is required to enable logging."
|
||||
msgstr ""
|
||||
"Zum Aktivieren der Protokollierung sind Administratorrechte erforderlich."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1092
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1092
|
||||
msgid "Also seen"
|
||||
msgstr "Weitere"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:571
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:607
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:571
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:607
|
||||
msgid "Another change is staged for the firewall; apply or revert it first."
|
||||
msgstr ""
|
||||
"Eine andere Änderung an der Firewall ist vorgemerkt; zuerst anwenden oder "
|
||||
"verwerfen."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1658
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1658
|
||||
msgid "Any action"
|
||||
msgstr "Beliebige Aktion"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1085
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1085
|
||||
msgid "Any protocol"
|
||||
msgstr "Beliebiges Protokoll"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:113
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:113
|
||||
msgid "Before you enable logging"
|
||||
msgstr "Before you enable logging"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:569
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:569
|
||||
msgid "Cannot enable logging until kernel log modules are installed."
|
||||
msgstr ""
|
||||
"Protokollierung kann erst aktiviert werden, wenn die Kernel-Log-Module "
|
||||
"installiert sind."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:116
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:116
|
||||
msgid "Changes:"
|
||||
msgstr "Changes:"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:250
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:250
|
||||
msgid "Classic (green/red)"
|
||||
msgstr "Klassisch (grün/rot)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1642
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1642
|
||||
msgid "Classic uses green/red; Accessible uses teal/orange"
|
||||
msgstr "Klassisch verwendet grün/rot; Barrierefrei verwendet teal/orange"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:116
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:116
|
||||
msgid "Clear all"
|
||||
msgstr "Alle löschen"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1698
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1698
|
||||
msgid ""
|
||||
"Click a cell to filter · ≠ on a chip to exclude · Ctrl+click a rule for "
|
||||
"firewall settings · in Simple view, click a row for the full message"
|
||||
@@ -92,7 +92,7 @@ msgstr ""
|
||||
"auf eine Regel für Firewall-Einstellungen · in der Einfachen Ansicht Zeile "
|
||||
"anklicken für die vollständige Meldung"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1719
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1719
|
||||
msgid ""
|
||||
"Click a row (Time or other non-link cells) to see the full log line (Simple "
|
||||
"view)."
|
||||
@@ -100,11 +100,11 @@ msgstr ""
|
||||
"Klicken Sie auf eine Zeile (Zeit oder andere Nicht-Link-Zellen), um die "
|
||||
"vollständige Log-Zeile zu sehen (Einfache Ansicht)."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:113
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:113
|
||||
msgid "Click a row for the full message"
|
||||
msgstr "Zeile anklicken für die vollständige Meldung"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1720
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1720
|
||||
msgid ""
|
||||
"Click an IP, action, or protocol to filter; use the Protocol menu (or ≠ on a "
|
||||
"chip) to exclude."
|
||||
@@ -112,87 +112,97 @@ msgstr ""
|
||||
"Click an IP, action, or protocol to filter; use the Protocol menu (or ≠ on a "
|
||||
"chip) to exclude."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1086
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1086
|
||||
msgid "Common"
|
||||
msgstr "Häufig"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:944
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:944
|
||||
msgid "Connection lost — retrying…"
|
||||
msgstr "Connection lost — retrying…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:609
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:609
|
||||
msgid "Could not disable logging."
|
||||
msgstr "Protokollierung konnte nicht deaktiviert werden."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:573
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:573
|
||||
msgid "Could not enable logging."
|
||||
msgstr "Protokollierung konnte nicht aktiviert werden."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1680
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1680
|
||||
msgid "Custom protocol (prefix ! to exclude). Overrides the menu when set."
|
||||
msgstr ""
|
||||
"Eigenes Protokoll (! zum Ausschließen). Überschreibt das Menü, wenn gesetzt."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42
|
||||
msgid "DPort"
|
||||
msgstr "Ziel-Port"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:814
|
||||
msgid "Degraded — sampling"
|
||||
msgstr "Eingeschränkt — Stichproben"
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:977
|
||||
msgid "Degraded — sampling (slow poll RTT; cadence reduced)."
|
||||
msgstr ""
|
||||
"Eingeschränkt — Stichproben (langsame Poll-Roundtrip-Zeit; Frequenz "
|
||||
"reduziert)."
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40
|
||||
msgid "Destination"
|
||||
msgstr "Ziel"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691
|
||||
msgid "Destination IP contains (! to exclude)"
|
||||
msgstr "Ziel-IP enthält (! zum AusschlieÃen)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1692
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1692
|
||||
msgid "Destination port (! to exclude)"
|
||||
msgstr "Ziel-Port (! zum AusschlieÃen)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1583
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1583
|
||||
msgid "Detail"
|
||||
msgstr "Detail"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37
|
||||
msgid "Dir"
|
||||
msgstr "Richtung"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:85
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:85
|
||||
msgid "Disabling…"
|
||||
msgstr "Disabling…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1616
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1616
|
||||
msgid "Display options"
|
||||
msgstr "Anzeigeoptionen"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1716
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1716
|
||||
msgid "Display options on the bar set Limit, row tint, palette, and hostnames."
|
||||
msgstr ""
|
||||
"Anzeigeoptionen in der Leiste setzen Limit, Zeilenfärbung, Palette und "
|
||||
"Hostnamen."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
|
||||
msgid "Does not change:"
|
||||
msgstr "Does not change:"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:138
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:138
|
||||
msgid "Don’t show this again"
|
||||
msgstr "Don’t show this again"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
|
||||
msgid "Enable WAN drop/reject logging"
|
||||
msgstr "Enable WAN drop/reject logging"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:104
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:104
|
||||
msgid "Enable WAN zone drop/reject logging (same as Network → Firewall)."
|
||||
msgstr "Enable WAN zone drop/reject logging (same as Network → Firewall)."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
|
||||
msgid "Enable logging"
|
||||
msgstr "Protokollierung aktivieren"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1715
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1715
|
||||
msgid ""
|
||||
"Enable logging turns on WAN zone drop/reject logging only (same as Network → "
|
||||
"Firewall). It does not add rules or log normal LAN browsing."
|
||||
@@ -200,57 +210,57 @@ msgstr ""
|
||||
"Enable logging turns on WAN zone drop/reject logging only (same as Network → "
|
||||
"Firewall). It does not add rules or log normal LAN browsing."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
|
||||
msgid "Enabling…"
|
||||
msgstr "Enabling…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1099
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1099
|
||||
msgid "Exclude"
|
||||
msgstr "Ausschließen"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
|
||||
msgid "Exclude instead"
|
||||
msgstr "Stattdessen ausschlieÃen"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:53
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:71
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:53
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:71
|
||||
msgid "Filter by %s"
|
||||
msgstr "Filtern nach %s"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:136
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:136
|
||||
msgid "Filter by interface"
|
||||
msgstr "Nach Schnittstelle filtern"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:112
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:112
|
||||
msgid "Filter logs by rule (hint: %s). Ctrl+click to open firewall settings."
|
||||
msgstr ""
|
||||
"Logs nach Regel filtern (Hinweis: %s). Strg+Klick öffnet die Firewall-"
|
||||
"Einstellungen."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1540
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/root/usr/share/luci/menu.d/luci-app-fwlive.json:3
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1540
|
||||
#: openwrt-feed/luci-app-fwlive/root/usr/share/luci/menu.d/luci-app-fwlive.json:3
|
||||
msgid "Firewall Live View"
|
||||
msgstr "Firewall-Live-Ansicht"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43
|
||||
msgid "Flags"
|
||||
msgstr "Flags"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:45
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:45
|
||||
msgid "Flow"
|
||||
msgstr "Fluss"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3
|
||||
#: openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3
|
||||
msgid "Grant access to firewall live log view"
|
||||
msgstr "Zugriff auf die Live-Ansicht der Firewall-Protokolle gewähren"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1712
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1712
|
||||
msgid "Help"
|
||||
msgstr "Hilfe"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:895
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:895
|
||||
msgid ""
|
||||
"High event rate — table refresh is throttled to protect the browser. The "
|
||||
"buffer still updates; refresh will resume automatically."
|
||||
@@ -258,15 +268,19 @@ msgstr ""
|
||||
"High event rate — table refresh is throttled to protect the browser. The "
|
||||
"buffer still updates; refresh will resume automatically."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:984
|
||||
msgid "Hostname resolve paused while the router is under load."
|
||||
msgstr "Hostnamenauflösung pausiert, solange der Router ausgelastet ist."
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090
|
||||
msgid "ICMPv6"
|
||||
msgstr "ICMPv6"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35
|
||||
msgid "IN"
|
||||
msgstr "EINGANG"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1723
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1723
|
||||
msgid ""
|
||||
"If Row tint looks missing, the active LuCI theme may omit success/error or "
|
||||
"info/warn CSS variables; fwlive falls back to local colors (air-gapped, no "
|
||||
@@ -276,7 +290,7 @@ msgstr ""
|
||||
"möglicherweise keine Erfolgs/Fehler-CSS-Variablen; fwlive fällt auf lokale "
|
||||
"Farben zurück (air-gapped, keine Daten verlassen das Gerät)."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:205
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:205
|
||||
msgid ""
|
||||
"If the WAN is quiet, wait for probes or use the optional ping check in "
|
||||
"Help / the enabling-logs guide."
|
||||
@@ -284,28 +298,28 @@ msgstr ""
|
||||
"If the WAN is quiet, wait for probes or use the optional ping check in "
|
||||
"Help / the enabling-logs guide."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
|
||||
msgid "Include instead"
|
||||
msgstr "Stattdessen einschlieÃen"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34
|
||||
msgid "Interface"
|
||||
msgstr "Schnittstelle"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1688
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1688
|
||||
msgid "Interface (prefix ! to exclude)"
|
||||
msgstr "Schnittstelle (! voranstellen zum AusschlieÃen)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:165
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:232
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:165
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:232
|
||||
msgid "I’ll configure this under Network → Firewall"
|
||||
msgstr "I’ll configure this under Network → Firewall"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:194
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:194
|
||||
msgid "Kernel log modules missing"
|
||||
msgstr "Kernel log modules missing"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:195
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:195
|
||||
msgid ""
|
||||
"Kernel netfilter log modules are missing. Install kmod-nf-log-ipv4 and kmod-"
|
||||
"nf-log-ipv6 (or kmod-nf-log / kmod-nf-log6), then reload the firewall."
|
||||
@@ -314,74 +328,74 @@ msgstr ""
|
||||
"kmod-nf-log-ipv6 (oder kmod-nf-log / kmod-nf-log6) und laden Sie dann die "
|
||||
"Firewall neu."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:44
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:44
|
||||
msgid "Len"
|
||||
msgstr "Länge"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1619
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1619
|
||||
msgid "Limit"
|
||||
msgstr "Limit"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:536
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:536
|
||||
msgid "Limited diagnostics — timeout command missing"
|
||||
msgstr "Eingeschränkte Diagnose — timeout-Befehl fehlt"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:210
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:210
|
||||
msgid "Logging is off on this router"
|
||||
msgstr "Logging is off on this router"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:252
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:256
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:252
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:256
|
||||
msgid "Manual test (System → Terminal):"
|
||||
msgstr "Manueller Test (System → Terminal):"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:46
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:221
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1590
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1595
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:46
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:221
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1590
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1595
|
||||
msgid "Message"
|
||||
msgstr "Nachricht"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1686
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1686
|
||||
msgid "More filters"
|
||||
msgstr "Weitere Filter"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:37
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:37
|
||||
msgid "Network → Firewall"
|
||||
msgstr "Network → Firewall"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:187
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:187
|
||||
msgid ""
|
||||
"No WAN firewall zone found in /etc/config/firewall. Configure zones under"
|
||||
msgstr ""
|
||||
"Keine WAN-Firewall-Zone in /etc/config/firewall gefunden. Konfigurieren Sie "
|
||||
"Zonen unter"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:185
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:185
|
||||
msgid "No WAN zone found"
|
||||
msgstr "No WAN zone found"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:163
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:163
|
||||
msgid "Not now"
|
||||
msgstr "Not now"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:220
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:220
|
||||
msgid "Nothing changes until you click Enable."
|
||||
msgstr "Nothing changes until you click Enable."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:36
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:36
|
||||
msgid "OUT"
|
||||
msgstr "AUSGANG"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1610
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1610
|
||||
msgid "One line"
|
||||
msgstr "Einzeilig"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:206
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:206
|
||||
msgid "Open firewall zone settings"
|
||||
msgstr "Firewall-Zonen-Einstellungen öffnen"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211
|
||||
msgid ""
|
||||
"OpenWrt does not write firewall events to the log until you turn logging on. "
|
||||
"Live View only shows what the firewall already logs — it does not add allow/"
|
||||
@@ -391,44 +405,44 @@ msgstr ""
|
||||
"Live View only shows what the firewall already logs — it does not add allow/"
|
||||
"deny rules."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1638
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1638
|
||||
msgid "Palette"
|
||||
msgstr "Palette"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1560
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1560
|
||||
msgid "Pause"
|
||||
msgstr "Pause"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
|
||||
msgid "Paused"
|
||||
msgstr "Pausiert"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:38
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:38
|
||||
msgid "Proto"
|
||||
msgstr "Protokoll"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1674
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1674
|
||||
msgid "Protocol — common values"
|
||||
msgstr "Protokoll — häufige Werte"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1656
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1656
|
||||
msgid "Quick search"
|
||||
msgstr "Schnellsuche"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:91
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:91
|
||||
msgid "Remove filter"
|
||||
msgstr "Filter entfernen"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
|
||||
msgid "Resume"
|
||||
msgstr "Fortsetzen"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1631
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1631
|
||||
msgid "Row tint"
|
||||
msgstr "Zeileneinfärbung"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1721
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1721
|
||||
msgid ""
|
||||
"Row tint shows pass/deny row backgrounds when checked. Choose Classic (green/"
|
||||
"red, default) or Accessible (teal/orange). Action text stays colored either "
|
||||
@@ -438,7 +452,7 @@ msgstr ""
|
||||
"Klassisch (grün/rot, Standard) oder Barrierefrei (teal/orange). Aktionstext "
|
||||
"bleibt in beiden Fällen farbig."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1550
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1550
|
||||
msgid ""
|
||||
"Row tint used a local color fallback because the active LuCI theme did not "
|
||||
"apply pass/deny backgrounds."
|
||||
@@ -446,51 +460,59 @@ msgstr ""
|
||||
"Die Zeileneinfärbung verwendete einen lokalen Farbfallback, da das aktive "
|
||||
"LuCI-Theme keine Erlauben/Verweigern-Hintergründe anwendet."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:33
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:33
|
||||
msgid "Rule"
|
||||
msgstr "Regel"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:527
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:527
|
||||
msgid "Rule labels incomplete — map truncated"
|
||||
msgstr "Rule labels incomplete — map truncated"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:531
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:531
|
||||
msgid "Rule labels unavailable"
|
||||
msgstr "Rule labels unavailable"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:529
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:529
|
||||
msgid "Rule labels unavailable — temp file failed"
|
||||
msgstr "Rule labels unavailable — temp file failed"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:980
|
||||
msgid "Server shedding — at most %d log lines per poll."
|
||||
msgstr "Server reduziert — höchstens %d Protokollzeilen pro Abfrage."
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:982
|
||||
msgid "Server truncated this poll (adaptive cap)."
|
||||
msgstr "Server hat diese Abfrage gekürzt (adaptives Limit)."
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
|
||||
msgid "SPort"
|
||||
msgstr "Quell-Port"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1650
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1650
|
||||
msgid "Show hostnames"
|
||||
msgstr "Hostnamen anzeigen"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1629
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1629
|
||||
msgid "Show pass/deny row background colors"
|
||||
msgstr "Pass/Deny-Zeilenhintergrundfarben anzeigen"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1576
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1576
|
||||
msgid "Simple"
|
||||
msgstr "Einfach"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:39
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:39
|
||||
msgid "Source"
|
||||
msgstr "Quelle"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1689
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1689
|
||||
msgid "Source IP contains (! to exclude)"
|
||||
msgstr "Quell-IP enthält (! zum AusschlieÃen)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1690
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1690
|
||||
msgid "Source port (! to exclude)"
|
||||
msgstr "Quell-Port (! zum AusschlieÃen)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1717
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1717
|
||||
msgid ""
|
||||
"The rate shown for WAN logging is the firewall zone log_limit. OpenWrt "
|
||||
"defaults to 10/minute when no explicit limit is configured; fwlive does not "
|
||||
@@ -500,7 +522,7 @@ msgstr ""
|
||||
"OpenWrt-Standard ist 10/Minute ohne explizites Limit; fwlive setzt diese "
|
||||
"Grenze nicht."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1714
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1714
|
||||
msgid ""
|
||||
"The table updates automatically when your firewall logs traffic. Use Pause "
|
||||
"if it moves too fast."
|
||||
@@ -508,15 +530,15 @@ msgstr ""
|
||||
"Die Tabelle aktualisiert sich automatisch, wenn Ihre Firewall Verkehr "
|
||||
"protokolliert. Pause nutzen, wenn es zu schnell wird."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1551
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1551
|
||||
msgid "Theme tint fallback"
|
||||
msgstr "Theme-Farb-Fallback"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:31
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:31
|
||||
msgid "Time"
|
||||
msgstr "Zeit"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:219
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:219
|
||||
msgid ""
|
||||
"Turns on WAN zone drop/reject logging (same as Network → Firewall → wan → "
|
||||
"Log). Rate-limited by the zone log_limit (OpenWrt default 10/minute). Normal "
|
||||
@@ -526,25 +548,25 @@ msgstr ""
|
||||
"Log). Rate-limited by the zone log_limit (OpenWrt default 10/minute). Normal "
|
||||
"LAN browsing is not logged."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:126
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:126
|
||||
msgid "Undo:"
|
||||
msgstr "Undo:"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1722
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1722
|
||||
msgid "Use Detail for all columns (flags, length, raw message)."
|
||||
msgstr ""
|
||||
"Verwenden Sie „Detail“ für alle Spalten (Flags, Länge, rohe Nachricht)."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1564
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1568
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1564
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1568
|
||||
msgid "View"
|
||||
msgstr "Ansicht"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:615
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:615
|
||||
msgid "WAN drop/reject logging is off."
|
||||
msgstr "WAN drop/reject logging is off."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:204
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:204
|
||||
msgid ""
|
||||
"WAN drop/reject logging is on. Blocked inbound WAN traffic will show up "
|
||||
"here. Normal LAN browsing will not."
|
||||
@@ -552,7 +574,7 @@ msgstr ""
|
||||
"WAN drop/reject logging is on. Blocked inbound WAN traffic will show up "
|
||||
"here. Normal LAN browsing will not."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:579
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:579
|
||||
msgid ""
|
||||
"WAN drop/reject logging is on. Blocked inbound traffic should appear here as "
|
||||
"it happens — not normal LAN browsing."
|
||||
@@ -560,157 +582,165 @@ msgstr ""
|
||||
"WAN drop/reject logging is on. Blocked inbound traffic should appear here as "
|
||||
"it happens — not normal LAN browsing."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:581
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:581
|
||||
msgid "WAN logging is already enabled."
|
||||
msgstr "WAN-Protokollierung ist bereits aktiviert."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:88
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:88
|
||||
msgid "WAN logging on"
|
||||
msgstr "WAN-Protokollierung: EIN"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:94
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:94
|
||||
msgid "WAN logging on (%s). Click to disable."
|
||||
msgstr "WAN-Protokollierung: EIN (%s). Klicken zum Deaktivieren."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:77
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:77
|
||||
msgid "WAN logging unavailable: missing kernel log modules"
|
||||
msgstr "WAN-Protokollierung nicht verfügbar: fehlende Kernel-Log-Module"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:70
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:70
|
||||
msgid "WAN logging unavailable: no WAN zone"
|
||||
msgstr "WAN-Protokollierung nicht verfügbar: keine WAN-Zone"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203
|
||||
msgid "Waiting for firewall events"
|
||||
msgstr "Waiting for firewall events"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1545
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1545
|
||||
msgid "Watching"
|
||||
msgstr "Beobachtet"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1603
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1603
|
||||
msgid "Wrap"
|
||||
msgstr "Umbrechen"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:123
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:123
|
||||
msgid "allow/deny rules, LAN logging, or anything else."
|
||||
msgstr "allow/deny rules, LAN logging, or anything else."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:828
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:828
|
||||
msgid "buffer full"
|
||||
msgstr "Puffer voll"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:81
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:81
|
||||
msgid "default 10/minute"
|
||||
msgstr "Standard 10/Minute"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28
|
||||
msgid "is"
|
||||
msgstr "ist"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:823
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:823
|
||||
msgid "loading buffer"
|
||||
msgstr "Lade Puffer"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:923
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:923
|
||||
msgid "loading…"
|
||||
msgstr "loading…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:37
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:37
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44
|
||||
msgid "not"
|
||||
msgstr "nicht"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1107
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1107
|
||||
msgid "not AH"
|
||||
msgstr "nicht AH"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1106
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1106
|
||||
msgid "not ESP"
|
||||
msgstr "nicht ESP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1105
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1105
|
||||
msgid "not GRE"
|
||||
msgstr "nicht GRE"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1102
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1102
|
||||
msgid "not ICMP"
|
||||
msgstr "nicht ICMP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1103
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1103
|
||||
msgid "not ICMPv6"
|
||||
msgstr "nicht ICMPv6"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1104
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1104
|
||||
msgid "not IGMP"
|
||||
msgstr "nicht IGMP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1108
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1108
|
||||
msgid "not SCTP"
|
||||
msgstr "nicht SCTP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1100
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1100
|
||||
msgid "not TCP"
|
||||
msgstr "nicht TCP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1101
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1101
|
||||
msgid "not UDP"
|
||||
msgstr "nicht UDP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1666
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1666
|
||||
msgid "not block"
|
||||
msgstr "nicht blockieren"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1665
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1665
|
||||
msgid "not drop"
|
||||
msgstr "nicht verwerfen"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1664
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1664
|
||||
msgid "not pass"
|
||||
msgstr "nicht erlauben"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1667
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1667
|
||||
msgid "not reject"
|
||||
msgstr "nicht zurückweisen"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1668
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1668
|
||||
msgid "not unknown"
|
||||
msgstr "nicht unbekannt"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1679
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1679
|
||||
msgid "or type…"
|
||||
msgstr "oder tippen…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:830
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:830
|
||||
msgid "render paused (high rate)"
|
||||
msgstr "Rendering pausiert (hohe Rate)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:817
|
||||
msgid "resolve paused (load)"
|
||||
msgstr "Auflösung pausiert (Last)"
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832
|
||||
msgid "scroll frozen — scroll to top to follow live"
|
||||
msgstr "scroll frozen — scroll to top to follow live"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:118
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:118
|
||||
msgid "sets log on the WAN firewall zone and reloads the firewall."
|
||||
msgstr "sets log on the WAN firewall zone and reloads the firewall."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:254
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:258
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:254
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:258
|
||||
msgid "then ping the router."
|
||||
msgstr "dann den Router anpingen."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:815
|
||||
msgid "truncated"
|
||||
msgstr "gekürzt"
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128
|
||||
msgid "turn it back off with the WAN logging on control on the watch strip."
|
||||
msgstr "turn it back off with the WAN logging on control on the watch strip."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:512
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:512
|
||||
msgid "using fw4"
|
||||
msgstr "mit fw4"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:510
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:510
|
||||
msgid "using iptables"
|
||||
msgstr "mit iptables"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:89
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:89
|
||||
msgid "· %s"
|
||||
msgstr "· %s"
|
||||
@@ -13,82 +13,82 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:926
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:926
|
||||
msgid "%d matching · %d/%d stored"
|
||||
msgstr "%d matching · %d/%d stored"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:929
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:929
|
||||
msgid "0 matching · %d/%d stored"
|
||||
msgstr "0 matching · %d/%d stored"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:251
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:251
|
||||
msgid "Accessible (teal/orange)"
|
||||
msgstr "ÐоÑÑÑпнÑй (биÑÑзовÑй/оÑанжевÑй)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:32
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:32
|
||||
msgid "Action"
|
||||
msgstr "ÐейÑÑвие"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:618
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:618
|
||||
msgid "Administrator access is required to disable logging."
|
||||
msgstr ""
|
||||
"ÐÐ»Ñ Ð¾ÑклÑÑÐµÐ½Ð¸Ñ Ð¶ÑÑналиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑебÑÑÑÑÑ Ð¿Ñава аÐ"
|
||||
"´Ð¼Ð¸Ð½Ð¸ÑÑÑаÑоÑа."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:586
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:586
|
||||
msgid "Administrator access is required to enable logging."
|
||||
msgstr ""
|
||||
"ÐÐ»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð¶ÑÑналиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑебÑÑÑÑÑ Ð¿Ñава аÐ"
|
||||
"´Ð¼Ð¸Ð½Ð¸ÑÑÑаÑоÑа."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1092
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1092
|
||||
msgid "Also seen"
|
||||
msgstr "Также встречаются"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:571
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:607
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:571
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:607
|
||||
msgid "Another change is staged for the firewall; apply or revert it first."
|
||||
msgstr ""
|
||||
"В брандмауэре уже есть другое незафиксированное изменение; сначала примените "
|
||||
"или отмените его."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1658
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1658
|
||||
msgid "Any action"
|
||||
msgstr "ÐÑбое дейÑÑвие"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1085
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1085
|
||||
msgid "Any protocol"
|
||||
msgstr "Любой протокол"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:113
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:113
|
||||
msgid "Before you enable logging"
|
||||
msgstr "Before you enable logging"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:569
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:569
|
||||
msgid "Cannot enable logging until kernel log modules are installed."
|
||||
msgstr ""
|
||||
"Ðевозможно вклÑÑиÑÑ Ð¶ÑÑналиÑование, пока не "
|
||||
"ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð¼Ð¾Ð´Ñли жÑÑнала ÑдÑа."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:116
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:116
|
||||
msgid "Changes:"
|
||||
msgstr "Changes:"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:250
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:250
|
||||
msgid "Classic (green/red)"
|
||||
msgstr "ÐлаÑÑиÑеÑкий (зелÑнÑй/кÑаÑнÑй)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1642
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1642
|
||||
msgid "Classic uses green/red; Accessible uses teal/orange"
|
||||
msgstr ""
|
||||
"ÐлаÑÑиÑеÑкий â зелÑнÑй/кÑаÑнÑй; доÑÑÑпнÑй â "
|
||||
"биÑÑзовÑй/оÑанжевÑй"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:116
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:116
|
||||
msgid "Clear all"
|
||||
msgstr "ÐÑиÑÑиÑÑ Ð²ÑÑ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1698
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1698
|
||||
msgid ""
|
||||
"Click a cell to filter · ≠ on a chip to exclude · Ctrl+click a rule for "
|
||||
"firewall settings · in Simple view, click a row for the full message"
|
||||
@@ -97,7 +97,7 @@ msgstr ""
|
||||
"правилу для настроек МЭ · в Простом виде щёлкните строку для полного "
|
||||
"сообщения"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1719
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1719
|
||||
msgid ""
|
||||
"Click a row (Time or other non-link cells) to see the full log line (Simple "
|
||||
"view)."
|
||||
@@ -105,11 +105,11 @@ msgstr ""
|
||||
"Щёлкните строку (Время или другие ячейки без ссылки), чтобы увидеть полную "
|
||||
"строку журнала (Простой вид)."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:113
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:113
|
||||
msgid "Click a row for the full message"
|
||||
msgstr "Щёлкните строку для полного сообщения"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1720
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1720
|
||||
msgid ""
|
||||
"Click an IP, action, or protocol to filter; use the Protocol menu (or ≠ on a "
|
||||
"chip) to exclude."
|
||||
@@ -117,86 +117,94 @@ msgstr ""
|
||||
"Click an IP, action, or protocol to filter; use the Protocol menu (or ≠ on a "
|
||||
"chip) to exclude."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1086
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1086
|
||||
msgid "Common"
|
||||
msgstr "Частые"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:944
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:944
|
||||
msgid "Connection lost — retrying…"
|
||||
msgstr "Connection lost — retrying…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:609
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:609
|
||||
msgid "Could not disable logging."
|
||||
msgstr "Ðе ÑдалоÑÑ Ð¾ÑклÑÑиÑÑ Ð¶ÑÑналиÑование."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:573
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:573
|
||||
msgid "Could not enable logging."
|
||||
msgstr "Ðе ÑдалоÑÑ Ð²ÐºÐ»ÑÑиÑÑ Ð¶ÑÑналиÑование."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1680
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1680
|
||||
msgid "Custom protocol (prefix ! to exclude). Overrides the menu when set."
|
||||
msgstr "Свой протокол (! для исключения). Переопределяет меню, если задан."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42
|
||||
msgid "DPort"
|
||||
msgstr "ÐоÑÑ Ð½Ð°Ð·Ð½."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:814
|
||||
msgid "Degraded — sampling"
|
||||
msgstr "Упрощённый режим — выборка"
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:977
|
||||
msgid "Degraded — sampling (slow poll RTT; cadence reduced)."
|
||||
msgstr "Упрощённый режим — выборка (медленный RTT опроса; интервал увеличен)."
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40
|
||||
msgid "Destination"
|
||||
msgstr "ÐазнаÑение"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691
|
||||
msgid "Destination IP contains (! to exclude)"
|
||||
msgstr "IP назнаÑÐµÐ½Ð¸Ñ ÑодеÑÐ¶Ð¸Ñ (! Ð´Ð»Ñ Ð¸ÑклÑÑениÑ)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1692
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1692
|
||||
msgid "Destination port (! to exclude)"
|
||||
msgstr "ÐоÑÑ Ð½Ð°Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ (! Ð´Ð»Ñ Ð¸ÑклÑÑениÑ)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1583
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1583
|
||||
msgid "Detail"
|
||||
msgstr "Подробно"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37
|
||||
msgid "Dir"
|
||||
msgstr "ÐапÑ."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:85
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:85
|
||||
msgid "Disabling…"
|
||||
msgstr "Disabling…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1616
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1616
|
||||
msgid "Display options"
|
||||
msgstr "ÐаÑамеÑÑÑ Ð¾ÑобÑажениÑ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1716
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1716
|
||||
msgid "Display options on the bar set Limit, row tint, palette, and hostnames."
|
||||
msgstr ""
|
||||
"Параметры отображения на панели задают лимит, окраску строк, палитру и имена "
|
||||
"узлов."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
|
||||
msgid "Does not change:"
|
||||
msgstr "Does not change:"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:138
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:138
|
||||
msgid "Don’t show this again"
|
||||
msgstr "Don’t show this again"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
|
||||
msgid "Enable WAN drop/reject logging"
|
||||
msgstr "Enable WAN drop/reject logging"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:104
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:104
|
||||
msgid "Enable WAN zone drop/reject logging (same as Network → Firewall)."
|
||||
msgstr "Enable WAN zone drop/reject logging (same as Network → Firewall)."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
|
||||
msgid "Enable logging"
|
||||
msgstr "ÐклÑÑиÑÑ Ð¶ÑÑнал"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1715
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1715
|
||||
msgid ""
|
||||
"Enable logging turns on WAN zone drop/reject logging only (same as Network → "
|
||||
"Firewall). It does not add rules or log normal LAN browsing."
|
||||
@@ -204,57 +212,57 @@ msgstr ""
|
||||
"Enable logging turns on WAN zone drop/reject logging only (same as Network → "
|
||||
"Firewall). It does not add rules or log normal LAN browsing."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
|
||||
msgid "Enabling…"
|
||||
msgstr "Enabling…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1099
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1099
|
||||
msgid "Exclude"
|
||||
msgstr "Исключить"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
|
||||
msgid "Exclude instead"
|
||||
msgstr "ÐÑклÑÑиÑÑ Ð²Ð¼ÐµÑÑо ÑÑого"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:53
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:71
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:53
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:71
|
||||
msgid "Filter by %s"
|
||||
msgstr "ФилÑÑÑ Ð¿Ð¾ %s"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:136
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:136
|
||||
msgid "Filter by interface"
|
||||
msgstr "ФилÑÑÑ Ð¿Ð¾ инÑеÑÑейÑÑ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:112
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:112
|
||||
msgid "Filter logs by rule (hint: %s). Ctrl+click to open firewall settings."
|
||||
msgstr ""
|
||||
"ФилÑÑÑ Ð¶ÑÑналов по пÑÐ°Ð²Ð¸Ð»Ñ (подÑказка: %s). "
|
||||
"Ctrl+клик оÑкÑÑÐ²Ð°ÐµÑ Ð½Ð°ÑÑÑойки ÑайÑвола."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1540
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/root/usr/share/luci/menu.d/luci-app-fwlive.json:3
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1540
|
||||
#: openwrt-feed/luci-app-fwlive/root/usr/share/luci/menu.d/luci-app-fwlive.json:3
|
||||
msgid "Firewall Live View"
|
||||
msgstr "ÐÑоÑмоÑÑ ÑайÑвола в ÑеалÑном вÑемени"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43
|
||||
msgid "Flags"
|
||||
msgstr "Флаги"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:45
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:45
|
||||
msgid "Flow"
|
||||
msgstr "ÐоÑок"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3
|
||||
#: openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3
|
||||
msgid "Grant access to firewall live log view"
|
||||
msgstr "Предоставить доступ к живому просмотру журнала межсетевого экрана"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1712
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1712
|
||||
msgid "Help"
|
||||
msgstr "СпÑавка"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:895
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:895
|
||||
msgid ""
|
||||
"High event rate — table refresh is throttled to protect the browser. The "
|
||||
"buffer still updates; refresh will resume automatically."
|
||||
@@ -262,15 +270,19 @@ msgstr ""
|
||||
"High event rate — table refresh is throttled to protect the browser. The "
|
||||
"buffer still updates; refresh will resume automatically."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:984
|
||||
msgid "Hostname resolve paused while the router is under load."
|
||||
msgstr "Разрешение имён приостановлено из-за нагрузки на маршрутизатор."
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090
|
||||
msgid "ICMPv6"
|
||||
msgstr "ICMPv6"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35
|
||||
msgid "IN"
|
||||
msgstr "ÐÐ¥ÐÐ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1723
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1723
|
||||
msgid ""
|
||||
"If Row tint looks missing, the active LuCI theme may omit success/error or "
|
||||
"info/warn CSS variables; fwlive falls back to local colors (air-gapped, no "
|
||||
@@ -280,7 +292,7 @@ msgstr ""
|
||||
"акÑÐ¸Ð²Ð½Ð°Ñ Ñема LuCI Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑодеÑжаÑÑ CSS-"
|
||||
"пеÑеменнÑе ÑÑпе"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:205
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:205
|
||||
msgid ""
|
||||
"If the WAN is quiet, wait for probes or use the optional ping check in "
|
||||
"Help / the enabling-logs guide."
|
||||
@@ -288,28 +300,28 @@ msgstr ""
|
||||
"If the WAN is quiet, wait for probes or use the optional ping check in "
|
||||
"Help / the enabling-logs guide."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
|
||||
msgid "Include instead"
|
||||
msgstr "ÐклÑÑиÑÑ Ð²Ð¼ÐµÑÑо ÑÑого"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34
|
||||
msgid "Interface"
|
||||
msgstr "ÐнÑеÑÑейÑ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1688
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1688
|
||||
msgid "Interface (prefix ! to exclude)"
|
||||
msgstr "ÐнÑеÑÑÐµÐ¹Ñ (! в наÑале Ð´Ð»Ñ Ð¸ÑклÑÑениÑ)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:165
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:232
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:165
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:232
|
||||
msgid "I’ll configure this under Network → Firewall"
|
||||
msgstr "I’ll configure this under Network → Firewall"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:194
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:194
|
||||
msgid "Kernel log modules missing"
|
||||
msgstr "Kernel log modules missing"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:195
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:195
|
||||
msgid ""
|
||||
"Kernel netfilter log modules are missing. Install kmod-nf-log-ipv4 and kmod-"
|
||||
"nf-log-ipv6 (or kmod-nf-log / kmod-nf-log6), then reload the firewall."
|
||||
@@ -318,73 +330,73 @@ msgstr ""
|
||||
"kmod-nf-log-ipv4 и kmod-nf-log-ipv6 (или kmod-nf-log / kmod-nf-log6), "
|
||||
"заÑем пеÑезагÑÑзиÑе ÑайÑвол."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:44
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:44
|
||||
msgid "Len"
|
||||
msgstr "Ðлина"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1619
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1619
|
||||
msgid "Limit"
|
||||
msgstr "ÐимиÑ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:536
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:536
|
||||
msgid "Limited diagnostics — timeout command missing"
|
||||
msgstr "Ограниченная диагностика — отсутствует команда timeout"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:210
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:210
|
||||
msgid "Logging is off on this router"
|
||||
msgstr "Logging is off on this router"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:252
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:256
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:252
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:256
|
||||
msgid "Manual test (System → Terminal):"
|
||||
msgstr "Ручной тест (Система → Терминал):"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:46
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:221
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1590
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1595
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:46
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:221
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1590
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1595
|
||||
msgid "Message"
|
||||
msgstr "СообÑение"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1686
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1686
|
||||
msgid "More filters"
|
||||
msgstr "ÐолÑÑе ÑилÑÑÑов"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:37
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:37
|
||||
msgid "Network → Firewall"
|
||||
msgstr "Network → Firewall"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:187
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:187
|
||||
msgid ""
|
||||
"No WAN firewall zone found in /etc/config/firewall. Configure zones under"
|
||||
msgstr ""
|
||||
"Зона WAN брандмауэра не найдена в /etc/config/firewall. Настройте зоны в"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:185
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:185
|
||||
msgid "No WAN zone found"
|
||||
msgstr "No WAN zone found"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:163
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:163
|
||||
msgid "Not now"
|
||||
msgstr "Not now"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:220
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:220
|
||||
msgid "Nothing changes until you click Enable."
|
||||
msgstr "Nothing changes until you click Enable."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:36
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:36
|
||||
msgid "OUT"
|
||||
msgstr "ÐЫХÐÐ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1610
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1610
|
||||
msgid "One line"
|
||||
msgstr "Одна строка"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:206
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:206
|
||||
msgid "Open firewall zone settings"
|
||||
msgstr "ÐÑкÑÑÑÑ Ð½Ð°ÑÑÑойки зон ÑайÑвола"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211
|
||||
msgid ""
|
||||
"OpenWrt does not write firewall events to the log until you turn logging on. "
|
||||
"Live View only shows what the firewall already logs — it does not add allow/"
|
||||
@@ -394,44 +406,44 @@ msgstr ""
|
||||
"Live View only shows what the firewall already logs — it does not add allow/"
|
||||
"deny rules."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1638
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1638
|
||||
msgid "Palette"
|
||||
msgstr "ÐалиÑÑа"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1560
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1560
|
||||
msgid "Pause"
|
||||
msgstr "ÐаÑза"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
|
||||
msgid "Paused"
|
||||
msgstr "ÐаÑза"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:38
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:38
|
||||
msgid "Proto"
|
||||
msgstr "ÐÑоÑокол"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1674
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1674
|
||||
msgid "Protocol — common values"
|
||||
msgstr "Протокол — частые значения"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1656
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1656
|
||||
msgid "Quick search"
|
||||
msgstr "ÐÑÑÑÑÑй поиÑк"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:91
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:91
|
||||
msgid "Remove filter"
|
||||
msgstr "УдалиÑÑ ÑилÑÑÑ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
|
||||
msgid "Resume"
|
||||
msgstr "ÐÑодолжиÑÑ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1631
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1631
|
||||
msgid "Row tint"
|
||||
msgstr "Ð¦Ð²ÐµÑ ÑÑÑок"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1721
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1721
|
||||
msgid ""
|
||||
"Row tint shows pass/deny row backgrounds when checked. Choose Classic (green/"
|
||||
"red, default) or Accessible (teal/orange). Action text stays colored either "
|
||||
@@ -441,7 +453,7 @@ msgstr ""
|
||||
"классический (зелёный/красный, по умолчанию) или доступный (бирюзовый/"
|
||||
"оранжевый). Цвет текста действия сохраняется в любом случае."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1550
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1550
|
||||
msgid ""
|
||||
"Row tint used a local color fallback because the active LuCI theme did not "
|
||||
"apply pass/deny backgrounds."
|
||||
@@ -450,51 +462,59 @@ msgstr ""
|
||||
"локалÑнÑй запаÑной ÑвеÑ, Ñак как акÑÐ¸Ð²Ð½Ð°Ñ Ñема "
|
||||
"LuCI не пÑименÑÐµÑ Ñон пÑопÑÑка/оÑказа."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:33
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:33
|
||||
msgid "Rule"
|
||||
msgstr "ÐÑавило"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:527
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:527
|
||||
msgid "Rule labels incomplete — map truncated"
|
||||
msgstr "Rule labels incomplete — map truncated"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:531
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:531
|
||||
msgid "Rule labels unavailable"
|
||||
msgstr "Rule labels unavailable"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:529
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:529
|
||||
msgid "Rule labels unavailable — temp file failed"
|
||||
msgstr "Rule labels unavailable — temp file failed"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:980
|
||||
msgid "Server shedding — at most %d log lines per poll."
|
||||
msgstr "Сервер ограничивает выдачу — не более %d строк журнала за опрос."
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:982
|
||||
msgid "Server truncated this poll (adaptive cap)."
|
||||
msgstr "Сервер сократил этот опрос (адаптивный предел)."
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
|
||||
msgid "SPort"
|
||||
msgstr "ÐоÑÑ Ð¸ÑÑ."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1650
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1650
|
||||
msgid "Show hostnames"
|
||||
msgstr "ÐоказÑваÑÑ Ð¸Ð¼ÐµÐ½Ð° "
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1629
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1629
|
||||
msgid "Show pass/deny row background colors"
|
||||
msgstr "Показывать цвета фона строк pass/deny"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1576
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1576
|
||||
msgid "Simple"
|
||||
msgstr "Простой"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:39
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:39
|
||||
msgid "Source"
|
||||
msgstr "ÐÑÑоÑник"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1689
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1689
|
||||
msgid "Source IP contains (! to exclude)"
|
||||
msgstr "IP иÑÑоÑника ÑодеÑÐ¶Ð¸Ñ (! Ð´Ð»Ñ Ð¸ÑклÑÑениÑ)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1690
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1690
|
||||
msgid "Source port (! to exclude)"
|
||||
msgstr "ÐоÑÑ Ð¸ÑÑоÑника (! Ð´Ð»Ñ Ð¸ÑклÑÑениÑ)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1717
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1717
|
||||
msgid ""
|
||||
"The rate shown for WAN logging is the firewall zone log_limit. OpenWrt "
|
||||
"defaults to 10/minute when no explicit limit is configured; fwlive does not "
|
||||
@@ -504,7 +524,7 @@ msgstr ""
|
||||
"ÑмолÑÐ°Ð½Ð¸Ñ OpenWrt: 10/мин без Ñвного лимиÑа; fwlive "
|
||||
"Ñам Ð»Ð¸Ð¼Ð¸Ñ Ð½Ðµ задаÑÑ."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1714
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1714
|
||||
msgid ""
|
||||
"The table updates automatically when your firewall logs traffic. Use Pause "
|
||||
"if it moves too fast."
|
||||
@@ -513,15 +533,15 @@ msgstr ""
|
||||
"ÑайÑвол пиÑÐµÑ Ð² жÑÑнал. ÐÑполÑзÑйÑе ÐаÑзÑ, еÑли "
|
||||
"ÑлиÑком бÑÑÑÑо."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1551
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1551
|
||||
msgid "Theme tint fallback"
|
||||
msgstr "ÐапаÑной ÑÐ²ÐµÑ ÑемÑ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:31
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:31
|
||||
msgid "Time"
|
||||
msgstr "ÐÑемÑ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:219
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:219
|
||||
msgid ""
|
||||
"Turns on WAN zone drop/reject logging (same as Network → Firewall → wan → "
|
||||
"Log). Rate-limited by the zone log_limit (OpenWrt default 10/minute). Normal "
|
||||
@@ -531,25 +551,25 @@ msgstr ""
|
||||
"Log). Rate-limited by the zone log_limit (OpenWrt default 10/minute). Normal "
|
||||
"LAN browsing is not logged."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:126
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:126
|
||||
msgid "Undo:"
|
||||
msgstr "Undo:"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1722
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1722
|
||||
msgid "Use Detail for all columns (flags, length, raw message)."
|
||||
msgstr ""
|
||||
"Используйте «Подробно» для всех столбцов (флаги, длина, исходное сообщение)."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1564
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1568
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1564
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1568
|
||||
msgid "View"
|
||||
msgstr "Вид"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:615
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:615
|
||||
msgid "WAN drop/reject logging is off."
|
||||
msgstr "WAN drop/reject logging is off."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:204
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:204
|
||||
msgid ""
|
||||
"WAN drop/reject logging is on. Blocked inbound WAN traffic will show up "
|
||||
"here. Normal LAN browsing will not."
|
||||
@@ -557,7 +577,7 @@ msgstr ""
|
||||
"WAN drop/reject logging is on. Blocked inbound WAN traffic will show up "
|
||||
"here. Normal LAN browsing will not."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:579
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:579
|
||||
msgid ""
|
||||
"WAN drop/reject logging is on. Blocked inbound traffic should appear here as "
|
||||
"it happens — not normal LAN browsing."
|
||||
@@ -565,159 +585,167 @@ msgstr ""
|
||||
"WAN drop/reject logging is on. Blocked inbound traffic should appear here as "
|
||||
"it happens — not normal LAN browsing."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:581
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:581
|
||||
msgid "WAN logging is already enabled."
|
||||
msgstr "WAN-жÑÑналиÑование Ñже вклÑÑено."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:88
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:88
|
||||
msgid "WAN logging on"
|
||||
msgstr "WAN-жÑÑнал: ÐÐÐ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:94
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:94
|
||||
msgid "WAN logging on (%s). Click to disable."
|
||||
msgstr "WAN-жÑÑнал: ÐÐÐ (%s). ÐажмиÑе, ÑÑÐ¾Ð±Ñ Ð¾ÑклÑÑиÑÑ."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:77
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:77
|
||||
msgid "WAN logging unavailable: missing kernel log modules"
|
||||
msgstr ""
|
||||
"WAN-жÑÑналиÑование недоÑÑÑпно: оÑÑÑÑÑÑвÑÑÑ Ð¼Ð¾Ð´Ñли "
|
||||
"жÑÑнала ÑдÑа"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:70
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:70
|
||||
msgid "WAN logging unavailable: no WAN zone"
|
||||
msgstr "WAN-жÑÑналиÑование недоÑÑÑпно: Ð½ÐµÑ Ð·Ð¾Ð½Ñ WAN"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203
|
||||
msgid "Waiting for firewall events"
|
||||
msgstr "Waiting for firewall events"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1545
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1545
|
||||
msgid "Watching"
|
||||
msgstr "ÐаблÑдение"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1603
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1603
|
||||
msgid "Wrap"
|
||||
msgstr "Перенос"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:123
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:123
|
||||
msgid "allow/deny rules, LAN logging, or anything else."
|
||||
msgstr "allow/deny rules, LAN logging, or anything else."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:828
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:828
|
||||
msgid "buffer full"
|
||||
msgstr "бÑÑÐµÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:81
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:81
|
||||
msgid "default 10/minute"
|
||||
msgstr "по ÑмолÑÐ°Ð½Ð¸Ñ 10/мин"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28
|
||||
msgid "is"
|
||||
msgstr "еÑÑÑ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:823
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:823
|
||||
msgid "loading buffer"
|
||||
msgstr "загÑÑзка бÑÑеÑа"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:923
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:923
|
||||
msgid "loading…"
|
||||
msgstr "loading…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:37
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:37
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44
|
||||
msgid "not"
|
||||
msgstr "не"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1107
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1107
|
||||
msgid "not AH"
|
||||
msgstr "не AH"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1106
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1106
|
||||
msgid "not ESP"
|
||||
msgstr "не ESP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1105
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1105
|
||||
msgid "not GRE"
|
||||
msgstr "не GRE"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1102
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1102
|
||||
msgid "not ICMP"
|
||||
msgstr "не ICMP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1103
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1103
|
||||
msgid "not ICMPv6"
|
||||
msgstr "не ICMPv6"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1104
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1104
|
||||
msgid "not IGMP"
|
||||
msgstr "не IGMP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1108
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1108
|
||||
msgid "not SCTP"
|
||||
msgstr "не SCTP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1100
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1100
|
||||
msgid "not TCP"
|
||||
msgstr "не TCP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1101
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1101
|
||||
msgid "not UDP"
|
||||
msgstr "не UDP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1666
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1666
|
||||
msgid "not block"
|
||||
msgstr "не блокиÑоваÑÑ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1665
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1665
|
||||
msgid "not drop"
|
||||
msgstr "не оÑбÑаÑÑваÑÑ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1664
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1664
|
||||
msgid "not pass"
|
||||
msgstr "не пÑопÑÑкаÑÑ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1667
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1667
|
||||
msgid "not reject"
|
||||
msgstr "не оÑклонÑÑÑ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1668
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1668
|
||||
msgid "not unknown"
|
||||
msgstr "не неизвеÑÑно"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1679
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1679
|
||||
msgid "or type…"
|
||||
msgstr "или введите…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:830
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:830
|
||||
msgid "render paused (high rate)"
|
||||
msgstr "ÑендеÑинг пÑиоÑÑановлен (вÑÑÐ¾ÐºÐ°Ñ ÑаÑÑоÑа)"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:817
|
||||
msgid "resolve paused (load)"
|
||||
msgstr "Разрешение приостановлено (нагрузка)"
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832
|
||||
msgid "scroll frozen — scroll to top to follow live"
|
||||
msgstr "scroll frozen — scroll to top to follow live"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:118
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:118
|
||||
msgid "sets log on the WAN firewall zone and reloads the firewall."
|
||||
msgstr "sets log on the WAN firewall zone and reloads the firewall."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:254
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:258
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:254
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:258
|
||||
msgid "then ping the router."
|
||||
msgstr "затем выполните ping маршрутизатора."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:815
|
||||
msgid "truncated"
|
||||
msgstr "обрезано"
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128
|
||||
msgid "turn it back off with the WAN logging on control on the watch strip."
|
||||
msgstr "turn it back off with the WAN logging on control on the watch strip."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:512
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:512
|
||||
msgid "using fw4"
|
||||
msgstr "иÑполÑзÑеÑÑÑ fw4"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:510
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:510
|
||||
msgid "using iptables"
|
||||
msgstr "иÑполÑзÑеÑÑÑ iptables"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:89
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:89
|
||||
msgid "· %s"
|
||||
msgstr "· %s"
|
||||
@@ -112,6 +112,14 @@ msgstr ""
|
||||
msgid "DPort"
|
||||
msgstr ""
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:814
|
||||
msgid "Degraded — sampling"
|
||||
msgstr ""
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:977
|
||||
msgid "Degraded — sampling (slow poll RTT; cadence reduced)."
|
||||
msgstr ""
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40
|
||||
msgid "Destination"
|
||||
msgstr ""
|
||||
@@ -225,6 +233,10 @@ msgid ""
|
||||
"buffer still updates; refresh will resume automatically."
|
||||
msgstr ""
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:984
|
||||
msgid "Hostname resolve paused while the router is under load."
|
||||
msgstr ""
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090
|
||||
msgid "ICMPv6"
|
||||
msgstr ""
|
||||
@@ -411,6 +423,14 @@ msgstr ""
|
||||
msgid "Rule labels unavailable — temp file failed"
|
||||
msgstr ""
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:980
|
||||
msgid "Server shedding — at most %d log lines per poll."
|
||||
msgstr ""
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:982
|
||||
msgid "Server truncated this poll (adaptive cap)."
|
||||
msgstr ""
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
|
||||
msgid "SPort"
|
||||
msgstr ""
|
||||
@@ -622,6 +642,10 @@ msgstr ""
|
||||
msgid "render paused (high rate)"
|
||||
msgstr ""
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:817
|
||||
msgid "resolve paused (load)"
|
||||
msgstr ""
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832
|
||||
msgid "scroll frozen — scroll to top to follow live"
|
||||
msgstr ""
|
||||
@@ -635,6 +659,10 @@ msgstr ""
|
||||
msgid "then ping the router."
|
||||
msgstr ""
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:815
|
||||
msgid "truncated"
|
||||
msgstr ""
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128
|
||||
msgid "turn it back off with the WAN logging on control on the watch strip."
|
||||
msgstr ""
|
||||
|
||||
@@ -12,72 +12,72 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:926
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:926
|
||||
msgid "%d matching · %d/%d stored"
|
||||
msgstr "%d matching · %d/%d stored"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:929
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:929
|
||||
msgid "0 matching · %d/%d stored"
|
||||
msgstr "0 matching · %d/%d stored"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:251
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:251
|
||||
msgid "Accessible (teal/orange)"
|
||||
msgstr "å¯è®¿é®ï¼é绿/æ©è²ï¼"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:32
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:32
|
||||
msgid "Action"
|
||||
msgstr "å¨ä½"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:618
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:618
|
||||
msgid "Administrator access is required to disable logging."
|
||||
msgstr "éè¦ç®¡çåæéæè½"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:586
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:586
|
||||
msgid "Administrator access is required to enable logging."
|
||||
msgstr "éè¦ç®¡çåæéæè½å¼å¯æ¥å¿è®°å½ã"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1092
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1092
|
||||
msgid "Also seen"
|
||||
msgstr "其他常见"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:571
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:607
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:571
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:607
|
||||
msgid "Another change is staged for the firewall; apply or revert it first."
|
||||
msgstr "防火墙另有未提交的更改;请先应用或还原。"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1658
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1658
|
||||
msgid "Any action"
|
||||
msgstr "ææå¨ä½"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1085
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1085
|
||||
msgid "Any protocol"
|
||||
msgstr "任意协议"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:113
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:113
|
||||
msgid "Before you enable logging"
|
||||
msgstr "Before you enable logging"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:569
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:569
|
||||
msgid "Cannot enable logging until kernel log modules are installed."
|
||||
msgstr "无法启用日志记录,直到内核日志模块已安装。"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:116
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:116
|
||||
msgid "Changes:"
|
||||
msgstr "Changes:"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:250
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:250
|
||||
msgid "Classic (green/red)"
|
||||
msgstr "ç»"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1642
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1642
|
||||
msgid "Classic uses green/red; Accessible uses teal/orange"
|
||||
msgstr "ç»"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:116
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:116
|
||||
msgid "Clear all"
|
||||
msgstr "æ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1698
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1698
|
||||
msgid ""
|
||||
"Click a cell to filter · ≠ on a chip to exclude · Ctrl+click a rule for "
|
||||
"firewall settings · in Simple view, click a row for the full message"
|
||||
@@ -85,17 +85,17 @@ msgstr ""
|
||||
"点击单元格筛选 · 芯片上的 ≠ 排除 · Ctrl+点击规则打开防火墙设置 · 在简单视图中"
|
||||
"点击行查看完整消息"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1719
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1719
|
||||
msgid ""
|
||||
"Click a row (Time or other non-link cells) to see the full log line (Simple "
|
||||
"view)."
|
||||
msgstr "点击一行(时间或其他非链接单元格)可查看完整日志行(简单视图)。"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:113
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:113
|
||||
msgid "Click a row for the full message"
|
||||
msgstr "点击行可查看完整消息"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1720
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1720
|
||||
msgid ""
|
||||
"Click an IP, action, or protocol to filter; use the Protocol menu (or ≠ on a "
|
||||
"chip) to exclude."
|
||||
@@ -103,84 +103,92 @@ msgstr ""
|
||||
"Click an IP, action, or protocol to filter; use the Protocol menu (or ≠ on a "
|
||||
"chip) to exclude."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1086
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1086
|
||||
msgid "Common"
|
||||
msgstr "常用"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:944
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:944
|
||||
msgid "Connection lost — retrying…"
|
||||
msgstr "Connection lost — retrying…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:609
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:609
|
||||
msgid "Could not disable logging."
|
||||
msgstr "æ æ³"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:573
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:573
|
||||
msgid "Could not enable logging."
|
||||
msgstr "æ æ³å¼å¯æ¥å¿è®°å½ã"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1680
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1680
|
||||
msgid "Custom protocol (prefix ! to exclude). Overrides the menu when set."
|
||||
msgstr "自定义协议(! 排除)。有内容时覆盖菜单。"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42
|
||||
msgid "DPort"
|
||||
msgstr "ç®æ 端å£"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:814
|
||||
msgid "Degraded — sampling"
|
||||
msgstr "降级 — 抽样"
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:977
|
||||
msgid "Degraded — sampling (slow poll RTT; cadence reduced)."
|
||||
msgstr "降级 — 抽样(轮询 RTT 较慢;已降低频率)。"
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40
|
||||
msgid "Destination"
|
||||
msgstr "ç®æ å°å"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691
|
||||
msgid "Destination IP contains (! to exclude)"
|
||||
msgstr "ç®æ IP å"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1692
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1692
|
||||
msgid "Destination port (! to exclude)"
|
||||
msgstr "ç®æ 端å£ï¼! 表示æé¤ï¼"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1583
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1583
|
||||
msgid "Detail"
|
||||
msgstr "详细"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37
|
||||
msgid "Dir"
|
||||
msgstr "æ¹å"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:85
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:85
|
||||
msgid "Disabling…"
|
||||
msgstr "Disabling…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1616
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1616
|
||||
msgid "Display options"
|
||||
msgstr "æ¾ç¤ºé项"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1716
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1716
|
||||
msgid "Display options on the bar set Limit, row tint, palette, and hostnames."
|
||||
msgstr "栏上的显示选项可设置行数限制、行着色、调色板和主机名。"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
|
||||
msgid "Does not change:"
|
||||
msgstr "Does not change:"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:138
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:138
|
||||
msgid "Don’t show this again"
|
||||
msgstr "Don’t show this again"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
|
||||
msgid "Enable WAN drop/reject logging"
|
||||
msgstr "Enable WAN drop/reject logging"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:104
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:104
|
||||
msgid "Enable WAN zone drop/reject logging (same as Network → Firewall)."
|
||||
msgstr "Enable WAN zone drop/reject logging (same as Network → Firewall)."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
|
||||
msgid "Enable logging"
|
||||
msgstr "å¼å¯æ¥å¿"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1715
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1715
|
||||
msgid ""
|
||||
"Enable logging turns on WAN zone drop/reject logging only (same as Network → "
|
||||
"Firewall). It does not add rules or log normal LAN browsing."
|
||||
@@ -188,55 +196,55 @@ msgstr ""
|
||||
"Enable logging turns on WAN zone drop/reject logging only (same as Network → "
|
||||
"Firewall). It does not add rules or log normal LAN browsing."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230
|
||||
msgid "Enabling…"
|
||||
msgstr "Enabling…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1099
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1099
|
||||
msgid "Exclude"
|
||||
msgstr "排除"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
|
||||
msgid "Exclude instead"
|
||||
msgstr "æ¹ä¸ºæé¤"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:53
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:71
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:53
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:71
|
||||
msgid "Filter by %s"
|
||||
msgstr "æ %s çé"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:136
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:136
|
||||
msgid "Filter by interface"
|
||||
msgstr "ææ¥å£çé"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:112
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:112
|
||||
msgid "Filter logs by rule (hint: %s). Ctrl+click to open firewall settings."
|
||||
msgstr "æè§åç鿥å¿ï¼æç¤ºï¼%sï¼ãCtrl+ç¹å»å¯æå¼é²ç«å¢è®¾ç½®ã"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1540
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/root/usr/share/luci/menu.d/luci-app-fwlive.json:3
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1540
|
||||
#: openwrt-feed/luci-app-fwlive/root/usr/share/luci/menu.d/luci-app-fwlive.json:3
|
||||
msgid "Firewall Live View"
|
||||
msgstr "é²ç«å¢å®æ¶è§å¾"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43
|
||||
msgid "Flags"
|
||||
msgstr "æ å¿"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:45
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:45
|
||||
msgid "Flow"
|
||||
msgstr "æµ"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3
|
||||
#: openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3
|
||||
msgid "Grant access to firewall live log view"
|
||||
msgstr "授予防火墙实时日志视图的访问权限"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1712
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1712
|
||||
msgid "Help"
|
||||
msgstr "帮å©"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:895
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:895
|
||||
msgid ""
|
||||
"High event rate — table refresh is throttled to protect the browser. The "
|
||||
"buffer still updates; refresh will resume automatically."
|
||||
@@ -244,15 +252,19 @@ msgstr ""
|
||||
"High event rate — table refresh is throttled to protect the browser. The "
|
||||
"buffer still updates; refresh will resume automatically."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:984
|
||||
msgid "Hostname resolve paused while the router is under load."
|
||||
msgstr "路由器负载较高,已暂停主机名解析。"
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090
|
||||
msgid "ICMPv6"
|
||||
msgstr "ICMPv6"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35
|
||||
msgid "IN"
|
||||
msgstr "IN"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1723
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1723
|
||||
msgid ""
|
||||
"If Row tint looks missing, the active LuCI theme may omit success/error or "
|
||||
"info/warn CSS variables; fwlive falls back to local colors (air-gapped, no "
|
||||
@@ -261,7 +273,7 @@ msgstr ""
|
||||
"å¦æè¡æè²çèµ·æ¥ç¼ºå¤±ï¼å½å LuCI 主é¢å¯è½æªæä¾æå/é误 CSS åéï¼fwlive "
|
||||
"ä¼åéå°æ¬å°é¢è²ï¼é离è¿è¡ï¼æ°æ®ä¸ä¼ç¦»å¼æ¬æºï¼ã"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:205
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:205
|
||||
msgid ""
|
||||
"If the WAN is quiet, wait for probes or use the optional ping check in "
|
||||
"Help / the enabling-logs guide."
|
||||
@@ -269,99 +281,99 @@ msgstr ""
|
||||
"If the WAN is quiet, wait for probes or use the optional ping check in "
|
||||
"Help / the enabling-logs guide."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80
|
||||
msgid "Include instead"
|
||||
msgstr "æ¹ä¸ºå"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34
|
||||
msgid "Interface"
|
||||
msgstr "æ¥å£"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1688
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1688
|
||||
msgid "Interface (prefix ! to exclude)"
|
||||
msgstr "æ¥å£ï¼! åç¼è¡¨ç¤ºæé¤ï¼"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:165
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:232
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:165
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:232
|
||||
msgid "I’ll configure this under Network → Firewall"
|
||||
msgstr "I’ll configure this under Network → Firewall"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:194
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:194
|
||||
msgid "Kernel log modules missing"
|
||||
msgstr "Kernel log modules missing"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:195
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:195
|
||||
msgid ""
|
||||
"Kernel netfilter log modules are missing. Install kmod-nf-log-ipv4 and kmod-"
|
||||
"nf-log-ipv6 (or kmod-nf-log / kmod-nf-log6), then reload the firewall."
|
||||
msgstr "缺å°å"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:44
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:44
|
||||
msgid "Len"
|
||||
msgstr "é¿åº¦"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1619
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1619
|
||||
msgid "Limit"
|
||||
msgstr "éå¶"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:536
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:536
|
||||
msgid "Limited diagnostics — timeout command missing"
|
||||
msgstr "诊断功能受限 — 缺少 timeout 命令"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:210
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:210
|
||||
msgid "Logging is off on this router"
|
||||
msgstr "Logging is off on this router"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:252
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:256
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:252
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:256
|
||||
msgid "Manual test (System → Terminal):"
|
||||
msgstr "手动测试(系统 → 终端):"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:46
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:221
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1590
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1595
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:46
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:221
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1590
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1595
|
||||
msgid "Message"
|
||||
msgstr "æ¶æ¯"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1686
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1686
|
||||
msgid "More filters"
|
||||
msgstr "æ´å¤çé"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:37
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:37
|
||||
msgid "Network → Firewall"
|
||||
msgstr "Network → Firewall"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:187
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:187
|
||||
msgid ""
|
||||
"No WAN firewall zone found in /etc/config/firewall. Configure zones under"
|
||||
msgstr "在 /etc/config/firewall 中未找到 WAN 防火墙区域。请在以下位置配置区域"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:185
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:185
|
||||
msgid "No WAN zone found"
|
||||
msgstr "No WAN zone found"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:163
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:163
|
||||
msgid "Not now"
|
||||
msgstr "Not now"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:220
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:220
|
||||
msgid "Nothing changes until you click Enable."
|
||||
msgstr "Nothing changes until you click Enable."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:36
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:36
|
||||
msgid "OUT"
|
||||
msgstr "åºæ¥å£"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1610
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1610
|
||||
msgid "One line"
|
||||
msgstr "单行"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:206
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:206
|
||||
msgid "Open firewall zone settings"
|
||||
msgstr "æå¼é²ç«å¢åºå设置"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211
|
||||
msgid ""
|
||||
"OpenWrt does not write firewall events to the log until you turn logging on. "
|
||||
"Live View only shows what the firewall already logs — it does not add allow/"
|
||||
@@ -371,44 +383,44 @@ msgstr ""
|
||||
"Live View only shows what the firewall already logs — it does not add allow/"
|
||||
"deny rules."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1638
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1638
|
||||
msgid "Palette"
|
||||
msgstr "Palette"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1560
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1560
|
||||
msgid "Pause"
|
||||
msgstr "æå"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
|
||||
msgid "Paused"
|
||||
msgstr "å·²æå"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:38
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:38
|
||||
msgid "Proto"
|
||||
msgstr "åè®®"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1674
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1674
|
||||
msgid "Protocol — common values"
|
||||
msgstr "协议 — 常用值"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1656
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1656
|
||||
msgid "Quick search"
|
||||
msgstr "å¿«éæç´¢"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:91
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:91
|
||||
msgid "Remove filter"
|
||||
msgstr "ç§»é¤çé"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995
|
||||
msgid "Resume"
|
||||
msgstr "ç»§ç»"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1631
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1631
|
||||
msgid "Row tint"
|
||||
msgstr "è¡æè²"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1721
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1721
|
||||
msgid ""
|
||||
"Row tint shows pass/deny row backgrounds when checked. Choose Classic (green/"
|
||||
"red, default) or Accessible (teal/orange). Action text stays colored either "
|
||||
@@ -417,78 +429,86 @@ msgstr ""
|
||||
"勾选后行着色显示放行/拒绝行背景。可选经典(绿/红,默认)或无障碍(青绿/橙)。"
|
||||
"操作文本在两种模式下均保持着色。"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1550
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1550
|
||||
msgid ""
|
||||
"Row tint used a local color fallback because the active LuCI theme did not "
|
||||
"apply pass/deny backgrounds."
|
||||
msgstr "è¡æè²ä½¿ç¨äºæ¬å°é¢è²åéï¼å 为å½å LuCI 䏻颿ªåºç¨æ¾è¡/æç»èæ¯è²ã"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:33
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:33
|
||||
msgid "Rule"
|
||||
msgstr "è§å"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:527
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:527
|
||||
msgid "Rule labels incomplete — map truncated"
|
||||
msgstr "Rule labels incomplete — map truncated"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:531
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:531
|
||||
msgid "Rule labels unavailable"
|
||||
msgstr "Rule labels unavailable"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:529
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:529
|
||||
msgid "Rule labels unavailable — temp file failed"
|
||||
msgstr "Rule labels unavailable — temp file failed"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:980
|
||||
msgid "Server shedding — at most %d log lines per poll."
|
||||
msgstr "服务器正在削减 — 每次轮询最多 %d 行日志。"
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:982
|
||||
msgid "Server truncated this poll (adaptive cap)."
|
||||
msgstr "服务器已截断本次轮询(自适应上限)。"
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41
|
||||
msgid "SPort"
|
||||
msgstr "æºç«¯å£"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1650
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1650
|
||||
msgid "Show hostnames"
|
||||
msgstr "æ¾ç¤ºä¸»æºå"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1629
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1629
|
||||
msgid "Show pass/deny row background colors"
|
||||
msgstr "显示放行/拒绝行背景色"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1576
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1576
|
||||
msgid "Simple"
|
||||
msgstr "简洁"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:39
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:39
|
||||
msgid "Source"
|
||||
msgstr "æºå°å"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1689
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1689
|
||||
msgid "Source IP contains (! to exclude)"
|
||||
msgstr "æº IP å"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1690
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1690
|
||||
msgid "Source port (! to exclude)"
|
||||
msgstr "æºç«¯å£ï¼! 表示æé¤ï¼"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1717
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1717
|
||||
msgid ""
|
||||
"The rate shown for WAN logging is the firewall zone log_limit. OpenWrt "
|
||||
"defaults to 10/minute when no explicit limit is configured; fwlive does not "
|
||||
"impose this cap."
|
||||
msgstr "WAN æ¥å¿æ¾ç¤ºçéçæ¯é²ç«å¢åºåç log_limitãæª"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1714
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1714
|
||||
msgid ""
|
||||
"The table updates automatically when your firewall logs traffic. Use Pause "
|
||||
"if it moves too fast."
|
||||
msgstr "é²ç«å¢å"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1551
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1551
|
||||
msgid "Theme tint fallback"
|
||||
msgstr "主é¢çè²åé"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:31
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:31
|
||||
msgid "Time"
|
||||
msgstr "æ¶é´"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:219
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:219
|
||||
msgid ""
|
||||
"Turns on WAN zone drop/reject logging (same as Network → Firewall → wan → "
|
||||
"Log). Rate-limited by the zone log_limit (OpenWrt default 10/minute). Normal "
|
||||
@@ -498,24 +518,24 @@ msgstr ""
|
||||
"Log). Rate-limited by the zone log_limit (OpenWrt default 10/minute). Normal "
|
||||
"LAN browsing is not logged."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:126
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:126
|
||||
msgid "Undo:"
|
||||
msgstr "Undo:"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1722
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1722
|
||||
msgid "Use Detail for all columns (flags, length, raw message)."
|
||||
msgstr "使用「详细」可查看全部列(标志、长度、原始消息)。"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1564
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1568
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1564
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1568
|
||||
msgid "View"
|
||||
msgstr "视图"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:615
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:615
|
||||
msgid "WAN drop/reject logging is off."
|
||||
msgstr "WAN drop/reject logging is off."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:204
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:204
|
||||
msgid ""
|
||||
"WAN drop/reject logging is on. Blocked inbound WAN traffic will show up "
|
||||
"here. Normal LAN browsing will not."
|
||||
@@ -523,7 +543,7 @@ msgstr ""
|
||||
"WAN drop/reject logging is on. Blocked inbound WAN traffic will show up "
|
||||
"here. Normal LAN browsing will not."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:579
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:579
|
||||
msgid ""
|
||||
"WAN drop/reject logging is on. Blocked inbound traffic should appear here as "
|
||||
"it happens — not normal LAN browsing."
|
||||
@@ -531,157 +551,165 @@ msgstr ""
|
||||
"WAN drop/reject logging is on. Blocked inbound traffic should appear here as "
|
||||
"it happens — not normal LAN browsing."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:581
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:581
|
||||
msgid "WAN logging is already enabled."
|
||||
msgstr "WAN æ¥å¿å·²å¤äºå¼å¯ç¶æã"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:88
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:88
|
||||
msgid "WAN logging on"
|
||||
msgstr "WAN æ¥å¿ï¼å¼"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:94
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:94
|
||||
msgid "WAN logging on (%s). Click to disable."
|
||||
msgstr "WAN æ¥å¿ï¼å¼ï¼%sï¼ãç¹å»å¯"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:77
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:77
|
||||
msgid "WAN logging unavailable: missing kernel log modules"
|
||||
msgstr "WAN æ¥å¿ä¸å¯ç¨ï¼ç¼ºå°å"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:70
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:70
|
||||
msgid "WAN logging unavailable: no WAN zone"
|
||||
msgstr "WAN æ¥å¿ä¸å¯ç¨ï¼æ WAN åºå"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203
|
||||
msgid "Waiting for firewall events"
|
||||
msgstr "Waiting for firewall events"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1545
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1545
|
||||
msgid "Watching"
|
||||
msgstr "çè§ä¸"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1603
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1603
|
||||
msgid "Wrap"
|
||||
msgstr "自动换行"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:123
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:123
|
||||
msgid "allow/deny rules, LAN logging, or anything else."
|
||||
msgstr "allow/deny rules, LAN logging, or anything else."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:828
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:828
|
||||
msgid "buffer full"
|
||||
msgstr "ç¼å²åºå·²æ»¡"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:81
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:81
|
||||
msgid "default 10/minute"
|
||||
msgstr "é»è®¤ 10 æ¡/åé"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28
|
||||
msgid "is"
|
||||
msgstr "æ¯"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:823
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:823
|
||||
msgid "loading buffer"
|
||||
msgstr "æ£å¨å è½½ç¼å²åº"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:923
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:923
|
||||
msgid "loading…"
|
||||
msgstr "loading…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:37
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:37
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44
|
||||
msgid "not"
|
||||
msgstr "é"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1107
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1107
|
||||
msgid "not AH"
|
||||
msgstr "非 AH"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1106
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1106
|
||||
msgid "not ESP"
|
||||
msgstr "非 ESP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1105
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1105
|
||||
msgid "not GRE"
|
||||
msgstr "非 GRE"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1102
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1102
|
||||
msgid "not ICMP"
|
||||
msgstr "非 ICMP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1103
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1103
|
||||
msgid "not ICMPv6"
|
||||
msgstr "非 ICMPv6"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1104
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1104
|
||||
msgid "not IGMP"
|
||||
msgstr "非 IGMP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1108
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1108
|
||||
msgid "not SCTP"
|
||||
msgstr "非 SCTP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1100
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1100
|
||||
msgid "not TCP"
|
||||
msgstr "非 TCP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1101
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1101
|
||||
msgid "not UDP"
|
||||
msgstr "非 UDP"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1666
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1666
|
||||
msgid "not block"
|
||||
msgstr "é黿¢"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1665
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1665
|
||||
msgid "not drop"
|
||||
msgstr "é丢å¼"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1664
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1664
|
||||
msgid "not pass"
|
||||
msgstr "éæ¾è¡"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1667
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1667
|
||||
msgid "not reject"
|
||||
msgstr "éæç»"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1668
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1668
|
||||
msgid "not unknown"
|
||||
msgstr "éæªç¥"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1679
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1679
|
||||
msgid "or type…"
|
||||
msgstr "或输入…"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:830
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:830
|
||||
msgid "render paused (high rate)"
|
||||
msgstr "渲ææåï¼éçè¿é«ï¼"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:817
|
||||
msgid "resolve paused (load)"
|
||||
msgstr "解析已暂停(负载)"
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832
|
||||
msgid "scroll frozen — scroll to top to follow live"
|
||||
msgstr "scroll frozen — scroll to top to follow live"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:118
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:118
|
||||
msgid "sets log on the WAN firewall zone and reloads the firewall."
|
||||
msgstr "sets log on the WAN firewall zone and reloads the firewall."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:254
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:258
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:254
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:258
|
||||
msgid "then ping the router."
|
||||
msgstr "然后 ping 路由器。"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:815
|
||||
msgid "truncated"
|
||||
msgstr "已截断"
|
||||
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128
|
||||
msgid "turn it back off with the WAN logging on control on the watch strip."
|
||||
msgstr "turn it back off with the WAN logging on control on the watch strip."
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:512
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:512
|
||||
msgid "using fw4"
|
||||
msgstr "ä½¿ç¨ fw4"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:510
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:510
|
||||
msgid "using iptables"
|
||||
msgstr "ä½¿ç¨ iptables"
|
||||
|
||||
#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:89
|
||||
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:89
|
||||
msgid "· %s"
|
||||
msgstr "· %s"
|
||||
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-mosdns
|
||||
PKG_VERSION:=1.7.14
|
||||
PKG_RELEASE:=24
|
||||
PKG_RELEASE:=25
|
||||
|
||||
LUCI_TITLE:=LuCI Support for mosdns
|
||||
LUCI_PKGARCH:=all
|
||||
|
||||
@@ -72,7 +72,7 @@ function get_adlist() {
|
||||
let adblock = uci_cursor.get('mosdns', 'config', 'adblock');
|
||||
|
||||
if (adblock !== '1') {
|
||||
mkdir('/etc/mosdns/rule', 0755);
|
||||
mkdir('/var/mosdns', 0755);
|
||||
exec_sys('rm -rf /etc/mosdns/rule/adlist /etc/mosdns/rule/.ad_source');
|
||||
writefile('/var/mosdns/disable-ads.txt', '');
|
||||
print("/var/mosdns/disable-ads.txt\n");
|
||||
|
||||
@@ -7,11 +7,11 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-openlist2
|
||||
PKG_VERSION:=1.0.4
|
||||
PKG_RELEASE:=6
|
||||
PKG_RELEASE:=7
|
||||
|
||||
LUCI_TITLE:=LuCI support for openlist
|
||||
# The virtual provide forces installation of a core package with the helper.
|
||||
LUCI_DEPENDS:=+openlist2 +openlist2-helper
|
||||
# Require a core package with both the restricted helper and automatic TLS.
|
||||
LUCI_DEPENDS:=+openlist2 +openlist2-helper +openlist2-tls
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
|
||||
@@ -545,7 +545,7 @@ return view.extend({
|
||||
};
|
||||
|
||||
o = addOption('scheme', form.Value, 'listen_https_port', _('HTTPS listen port'),
|
||||
_('The upstream default is -1 (disabled). Set a valid port number to enable HTTPS.'));
|
||||
_('Set to -1 to disable HTTPS, or 1-65535 to enable it. Leave both certificate paths empty to use an automatically generated self-signed certificate.'));
|
||||
o.datatype = 'integer';
|
||||
o.default = '-1';
|
||||
o.rmempty = false;
|
||||
@@ -554,14 +554,15 @@ return view.extend({
|
||||
return validateListenPort(value);
|
||||
};
|
||||
|
||||
o = addOption('scheme', form.Flag, 'force_https', _('Force HTTPS'));
|
||||
o = addOption('scheme', form.Flag, 'force_https', _('Force HTTPS'),
|
||||
_('Redirect HTTP requests to HTTPS. The HTTPS listen port enables HTTPS independently of this option.'));
|
||||
o.rmempty = false;
|
||||
|
||||
o = addOption('scheme', form.Value, 'ssl_cert', _('SSL cert'),
|
||||
_('SSL certificate file path'));
|
||||
_('Leave both paths empty to manage a self-signed certificate in the TLS subdirectory of the data directory. It is reused and renewed at startup when fewer than 30 days remain. Browsers do not trust self-signed certificates automatically.'));
|
||||
|
||||
o = addOption('scheme', form.Value, 'ssl_key', _('SSL key'),
|
||||
_('SSL key file path'));
|
||||
_('For custom TLS, specify both certificate and private key paths. The certificate must be currently valid and match its private key. Custom files are never overwritten automatically.'));
|
||||
|
||||
o = addOption('scheme', form.Value, 'listen_unix_file', _('Unix socket file'));
|
||||
|
||||
@@ -572,7 +573,7 @@ return view.extend({
|
||||
o.rmempty = false;
|
||||
|
||||
o = addOption('scheme', form.Flag, 'listen_enable_h3', _('Enable HTTP/3/QUIC'),
|
||||
_('Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled and certificate files must be configured.'));
|
||||
_('Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled. Certificate settings are shared with HTTPS.'));
|
||||
o.rmempty = false;
|
||||
|
||||
// tasks
|
||||
@@ -698,7 +699,8 @@ return view.extend({
|
||||
o.default = 5246;
|
||||
o.rmempty = false;
|
||||
|
||||
o = addOption('s3', form.Flag, 's3_ssl', _('Enable SSL'));
|
||||
o = addOption('s3', form.Flag, 's3_ssl', _('Enable SSL'),
|
||||
_('Use the same custom or automatically generated certificate as HTTPS. Configure certificate paths on the Web Protocol tab.'));
|
||||
o.rmempty = false;
|
||||
|
||||
// ftp
|
||||
@@ -708,7 +710,8 @@ return view.extend({
|
||||
_('Ports or ranges to allow from WAN, for example 50000-50100. They must match the listening ports in OpenList passive port mapping. Empty means passive ports must be allowed manually.'));
|
||||
o.placeholder = '50000-50100';
|
||||
o.depends({ ftp: '1', allow_wan: '1' });
|
||||
o = addOption('ftp', form.Flag, 'ftp', _('Enabled FTP'));
|
||||
o = addOption('ftp', form.Flag, 'ftp', _('Enabled FTP'),
|
||||
_('Enable FTP/SFTP access for the OpenList account in Management > Users. Also grant FTP/SFTP management permission to allow uploads and changes.'));
|
||||
o.rmempty = false;
|
||||
|
||||
o = addOption('ftp', form.Value, 'ftp_port', _('FTP Port'));
|
||||
@@ -749,7 +752,8 @@ return view.extend({
|
||||
o.rmempty = false;
|
||||
|
||||
// sftp
|
||||
o = addOption('sftp', form.Flag, 'sftp', _('Enabled SFTP'));
|
||||
o = addOption('sftp', form.Flag, 'sftp', _('Enabled SFTP'),
|
||||
_('Enable FTP/SFTP access for the OpenList account in Management > Users. Also grant FTP/SFTP management permission to allow uploads and changes.'));
|
||||
o.rmempty = false;
|
||||
|
||||
o = addOption('sftp', form.Value, 'sftp_port', _('SFTP Port'));
|
||||
@@ -764,7 +768,7 @@ return view.extend({
|
||||
|
||||
|
||||
o = addOption('mcp', form.DummyValue, '_mcp_endpoint', _('MCP endpoint'),
|
||||
_('Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList user login token; retain MCP-Session-Id for subsequent requests.'));
|
||||
_('Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList administrator login token; retain MCP-Session-Id for subsequent requests.'));
|
||||
o.depends('mcp', '1');
|
||||
o.renderWidget = () => E('div', {}, [
|
||||
E('code', {}, backendUrl('mcp') || _('Configure a web port or Site URL.')),
|
||||
@@ -793,26 +797,48 @@ return view.extend({
|
||||
if (dist && (containsPath(dist, data) || containsPath(dist, cache) ||
|
||||
containsPath(cache, dist) || containsPath(dist, index) || containsPath(index, dist)))
|
||||
return _('Frontend files must be separate from private data, cache and index files.');
|
||||
if (tlsRequired(section_id) && !fieldValue(section_id, 'ssl_cert') && !fieldValue(section_id, 'ssl_key')) {
|
||||
const tls = data + '/tls';
|
||||
for (const directory of [cache, index, dist].filter(Boolean))
|
||||
if (containsPath(tls, directory) || containsPath(directory, tls))
|
||||
return _('Automatic TLS directory must be separate from cache, index and public frontend directories.');
|
||||
}
|
||||
return true;
|
||||
};
|
||||
for (const name of ['data_dir', 'temp_dir', 'bleve_dir', 'dist_dir'])
|
||||
fields[name].validate = (section_id, value) => validateDirectories(section_id, name, value);
|
||||
|
||||
const tlsRequired = section_id => isEnabledPort(fieldValue(section_id, 'listen_https_port', '-1')) ||
|
||||
(fieldValue(section_id, 's3') === '1' && fieldValue(section_id, 's3_ssl') === '1');
|
||||
for (const name of ['ssl_cert', 'ssl_key']) {
|
||||
fields[name].validate = (section_id, value) => {
|
||||
if (tlsRequired(section_id) && !String(value || '').trim())
|
||||
return _('Certificate and key paths are required for HTTPS or S3 SSL.');
|
||||
return validateAbsolutePath(value, false);
|
||||
};
|
||||
}
|
||||
const tlsRequired = section_id => {
|
||||
const httpsPort = fieldValue(section_id, 'listen_https_port', '-1');
|
||||
const s3Enabled = fieldValue(section_id, 's3') === '1';
|
||||
const s3Ssl = fieldValue(section_id, 's3_ssl') === '1';
|
||||
return isEnabledPort(httpsPort) || (s3Enabled && s3Ssl);
|
||||
};
|
||||
const validateCertificatePaths = (section_id, changed, value) => {
|
||||
if (!tlsRequired(section_id))
|
||||
return true;
|
||||
const cert = changed === 'ssl_cert' ? value : fieldValue(section_id, 'ssl_cert');
|
||||
const key = changed === 'ssl_key' ? value : fieldValue(section_id, 'ssl_key');
|
||||
if (!cert && !key)
|
||||
return true;
|
||||
if (!cert || !key)
|
||||
return _('Leave both certificate paths empty for automatic TLS, or provide both custom certificate and key paths.');
|
||||
for (const path of [cert, key]) {
|
||||
const valid = validateAbsolutePath(path, true);
|
||||
if (valid !== true)
|
||||
return valid;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
for (const name of ['ssl_cert', 'ssl_key'])
|
||||
fields[name].validate = (section_id, value) => validateCertificatePaths(section_id, name, value);
|
||||
// LuCI passes input.value (always "1") for checkbox validation.
|
||||
// Read formvalue() to distinguish checked and unchecked flags.
|
||||
for (const name of ['force_https', 'listen_enable_h3'])
|
||||
fields[name].validate = (section_id, value) => value !== '1' || isEnabledPort(fieldValue(section_id, 'listen_https_port', '-1'))
|
||||
fields[name].validate = section_id => fieldValue(section_id, name) !== '1' || isEnabledPort(fieldValue(section_id, 'listen_https_port', '-1'))
|
||||
? true : _('Force HTTPS and HTTP/3 require an enabled HTTPS port.');
|
||||
fields.s3_ssl.validate = (section_id, value) => value !== '1' || fieldValue(section_id, 's3') !== '1' ||
|
||||
(fieldValue(section_id, 'ssl_cert').trim() && fieldValue(section_id, 'ssl_key').trim())
|
||||
? true : _('Certificate and key paths are required for HTTPS or S3 SSL.');
|
||||
fields.s3_ssl.validate = section_id => fieldValue(section_id, 's3') !== '1' || fieldValue(section_id, 's3_ssl') !== '1'
|
||||
? true : validateCertificatePaths(section_id);
|
||||
fields.listen_unix_file.validate = (section_id, value) => validateAbsolutePath(value, false);
|
||||
fields.listen_unix_file_perm.validate = (section_id, value) => !value || /^[0-7]{3,4}$/.test(value)
|
||||
? true : _('Use 3 or 4 octal digits, for example 660 or 0660.');
|
||||
@@ -857,6 +883,17 @@ return view.extend({
|
||||
};
|
||||
for (const name of ['listen_http_port', 'listen_https_port', 's3_port', 'ftp_port', 'sftp_port', 'ftp_pasv_ports'])
|
||||
fields[name].validate = (section_id, value) => validatePorts(section_id, name, value);
|
||||
const protocolFields = ['listen_http_port', 'listen_https_port', 'force_https', 'listen_enable_h3',
|
||||
'ssl_cert', 'ssl_key', 's3', 's3_ssl', 's3_port', 'ftp', 'ftp_port', 'sftp', 'sftp_port',
|
||||
'ftp_pasv_ports', 'allow_wan', 'data_dir', 'temp_dir', 'bleve_dir', 'dist_dir'];
|
||||
const revalidateProtocolFields = (event, section_id) => {
|
||||
for (const name of protocolFields)
|
||||
if (fields[name].isActive(section_id))
|
||||
fields[name].triggerValidation(section_id);
|
||||
ui.tabs.updateTabs(event, m.root);
|
||||
};
|
||||
for (const name of protocolFields)
|
||||
fields[name].onchange = revalidateProtocolFields;
|
||||
for (const name of ['ftp_pasv_ports', 'log_path', 'log_max_size', 'log_max_backups', 'log_max_age',
|
||||
'log_compress', 'log_filter', 'log_filter_cidr', 'log_filter_path', 'log_filter_method'])
|
||||
fields[name].retain = true;
|
||||
|
||||
@@ -54,7 +54,7 @@ return view.extend({
|
||||
const clearButton = E('button', {
|
||||
'class': 'btn cbi-button-action',
|
||||
'type': 'button',
|
||||
'disabled': !L.hasViewPermission(),
|
||||
'disabled': !L.hasViewPermission() || null,
|
||||
'click': ui.createHandlerFn(this, 'handleCleanLogs')
|
||||
}, _('Clear current log'));
|
||||
|
||||
|
||||
@@ -439,19 +439,23 @@ msgid "HTTPS listen port"
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:548
|
||||
msgid "The upstream default is -1 (disabled). Set a valid port number to enable HTTPS."
|
||||
msgid "Set to -1 to disable HTTPS, or 1-65535 to enable it. Leave both certificate paths empty to use an automatically generated self-signed certificate."
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:557
|
||||
msgid "Force HTTPS"
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
|
||||
msgid "Redirect HTTP requests to HTTPS. The HTTPS listen port enables HTTPS independently of this option."
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:560
|
||||
msgid "SSL cert"
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:561
|
||||
msgid "SSL certificate file path"
|
||||
msgid "Leave both paths empty to manage a self-signed certificate in the TLS subdirectory of the data directory. It is reused and renewed at startup when fewer than 30 days remain. Browsers do not trust self-signed certificates automatically."
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:563
|
||||
@@ -459,7 +463,7 @@ msgid "SSL key"
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:564
|
||||
msgid "SSL key file path"
|
||||
msgid "For custom TLS, specify both certificate and private key paths. The certificate must be currently valid and match its private key. Custom files are never overwritten automatically."
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:566
|
||||
@@ -483,7 +487,7 @@ msgid "Enable HTTP/3/QUIC"
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:575
|
||||
msgid "Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled and certificate files must be configured."
|
||||
msgid "Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled. Certificate settings are shared with HTTPS."
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:579
|
||||
@@ -632,6 +636,10 @@ msgstr ""
|
||||
msgid "Enabled FTP"
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
|
||||
msgid "Enable FTP/SFTP access for the OpenList account in Management > Users. Also grant FTP/SFTP management permission to allow uploads and changes."
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:714
|
||||
msgid "FTP Port"
|
||||
msgstr ""
|
||||
@@ -689,7 +697,7 @@ msgid "MCP endpoint"
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:767
|
||||
msgid "Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList user login token; retain MCP-Session-Id for subsequent requests."
|
||||
msgid "Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList administrator login token; retain MCP-Session-Id for subsequent requests."
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:770
|
||||
@@ -718,7 +726,15 @@ msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:806
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:815
|
||||
msgid "Certificate and key paths are required for HTTPS or S3 SSL."
|
||||
msgid "Leave both certificate paths empty for automatic TLS, or provide both custom certificate and key paths."
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
|
||||
msgid "Automatic TLS directory must be separate from cache, index and public frontend directories."
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
|
||||
msgid "Use the same custom or automatically generated certificate as HTTPS. Configure certificate paths on the Web Protocol tab."
|
||||
msgstr ""
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:812
|
||||
|
||||
@@ -440,28 +440,32 @@ msgid "HTTPS listen port"
|
||||
msgstr "HTTPS 监听端口"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:548
|
||||
msgid "The upstream default is -1 (disabled). Set a valid port number to enable HTTPS."
|
||||
msgstr "上游默认值为 -1(禁用)。设为有效端口号可启用 HTTPS。"
|
||||
msgid "Set to -1 to disable HTTPS, or 1-65535 to enable it. Leave both certificate paths empty to use an automatically generated self-signed certificate."
|
||||
msgstr "设为 -1 可禁用 HTTPS,设为 1–65535 可启用 HTTPS。证书和私钥路径同时留空时,使用自动生成的自签名证书。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:557
|
||||
msgid "Force HTTPS"
|
||||
msgstr "强制 HTTPS"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
|
||||
msgid "Redirect HTTP requests to HTTPS. The HTTPS listen port enables HTTPS independently of this option."
|
||||
msgstr "将 HTTP 请求重定向到 HTTPS。是否启用 HTTPS 由 HTTPS 监听端口决定,与此选项独立。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:560
|
||||
msgid "SSL cert"
|
||||
msgstr "SSL 证书"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:561
|
||||
msgid "SSL certificate file path"
|
||||
msgstr "SSL 证书文件路径"
|
||||
msgid "Leave both paths empty to manage a self-signed certificate in the TLS subdirectory of the data directory. It is reused and renewed at startup when fewer than 30 days remain. Browsers do not trust self-signed certificates automatically."
|
||||
msgstr "两项路径同时留空时,在数据目录的 tls 子目录中自动管理自签名证书。有效证书会复用,剩余有效期不足 30 天时在启动时更新。浏览器不会自动信任自签名证书。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:563
|
||||
msgid "SSL key"
|
||||
msgstr "SSL 密钥"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:564
|
||||
msgid "SSL key file path"
|
||||
msgstr "SSL 密钥文件路径"
|
||||
msgid "For custom TLS, specify both certificate and private key paths. The certificate must be currently valid and match its private key. Custom files are never overwritten automatically."
|
||||
msgstr "使用自定义证书时,请同时填写证书和私钥路径。证书必须在有效期内且与私钥匹配。自定义文件不会被自动覆盖。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:566
|
||||
msgid "Unix socket file"
|
||||
@@ -484,8 +488,8 @@ msgid "Enable HTTP/3/QUIC"
|
||||
msgstr "启用 HTTP/3/QUIC"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:575
|
||||
msgid "Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled and certificate files must be configured."
|
||||
msgstr "在 HTTPS 监听端口上启用基于 QUIC 的 HTTP/3。必须先启用 HTTPS 并配置证书文件。"
|
||||
msgid "Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled. Certificate settings are shared with HTTPS."
|
||||
msgstr "在 HTTPS 监听端口上启用基于 QUIC 的 HTTP/3。必须先启用 HTTPS,并与 HTTPS 共用证书设置。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:579
|
||||
msgid "Open traffic settings"
|
||||
@@ -633,6 +637,10 @@ msgstr "允许从 WAN 访问的端口或范围,例如 50000-50100,必须与
|
||||
msgid "Enabled FTP"
|
||||
msgstr "启用 FTP"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
|
||||
msgid "Enable FTP/SFTP access for the OpenList account in Management > Users. Also grant FTP/SFTP management permission to allow uploads and changes."
|
||||
msgstr "还需在 OpenList 管理后台的“用户”中为账号开启 FTP/SFTP 访问权限;上传和修改文件还需要 FTP/SFTP 管理权限。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:714
|
||||
msgid "FTP Port"
|
||||
msgstr "FTP 端口"
|
||||
@@ -690,8 +698,8 @@ msgid "MCP endpoint"
|
||||
msgstr "MCP 端点"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:767
|
||||
msgid "Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList user login token; retain MCP-Session-Id for subsequent requests."
|
||||
msgstr "使用 Streamable HTTP,认证头为 Authorization: TOKEN,不添加 Bearer 前缀。TOKEN 为 OpenList 用户登录令牌,后续请求需保留 MCP-Session-Id。"
|
||||
msgid "Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList administrator login token; retain MCP-Session-Id for subsequent requests."
|
||||
msgstr "使用 Streamable HTTP,认证头为 Authorization: TOKEN,不添加 Bearer 前缀。TOKEN 必须为 OpenList 管理员登录令牌,后续请求需保留 MCP-Session-Id。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:770
|
||||
msgid "Configure a web port or Site URL."
|
||||
@@ -719,8 +727,16 @@ msgstr "前端文件必须与私有数据、缓存和索引分开。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:806
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:815
|
||||
msgid "Certificate and key paths are required for HTTPS or S3 SSL."
|
||||
msgstr "启用 HTTPS 或 S3 SSL 时必须填写证书和私钥路径。"
|
||||
msgid "Leave both certificate paths empty for automatic TLS, or provide both custom certificate and key paths."
|
||||
msgstr "请将证书和私钥路径同时留空以自动生成证书,或同时填写自定义证书和私钥路径。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
|
||||
msgid "Automatic TLS directory must be separate from cache, index and public frontend directories."
|
||||
msgstr "自动 TLS 目录必须与缓存、索引和公开前端目录分开。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
|
||||
msgid "Use the same custom or automatically generated certificate as HTTPS. Configure certificate paths on the Web Protocol tab."
|
||||
msgstr "与 HTTPS 共用自定义或自动生成的证书。请在“Web 协议”选项卡配置证书路径。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:812
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:855
|
||||
|
||||
@@ -440,28 +440,32 @@ msgid "HTTPS listen port"
|
||||
msgstr "HTTPS 監聽埠"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:548
|
||||
msgid "The upstream default is -1 (disabled). Set a valid port number to enable HTTPS."
|
||||
msgstr "上游預設值為 -1(停用)。設為有效埠號可啟用 HTTPS。"
|
||||
msgid "Set to -1 to disable HTTPS, or 1-65535 to enable it. Leave both certificate paths empty to use an automatically generated self-signed certificate."
|
||||
msgstr "設為 -1 可停用 HTTPS,設為 1–65535 可啟用 HTTPS。憑證與私密金鑰路徑同時留空時,使用自動產生的自簽憑證。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:557
|
||||
msgid "Force HTTPS"
|
||||
msgstr "強制 HTTPS"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
|
||||
msgid "Redirect HTTP requests to HTTPS. The HTTPS listen port enables HTTPS independently of this option."
|
||||
msgstr "將 HTTP 請求重新導向至 HTTPS。是否啟用 HTTPS 由 HTTPS 監聽埠決定,與此選項獨立。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:560
|
||||
msgid "SSL cert"
|
||||
msgstr "SSL 證書"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:561
|
||||
msgid "SSL certificate file path"
|
||||
msgstr "SSL 證書檔案路徑"
|
||||
msgid "Leave both paths empty to manage a self-signed certificate in the TLS subdirectory of the data directory. It is reused and renewed at startup when fewer than 30 days remain. Browsers do not trust self-signed certificates automatically."
|
||||
msgstr "兩項路徑同時留空時,在資料目錄的 tls 子目錄中自動管理自簽憑證。有效憑證會重複使用,剩餘有效期不足 30 天時於啟動時更新。瀏覽器不會自動信任自簽憑證。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:563
|
||||
msgid "SSL key"
|
||||
msgstr "SSL 金鑰"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:564
|
||||
msgid "SSL key file path"
|
||||
msgstr "SSL 金鑰檔案路徑"
|
||||
msgid "For custom TLS, specify both certificate and private key paths. The certificate must be currently valid and match its private key. Custom files are never overwritten automatically."
|
||||
msgstr "使用自訂憑證時,請同時填寫憑證與私密金鑰路徑。憑證必須在有效期內且與私密金鑰相符。自訂檔案不會被自動覆寫。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:566
|
||||
msgid "Unix socket file"
|
||||
@@ -484,8 +488,8 @@ msgid "Enable HTTP/3/QUIC"
|
||||
msgstr "啟用 HTTP/3/QUIC"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:575
|
||||
msgid "Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled and certificate files must be configured."
|
||||
msgstr "在 HTTPS 監聽連接埠上啟用基於 QUIC 的 HTTP/3。必須先啟用 HTTPS 並配置憑證檔案。"
|
||||
msgid "Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled. Certificate settings are shared with HTTPS."
|
||||
msgstr "在 HTTPS 監聽埠上啟用基於 QUIC 的 HTTP/3。必須先啟用 HTTPS,並與 HTTPS 共用憑證設定。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:579
|
||||
msgid "Open traffic settings"
|
||||
@@ -633,6 +637,10 @@ msgstr "允許從 WAN 存取的連接埠或範圍,例如 50000-50100,必須
|
||||
msgid "Enabled FTP"
|
||||
msgstr "啟用 FTP"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
|
||||
msgid "Enable FTP/SFTP access for the OpenList account in Management > Users. Also grant FTP/SFTP management permission to allow uploads and changes."
|
||||
msgstr "還需在 OpenList 管理後台的「使用者」中為帳號開啟 FTP/SFTP 存取權限;上傳和修改檔案還需要 FTP/SFTP 管理權限。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:714
|
||||
msgid "FTP Port"
|
||||
msgstr "FTP 埠"
|
||||
@@ -690,8 +698,8 @@ msgid "MCP endpoint"
|
||||
msgstr "MCP 端點"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:767
|
||||
msgid "Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList user login token; retain MCP-Session-Id for subsequent requests."
|
||||
msgstr "使用 Streamable HTTP,認證標頭為 Authorization: TOKEN,不加 Bearer 前綴。TOKEN 為 OpenList 使用者登入權杖,後續請求須保留 MCP-Session-Id。"
|
||||
msgid "Use Streamable HTTP with Authorization: TOKEN, without a Bearer prefix. Use an OpenList administrator login token; retain MCP-Session-Id for subsequent requests."
|
||||
msgstr "使用 Streamable HTTP,認證標頭為 Authorization: TOKEN,不加 Bearer 前綴。TOKEN 必須為 OpenList 管理員登入權杖,後續請求須保留 MCP-Session-Id。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:770
|
||||
msgid "Configure a web port or Site URL."
|
||||
@@ -719,8 +727,16 @@ msgstr "前端檔案必須與私人資料、快取及索引分開。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:806
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:815
|
||||
msgid "Certificate and key paths are required for HTTPS or S3 SSL."
|
||||
msgstr "啟用 HTTPS 或 S3 SSL 時必須填寫憑證及私密金鑰路徑。"
|
||||
msgid "Leave both certificate paths empty for automatic TLS, or provide both custom certificate and key paths."
|
||||
msgstr "請將憑證與私密金鑰路徑同時留空以自動產生憑證,或同時填寫自訂憑證與私密金鑰路徑。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
|
||||
msgid "Automatic TLS directory must be separate from cache, index and public frontend directories."
|
||||
msgstr "自動 TLS 目錄必須與快取、索引及公開前端目錄分開。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js
|
||||
msgid "Use the same custom or automatically generated certificate as HTTPS. Configure certificate paths on the Web Protocol tab."
|
||||
msgstr "與 HTTPS 共用自訂或自動產生的憑證。請在「Web 協定」分頁設定憑證路徑。"
|
||||
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:812
|
||||
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:855
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
# Preserve the original supplemental SVG bytes and source SHA256.
|
||||
htdocs/luci-static/resources/oui/midea.svg -text whitespace=cr-at-eol
|
||||
@@ -0,0 +1,19 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_VERSION:=1.0.6
|
||||
PKG_RELEASE:=1
|
||||
PKG_LICENSE:=GPL-2.0-only AND CC0-1.0 AND MIT AND LicenseRef-Public-Domain AND LicenseRef-fnOS-Trademark
|
||||
LUCI_MAINTAINER:=coolsnowwolf <coolsnowwolf@gmail.com>
|
||||
|
||||
LUCI_TITLE:=Local OUI vendor icons for DHCP leases
|
||||
LUCI_DEPENDS:=+luci-base
|
||||
LUCI_PKGARCH:=all
|
||||
|
||||
define Package/luci-app-oui/conffiles
|
||||
/etc/config/oui
|
||||
endef
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
||||
@@ -0,0 +1,87 @@
|
||||
# luci-app-oui
|
||||
|
||||
Optional local vendor SVG icons beside DHCP lease hostnames. Install together with
|
||||
this tree's luci-base / luci-mod-status integration. No daemon, external lookup,
|
||||
or scheduled download. Optional device overrides are available for devices using OEM network modules.
|
||||
|
||||
The normal LuCI feature response checks for the installed helper. Without the
|
||||
package, the homepage neither loads its JavaScript nor fetches the OUI database
|
||||
or icons. With it, hostnames render immediately; icons are added asynchronously.
|
||||
The database is fetched once per page, including caching failures, and its hash
|
||||
in the filename invalidates browser caches after data updates. SVG requests are
|
||||
shared by brand and use normal HTTP caching. The resident prefix table bounds
|
||||
memory usage; no per-client MAC history is stored. No MAC is sent off-router.
|
||||
|
||||
Data comes from [WH-2099/macdb](https://github.com/WH-2099/macdb), which combines
|
||||
IEEE MA-L, MA-M and MA-S assignments. Longest-prefix matching supports 24/28/36
|
||||
bits. Multicast, locally administered/randomized and malformed MACs are ignored.
|
||||
Unknown vendors, absent/random MACs and brands without a bundled icon use a
|
||||
small generic desktop SVG. It is an original GPL-2.0-only asset, not a brand logo.
|
||||
The icon identifies the registered MAC vendor: a PC using an Intel NIC can show
|
||||
Intel rather than the motherboard manufacturer. DHCP hostnames are not used to
|
||||
guess brands.
|
||||
|
||||
Hosts with an open TCP port 5666 or 5667 in the existing LAN web-probe cache
|
||||
show the fnOS logo instead of the OUI icon. The probe must be ready and match
|
||||
the current IP and MAC; any active IPv4 address of a merged client can qualify.
|
||||
This is a port-based display heuristic, not OS authentication. The vector logo
|
||||
was traced from the supplied `fnos.PNG`; see `NOTICE.fnos`.
|
||||
|
||||
Most icons are an unmodified subset of
|
||||
[Simple Icons 11.15.0](https://github.com/simple-icons/simple-icons/tree/11.15.0),
|
||||
pinned to retain brands removed from newer releases (including Microsoft).
|
||||
The included Simple Icons CC0 license and disclaimer and macdb MIT license travel
|
||||
with the package. Not all hardware brands exist in this snapshot: for example,
|
||||
ASRock and Realme have no bundled official Simple Icons asset. They are
|
||||
not relabeled as another manufacturer. GIGABYTE uses a supplemental public-domain
|
||||
wordmark; its source and attribution are recorded in `NOTICE.supplemental`.
|
||||
|
||||
## Updating the subset
|
||||
|
||||
On a development machine with Python 3, unpack Simple Icons 11.15.0 and a macdb
|
||||
snapshot, then run:
|
||||
|
||||
```sh
|
||||
python3 tools/generate.py /path/to/macdb /path/to/simple-icons-11.15.0
|
||||
```
|
||||
|
||||
`tools/vendors.json` contains normalized manufacturer alias patterns. Normalizing
|
||||
case and punctuation merges ASUSTek COMPUTER INC., ASUSTeK Computer Inc., ASUS and
|
||||
ASUS COMPUTER INTERNATIONAL under ASUS; patterns are anchored to avoid accidental
|
||||
matches such as Pegasus or Asustor. Ambiguous matches abort generation.
|
||||
`tools/sources.json` records the input CSV SHA256, source URLs, exact observed
|
||||
aliases and generated database filename. Review these with any regenerated data.
|
||||
Generation also updates the helper's database URL. Bump the package version and
|
||||
the homepage helper query version when changing the helper or generated data.
|
||||
No source downloads or Python dependency are needed when building/installing.
|
||||
|
||||
Run the regression checks with `python3 tools/test_generate.py` and
|
||||
`node tools/test_oui.js`.
|
||||
|
||||
## OEM devices and supplemental brands
|
||||
|
||||
Midea and TCL SVGs supplement the Simple Icons subset. Their individual sources,
|
||||
authors and hashes are recorded in `tools/supplemental.json` and the packaged
|
||||
`NOTICE.supplemental`. These are not claimed to be Simple Icons assets.
|
||||
|
||||
For a known device whose MAC belongs to a module maker, add an exact device entry
|
||||
to `/etc/config/oui` (vendor is the icon slug):
|
||||
|
||||
```uci
|
||||
config device
|
||||
option mac '00:11:22:33:44:55'
|
||||
option vendor 'tcl'
|
||||
```
|
||||
|
||||
Only that full MAC is overridden, never the module maker's entire prefix. The
|
||||
configuration is preserved on upgrades and read once asynchronously through the
|
||||
authenticated UCI RPC. It is not published as a static file, and no device-specific
|
||||
MAC is shipped in the package. Reload the homepage after changing it.
|
||||
|
||||
Imilab / Chuangmi manufacturer aliases are intentionally grouped under Xiaomi
|
||||
for Mi Home cameras, including all matching OUI assignments. This is a product
|
||||
ecosystem grouping rather than a claim that the registered companies are identical.
|
||||
|
||||
Hui Zhou / Huizhou Gaoshengda aliases are intentionally grouped under TCL. This
|
||||
OEM heuristic applies to all registered prefixes for that module maker, including
|
||||
0C:79:55. A device override can correct exceptions using the same OEM modules.
|
||||
@@ -0,0 +1,54 @@
|
||||
# Disclaimer
|
||||
|
||||
Simple Icons asks that its users read this disclaimer fully before including an icon in their project.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Licenses, Copyrights & Trademarks](#licenses-copyrights--trademarks)
|
||||
- [Brand Guidelines](#brand-guidelines)
|
||||
- [Update of Brands](#update-of-brands)
|
||||
- [Removal of Brands](#removal-of-brands)
|
||||
|
||||
## Licenses, Copyrights & Trademarks
|
||||
|
||||
> [!IMPORTANT]\
|
||||
> The addition of licenses to Simple Icons is an ongoing project. Hence, the absence of licence data for a particular icon does not imply that the icon is not released under a license.
|
||||
|
||||
> [!NOTE]\
|
||||
> Simple Icons is released under CC0 - though that doesn't mean to imply that all icons within the project are also CC0. Please see individual licenses where available.
|
||||
|
||||
Simple Icons provides data on the license under which icons are available. We ask users to carefully consider this when using an icon. As licenses are subject to change we also ask our users to regularly check if the license of the icons they use have been changed.
|
||||
|
||||
The license under which an icon is available can be found in the icon's entry in the JSON data file in the NPM and Packagist packages, or through the license link on the icon's card on [the Simple Icons website].
|
||||
|
||||
As we rely largely on our community to help us keep Simple Icons up-to-date, the license data for an icon may be outdated. If you find that the license data provided is outdated, please [submit an issue][icon-outdated-issues] to [the Simple Icons GitHub repository].
|
||||
|
||||
If an icon includes a registered trademark (`®`) or trademark symbol (`™`) the recommendations outlined in [the Simple Icons Contributing Guidelines] are followed to decide whether to include the symbol or not.
|
||||
|
||||
Simple Icons cannot be held responsible for any legal activity raised by a brand, or users of the package. We ask that our users seek the correct permissions to use the icons relevant to their project.
|
||||
|
||||
## Brand Guidelines
|
||||
|
||||
> [!NOTE]\
|
||||
> The addition of guidelines to Simple Icons is an ongoing project. In the meantime, users of Simple Icons are instead encouraged to check the `source` URL as, in some cases, the icon will have been sourced from official guidelines. The lack of a `guidelines` entry for a particular brand does not imply that the brand has no guidelines.
|
||||
|
||||
Simple Icons provides a link to a brand's _branding guidelines_ (or similar) if the brand provides one. We ask our users read these guidelines and ensure their usage of the brand's icon is in accordance with them. As guidelines are subject to change we also ask our users to regularly check if the brand guidelines of the icons they use have been updated.
|
||||
|
||||
The brand guidelines can be found in the icon's entry in the JSON data file in the NPM and Packagist packages, or through the "Brand Guidelines" link on the icon's card on [the Simple Icons website].
|
||||
|
||||
As we rely largely on our community to help us keep Simple Icons up-to-date, the guidelines link for a brand may be outdated. If you find that the guidelines are outdated, please [submit an issue][icon-outdated-issues] to [the Simple Icons GitHub repository].
|
||||
|
||||
## Update of Brands
|
||||
|
||||
Should a brand wish for their icon or data to be updated, please [submit an issue][icon-outdated-issues] to [the Simple Icons GitHub repository]. In the issue, please explain your affiliation with the company and reasons for the update. We generally release updates once a week, but can make exceptions for immediate updates of brands.
|
||||
|
||||
## Removal of Brands
|
||||
|
||||
Should a brand wish for their icon to be removed from the package, contact `removals at simpleicons dot org` explaining your affiliation with the company, and reasons for removal. Alternatively, it is also possible to [submit an issue][removal-issues] on [the Simple Icons GitHub repository] with the same information. We generally remove icons that no longer [meet our criteria] twice a year in our major releases - but can occasionally make exceptions for immediate removal of brands.
|
||||
|
||||
[meet our criteria]: https://github.com/simple-icons/simple-icons/blob/develop/CONTRIBUTING.md#requesting-an-icon
|
||||
[icon-outdated-issues]: https://github.com/simple-icons/simple-icons/issues/new?assignees=&labels=update+icon%2Fdata&template=icon_update.yml&title=Update%3A+
|
||||
[removal-issues]: https://github.com/simple-icons/simple-icons/issues/new?assignees=&labels=breaking+change&template=icon_removal.yml&title=Remove%3A+
|
||||
[the simple icons contributing guidelines]: https://github.com/simple-icons/simple-icons/blob/develop/CONTRIBUTING.md#icon-guidelines
|
||||
[the simple icons github repository]: https://github.com/simple-icons/simple-icons
|
||||
[the simple icons website]: https://simpleicons.org/
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 WH-2099
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,30 @@
|
||||
# CC0 1.0 Universal
|
||||
|
||||
## Statement of Purpose
|
||||
|
||||
The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an “owner”) of an original work of authorship and/or a database (each, a “Work”).
|
||||
|
||||
Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works (“Commons”) that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
|
||||
|
||||
For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the “Affirmer”), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
|
||||
|
||||
1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights (“Copyright and Related Rights”). Copyright and Related Rights include, but are not limited to, the following:
|
||||
1. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
|
||||
2. moral rights retained by the original author(s) and/or performer(s);
|
||||
3. publicity and privacy rights pertaining to a person’s image or likeness depicted in a Work;
|
||||
4. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(i), below;
|
||||
5. rights protecting the extraction, dissemination, use and reuse of data in a Work;
|
||||
6. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
|
||||
7. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
|
||||
|
||||
2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer’s Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the “Waiver”). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer’s heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer’s express Statement of Purpose.
|
||||
|
||||
3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer’s express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer’s Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the “License”). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer’s express Statement of Purpose.
|
||||
|
||||
4. Limitations and Disclaimers.
|
||||
1. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
|
||||
2. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
|
||||
3. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person’s Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
|
||||
4. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.
|
||||
|
||||
For more information, please see https://creativecommons.org/publicdomain/zero/1.0/.
|
||||
@@ -0,0 +1,4 @@
|
||||
fnOS (飞牛OS) logo, traced from the user-provided fnos.PNG reference.
|
||||
Reference SHA256: 075d2d9505d3d53b08085dd8f06061ddb1f504b0f014c897ef944288501f1f7f
|
||||
Vectorized with Potrace 1.16; original blue and transparent background retained.
|
||||
The logo and trademark belong to their respective owner.
|
||||
@@ -0,0 +1,22 @@
|
||||
Midea, TCL and GIGABYTE are supplemental SVGs, not Simple Icons assets.
|
||||
Sources and attribution:
|
||||
{
|
||||
"midea": {
|
||||
"source": "https://commons.wikimedia.org/wiki/File:Midea.svg",
|
||||
"sha256": "cd91efe06bdcb95055255d16b6a908e5dfba7530f92d7531f01b9e6f79f4fa6e",
|
||||
"author": "Midea Group",
|
||||
"license": "Public domain simple shape/text logo; trademark retained"
|
||||
},
|
||||
"tcl": {
|
||||
"source": "https://commons.wikimedia.org/wiki/File:Logo_of_the_TCL_Corporation.svg",
|
||||
"sha256": "949117dc99503fe4a382afed3bd7f69fbfe61a6da91236b6842d8a4991df7fa8",
|
||||
"author": "TCL Electronics",
|
||||
"license": "Public domain simple shape/text logo; trademark retained"
|
||||
},
|
||||
"gigabyte": {
|
||||
"source": "https://commons.wikimedia.org/wiki/File:Gigabyte_Technology_logo_20080107.svg",
|
||||
"sha256": "49693ef6522f58af4e059afe18c1fb3ddc8e6a5b15ac724d6a7493f47d84d849",
|
||||
"author": "Koman90",
|
||||
"license": "Public domain simple shape/text logo; trademark retained"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Acer</title><path d="M23.943 9.364c-.085-.113-.17-.198-.595-.226-.113 0-.453-.029-1.048-.029-1.56 0-2.636.482-3.175 1.417.142-.935-.765-1.417-2.749-1.417-2.324 0-3.798.935-4.393 2.834-.226.709-.226 1.276-.056 1.73h-.567c-.425.027-.992.056-1.36.056-.85 0-1.39-.142-1.588-.425-.17-.255-.17-.737.057-1.446.368-1.162 1.247-1.672 2.664-1.672.737 0 1.445.085 1.445.085.085 0 .142-.113.142-.198l-.028-.085-.057-.397c-.028-.255-.227-.397-.567-.453-.311-.029-.567-.029-.907-.029h-.028c-1.842 0-3.146.624-3.854 1.814.255-1.219-.596-1.814-2.551-1.814-1.105 0-1.9.029-2.353.085-.368.057-.595.199-.68.454l-.17.51c-.028.085.029.142.142.142.085 0 .425-.057.992-.086a24.816 24.816 0 0 1 1.672-.085c1.077 0 1.559.284 1.389.822-.029.114-.114.199-.255.227-1.02.17-1.842.284-2.438.369-1.7.226-2.692.736-2.947 1.587-.369 1.162.538 1.728 2.72 1.728 1.078 0 2.013-.056 2.75-.198.425-.085.652-.17.737-.453l.396-1.304c-.028 1.304.85 1.955 2.721 1.955.794 0 1.559-.028 1.927-.085.369-.056.567-.141.652-.425l.085-.396c.397.623 1.276.935 2.608.935 1.417 0 2.239-.029 2.465-.114a.523.523 0 0 0 .369-.311l.028-.085.17-.539c.029-.085-.028-.142-.142-.142l-.906.057c-.596.029-1.077.057-1.418.057-.651 0-1.076-.057-1.332-.142-.368-.142-.538-.397-.51-.822l2.863-.368c1.275-.17 2.154-.567 2.579-1.19l-.992 3.315c-.028.057 0 .114.028.142.029.028.085.057.199.057h1.19c.198 0 .283-.114.312-.199l1.048-3.656c.142-.481.567-.708 1.36-.708.71 0 1.22 0 1.56.028h.028c.057 0 .17-.028.255-.17l.17-.51c0-.085 0-.17-.057-.227zM4.841 13.73c-.368.057-.907.085-1.587.085-1.219 0-1.729-.255-1.587-.737.113-.34.425-.567.935-.624l2.75-.368zm12.669-2.95c-.114.369-.652.624-1.616.766l-2.295.311.056-.198c.199-.624.454-1.02.794-1.247.34-.227.907-.34 1.7-.34 1.05.028 1.503.255 1.36.708Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Amazon</title><path d="M.045 18.02c.072-.116.187-.124.348-.022 3.636 2.11 7.594 3.166 11.87 3.166 2.852 0 5.668-.533 8.447-1.595l.315-.14c.138-.06.234-.1.293-.13.226-.088.39-.046.525.13.12.174.09.336-.12.48-.256.19-.6.41-1.006.654-1.244.743-2.64 1.316-4.185 1.726a17.617 17.617 0 01-10.951-.577 17.88 17.88 0 01-5.43-3.35c-.1-.074-.151-.15-.151-.22 0-.047.021-.09.051-.13zm6.565-6.218c0-1.005.247-1.863.743-2.577.495-.71 1.17-1.25 2.04-1.615.796-.335 1.756-.575 2.912-.72.39-.046 1.033-.103 1.92-.174v-.37c0-.93-.105-1.558-.3-1.875-.302-.43-.78-.65-1.44-.65h-.182c-.48.046-.896.196-1.246.46-.35.27-.575.63-.675 1.096-.06.3-.206.465-.435.51l-2.52-.315c-.248-.06-.372-.18-.372-.39 0-.046.007-.09.022-.15.247-1.29.855-2.25 1.82-2.88.976-.616 2.1-.975 3.39-1.05h.54c1.65 0 2.957.434 3.888 1.29.135.15.27.3.405.48.12.165.224.314.283.45.075.134.15.33.195.57.06.254.105.42.135.51.03.104.062.3.076.615.01.313.02.493.02.553v5.28c0 .376.06.72.165 1.036.105.313.21.54.315.674l.51.674c.09.136.136.256.136.36 0 .12-.06.226-.18.314-1.2 1.05-1.86 1.62-1.963 1.71-.165.135-.375.15-.63.045a6.062 6.062 0 01-.526-.496l-.31-.347a9.391 9.391 0 01-.317-.42l-.3-.435c-.81.886-1.603 1.44-2.4 1.665-.494.15-1.093.227-1.83.227-1.11 0-2.04-.343-2.76-1.034-.72-.69-1.08-1.665-1.08-2.94l-.05-.076zm3.753-.438c0 .566.14 1.02.425 1.364.285.34.675.512 1.155.512.045 0 .106-.007.195-.02.09-.016.134-.023.166-.023.614-.16 1.08-.553 1.424-1.178.165-.28.285-.58.36-.91.09-.32.12-.59.135-.8.015-.195.015-.54.015-1.005v-.54c-.84 0-1.484.06-1.92.18-1.275.36-1.92 1.17-1.92 2.43l-.035-.02zm9.162 7.027c.03-.06.075-.11.132-.17.362-.243.714-.41 1.05-.5a8.094 8.094 0 011.612-.24c.14-.012.28 0 .41.03.65.06 1.05.168 1.172.33.063.09.099.228.099.39v.15c0 .51-.149 1.11-.424 1.8-.278.69-.664 1.248-1.156 1.68-.073.06-.14.09-.197.09-.03 0-.06 0-.09-.012-.09-.044-.107-.12-.064-.24.54-1.26.806-2.143.806-2.64 0-.15-.03-.27-.087-.344-.145-.166-.55-.257-1.224-.257-.243 0-.533.016-.87.046-.363.045-.7.09-1 .135-.09 0-.148-.014-.18-.044-.03-.03-.036-.047-.02-.077 0-.017.006-.03.02-.063v-.06z"/></svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Apple</title><path d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701"/></svg>
|
||||
|
After Width: | Height: | Size: 650 B |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>ASUS</title><path d="M23.904 10.788V9.522h-4.656c-.972 0-1.41.6-1.482 1.182v.018-1.2h-1.368v1.266h1.362zm-6.144.456l-1.368-.078v1.458c0 .456-.228.594-1.02.594H14.28c-.654 0-.93-.186-.93-.594v-1.596l-1.386-.102v1.812h-.03c-.078-.528-.276-1.14-1.596-1.23L6 11.22c0 .666.474 1.062 1.218 1.14l3.024.306c.24.018.414.09.414.288 0 .216-.18.24-.456.24H5.946V11.22l-1.386-.09v3.348h5.646c1.26 0 1.662-.654 1.722-1.2h.03c.156.864.912 1.2 2.19 1.2h1.41c1.494 0 2.202-.456 2.202-1.524zm4.398.258l-4.338-.258c0 .666.438 1.11 1.182 1.17l3.09.24c.24.018.384.078.384.276 0 .186-.168.258-.516.258h-4.212v1.29h4.302c1.356 0 1.95-.474 1.95-1.554 0-.972-.534-1.338-1.842-1.422zm-10.194-1.98h1.386v1.266h-1.386zM3.798 11.07l-1.506-.15L0 14.478h1.686zm7.914-1.548h-4.23c-.984 0-1.416.612-1.518 1.2v-1.2H3.618c-.33 0-.486.102-.642.33l-.648.936h9.384Z"/></svg>
|
||||
|
After Width: | Height: | Size: 914 B |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Broadcom</title><path d="M12 0c6.628 0 12 5.372 12 12a12 12 0 0 1-.56 3.63 13.641 13.641 0 0 0-.867-.388c-1.372-.546-2.629-.363-3.888.4 0 0-.459.28-.597.366-.586.37-1.14.717-1.672.717-.508 0-1.007-.135-1.218-1.117-.33-1.533-1.135-5.298-1.486-7.162-.206-1.097-.319-1.688-.436-2.088-.208-.706-.586-1.09-1.124-1.15 0 0-.084-.013-.152-.013-.068 0-.162.014-.162.014-.531.064-.907.447-1.114 1.15-.117.4-.23.99-.436 2.087-.351 1.864-1.156 5.63-1.486 7.162-.21.982-.71 1.117-1.218 1.117-.531 0-1.086-.348-1.672-.717-.138-.086-.597-.366-.597-.366-1.259-.763-2.516-.946-3.888-.4-.301.12-.586.251-.867.387A11.995 11.995 0 0 1 0 12C0 5.372 5.372 0 12 0m8.375 16.976c-.453.152-.855.42-1.256.672-.756.475-1.613 1.014-2.704 1.014-1.614 0-2.749-.964-3.112-2.647C13.023 14.712 12 9.793 12 9.793a496.28 496.28 0 0 1-1.303 6.222c-.362 1.683-1.497 2.647-3.112 2.647-1.09 0-1.946-.539-2.703-1.014-.401-.252-.804-.52-1.256-.672a2.319 2.319 0 0 0-1.414-.01c-.33.097-.644.234-.951.386C3.227 21.292 7.207 24 11.91 24s8.863-2.708 10.83-6.648a5.958 5.958 0 0 0-.95-.386 2.322 2.322 0 0 0-1.415.01"/></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#64748b" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="1.5" y="4" width="14" height="11" rx="1.5"/><path d="M8.5 15v4m-4 0h8M2 12h13"/><rect x="18" y="3" width="4.5" height="17" rx="1"/><path d="M19.7 6h1.1m-1.1 3h1.1m-.55 7.5h.01"/></svg>
|
||||
|
After Width: | Height: | Size: 349 B |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Dell</title><path d="M17.963 14.6V9.324h1.222v4.204h2.14v1.07h-3.362zm-9.784-3.288l2.98-2.292c.281.228.56.458.841.687l-2.827 2.14.611.535 2.827-2.216c.281.228.56.458.841.688a295.83 295.83 0 0 1-2.827 2.216l.61.536 2.83-2.295-.001-1.986h1.223v4.204h2.216v1.07h-3.362v-1.987c-.995.763-1.987 1.529-2.981 2.292l-2.981-2.292c-.144.729-.653 1.36-1.312 1.694-.285.147-.597.24-.915.276-.183.022-.367.017-.551.017H3.516V9.325H5.69a2.544 2.544 0 0 1 1.563.557c.454.36.778.872.927 1.43m-3.516-.917v3.21l.953-.001a1.377 1.377 0 0 0 1.036-.523 1.74 1.74 0 0 0 .182-1.889 1.494 1.494 0 0 0-.976-.766c-.166-.04-.338-.03-.507-.032h-.688zM11.82 0h.337a11.94 11.94 0 0 1 5.405 1.373 12.101 12.101 0 0 1 4.126 3.557A11.93 11.93 0 0 1 24 11.82v.36a11.963 11.963 0 0 1-3.236 8.033A11.967 11.967 0 0 1 12.182 24h-.361a11.993 11.993 0 0 1-4.145-.806 12.04 12.04 0 0 1-4.274-2.836A12.057 12.057 0 0 1 .576 15.67 12.006 12.006 0 0 1 0 12.181v-.361a11.924 11.924 0 0 1 1.992-6.396 12.211 12.211 0 0 1 4.71-4.172A11.875 11.875 0 0 1 11.82 0m-.153 1.23a10.724 10.724 0 0 0-6.43 2.375 10.78 10.78 0 0 0-3.319 4.573 10.858 10.858 0 0 0 .193 8.12 10.788 10.788 0 0 0 3.546 4.421 10.698 10.698 0 0 0 4.786 1.946c1.456.209 2.955.124 4.376-.26a10.756 10.756 0 0 0 5.075-3.062 10.742 10.742 0 0 0 2.686-5.28 10.915 10.915 0 0 0-.122-4.682 10.77 10.77 0 0 0-7.098-7.626 10.78 10.78 0 0 0-3.693-.525z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="40 40 200 200"><g fill="#2568ed" transform="translate(0 280) scale(.1 -.1)"><path d="M611 2045 c-29 -30 -65 -83 -81 -118 -93 -197 -11 -377 180 -394 l56 -5 12 58 c6 33 23 75 36 95 l25 36 -66 17 c-79 19 -107 36 -133 79 -27 44 -25 124 4 212 14 39 23 71 22 73 -2 1 -26 -23 -55 -53z M2150 2034 c41 -118 36 -192 -17 -255 -51 -60 -39 -59 -544 -59 -335 0 -473 -3 -503 -12 -54 -16 -131 -93 -145 -144 -7 -25 -11 -170 -11 -390 0 -347 0 -351 23 -394 16 -30 37 -51 67 -67 39 -21 56 -23 192 -23 215 0 238 17 238 175 l0 85 103 0 c144 1 167 22 167 154 l0 75 38 6 c131 21 215 61 287 138 l40 42 -234 3 c-197 2 -238 0 -257 -13 -41 -26 -56 -62 -63 -143 l-6 -77 -101 -5 c-140 -7 -156 -23 -164 -160 l-5 -85 -65 0 -65 0 0 320 0 320 505 5 505 5 48 24 c163 80 163 323 -1 494 -20 20 -39 37 -43 37 -5 0 1 -25 11 -56z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 852 B |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Framework</title><path d="M23.186 9.07 21.41 8.019a2.78 2.78 0 0 1-1.344-2.391V3.523c0-.431-.19-.837-.516-1.108A11.965 11.965 0 0 0 16.317.493a1.356 1.356 0 0 0-1.193.091L13.347 1.64a2.622 2.622 0 0 1-2.688 0L8.882.584a1.348 1.348 0 0 0-1.194-.09 11.93 11.93 0 0 0-3.231 1.918 1.44 1.44 0 0 0-.516 1.108v2.104c0 .986-.51 1.897-1.344 2.392L.823 9.068c-.363.215-.61.588-.675 1.013A12.24 12.24 0 0 0 0 12.001c0 .651.048 1.292.145 1.916.065.425.312.801.675 1.016l1.774 1.052a2.78 2.78 0 0 1 1.344 2.392v2.104c0 .431.191.837.516 1.108.965.8 2.054 1.452 3.231 1.919.393.155.831.124 1.194-.091l1.777-1.055a2.622 2.622 0 0 1 2.688 0l1.777 1.055c.363.215.804.246 1.193.091a11.973 11.973 0 0 0 3.232-1.92 1.44 1.44 0 0 0 .516-1.107v-2.104a2.78 2.78 0 0 1 1.344-2.392l1.774-1.052c.363-.215.61-.588.675-1.016.094-.624.145-1.265.145-1.916 0-.652-.048-1.293-.145-1.917a1.41 1.41 0 0 0-.67-1.013zM12.003 19.41c-3.981 0-7.21-3.317-7.21-7.407s3.229-7.406 7.21-7.406c3.98 0 7.21 3.316 7.21 7.406s-3.23 7.407-7.21 7.407z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Fujitsu</title><path d="M16.56 3C14.15 3 12.04 4.24 10.68 5.97L10.68 9.76C12.5 4.71 16.56 5.08 16.56 5.08C19.5 5.08 21.84 7.38 21.84 10.2C21.84 13.04 19.5 15.33 16.56 15.33A5.32 5.32 0 0 1 12.84 13.83L10.28 11.03A6.06 6.06 0 0 0 6.03 9.32C2.7 9.32 0 11.93 0 15.16C0 18.4 2.7 21 6.03 21C7.9 21 9.58 20.19 10.68 18.89L10.68 15.86C8.88 19.29 6.03 18.92 6.03 18.92C3.9 18.92 2.17 17.24 2.17 15.16C2.17 13.1 3.9 11.42 6.03 11.42C7.09 11.42 8.05 11.84 8.75 12.5L11.31 15.31A7.5 7.5 0 0 0 16.56 17.43C20.67 17.43 24 14.19 24 10.2C24 6.21 20.67 3 16.56 3Z"/></svg>
|
||||
|
After Width: | Height: | Size: 634 B |
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="312.802px" height="39.851px" viewBox="0 0 312.802 39.851" enable-background="new 0 0 312.802 39.851"
|
||||
xml:space="preserve">
|
||||
<polygon fill="#005DAA" points="300.199,1.064 297.884,1.064 297.884,0.128 303.576,0.128 303.576,1.064 301.265,1.064
|
||||
301.265,7.552 300.199,7.552 "/>
|
||||
<polygon fill="#005DAA" points="304.65,0.128 306.412,0.128 308.753,6.286 311.046,0.128 312.802,0.128 312.802,7.552
|
||||
311.736,7.552 311.736,1.13 311.718,1.13 309.257,7.552 308.201,7.552 305.744,1.13 305.722,1.13 305.722,7.552 304.65,7.552 "/>
|
||||
<rect x="46.272" fill="#005DAA" width="10.603" height="39.625"/>
|
||||
<path fill="#005DAA" d="M119.531,0.033h13.006l15.344,39.818h-11.635l-2.969-8.495h-14.945l-3.142,8.495h-10.781L119.531,0.033
|
||||
M126.032,8.247h-0.111l-5.138,15.576h9.983L126.032,8.247"/>
|
||||
<path fill="#005DAA" d="M153.044,0.028h18.317c7.412,0,12.949,3.249,12.949,10.094c0,5.028-2.566,7.826-7.015,9.304v0.111
|
||||
c5.297,1.091,8.042,3.94,8.042,8.795c0,9.526-8.387,11.518-15.516,11.518h-16.777V0.028 M163.652,32.33h3.146
|
||||
c3.877,0,7.926-0.577,7.926-4.624c0-4.342-4.164-4.735-7.811-4.735h-3.262V32.33 M163.652,15.779h2.97
|
||||
c3.482,0,7.072-0.856,7.072-4.225c0-3.653-3.417-3.987-6.953-3.987h-3.089V15.779"/>
|
||||
<polyline fill="#005DAA" points="199.702,24.852 184.988,0.028 197.193,0.028 205.012,16.004 212.713,0.028 224.927,0.028
|
||||
210.314,24.852 210.314,39.851 199.702,39.851 199.702,24.852 "/>
|
||||
<polyline fill="#005DAA" points="239.101,7.901 229.294,7.901 229.294,0.028 259.529,0.028 259.529,7.901 249.722,7.901
|
||||
249.722,39.851 239.101,39.851 239.101,7.901 "/>
|
||||
<polyline fill="#005DAA" points="264.58,0.028 292.65,0.028 292.65,7.567 275.187,7.567 275.187,15.779 291.675,15.779
|
||||
291.675,23.308 275.187,23.308 275.187,32.33 293.273,32.33 293.273,39.851 264.58,39.851 264.58,0.028 "/>
|
||||
<path fill="#005DAA" d="M22.176,8.747c-7.059,0.587-10.913,5.221-10.913,11.218c0,5.831,5.403,10.732,10.621,10.732l1.146-0.012
|
||||
h1.929c0,0,1.279,0,1.288-1.247V16.923h10.896c0,7.064-0.026,22.928-0.026,22.928s-10.754-0.009-16.998-0.009
|
||||
C8.377,39.842,0,30.142,0,19.965C0,8.957,9.112-0.237,20.458,0.17l16.299,0.051l-0.008,8.525H22.176"/>
|
||||
<path fill="#005DAA" d="M85.229,8.747C78.167,9.333,74.32,13.967,74.32,19.965c0,5.831,5.395,10.732,10.617,10.732l1.142-0.012
|
||||
h1.934c0,0,1.27,0,1.279-1.247V16.923h10.878c0,7.064-0.018,22.928-0.018,22.928s-10.745-0.009-16.985-0.009
|
||||
c-11.736,0-20.104-9.7-20.104-19.877c0-11.008,9.103-20.202,20.454-19.794l16.272,0.051l-0.004,8.525H85.229"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.8 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Google</title><path d="M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z"/></svg>
|
||||
|
After Width: | Height: | Size: 457 B |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Honor</title><path d="M2.601 9.753v1.823H.807V9.753H0v4.498h.807v-1.874h1.794v1.874h.807V9.753h-.807Zm18.671.801h.898c.369 0 .667.297.667.662a.665.665 0 0 1-.667.663h-.898v-1.325Zm-.806-.801v4.498h.806v-2.002l1.68 2.002H24l-1.376-1.64a1.462 1.462 0 0 0-.444-2.858h-1.716.002Zm-7.63-.014v2.807l-1.959-2.807h-.644v4.498h.807v-2.82l1.968 2.82h.633V9.739h-.805Zm-7.532 2.26c0-.832.68-1.506 1.517-1.506A1.51 1.51 0 0 1 8.337 12c0 .832-.679 1.506-1.516 1.506-.403 0-.789-.159-1.073-.441A1.504 1.504 0 0 1 5.304 12v-.001ZM4.497 12c0 .933.566 1.774 1.434 2.132.869.357 1.868.16 2.533-.5.664-.66.863-1.653.503-2.515a2.324 2.324 0 0 0-2.146-1.425 2.316 2.316 0 0 0-2.323 2.307L4.497 12Zm11.04-.001a1.513 1.513 0 0 1 1.518-1.506c.838 0 1.516.675 1.516 1.507a1.513 1.513 0 0 1-1.518 1.506c-.402 0-.788-.159-1.072-.441a1.5 1.5 0 0 1-.444-1.066ZM14.73 12c0 .933.566 1.774 1.434 2.132.868.357 1.868.16 2.532-.5.665-.66.864-1.653.504-2.515a2.325 2.325 0 0 0-2.147-1.425 2.316 2.316 0 0 0-2.323 2.307V12Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>HP</title><path d="M12.0069 24h-.3572l2.459-6.7453h3.3796c.5907 0 1.2364-.4533 1.4424-1.0166l2.6652-7.3085c.4396-1.1952-.2473-2.1706-1.525-2.1706h-4.6983l-3.929 10.798-2.2255 6.127C3.929 22.434 0 17.6806 0 12.007 0 6.498 3.7092 1.8546 8.7647.4396L6.4705 6.759 2.6514 17.2547h2.5415L8.4488 8.339h1.9095l-3.2558 8.9158H9.644l3.0223-8.3251c.4396-1.1952-.2473-2.1706-1.525-2.1706h-2.143l2.459-6.7453C11.636 0 11.8145 0 11.9931 0 18.6285 0 24 5.3715 24 12.007c.0137 6.6216-5.3578 11.993-11.9931 11.993zM19.2742 8.325h-1.9096l-2.6789 7.336h1.9096l2.6789-7.336z"/></svg>
|
||||
|
After Width: | Height: | Size: 641 B |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Huawei</title><path d="M3.67 6.14S1.82 7.91 1.72 9.78v.35c.08 1.51 1.22 2.4 1.22 2.4 1.83 1.79 6.26 4.04 7.3 4.55 0 0 .06.03.1-.01l.02-.04v-.04C7.52 10.8 3.67 6.14 3.67 6.14zM9.65 18.6c-.02-.08-.1-.08-.1-.08l-7.38.26c.8 1.43 2.15 2.53 3.56 2.2.96-.25 3.16-1.78 3.88-2.3.06-.05.04-.09.04-.09zm.08-.78C6.49 15.63.21 12.28.21 12.28c-.15.46-.2.9-.21 1.3v.07c0 1.07.4 1.82.4 1.82.8 1.69 2.34 2.2 2.34 2.2.7.3 1.4.31 1.4.31.12.02 4.4 0 5.54 0 .05 0 .08-.05.08-.05v-.06c0-.03-.03-.05-.03-.05zM9.06 3.19a3.42 3.42 0 00-2.57 3.15v.41c.03.6.16 1.05.16 1.05.66 2.9 3.86 7.65 4.55 8.65.05.05.1.03.1.03a.1.1 0 00.06-.1c1.06-10.6-1.11-13.42-1.11-13.42-.32.02-1.19.23-1.19.23zm8.299 2.27s-.49-1.8-2.44-2.28c0 0-.57-.14-1.17-.22 0 0-2.18 2.81-1.12 13.43.01.07.06.08.06.08.07.03.1-.03.1-.03.72-1.03 3.9-5.76 4.55-8.64 0 0 .36-1.4.02-2.34zm-2.92 13.07s-.07 0-.09.05c0 0-.01.07.03.1.7.51 2.85 2 3.88 2.3 0 0 .16.05.43.06h.14c.69-.02 1.9-.37 3-2.26l-7.4-.25zm7.83-8.41c.14-2.06-1.94-3.97-1.94-3.98 0 0-3.85 4.66-6.67 10.8 0 0-.03.08.02.13l.04.01h.06c1.06-.53 5.46-2.77 7.28-4.54 0 0 1.15-.93 1.21-2.42zm1.52 2.14s-6.28 3.37-9.52 5.55c0 0-.05.04-.03.11 0 0 .03.06.07.06 1.16 0 5.56 0 5.67-.02 0 0 .57-.02 1.27-.29 0 0 1.56-.5 2.37-2.27 0 0 .73-1.45.17-3.14z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Intel</title><path d="M20.42 7.345v9.18h1.651v-9.18zM0 7.475v1.737h1.737V7.474zm9.78.352v6.053c0 .513.044.945.13 1.292.087.34.235.618.44.828.203.21.475.359.803.451.334.093.754.136 1.255.136h.216v-1.533c-.24 0-.445-.012-.593-.037a.672.672 0 0 1-.39-.173.693.693 0 0 1-.173-.377 4.002 4.002 0 0 1-.037-.606v-2.182h1.193v-1.416h-1.193V7.827zm-3.505 2.312c-.396 0-.76.08-1.082.241-.327.161-.6.384-.822.668l-.087.117v-.902H2.658v6.256h1.639v-3.214c.018-.588.16-1.02.433-1.299.29-.297.642-.445 1.044-.445.476 0 .841.149 1.082.433.235.284.359.686.359 1.2v3.324h1.663V12.97c.006-.89-.229-1.595-.686-2.09-.458-.495-1.1-.742-1.917-.742zm10.065.006a3.252 3.252 0 0 0-2.306.946c-.29.29-.525.637-.692 1.033a3.145 3.145 0 0 0-.254 1.273c0 .452.08.878.241 1.274.161.395.39.742.674 1.032.284.29.637.526 1.045.693.408.173.86.26 1.342.26 1.397 0 2.262-.637 2.782-1.23l-1.187-.904c-.248.297-.841.699-1.583.699-.464 0-.847-.105-1.138-.321a1.588 1.588 0 0 1-.593-.872l-.019-.056h4.915v-.587c0-.451-.08-.872-.235-1.267a3.393 3.393 0 0 0-.661-1.033 3.013 3.013 0 0 0-1.02-.692 3.345 3.345 0 0 0-1.311-.248zm-16.297.118v6.256h1.651v-6.256zm16.278 1.286c1.132 0 1.664.797 1.664 1.255l-3.32.006c0-.458.525-1.255 1.656-1.261zm7.073 3.814a.606.606 0 0 0-.606.606.606.606 0 0 0 .606.606.606.606 0 0 0 .606-.606.606.606 0 0 0-.606-.606zm-.008.105a.5.5 0 0 1 .002 0 .5.5 0 0 1 .5.501.5.5 0 0 1-.5.5.5.5 0 0 1-.5-.5.5.5 0 0 1 .498-.5zm-.233.155v.699h.13v-.285h.093l.173.285h.136l-.18-.297a.191.191 0 0 0 .118-.056c.03-.03.05-.074.05-.136 0-.068-.02-.117-.063-.154-.037-.038-.105-.056-.185-.056zm.13.099h.154c.019 0 .037.006.056.012a.064.064 0 0 1 .037.031c.013.013.012.031.012.056a.124.124 0 0 1-.012.055.164.164 0 0 1-.037.031c-.019.006-.037.013-.056.013h-.154Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Lenovo</title><path d="M21.044 12.288c0 .5-.343.867-.815.867-.464 0-.827-.38-.827-.867 0-.51.343-.868.815-.868.464 0 .827.381.827.868zm-14.305-.92a.787.787 0 0 0-.651.307.991.991 0 0 0-.172.738l1.479-.614a.708.708 0 0 0-.656-.43zm6.963.052c-.472 0-.816.358-.816.868 0 .486.364.867.828.867.472 0 .815-.368.815-.867 0-.487-.363-.868-.827-.868zM24 7.997v8.006H0V7.997h24zM5.01 13.05H3.088V9.825H2.23v4.003h2.78v-.777zm1.137-.094l2.163-.897a1.667 1.667 0 0 0-.37-.86c-.284-.33-.704-.505-1.216-.505-.931 0-1.633.686-1.633 1.593 0 .93.704 1.593 1.726 1.593.572 0 1.158-.272 1.432-.589l-.535-.411c-.357.264-.56.326-.885.326-.292 0-.52-.09-.682-.25zm5.57-1.039c0-.709-.507-1.223-1.252-1.223a1.28 1.28 0 0 0-1.005.494v-.442h-.846v3.081h.846v-1.753c0-.316.245-.651.698-.651.35 0 .712.243.712.651v1.753h.847v-1.91zm3.647.37c0-.904-.725-1.593-1.65-1.593-.933 0-1.663.7-1.663 1.593 0 .903.726 1.592 1.651 1.592.932 0 1.662-.7 1.662-1.592zm2.066 1.54l1.268-3.081h-.967l-.765 2.099-.765-2.1h-.966l1.268 3.081h.927zm4.449-1.54c0-.904-.725-1.593-1.65-1.593-.932 0-1.662.7-1.662 1.593 0 .903.725 1.592 1.65 1.592.932 0 1.662-.7 1.662-1.592z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>LG</title><path d="M14.522 14.078h3.27v1.33h-4.847v-6.83h1.577v5.5zm6.74-1.274h1.284v1.195c-.236.09-.698.18-1.137.18-1.42 0-1.893-.721-1.893-2.186 0-1.398.45-2.221 1.869-2.221.791 0 1.24.248 1.612.722l.982-.903c-.6-.855-1.646-1.114-2.629-1.114-2.208 0-3.368 1.205-3.368 3.504 0 2.288 1.047 3.528 3.358 3.528 1.06 0 2.096-.27 2.66-.665V11.53h-2.739v1.274zM5.291 6.709a5.29 5.29 0 1 1 0 10.582 5.291 5.291 0 1 1 0-10.582m3.16 8.457a4.445 4.445 0 0 0 1.31-3.161v-.242l-.22.001H6.596v.494h2.662l-.001.015a3.985 3.985 0 0 1-3.965 3.708 3.95 3.95 0 0 1-2.811-1.165 3.952 3.952 0 0 1-1.164-2.811c0-1.061.414-2.059 1.164-2.81a3.951 3.951 0 0 1 2.81-1.164l.252.003v-.495l-.251-.003a4.475 4.475 0 0 0-4.47 4.469c0 1.194.465 2.316 1.309 3.161a4.444 4.444 0 0 0 3.16 1.31 4.444 4.444 0 0 0 3.162-1.31m-2.91-1.297V9.644H5.04v4.72h1.556v-.495H5.543zm-1.265-3.552a.676.676 0 1 0-.675.674.676.676 0 0 0 .675-.674"/></svg>
|
||||
|
After Width: | Height: | Size: 983 B |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Linksys</title><path d="M19.871 0c-1.7024 0-3.082 1.38-3.082 3.082 0 1.7025 1.38 3.08 3.082 3.082 1.7026 0 3.082-1.3795 3.082-3.082 0-1.7024-1.3795-3.082-3.082-3.082ZM1.047.488V24h21.3105v-3.469H5.166V.488Zm7.156 0v17.156h14.154v-3.4707h-10.039V.488Z"/></svg>
|
||||
|
After Width: | Height: | Size: 337 B |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>MediaTek</title><path d="M3.863 8.996c-.296 0-.664.21-.815.467L.064 14.537c-.15.257-.029.467.267.467h19.805c.297 0 .665-.21.816-.467l2.983-5.074c.15-.257.03-.467-.268-.467zm3.41 1.975h1.09l-.232.402h-.776c-.238 0-.312.093-.312.338v.807h1.37l-.233.402H6.502v-1.197c0-.589.307-.752.771-.752zm1.444 0h.937c.703 0 1.002.27 1.002.959 0 .73-.301.99-.976.99h-.963zm7.832 0h1.09l-.233.402h-.775c-.239 0-.313.093-.313.338-.004.264-.002.539-.002.807h1.372l-.233.402h-1.678v-1.197c0-.589.308-.752.772-.752zm-11.567.004v.986l.569-.984.65-.002v1.941h-.547v-1.191l-.672 1.191h-.546v-1.191l-.688 1.19h-.535l1.121-1.938zm5.98 0h.546v1.941h-.545zm1.798 0h.781v1.941h-.553v-1.383l-.797 1.383h-.552zm1.256 0h1.714l-.232.404h-.504v1.537h-.533v-1.537h-.68zm3.873 0h.547v1.941h-.547zm1.345 0h.545l-.558.968-.002.004h.002l.558.969h-.545l-.56-.97zm-9.994.398v1.145h.297c.432 0 .567-.104.567-.586 0-.483-.135-.559-.567-.559zm-1.847.416h.87l-.185.318h-.86zm9.255 0h.872l-.186.318h-.86Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Microsoft</title><path d="M0 0v11.408h11.408V0zm12.594 0v11.408H24V0zM0 12.594V24h11.408V12.594zm12.594 0V24H24V12.594z"/></svg>
|
||||
|
After Width: | Height: | Size: 206 B |
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Creator: CorelDRAW X6 -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="32.277mm" height="12.424mm" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
|
||||
viewBox="0 0 3228 1242"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<defs>
|
||||
<style type="text/css">
|
||||
<![CDATA[
|
||||
.fil3 {fill:#00B0F0;fill-rule:nonzero}
|
||||
.fil1 {fill:url(#id0)}
|
||||
.fil2 {fill:url(#id1)}
|
||||
.fil0 {fill:url(#id2)}
|
||||
]]>
|
||||
</style>
|
||||
<radialGradient id="id0" gradientUnits="userSpaceOnUse" cx="9593.85" cy="-10300.9" r="10500" fx="9593.85" fy="-10300.9">
|
||||
<stop offset="0" style="stop-color:#FEFEFE"/>
|
||||
<stop offset="1" style="stop-color:#A9CF48"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="id1" gradientUnits="userSpaceOnUse" cx="9593.85" cy="-8479.56" r="10500" fx="9593.85" fy="-8479.56">
|
||||
<stop offset="0" style="stop-color:#FEFEFE"/>
|
||||
<stop offset="1" style="stop-color:#A9CF47"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="id2" gradientUnits="userSpaceOnUse" cx="9593.85" cy="-9336.04" r="10500" fx="9593.85" fy="-9336.04">
|
||||
<stop offset="0" style="stop-color:#FEFEFE"/>
|
||||
<stop offset="1" style="stop-color:#A9D048"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
<symbol id="Fm113-113-0" viewBox="1614 -22527 21000 13152">
|
||||
<path class="fil0" d="M22614 -18376c-4943,-1048 -9932,-2209 -14431,-3078 -2289,-442 -4452,-793 -6569,-1072l0 9624 375 94c4502,654 8761,1621 13889,3007 2217,599 4524,528 6735,39l0 -8613z"/>
|
||||
</symbol>
|
||||
<symbol id="Fm119-119-0" viewBox="1614 -23737 21000 13088">
|
||||
<path class="fil1" d="M22614 -19550c-5098,-1073 -10263,-2282 -14907,-3179 -2118,-409 -4128,-740 -6093,-1008l0 9669c4465,654 8699,1617 13789,2992 2376,642 4856,514 7211,-74l0 -8400z"/>
|
||||
</symbol>
|
||||
<symbol id="Fm107-107-0" viewBox="1614 -21838 21000 13251">
|
||||
<path class="fil2" d="M22614 -17753c-4689,-1003 -9396,-2090 -13662,-2914 -2567,-496 -4976,-877 -7338,-1171l0 9530 1145 287c4502,654 8761,1621 13889,3007 1961,530 3992,535 5965,191l0 -8929z"/>
|
||||
</symbol>
|
||||
<g id="Camada_x0020_1">
|
||||
<metadata id="CorelCorpID_0Corel-Layer"/>
|
||||
<path class="fil3" d="M1481 609l0 446 105 0 0 -446 -105 0zm-189 -170l-108 0c-12,0 -10,11 -10,11 2,14 5,37 5,85 0,106 -13,258 -129,403l-8 10c0,0 -70,-488 -71,-497 0,0 0,-11 -10,-11l-109 0c-10,0 -10,11 -10,11 -3,56 -34,526 -377,602 73,8 161,-15 238,-62 95,-59 159,-146 180,-246 0,0 42,262 47,322l0 4 -3 2c-96,51 -205,79 -314,79 -270,0 -509,-160 -614,-404 62,287 318,496 617,496 349,0 557,-292 593,-500 0,0 47,303 48,313l143 0c-2,-13 -97,-595 -98,-604 0,0 0,-11 -10,-11zm-1209 255c0,-320 270,-580 601,-580 205,0 396,103 507,270 -81,-228 -307,-384 -560,-384 -327,0 -593,255 -593,568 0,86 21,170 60,247 -9,-39 -15,-80 -15,-120zm2506 -21c-38,-44 -91,-67 -155,-67 -65,0 -120,21 -164,63 -43,41 -65,96 -65,164 0,67 21,121 63,161 42,40 103,60 179,60 148,0 180,-102 192,-135l-38 -12c-34,62 -110,66 -155,63 -32,-2 -61,-13 -84,-29 -23,-17 -39,-41 -46,-78l-2 -14 332 0c-1,-73 -20,-132 -57,-175zm-267 113c-5,0 -5,-5 -5,-7 4,-26 14,-46 32,-64 20,-21 51,-33 84,-33 30,0 54,9 75,26 17,15 29,36 36,65 1,3 3,12 -5,12l-217 0zm601 -182c-126,0 -171,77 -185,113 0,1 -5,13 -5,13l42 14c0,0 27,-78 134,-73 108,4 95,93 95,107 -60,-18 -145,-16 -201,9 -70,32 -81,96 -78,143 3,70 65,119 145,123 72,4 104,-12 134,-41l-1 41 95 0 0 -117 0 -144 0 -25 0 -21c2,-53 -35,-143 -175,-143zm80 346c0,7 -2,12 -8,15 -18,9 -56,21 -103,18 -49,-4 -68,-39 -71,-54 -1,-6 -12,-71 51,-91 41,-13 93,-5 121,3 8,2 10,7 10,17l0 93zm-1424 -511l-87 0c-13,0 -11,13 -11,13 0,14 0,80 0,94l107 0 0 -95c0,0 1,-11 -10,-11zm534 0l-89 0c-9,0 -9,10 -9,10l0 183 -13 -7c-14,-7 -28,-12 -43,-15 -15,-3 -33,-4 -53,-4 -70,0 -127,20 -169,61 -41,40 -63,98 -63,169 0,63 18,116 53,158 35,41 86,62 153,62 96,0 134,-58 134,-58l0 56 108 0 0 -105c0,-118 0,-499 0,-499 0,0 0,-11 -9,-11zm-104 494c-10,9 -23,16 -39,22 -17,7 -37,10 -59,10 -36,0 -65,-12 -86,-36 -21,-24 -31,-59 -31,-106 0,-46 10,-80 29,-101 20,-22 50,-33 90,-33 21,0 41,3 59,10 16,6 28,12 37,20 3,3 6,8 6,15l0 183c0,7 -3,12 -6,15z"/>
|
||||
<path class="fil3" d="M3163 365c-37,0 -65,28 -65,65 0,36 28,65 65,65 37,0 65,-28 65,-65 0,-36 -28,-65 -65,-65zm0 9c31,0 55,25 55,56 0,31 -23,56 -55,56 -31,0 -55,-25 -55,-56 0,-31 23,-56 55,-56zm-14 60l16 0 21 33 11 0 -22 -33c10,-2 19,-8 19,-21 0,-13 -7,-21 -24,-21l-29 0 0 75 9 0 0 -33zm0 -8l0 -26 17 0c9,0 18,2 18,13 0,13 -11,13 -22,13l-12 0z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.5 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Motorola</title><path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12C24.002 5.375 18.632.002 12.007 0H12zm7.327 18.065s-.581-2.627-1.528-4.197c-.514-.857-1.308-1.553-2.368-1.532-.745 0-1.399.423-2.2 1.553-.469.77-.882 1.573-1.235 2.403 0 0-.29-.675-.63-1.343a8.038 8.038 0 0 0-.605-1.049c-.804-1.13-1.455-1.539-2.2-1.553-1.049-.021-1.854.675-2.364 1.528-.948 1.574-1.528 4.197-1.528 4.197h-.864l4.606-15.12 3.56 11.804.024.021.024-.021 3.56-11.804 4.61 15.113h-.862z"/></svg>
|
||||
|
After Width: | Height: | Size: 566 B |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>MSI</title><path d="M16.362 10.042c-1.044.56-2.193 1.05-3.7 1.142a4.26 4.26 0 0 1-2.321-.556c-.155-.09-.51-.26-.503-.457.011-.242.582-.303.816-.306 5.262-.178 6.29-2.472 6.286-2.563 0-.083-.09.011-.09.011-1.38 1.777-4.937 1.973-4.937 1.973-.877.121-1.761-.08-2.215-.529a.794.794 0 0 1-.215-.39c-.102.122-.17.25-.291.379-.114.128-.458.499-.484.06-.019-.325.076-.393.2-.586a5.178 5.178 0 0 1 .193-.276c.374-.49.684-.997 1.123-1.402.037-.038.11-.075.09-.11a6.221 6.221 0 0 0-3.624 4.166 6.508 6.508 0 0 0-.23 1.72c0 .62.082 1.209.21 1.75.258 1.073.56 1.817 1.033 2.66.155-.211.219-.491.306-.752.098-.276.166-.642.302-.87.321-.528 2.079-.396 1.599-.763a3.613 3.613 0 0 1-.397-.359 7.083 7.083 0 0 1-.673-.831c-.412-.582-.756-1.285-.79-2.2.469 1.21 1.18 2.222 2.313 2.774.378.182.813.378 1.323.367-1.341-.253-2.162-1.285-2.717-2.374-.087-.17-.208-.332-.25-.476a.4.4 0 0 1-.011-.189c.076-.336.484-.17.726-.083a8.489 8.489 0 0 0 3.602.438 6.678 6.678 0 0 0 1.874-.476c.545-.227 1.04-.518 1.452-.896m-2.34 2.657a8.001 8.001 0 0 1-2.4-.189 3.969 3.969 0 0 1-1.754-.865c-.181-.166-.295-.469-.597-.397-.026.22.151.378.272.514a3.507 3.507 0 0 0 1.573.896c.835.257 2.003.283 2.906.038M11.35 10.22c-.178 0-.771-.098-.786.098-.012.121.245.212.381.25.53.136 1.255.086 1.784.037a8.515 8.515 0 0 0 2.098-.465c.99-.362 1.795-.88 2.457-1.55.181-.18.162-.234-.034-.067a6.365 6.365 0 0 1-1.769 1.032c-1.172.472-2.517.665-4.131.665m6.576-6.717c.136.034.299.027.37.068.133.08.133.273.224.431-.54.091-.718-.302-.972-.585.091.007.227.052.378.086M7.325 16.57c-.393-.613-2.39-3.19-.832-6.989 2.128-5.178 7.88-3.772 8.421-3.557.064-.434.257-.884.764-.994a1.712 1.712 0 0 1 .612 0c-.522.193-1.077.427-1.05.976.022.49.52.835.936.91 0 0 .33.072.567-.075a.019.019 0 0 0 .016-.012c.064-.037.12-.075.204-.105a.979.979 0 0 1 .529-.023c.049.011.143.09.227.087.052 0 .136-.076.211-.087.2-.038.397.072.582.147.125.053.465.099.488.273.011.12-.178.264-.28.34a1.765 1.765 0 0 1-.423.23c.56-.045 1.682-.48 1.512.246-.015.076-.057.14-.042.178.578-.197.76-.685.673-1.372-.076.022-.14.17-.2.215v-.004c0-.196.01-.491-.125-.612.068.359-.121.53-.382.654a6.176 6.176 0 0 0-.695-.975c-.027.113-.012.26-.046.37a.518.518 0 0 0-.438-.351c-.129-.02-.272.022-.427 0-.2-.034-.431-.174-.446-.325-.027-.25.423-.367.65-.428.049.163.117.295.17.45a1.693 1.693 0 0 1 .964-.43c.102 0 .329.037.363.113.079.162-.129.355-.19.427-.037.038-.098.08-.079.102.39-.102.567-.355.84-.544.143.189.196.59.173.858.31-.303.318-.824.291-1.376a1.761 1.761 0 0 1 .749.597 1.943 1.943 0 0 0-.68-.756c-.1-.064-.228-.094-.303-.166-.068-.068-.151-.303-.242-.322-.113-.022-.265.11-.397.118-.238.019-.367-.144-.416-.378-.578.158-.8-.197-.937-.632-.023-.075-.023-.18-.06-.264-.042-.106-.273-.212-.394-.257a1.092 1.092 0 0 0-.548-.068c-.17.026-.294.113-.491.12-.476.027-.971-.18-1.357-.37A8.289 8.289 0 0 1 12.896.113c-.03-.038-.053-.094-.11-.113.125.385.348.707.556 1.005.639.915 1.47 1.58 2.283 2.215a1.308 1.308 0 0 1-.805-.208 4.165 4.165 0 0 1-.65-.416c-.85.726-2.548.81-3.916 1.134.567-.019 1.417.163 1.916.246h-.015c-2.389.094-4.449.794-5.877 2.147.37-.136.706-.306 1.118-.405-.59.537-1.171 1.096-1.644 1.75-.468.647-.967 1.33-.986 2.404.287-.28.578-.642.979-.847a13.108 13.108 0 0 0-.85 2.268c-.197.718-.492 1.913-.02 2.582.03-.238.03-.51.19-.624.28.661.76 1.996 2.26 3.319m5.68-14.095c.114.102.333.273.465.265.208 0 .314-.189.458-.272-.719-.321-1.388-.786-2.034-1.168.098.151.227.28.355.435.239.272.477.506.756.74m-8.05 5.16c.075.155 0 .366.011.517.234-.635.688-1.134 1.119-1.572.023-.026.087-.08.049-.072-.227.11-.355.314-.665.34-.174-.196-.174-.793.06-.922.288.087.477-.162.446-.427-.056-.423-.578-.707-.816-.877.125.159.367.303.423.537.02.083.015.242-.075.268-.133.038-.208-.11-.34-.09-.114.018-.167.219-.19.359a2.76 2.76 0 0 0-.03.529c0 .087.034.219-.03.283-.08-.038-.098-.136-.132-.215-.125-.276-.34-.647-.254-1.013.057-.023.163.007.2-.03.02-.227-.143-.443-.29-.586a.983.983 0 0 0-.926-.227c.211.038.68.068.684.302 0 .087-.102.212-.129.28-.166.408.023.93.22 1.194.113.152.28.295.181.575-.128-.008-.246-.09-.363-.155-.166-.095-.34-.185-.423-.329-.083-.162-.09-.325-.204-.446-.284-.321-.896-.544-1.342-.272.378-.011.73.011.877.26a1.119 1.119 0 0 1 .12.454c.008.068-.01.16.023.208.057.098.235.083.34.144.14.08.227.298.382.435a1.02 1.02 0 0 0 .133.102c.242.143.816.196.937.446m3.046 10.057c-.578.306-.914.907-.986 1.67.113-.302.43-.46.767-.615.216-.099.601-.197.662-.397.053-.155.037-.405-.038-.507-.083-.113-.227-.147-.405-.15m1.406 2.683a1.708 1.708 0 0 0-.907 1.38c.117-.28.424-.398.734-.53.189-.076.517-.162.578-.317.045-.125.045-.326-.023-.416-.064-.095-.283-.167-.382-.121m1.701 1.625c-.321.287-.506.88-.476 1.444.08-.321.325-.446.605-.631.162-.102.491-.261.552-.42a.469.469 0 0 0-.118-.461c-.181-.151-.453-.026-.567.072m2.627.567c-.313.276-.415.831-.34 1.432.076-.302.238-.45.454-.635.128-.113.332-.264.374-.42.068-.256-.208-.51-.491-.377m.544-6.085c.174.022.34.113.476.158.011-.049-.05-.071-.0Line truncated
|
||||
|
After Width: | Height: | Size: 8.1 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>NETGEAR</title><path d="M11.496 12.459h.678c-.035.362-.296.545-.67.545-.566 0-.849-.496-.849-.982 0-.479.244-.991.811-.991.347 0 .598.2.716.499l.817-.324c-.285-.588-.813-.88-1.493-.88-1.068 0-1.746.672-1.746 1.691 0 .987.699 1.657 1.74 1.657.555 0 1.017-.186 1.341-.616.295-.391.329-.782.338-1.24h-1.683v.641ZM6.86 11.122h.833v2.449h.874v-2.449h.834v-.692H6.86v.692Zm-4.565 1.229h-.009L.861 10.43H0v3.141h.861v-1.924H.87l1.425 1.924h.861V10.43h-.861v1.921Zm15.414-1.921-1.157 3.141h.889l.19-.578h1.149l.189.578h.889l-1.156-3.141h-.993ZM4.174 13.571h2.098v-.691H5.036v-.543h1.185v-.69H5.036v-.525h1.236v-.692H4.174v3.141Zm9.761 0h2.099v-.691h-1.237v-.543h1.185v-.69h-1.185v-.525h1.237v-.692h-2.099v3.141Zm8.954-2.174c0-.67-.497-.967-1.15-.967h-1.34v3.141h.86v-1.208h.062l.785 1.208h1.046l-.987-1.287c.47-.079.724-.453.724-.887Zm-5.054.971.358-1.096h.024l.359 1.096h-.741Zm3.646-.53h-.222v-.782h.247c.282 0 .522.049.522.391s-.265.391-.547.391Zm2.133-1.408c-.202 0-.386.157-.386.378 0 .218.186.38.386.38.202 0 .386-.16.386-.38 0-.225-.18-.378-.386-.378Zm0 .688c-.164 0-.315-.13-.315-.31 0-.183.149-.311.316-.311.164 0 .316.132.316.311 0 .183-.15.31-.317.31Zm.184-.404c0-.104-.101-.122-.174-.122h-.161v.416h.11v-.164h.033l.075.164h.121l-.089-.182c.049-.016.085-.054.085-.112Zm-.185.061h-.04v-.111h.033c.037 0 .079.006.079.057 0 .045-.039.054-.072.054Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Nokia</title><path d="M16.59 9.348v5.304h.796V9.348Zm-8.497-.09c-1.55 0-2.752 1.127-2.752 2.742 0 1.687 1.202 2.742 2.752 2.742 1.55 0 2.754-1.055 2.751-2.742a2.72 2.72 0 0 0-2.751-2.742ZM10.05 12c0 1.195-.876 1.987-1.957 1.987-1.082 0-1.958-.792-1.958-1.987 0-1.174.876-1.987 1.958-1.987 1.08 0 1.957.813 1.957 1.987zM0 9.176v5.476h.812v-3.619l4.218 3.79v-1.135zM11.442 12l2.952 2.652h1.184L12.622 12l2.956-2.652h-1.184ZM24 14.652h-.875l-.64-1.175h-2.898l-.64 1.175h-.875l1.06-1.958h2.937l-1.465-2.72.432-.798Z"/></svg>
|
||||
|
After Width: | Height: | Size: 598 B |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>NVIDIA</title><path d="M8.948 8.798v-1.43a6.7 6.7 0 0 1 .424-.018c3.922-.124 6.493 3.374 6.493 3.374s-2.774 3.851-5.75 3.851c-.398 0-.787-.062-1.158-.185v-4.346c1.528.185 1.837.857 2.747 2.385l2.04-1.714s-1.492-1.952-4-1.952a6.016 6.016 0 0 0-.796.035m0-4.735v2.138l.424-.027c5.45-.185 9.01 4.47 9.01 4.47s-4.08 4.964-8.33 4.964c-.37 0-.733-.035-1.095-.097v1.325c.3.035.61.062.91.062 3.957 0 6.82-2.023 9.593-4.408.459.371 2.34 1.263 2.73 1.652-2.633 2.208-8.772 3.984-12.253 3.984-.335 0-.653-.018-.971-.053v1.864H24V4.063zm0 10.326v1.131c-3.657-.654-4.673-4.46-4.673-4.46s1.758-1.944 4.673-2.262v1.237H8.94c-1.528-.186-2.73 1.245-2.73 1.245s.68 2.412 2.739 3.11M2.456 10.9s2.164-3.197 6.5-3.533V6.201C4.153 6.59 0 10.653 0 10.653s2.35 6.802 8.948 7.42v-1.237c-4.84-.6-6.492-5.936-6.492-5.936z"/></svg>
|
||||
|
After Width: | Height: | Size: 881 B |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>OnePlus</title><path d="M0 3.74V24h20.26V12.428h-2.256v9.317H2.254V5.995h9.318V3.742zM18.004 0v3.74h-3.758v2.256h3.758v3.758h2.255V5.996H24V3.74h-3.758V0zm-6.45 18.756V8.862H9.562c0 .682-.228 1.189-.577 1.504-.367.297-.91.437-1.556.437h-.245v1.625h2.133v6.31h2.237z"/></svg>
|
||||
|
After Width: | Height: | Size: 352 B |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>OPPO</title><path d="M2.85 12.786h-.001C1.639 12.774.858 12.2.858 11.321s.781-1.452 1.99-1.465c1.21.013 1.992.588 1.992 1.465s-.782 1.453-1.99 1.465zm.034-3.638h-.073C1.156 9.175 0 10.068 0 11.32s1.156 2.147 2.811 2.174h.073c1.655-.027 2.811-.921 2.811-2.174S4.54 9.175 2.885 9.148zm18.27 3.638c-1.21-.012-1.992-.587-1.992-1.465s.782-1.452 1.991-1.465c1.21.013 1.991.588 1.991 1.465s-.781 1.453-1.99 1.465zm.035-3.638h-.073c-1.655.027-2.811.92-2.811 2.173s1.156 2.147 2.81 2.174h.074C22.844 13.468 24 12.574 24 11.32s-1.156-2.146-2.811-2.173zm-6.126 3.638c-1.21-.012-1.99-.587-1.99-1.465s.78-1.452 1.99-1.465c1.21.013 1.991.588 1.991 1.465s-.781 1.453-1.99 1.465zm.036-3.638h-.073c-.789.013-1.464.222-1.955.574v-.37h-.857v5.5h.857v-1.931c.49.351 1.166.56 1.954.574h.074c1.655-.027 2.81-.921 2.81-2.174s-1.155-2.146-2.81-2.173zm-6.144 3.638c-1.21-.012-1.99-.587-1.99-1.465s.78-1.452 1.99-1.465c1.21.013 1.991.588 1.991 1.465s-.781 1.453-1.99 1.465zm.037-3.638H8.92c-.789.013-1.464.222-1.955.574v-.37h-.856v5.5h.856v-1.931c.491.351 1.166.56 1.955.574a3.728 3.728 0 0 0 .073 0c1.655-.027 2.811-.921 2.811-2.174s-1.156-2.146-2.81-2.173z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,111 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
(function(window, document) {
|
||||
'use strict';
|
||||
if (window.luciOUI)
|
||||
return;
|
||||
|
||||
var base = document.currentScript.src.replace(/[^/]*$/, '');
|
||||
var database, pending, devices = Object.create(null);
|
||||
|
||||
function normalize(mac) {
|
||||
if (typeof mac !== 'string' || !/^(?:[\da-f]{12}|(?:[\da-f]{2}:){5}[\da-f]{2}|(?:[\da-f]{2}-){5}[\da-f]{2})$/i.test(mac))
|
||||
return null;
|
||||
mac = mac.replace(/[:-]/g, '').toUpperCase();
|
||||
// Neither locally administered (randomized) nor multicast addresses have a reliable OUI.
|
||||
return (parseInt(mac.slice(0, 2), 16) & 3) ? null : mac;
|
||||
}
|
||||
|
||||
function load() {
|
||||
if (!pending) {
|
||||
// One local request per page; failed requests are cached too, so polling never retries.
|
||||
pending = new Promise(function(resolve) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open('GET', base + 'vendors-451e5311befc.json', true);
|
||||
xhr.timeout = 5000;
|
||||
xhr.onload = function() {
|
||||
try {
|
||||
if (xhr.status === 200) {
|
||||
var data = JSON.parse(xhr.responseText);
|
||||
if (Array.isArray(data.vendors) && data.prefixes && typeof data.prefixes === 'object')
|
||||
database = data;
|
||||
}
|
||||
} catch (e) { /* Leave the hostname unchanged on missing or invalid data. */ }
|
||||
resolve(database);
|
||||
};
|
||||
xhr.onerror = xhr.ontimeout = xhr.onabort = function() { resolve(null); };
|
||||
xhr.send();
|
||||
});
|
||||
}
|
||||
return pending;
|
||||
}
|
||||
|
||||
function lookup(mac) {
|
||||
mac = normalize(mac);
|
||||
if (!mac || !database)
|
||||
return null;
|
||||
if (devices[mac]) {
|
||||
for (var v = 0; v < database.vendors.length; v++)
|
||||
if (database.vendors[v][0] === devices[mac])
|
||||
return database.vendors[v];
|
||||
}
|
||||
// The resident prefix map also caches misses without retaining every client's MAC.
|
||||
for (var i = 0, lengths = [9, 7, 6]; i < lengths.length; i++) {
|
||||
var prefix = mac.slice(0, lengths[i]);
|
||||
if (Object.prototype.hasOwnProperty.call(database.prefixes, prefix)) {
|
||||
var index = database.prefixes[prefix];
|
||||
return index == null ? null : database.vendors[index];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function decorate(node, mac, fnos) {
|
||||
if (node.querySelector('.luci-oui-icon'))
|
||||
return;
|
||||
var icon = document.createElement('img');
|
||||
icon.className = 'luci-oui-icon';
|
||||
icon.width = icon.height = 20;
|
||||
icon.alt = '';
|
||||
icon.style.cssText = 'display:inline-block;width:20px;height:20px;object-fit:contain;vertical-align:middle;margin-inline-end:6px;background:#fff;border-radius:3px;padding:2px;box-sizing:content-box';
|
||||
function fallback() {
|
||||
icon.title = 'Unknown vendor';
|
||||
icon.onerror = function() { icon.remove(); };
|
||||
icon.src = base + 'computer.svg';
|
||||
}
|
||||
fallback();
|
||||
node.insertBefore(icon, node.firstChild);
|
||||
if (fnos === true) {
|
||||
icon.title = 'fnOS 飞牛OS';
|
||||
icon.onerror = fallback;
|
||||
icon.src = base + 'fnos.svg';
|
||||
return;
|
||||
}
|
||||
// Random, malformed or absent addresses use the fallback without an OUI request.
|
||||
if (!normalize(mac))
|
||||
return;
|
||||
function apply() {
|
||||
var vendor = lookup(mac);
|
||||
if (!vendor || !/^[a-z0-9]+$/.test(vendor[0]))
|
||||
return;
|
||||
icon.title = vendor[1];
|
||||
icon.onerror = fallback;
|
||||
icon.src = base + vendor[0] + '.svg';
|
||||
}
|
||||
if (database)
|
||||
apply();
|
||||
else
|
||||
load().then(apply);
|
||||
}
|
||||
|
||||
window.luciOUI = {
|
||||
decorate: decorate,
|
||||
setDevices: function(sections) {
|
||||
devices = Object.create(null);
|
||||
(sections || []).forEach(function(section) {
|
||||
var mac = normalize(section.mac);
|
||||
if (mac && typeof section.vendor === 'string' && /^[a-z0-9]+$/.test(section.vendor))
|
||||
devices[mac] = section.vendor;
|
||||
});
|
||||
}
|
||||
};
|
||||
})(window, document);
|
||||
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Panasonic</title><path d="M3.157 11.4852c.0399-.6914-.4884-1.2842-1.1798-1.324H0v3.58h1.084v-1.1h.66c.166 0 .333-.02.496-.059.497-.103.87-.52.917-1.025v-.072zm-1.081.005a.35.35 0 0 1-.337.301c-.081.007-.15.007-.23.007h-.425v-.777h.632a.36.36 0 0 1 .36.326.658.658 0 0 1 0 .143zm3.6781 1.45c0-.278-.01-.511-.01-.786a1.654 1.654 0 0 0-.057-.42.666.666 0 0 0-.332-.43 1.046 1.046 0 0 0-.316-.118 2.63 2.63 0 0 0-1.065-.02c-.1.015-.197.043-.29.082a.77.77 0 0 0-.455.5.597.597 0 0 0-.024.261.124.124 0 0 0 .014.048l.86.02a.386.386 0 0 1 .025-.153.262.262 0 0 1 .162-.162.49.49 0 0 1 .342 0 .23.23 0 0 1 .156.157.15.15 0 0 1-.02.13.22.22 0 0 1-.1.078l-.074.024c-.113.03-.228.055-.343.075a6.7928 6.7928 0 0 0-.276.05 3.2483 3.2483 0 0 0-.365.095.787.787 0 0 0-.295.173.621.621 0 0 0-.205.393.792.792 0 0 0 .012.299.71.71 0 0 0 .509.54c.277.084.574.068.841-.043a.83.83 0 0 0 .344-.248c.018.059.038.117.057.176.012.032.03.061.051.087h.948a.414.414 0 0 1-.068-.207c-.0138-.2-.0225-.4004-.026-.601zm-.956-.088a.431.431 0 0 1-.067.193.406.406 0 0 1-.182.145.627.627 0 0 1-.21.054.453.453 0 0 1-.163-.013.244.244 0 0 1-.12-.074.204.204 0 0 1-.057-.106.17.17 0 0 1 .064-.174.314.314 0 0 1 .105-.063c.095-.035.19-.066.288-.093.118-.034.232-.078.342-.131a.907.907 0 0 1 0 .262zm3.262-1.712a1.038 1.038 0 0 0-.755.054 1.662 1.662 0 0 0-.393.262l-.023-.27h-.919v2.559h.982v-1.42a.413.413 0 0 1 .06-.221.383.383 0 0 1 .482-.16c.081.032.142.1.167.183.013.043.02.087.02.131v1.484h1.01v-1.652a1.205 1.205 0 0 0-.06-.394.822.822 0 0 0-.572-.558l.001.002zm5.9501 1.25a1.076 1.076 0 0 0-.42-.231l-.106-.03a4.543 4.543 0 0 0-.58-.122 1.8502 1.8502 0 0 1-.156-.03.3.3 0 0 1-.068-.024.117.117 0 0 1-.059-.152v-.008a.222.222 0 0 1 .131-.105.491.491 0 0 1 .316 0c.107.03.178.133.17.244h.902a.9.9 0 0 0-.055-.31.551.551 0 0 0-.184-.255.848.848 0 0 0-.242-.138 1.196 1.196 0 0 0-.262-.073 2.627 2.627 0 0 0-.642-.037 2.033 2.033 0 0 0-.366.054 1.082 1.082 0 0 0-.444.211.693.693 0 0 0-.28.526.72.72 0 0 0 .052.316.675.675 0 0 0 .393.393c.09.036.183.064.278.082l.554.104c.07.01.138.028.205.051.06.018.103.07.113.131a.19.19 0 0 1-.052.176.304.304 0 0 1-.17.086.492.492 0 0 1-.262-.025.368.368 0 0 1-.105-.061.263.263 0 0 1-.089-.131.41.41 0 0 1-.02-.138h-.932v.055a.773.773 0 0 0 .256.555.99.99 0 0 0 .426.24c.329.098.676.12 1.014.065.16-.023.313-.073.455-.148a.935.935 0 0 0 .176-.118.778.778 0 0 0 .246-.852.632.632 0 0 0-.193-.302v.001zm6.1982-2.226h.957v.676h-.957v-.676zm0 1.024h.957v2.558h-.957v-2.558zm2.872 1.505a1.1666 1.1666 0 0 1-.018.154.393.393 0 0 1-.096.199.299.299 0 0 1-.185.098.364.364 0 0 1-.316-.1.53.53 0 0 1-.152-.26 1.168 1.168 0 0 1 .012-.703.41.41 0 0 1 .178-.232.36.36 0 0 1 .407.017c.092.068.153.17.17.284h.874a.78.78 0 0 0-.09-.417 1.12 1.12 0 0 0-.724-.564 1.711 1.711 0 0 0-.806-.02c-.48.094-.863.456-.984.93a1.383 1.383 0 0 0-.031.621c.023.149.075.291.152.42.095.171.227.32.385.435.189.148.416.239.655.262.18.02.36.012.538-.025a1.24 1.24 0 0 0 .685-.38.928.928 0 0 0 .263-.719h-.917zm-3.704-1.553a1.038 1.038 0 0 0-.755.054 1.656 1.656 0 0 0-.393.262l-.031-.27h-.9181v2.559h.984v-1.428a.425.425 0 0 1 .06-.221.393.393 0 0 1 .484-.16c.08.033.14.1.164.183a.453.453 0 0 1 .021.14v1.483h1.016v-1.652a1.2 1.2 0 0 0-.06-.394.822.822 0 0 0-.572-.558v.002zm-7.8792 1.8c0-.278-.01-.511-.012-.786 0-.142-.018-.283-.054-.42a.675.675 0 0 0-.333-.43 1.056 1.056 0 0 0-.315-.118 2.637 2.637 0 0 0-1.067-.02c-.1.015-.196.043-.289.082a.766.766 0 0 0-.456.5.617.617 0 0 0-.025.261.149.149 0 0 0 .015.048l.86.02a.384.384 0 0 1 .024-.153.262.262 0 0 1 .163-.162.49.49 0 0 1 .342 0 .23.23 0 0 1 .156.157.15.15 0 0 1-.021.13.213.213 0 0 1-.098.078l-.075.024c-.113.03-.228.055-.343.075a6.3141 6.3141 0 0 0-.274.05 3.2042 3.2042 0 0 0-.366.095.762.762 0 0 0-.296.173.617.617 0 0 0-.21.393.753.753 0 0 0 .012.299c.056.26.252.469.508.54.277.084.575.068.842-.043a.808.808 0 0 0 .335-.245c.017.058.036.116.057.173.01.032.029.062.052.087h.948a.418.418 0 0 1-.054-.207 13.4697 13.4697 0 0 1-.026-.601zm-.97-.084a.435.435 0 0 1-.07.189.371.371 0 0 1-.167.145.656.656 0 0 1-.205.054.466.466 0 0 1-.175-.015.248.248 0 0 1-.122-.073.214.214 0 0 1-.055-.105.172.172 0 0 1 .057-.17.344.344 0 0 1 .105-.063 4.83 4.83 0 0 1 .288-.093c.118-.035.233-.079.344-.131.01.087.01.175 0 .262zm5.483-1.72a1.858 1.858 0 0 0-.577 0 1.33 1.33 0 0 0-.747.371 1.21 1.21 0 0 0-.383.798c-.02.185-.003.372.048.551.073.278.239.522.47.693.147.117.32.197.504.235.26.055.527.055.787 0 .184-.038.359-.118.507-.235.23-.17.3961-.415.4681-.693a1.42 1.42 0 0 0 .05-.55 1.208 1.208 0 0 0-.383-.799 1.33 1.33 0 0 0-.743-.37l-.001-.001zm.06 1.814a.388.388 0 0 1-.513.193.371.371 0 0 1-.194-.193.903.903 0 0 1-.072-.246 1.42 1.42 0 0 1 .012-.515.657.657 0 0 1 .1-.247.374.374 0 0 1 .622 0 .627.627 0 0 1 .105.247c.034.17.038.344.01.515a.885.885 0 0 1-.07.246z"/></svg>
|
||||
|
After Width: | Height: | Size: 4.8 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>QNAP</title><path d="M1.3164 9.955C.438 9.955 0 10.3094 0 11.0177v1.9512c0 .704.438 1.0566 1.3164 1.0566h2.5703c0-.0061.1487.0049.377-.0293-.2145-.3087-.6112-.6434-.9825-.9121l-.0683-.0488H1.6133v-2.1133H3.744v1.793c.6399.1993 1.0793.4554 1.379.6992.0507-.1283.0761-.2763.0761-.4454v-1.9511c0-.6699-.3928-1.0238-1.1758-1.0606v-.002zm4.9649.0528c-.1551 0-.274.044-.3575.1309-.1468.1535-.1164.3461-.1308.3535v3.5176h1.4453s-.0081-1.8582-.0117-2.4063c.0062-.036.0323-.088.1425-.0742 0 0 .0426.0012.0606.0332.2786.445 2.1035 2.4473 2.1035 2.4473h1.5v-4.002H9.5703v2.3281c-.022.0535-.095.044-.1308.006-.258-.399-1.2508-1.7643-1.5684-2.1993-.0202-.0243-.1248-.1348-.3555-.1348Zm6.584 0c-.3665 0-.6468.0763-.8438.2305-.202.1592-.3027.371-.3027.6387v3.1328h1.5273v-1.0664h2.1406v1.0664h1.5293V10.877c0-.2711-.0993-.4848-.2969-.6387-.197-.1542-.4793-.2305-.8457-.2305zm5.9179 0c-.366 0-.6481.0778-.8457.2324-.197.1533-.2976.361-.3027.6192v3.1504h1.5293v-1.045h2.4707c.6714 0 1.0078-.268 1.0078-.8085V10.873c0-.3081-.0845-.529-.248-.664-.2801-.2223-.743-.1877-.7032-.2012zm4.7246.0723c-.248.0126-.4473.2195-.4473.4707 0 .259.2116.4687.4707.4687A.4684.4684 0 0 0 24 10.5508c0-.2593-.2096-.4707-.4688-.4707-.008 0-.0154-.0004-.0234 0zm.002.0683c.0068-.0003.0146 0 .0215 0 .2213.0007.3998.1813.4004.4024a.3996.3996 0 0 1-.4004.3984c-.221-.0005-.4001-.1777-.4004-.3984.0003-.2142.1675-.391.379-.4024zm-.1894.1407v.5332h.0722v-.2364c.0404-.0023.081.0013.1211.002.0326.0073.0642.0456.0684.0508.0452.0579.0807.1224.121.1836h.088l-.0918-.1445a.3512.3512 0 0 0-.0586-.0703.1786.1786 0 0 0-.043-.0274c.0514-.007.0887-.023.1133-.0488.0434-.0465.05-.1157.0137-.1758-.0217-.036-.0561-.0664-.166-.0664zm.0722.0586h.168c.1513 0 .134.1407.0586.168-.0737.0188-.1513.0064-.2266.0097zm-10.1465.7011h2.1407v1.1582H13.246zm5.8965 0h1.9434v1.0371h-1.9434zm-16.3574 1.539c.4791.3043 1.3518.9071 1.6406 1.4571h1.0879c-.1858-.3314-.814-1.1293-2.7285-1.457Z"/></svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Raspberry Pi</title><path d="m19.8955 10.8961-.1726-.3028c.0068-2.1746-1.0022-3.061-2.1788-3.7348.356-.0938.7237-.1711.8245-.6182.6118-.1566.7397-.4398.8011-.7398.16-.1066.6955-.4061.6394-.9211.2998-.2069.4669-.4725.3819-.8487.3222-.3515.407-.6419.2702-.9096.3868-.4805.2152-.7295.05-.9817.2897-.5254.0341-1.0887-.7758-.9944-.3221-.4733-1.0244-.3659-1.133-.3637-.1215-.1519-.2819-.2821-.7755-.219-.3197-.2851-.6771-.2364-1.0458-.0964-.4378-.3403-.7275-.0675-1.0584.0356-.53-.1706-.6513.0631-.9117.1583-.5781-.1203-.7538.1416-1.0309.4182l-.3224-.0063c-.8719.5061-1.305 1.5366-1.4585 2.0664-.1536-.5299-.5858-1.5604-1.4575-2.0664l-.3223.0063C9.942.5014 9.7663.2394 9.1883.3597 8.9279.2646 8.807.0309 8.2766.2015c-.2172-.0677-.417-.2084-.6522-.2012l.0004.0002C7.5017.0041 7.369.049 7.2185.166c-.3688-.1401-.7262-.1887-1.0459.0964-.4936-.0631-.654.0671-.7756.219C5.2887.4791 4.5862.3717 4.264.845c-.8096-.0943-1.0655.4691-.7756.9944-.1653.2521-.3366.5013.05.9819-.1367.2677-.0519.5581.2703.9096-.085.3763.0822.6418.3819.8487-.0561.515.4795.8144.6394.9211.0614.3001.1894.5832.8011.7398.1008.4472.4685.5244.8245.6183-1.1766.6737-2.1856 1.56-2.1788 3.7348l-.1724.3028c-1.3491.8082-2.5629 3.4056-.6648 5.5167.124.6609.3319 1.1355.5171 1.6609.2769 2.117 2.0841 3.1082 2.5608 3.2255.6984.524 1.4423 1.0212 2.449 1.3696.949.964 1.977 1.3314 3.0107 1.3308.0152 0 .0306.0002.0457 0 1.0337.0006 2.0618-.3668 3.0107-1.3308 1.0067-.3483 1.7506-.8456 2.4491-1.3696.4766-.1173 2.2838-1.1085 2.5607-3.2255.1851-.5253.3931-1 .517-1.6609 1.8981-2.1113.6843-4.7089-.6649-5.517zm-1.0386-.3715c-.0704.8759-4.6354-3.0504-3.8472-3.1808 2.1391-.3558 3.9191.896 3.8472 3.1808zm-2.0155 4.3649c-1.1481.7409-2.8025.2626-3.6953-1.0681-.8928-1.3306-.6858-3.0101.4623-3.7509 1.1481-.7409 2.8025-.2627 3.6953 1.068.8927 1.3307.6858 3.0101-.4623 3.751zM13.6591 1.3721c.0396.1967.0843.321.1354.3577.2537-.272.4611-.5506.7878-.8123.0011.1537-.0776.3205.1169.4425.1752-.2356.4119-.4459.7263-.6244-.1514.2611-.026.3404.0554.4486.24-.2059.4681-.4144.9109-.5759-.121.1474-.2902.2914-.1108.4607.2473-.1544.496-.3086 1.0833-.4183-.1323.1475-.4059.295-.2401.4426.3104-.1186.6539-.2047 1.034-.2546-.182.1496-.3337.2963-.1846.4122.3323-.1022.7899-.2398 1.2372-.1212l-.2832.2849c-.0314.0382.6623.0297 1.1202.0364-.167.2321-.3375.4562-.437.8548.0454.0459.2723.0204.4862 0-.2194.4618-.6004.5783-.6893.776.134.1015.32.075.5232.006-.158.3254-.4892.5484-.7509.8123.0662.047.1818.075.4555.0425-.2418.257-.5339.492-.8802.7032.0614.0708.2722.0681.4678.0727-.3136.3069-.7173.466-1.0955.6668.1885.1288.3234.0988.4678.097-.2676.2198-.7225.3342-1.1448.4668.0803.1249.1607.1589.3324.194-.447.2473-1.0873.1343-1.2679.2607.0435.1243.1665.2053.3139.2728-.7197.0418-2.6879-.0262-3.0652-1.5156.7367-.8094 2.0813-1.7593 4.394-2.934-1.7994.6022-3.4229 1.405-4.7817 2.5096-1.5978-.7436-.4965-2.6197.283-3.3645zm-1.6126 5.3718c1.1329-.0123 2.5356.8325 2.53 1.6286-.005.7027-.9851 1.2715-2.5213 1.2607-1.5043-.0177-2.5172-.7148-2.5137-1.3957.003-.5603 1.2282-1.5263 2.505-1.4936zm-5.7646-.6006c.1717-.0351.252-.0692.3323-.194-.4223-.1327-.8772-.247-1.1448-.4668.1444.0018.2792.0318.4678-.097-.3783-.2008-.782-.3599-1.0956-.6668.1955-.0048.4064-.002.4677-.0728-.3462-.2113-.6383-.4463-.8801-.7033.2738.0325.3893.0045.4555-.0425-.2617-.264-.593-.487-.7509-.8123.2032.069.3892.0954.5232-.006-.089-.1977-.47-.3142-.6894-.776.214.0204.4409.0459.4863 0-.0994-.3985-.2698-.6226-.4369-.8547.4579-.0067 1.1516.0018 1.1202-.0364l-.2831-.2849c.4472-.1186.9049.019 1.2371.1213.1492-.1159-.0026-.2626-.1847-.4123.3801.05.7236.1361 1.034.2547.1659-.1476-.1076-.2951-.24-.4426.5872.1097.8361.2639 1.0833.4183.1794-.1694.0103-.3133-.1108-.4607.4428.1615.6709.37.911.5759.0814-.1082.2068-.1875.0554-.4486.3143.1785.5511.3888.7263.6244.1945-.122.1159-.2888.1169-.4426.3267.2618.534.5404.7879.8124.0511-.0366.0959-.161.1354-.3577.7794.7448 1.8807 2.6208.2831 3.3646-1.3589-1.1039-2.9817-1.9064-4.78-2.5086 2.3115 1.174 3.6556 2.1239 4.392 2.9328-.3773 1.4895-2.3455 1.5575-3.0651 1.5157.1473-.0676.2703-.1485.3139-.2728-.1806-.1264-.8209-.0134-1.2679-.2607zm2.8175 1.1334c.7881.1304-3.7769 4.0567-3.8472 3.1809-.0719-2.2846 1.7079-3.5367 3.8472-3.1809zm-4.847 8.7567c-1.1094-.8789-1.4668-3.4529.5901-4.6097 1.2394-.3273.4184 5.051-.5901 4.6097zm4.2656 4.5989c-.6257.3719-2.1452.2187-3.2252-1.3095-.7283-1.2823-.6345-2.5872-.123-2.9705.7648-.4589 1.9464.1609 2.8559 1.2003.7923.9405 1.1536 2.5927.4923 3.0797zm-1.2415-5.6086c-1.1481-.7409-1.3551-2.4203-.4623-3.7511.8928-1.3307 2.5472-1.8089 3.6952-1.068 1.1481.7409 1.3551 2.4203.4623 3.7509-.8926 1.3308-2.5471 1.809-3.6952 1.0682zm4.7948 8.2279c-1.3763.0584-2.7258-1.1105-2.7081-1.5157-.0206-.594 1.6758-1.0578 2.782-1.0306 1.1131-.0479 2.6068.3531 2.6097.8851.0184.5166-1.3547 1.6838-2.6836 1.6612zm2.7584-5.8578c.0081 1.3899-1.226 2.5225-2.7562 2.5299-1.5302.0073-2.7773-1.1135-2.7854-2.5033v-.0265c-.008-1.3899 1.2259-2.5226 2.7562-2.5299 1.5302-.0073 2.77Line truncated
|
||||
|
After Width: | Height: | Size: 5.8 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Samsung</title><path d="M19.8166 10.2808l.0459 2.6934h-.023l-.7793-2.6934h-1.2837v3.3925h.8481l-.0458-2.785h.023l.8366 2.785h1.2264v-3.3925zm-16.149 0l-.6418 3.427h.9284l.4699-3.1175h.0229l.4585 3.1174h.9169l-.6304-3.4269zm5.1805 0l-.424 2.6132h-.023l-.424-2.6132H6.5788l-.0688 3.427h.8596l.023-3.0832h.0114l.573 3.0831h.8711l.5731-3.083h.023l.0228 3.083h.8596l-.0802-3.4269zm-7.2664 2.4527c.0343.0802.0229.1949.0114.2522-.0229.1146-.1031.2292-.3324.2292-.2177 0-.3438-.126-.3438-.3095v-.3323H0v.2636c0 .7679.6074.9971 1.2493.9971.6189 0 1.1346-.2178 1.2149-.7794.0458-.298.0114-.4928 0-.5616-.1605-.722-1.467-.9283-1.5588-1.3295-.0114-.0688-.0114-.1375 0-.1834.023-.1146.1032-.2292.3095-.2292.2063 0 .321.126.321.3095v.2063h.8595v-.2407c0-.745-.6762-.8596-1.1576-.8596-.6074 0-1.1117.2063-1.2034.7564-.023.149-.0344.2866.0114.4585.1376.7106 1.364.9169 1.5358 1.3524m11.152 0c.0343.0803.0228.1834.0114.2522-.023.1146-.1032.2292-.3324.2292-.2178 0-.3438-.126-.3438-.3095v-.3323h-.917v.2636c0 .7564.596.9857 1.2379.9857.6189 0 1.1232-.2063 1.2034-.7794.0459-.298.0115-.4814 0-.5616-.1375-.7106-1.4327-.9284-1.5243-1.318-.0115-.0688-.0115-.1376 0-.1835.0229-.1146.1031-.2292.3094-.2292.1948 0 .321.126.321.3095v.2063h.848v-.2407c0-.745-.6647-.8596-1.146-.8596-.6075 0-1.1004.1948-1.192.7564-.023.149-.023.2866.0114.4585.1376.7106 1.341.9054 1.513 1.3524m2.8882.4585c.2407 0 .3094-.1605.3323-.2522.0115-.0343.0115-.0917.0115-.126v-2.533h.871v2.4642c0 .0688 0 .1948-.0114.2292-.0573.6419-.5616.8482-1.192.8482-.6303 0-1.1346-.2063-1.192-.8482 0-.0344-.0114-.1604-.0114-.2292v-2.4642h.871v2.533c0 .0458 0 .0916.0115.126 0 .0917.0688.2522.3095.2522m7.1518-.0344c.2522 0 .3324-.1605.3553-.2522.0115-.0343.0115-.0917.0115-.126v-.4929h-.3553v-.5043H24v.917c0 .0687 0 .1145-.0115.2292-.0573.6303-.596.8481-1.2034.8481-.6075 0-1.1461-.2178-1.2034-.8481-.0115-.1147-.0115-.1605-.0115-.2293v-1.444c0-.0574.0115-.172.0115-.2293.0802-.6419.596-.8482 1.2034-.8482s1.1347.2063 1.2034.8482c.0115.1031.0115.2292.0115.2292v.1146h-.8596v-.1948s0-.0803-.0115-.1261c-.0114-.0802-.0802-.2521-.3438-.2521-.2521 0-.321.1604-.3438.2521-.0115.0458-.0115.1032-.0115.1605v1.5702c0 .0458 0 .0916.0115.126 0 .0917.0917.2522.3323.2522"/></svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>sharp</title><path d="M14.2209.0875v5.9613l-3.7433.5012v3.5233l3.7433-.5012v3.5735l3.492-.4672V9.1047L24 8.2634l-.4631-3.4613-5.824.7794V.0875zM6.287 1.145v5.9618L0 7.9483l.4634 3.4613 5.8514-.7834 3.4644-.4637V1.145zm3.5198 9.7185l-3.492.4675v3.578l-6.183.8276.4633 3.4613 5.8239-.7796v5.4942h3.492v-5.962l3.6114-.4834V13.944l-3.7156.4973zm13.73 1.7405l-5.824.779-3.492.4673v9.0179h3.492v-5.9618L24 16.0652Z"/></svg>
|
||||
|
After Width: | Height: | Size: 495 B |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Sony</title><path d="M8.5505 9.8881c.921 0 1.6574.2303 2.2209.7423.3848.3485.5999.8454.5939 1.3665a1.9081 1.9081 0 0 1-.5939 1.3726c-.5272.4848-1.3483.7423-2.221.7423-.8725 0-1.6785-.2575-2.2148-.7423-.3908-.3485-.609-.8484-.603-1.3726 0-.518.2182-1.015.603-1.3665.5-.4545 1.3847-.7423 2.2149-.7423zm.003 3.6692c.4606 0 .8878-.1606 1.1878-.4575.2999-.2999.4332-.6605.4332-1.1029 0-.4242-.1484-.821-.4333-1.1029-.2938-.2908-.7332-.4545-1.1877-.4545s-.8938.1637-1.1907.4545c-.2848.2818-.4333.6787-.4333 1.103-.006.409.1485.806.4333 1.1029.2969.2939.7332.4575 1.1907.4575zm-4.8418-1.9665c.1605.0424.315.094.4666.1636a1.352 1.352 0 0 1 .3787.2576c.197.206.309.4817.306.7665a.9643.9643 0 0 1-.3787.7788 2.0662 2.0662 0 0 1-.709.3485 3.7231 3.7231 0 0 1-1.1938.1697c-.352 0-.5467-.0406-.8138-.0962l-.077-.016c-.294-.0666-.5817-.1575-.8575-.2787a.0695.0695 0 0 0-.0424-.0121c-.0454 0-.0818.0394-.0818.0848v.203H.1212v-1.4786h.5242a.7559.7559 0 0 0 .1363.418c.2121.2607.4394.3607.6575.4395.3666.1212.7514.1848 1.1362.1969.5526 0 .8756-.134.9455-.163l.009-.0037.0062-.0023c.0616-.0226.3119-.1143.3119-.3916 0-.2743-.2338-.334-.387-.373l-.022-.0058c-.1708-.046-.562-.0872-.9897-.1323l-.1526-.016c-.4848-.0515-.9696-.1273-1.1968-.1758-.4977-.1097-.6942-.2917-.816-.4045l-.0082-.0076A1.0192 1.0192 0 0 1 0 11.1608c0-.497.3394-.797.7575-.9817.4454-.2.9756-.288 1.4392-.288.8211.0031 1.4877.2697 1.727.394.097.0515.1455-.0121.1455-.0606v-.1484h.5272v1.2876h-.4727a.9056.9056 0 0 0-.2939-.4909 1.289 1.289 0 0 0-.297-.1787c-.3968-.1667-.821-.2515-1.2513-.2455-.4423 0-.8665.085-1.0786.2153-.1333.0818-.2.1848-.2.306 0 .1727.1454.2424.2182.2636.1967.0597.6328.103.972.1369.0736.0073.1426.0142.2036.0206.3272.0334 1.012.1243 1.315.2zm18.1673-.9966v-.4787H24v.4696h-.4757c-.1727 0-.2424.0334-.3727.1788l-1.4271 1.63a.098.098 0 0 0-.0182.0698v.7423a1.106 1.106 0 0 0 .0121.103.1496.1496 0 0 0 .1.0909.9368.9368 0 0 0 .1303.009h.4848v.4698h-2.5724v-.4697h.4606a.9343.9343 0 0 0 .1302-.0091.1627.1627 0 0 0 .1031-.091.5626.5626 0 0 0 .009-.1v-.7422c0-.0242 0-.0242-.0333-.0636a606.7592 606.7592 0 0 0-1.4119-1.6028c-.0758-.0788-.2061-.2061-.406-.2061h-.4576v-.4696h2.5876v.4696h-.3121c-.0697 0-.1182.0697-.0576.1455 0 0 .8696 1.0392.8787 1.0513.0091.0122.0152.0122.0273.003.0121-.009.8938-1.0453.8999-1.0543a.0912.0912 0 0 0-.0182-.1273.1095.1095 0 0 0-.0606-.0182zm-6.284-.0031h.4848c.2212 0 .2606.0848.2636.2909l.0273 1.5664-2.5815-2.324H11.944v.4697h.412c.297 0 .3182.1636.3182.309v2.2138c.0004.1285.0009.295-.1818.295h-.506v.4667h2.1634v-.4697h-.5273c-.212 0-.2211-.097-.2242-.303v-1.8816l2.9724 2.6511h.7575l-.0394-2.9966c.003-.218.0182-.2908.2424-.2908h.4726v-.4697H15.595Z"/></svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Synology</title><path d="M13.44 8.927l-.889.37.056.117a.623.623 0 0 1 .212-.054c.05 0 .093.017.126.046.033.028.058.081.072.16.015.08.022.29.022.634v2.736c0 .189-.013.316-.042.381a.295.295 0 0 1-.118.142c-.053.031-.147.045-.286.045v.12h1.481v-.12c-.154 0-.261-.017-.32-.048a.29.29 0 0 1-.126-.142c-.026-.06-.04-.187-.04-.378V8.927zm-11.722.34c-.33 0-.608.05-.84.147-.233.1-.411.246-.534.436a1.083 1.083 0 0 0-.185.612c0 .338.131.627.393.864.184.167.507.309.968.422.358.091.587.153.688.191a.7.7 0 0 1 .31.183c.058.07.088.158.088.259 0 .155-.07.291-.21.41-.142.116-.35.176-.628.176-.262 0-.47-.066-.625-.197-.154-.132-.255-.339-.307-.619L0 12.23c.056.48.228.845.517 1.096.289.252.704.378 1.244.378.371 0 .68-.054.93-.156a1.263 1.263 0 0 0 .781-1.169 1.29 1.29 0 0 0-.171-.684 1.203 1.203 0 0 0-.472-.437c-.2-.107-.508-.21-.927-.31-.418-.098-.683-.193-.79-.286a.326.326 0 0 1 .009-.524c.14-.105.336-.156.586-.156.24 0 .422.049.542.145.122.097.199.256.237.471l.864-.028c-.013-.395-.154-.71-.425-.949-.271-.235-.674-.353-1.208-.353zm21.808.33a.475.475 0 1 0-.002.95.475.475 0 0 0 .002-.95zm0 .072a.4.4 0 0 1 .401.403c0 .116-.05.22-.128.294l-.086-.135a.396.396 0 0 0-.065-.078.212.212 0 0 0-.048-.03.2.2 0 0 0 .127-.057.144.144 0 0 0 .043-.109.178.178 0 0 0-.025-.091.125.125 0 0 0-.067-.055.309.309 0 0 0-.123-.02h-.266v.606h.08v-.268h.091c.02 0 .036.001.045.003.013.004.025.007.036.014.013.01.024.023.04.043.015.019.035.049.059.083l.08.125h.043a.396.396 0 0 1-.237.08.405.405 0 0 1-.404-.405c0-.224.18-.403.404-.403zm-.157.191h.191c.044 0 .077.01.097.027a.089.089 0 0 1 .03.07.09.09 0 0 1-.016.055.076.076 0 0 1-.047.035.196.196 0 0 1-.085.013h-.17zm-15.037.6c-.41 0-.752.17-1.023.514v-.455h-.754v3.105h.814v-1.401c0-.348.022-.583.063-.713a.583.583 0 0 1 .234-.306.666.666 0 0 1 .385-.118c.11 0 .208.028.287.082.08.054.135.13.17.229.037.099.054.314.054.646v1.581h.816V11.7a2.54 2.54 0 0 0-.046-.55.925.925 0 0 0-.16-.343.83.83 0 0 0-.341-.25 1.285 1.285 0 0 0-.499-.097zm2.65 0a1.7 1.7 0 0 0-.826.2 1.39 1.39 0 0 0-.571.586 1.684 1.684 0 0 0-.202.793c0 .356.068.657.202.904.134.25.33.438.588.566.259.129.53.194.814.194.46 0 .841-.156 1.144-.463.303-.31.455-.698.455-1.167 0-.465-.15-.85-.451-1.156-.3-.305-.683-.457-1.154-.457zm7.315.05c-.351 0-.64.108-.865.323a1.02 1.02 0 0 0-.336.77c0 .194.05.371.147.534.1.162.24.285.423.379-.223.187-.366.335-.429.44a.55.55 0 0 0-.092.271c0 .068.024.13.071.184.046.056.127.116.24.187a9.626 9.626 0 0 0-.329.355c-.113.145-.19.253-.226.336a.41.41 0 0 0-.034.157c0 .12.081.232.246.343.291.19.649.284 1.071.284.55 0 .996-.16 1.337-.477.232-.216.35-.45.35-.694a.613.613 0 0 0-.183-.45.838.838 0 0 0-.49-.227 8.478 8.478 0 0 0-.878-.053 4.257 4.257 0 0 1-.46-.027c-.105-.015-.177-.04-.212-.075-.038-.037-.056-.072-.056-.112a.37.37 0 0 1 .05-.159.868.868 0 0 1 .186-.221c.156.049.309.07.459.07.36 0 .648-.1.864-.301a.956.956 0 0 0 .323-.722c0-.247-.062-.45-.187-.61h.394c.097 0 .15-.002.167-.01a.056.056 0 0 0 .035-.025.289.289 0 0 0 .018-.12.214.214 0 0 0-.02-.105.083.083 0 0 0-.033-.028.83.83 0 0 0-.166-.008h-.639a1.307 1.307 0 0 0-.746-.21zm-2.752 0c-.252 0-.49.065-.714.194a1.437 1.437 0 0 0-.546.61 1.816 1.816 0 0 0-.205.825c0 .381.114.724.34 1.03a1.29 1.29 0 0 0 1.09.543c.28 0 .532-.07.76-.211.23-.14.409-.35.54-.627.13-.276.194-.55.194-.821 0-.385-.118-.725-.354-1.022a1.344 1.344 0 0 0-1.105-.522zm-12.182.009l1.174 3.113a1.193 1.193 0 0 1-.21.431c-.09.112-.23.167-.419.167-.102 0-.218-.013-.344-.04l.067.645c.152.033.307.052.464.052.155 0 .294-.019.418-.052a1.04 1.04 0 0 0 .31-.138.862.862 0 0 0 .224-.234 2.2 2.2 0 0 0 .205-.414l.199-.545 1.085-2.985h-.844l-.722 2.204-.74-2.204zm16.631.078v.122a.84.84 0 0 1 .245.091c.035.029.08.08.136.157.072.102.125.186.158.255l1.088 2.275-.213.526c-.079.194-.158.326-.236.393-.08.068-.15.104-.217.104a.878.878 0 0 1-.167-.05.924.924 0 0 0-.3-.07c-.105 0-.19.025-.25.084a.286.286 0 0 0-.092.22c0 .098.042.183.126.257a.457.457 0 0 0 .322.112c.18 0 .366-.072.56-.223.193-.15.35-.37.469-.664l1.226-3.014a1.6 1.6 0 0 1 .113-.254.55.55 0 0 1 .145-.146.473.473 0 0 1 .188-.053v-.122h-.978v.122c.093 0 .16.008.197.023a.172.172 0 0 1 .083.057.146.146 0 0 1 .023.087c0 .091-.019.18-.056.271l-.675 1.671-.737-1.53c-.074-.15-.11-.268-.11-.356a.21.21 0 0 1 .074-.16.346.346 0 0 1 .224-.063h.068v-.122zm-1.753.08c.175 0 .316.074.43.217.15.196.224.466.224.815 0 .265-.053.46-.16.584a.516.516 0 0 1-.41.188.528.528 0 0 1-.43-.216c-.149-.19-.223-.458-.223-.802 0-.268.054-.461.163-.59a.515.515 0 0 1 .406-.197zm-2.798.054c.242 0 .44.102.598.312.23.308.346.727.346 1.263 0 .429-.07.73-.209.905a.646.646 0 0 1-.528.264c-.286 0-.516-.161-.691-.477-.174-.32-.263-.695-.263-1.135 0-.272.037-.493.11-.669a.731.731 0 0 1 .285-.361.667.667 0 0 1 .352-.102zm-4.463.395c.216 0 .396.084.543.247.144.162.216.397.216.703 0 .311-.072.55-.216.712a.695.695 0 0 1-.543.248.695.695 0 0 1-.542-.248c-.147-.161-.22-.398-.22-.708 0-.308.073-.545.22-.707a.704.704 0 0 1 .542-.247zmLine truncated
|
||||
|
After Width: | Height: | Size: 5.1 KiB |
@@ -0,0 +1,113 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="1000"
|
||||
height="596.39362"
|
||||
id="svg281689"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.2 r9819"
|
||||
sodipodi:docname="A.svg">
|
||||
<defs
|
||||
id="defs281691">
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath3055">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 263.19,605.947 68.896,0 0,41.062 -68.896,0 0,-41.062 z"
|
||||
id="path3057" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.35"
|
||||
inkscape:cx="441.41717"
|
||||
inkscape:cy="-117.22998"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
fit-margin-left="0.5"
|
||||
fit-margin-bottom="0.5"
|
||||
fit-margin-top="0.5"
|
||||
fit-margin-right="0.5"
|
||||
inkscape:window-width="1058"
|
||||
inkscape:window-height="1039"
|
||||
inkscape:window-x="855"
|
||||
inkscape:window-y="-21"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata281694">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(66.41717,181.2614)">
|
||||
<g
|
||||
id="g3051"
|
||||
transform="matrix(14.500116,0,0,-14.500116,-3882.2027,9200.934)">
|
||||
<g
|
||||
id="g3053"
|
||||
clip-path="url(#clipPath3055)">
|
||||
<g
|
||||
id="g3059"
|
||||
transform="translate(332.086,605.9463)">
|
||||
<path
|
||||
d="m 0,0 -68.896,0 0,30.878 c 0,5.599 4.584,10.184 10.185,10.184 L 0,41.062 0,0 z"
|
||||
style="fill:#ed1c24;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path3061"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g3063"
|
||||
transform="translate(273.375,629.3974)">
|
||||
<path
|
||||
d="m 0,0 5.443,0 0,-9.75 4.868,0 0,9.75 5.437,0 0,3.936 L 0,3.936 0,0 z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path3065"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g3067"
|
||||
transform="translate(298.6641,622.4658)">
|
||||
<path
|
||||
d="m 0,0 c -1.131,0 -1.98,0.327 -2.701,0.998 -0.705,0.657 -1.211,1.66 -1.211,3.026 l 0,0.205 c 0,1.359 0.506,2.378 1.211,3.03 0.721,0.676 1.576,0.988 2.701,0.988 2.658,0 3.225,-1.582 3.395,-2.613 l 4.32,0 c -0.106,2.082 -1.098,3.545 -2.5,4.519 -1.395,0.97 -3.016,1.465 -5.168,1.465 -2.645,0 -4.524,-0.589 -6.069,-1.898 C -7.578,8.384 -8.406,6.281 -8.406,4.179 l 0,-0.107 c 0,-2.298 0.721,-4.021 2.316,-5.471 1.492,-1.356 3.668,-1.976 6.086,-1.968 2.143,0 3.983,0.503 5.256,1.46 1.404,1.061 2.363,2.55 2.478,4.514 l -4.31,0 C 3.301,1.782 2.781,0 0,0"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path3069"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g3071"
|
||||
transform="translate(313.6856,623.4004)">
|
||||
<path
|
||||
d="m 0,0 0,9.933 -4.687,0 0,-13.681 12.375,0 L 7.688,0 0,0 z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path3073"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.0 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Toshiba</title><path d="M5.174 10.172c-1.065 0-1.578.187-1.65 1.148a8.92 8.92 0 00-.022.68c0 .218.004.451.021.68.073.96.586 1.148 1.65 1.148 1.065 0 1.58-.188 1.653-1.148.018-.229.022-.462.022-.68 0-.217-.005-.451-.022-.68-.073-.96-.588-1.148-1.652-1.148zm3.79 0c-.41 0-.82.04-.985.121-.322.156-.545.38-.545 1.02 0 .375.1.654.293.796.281.21.553.23 1.31.27.305.016.47.078.47.34 0 .332-.294.332-.564.332-.28 0-.366-.025-.46-.096-.084-.063-.105-.176-.106-.348h-.95c0 .487.01.884.47 1.084.41.18 1.67.18 2.048.014.328-.145.563-.337.563-.994 0-.455-.091-.735-.44-.941-.248-.147-.945-.17-1.298-.192-.258-.016-.356-.11-.356-.338 0-.297.285-.308.53-.308.202 0 .34.018.439.105.038.039.086.099.088.307h.947c0-.408-.014-.848-.455-1.051-.175-.08-.587-.121-.998-.121zm2.206.062v3.532h.996v-1.362h1.156v1.362h.996v-3.532h-.996v1.29h-1.156v-1.29h-.996zm4.023 0v3.532h1.002v-3.532h-1.002zm1.891 0v3.532h1.887c.869 0 1.162-.376 1.162-.952 0-.401-.092-.755-.643-.894.444-.114.574-.379.574-.762 0-.776-.487-.924-1.181-.924h-1.799zm4.373 0l-1.068 3.532h1.037l.187-.655h1.16l.19.655H24l-1.07-3.532h-1.473zM0 10.236v.881h1.055v2.65H2.11v-2.65h1.055v-.88H0zm5.174.762c.418 0 .633.063.66.607.004.085.01.201.01.395 0 .195-.006.31-.01.395-.027.544-.242.607-.66.607-.418 0-.633-.063-.66-.607A7.674 7.674 0 014.506 12c0-.194.003-.31.008-.395.027-.544.242-.607.66-.607zm12.906.045h.69c.18 0 .293.085.293.291 0 .176-.112.285-.293.285h-.69v-.576zm4.111.064h.006l.354 1.22h-.713l.353-1.22zm-4.11 1.207h.689c.279 0 .337.124.337.323s-.11.32-.337.32h-.69v-.643z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>TP-Link</title><path d="M15.185 0C10.218 0 6.25 3.984 6.25 8.903V10.8h4.99V8.903c0-2.135 1.736-3.863 3.946-3.863 2.187 0 3.708 1.536 3.708 3.815 0 2.257-1.64 3.912-3.827 3.912h-1.878v5.039h1.878c4.874 0 8.819-4.007 8.819-8.952C23.885 3.72 20.2 0 15.185 0zM.115 12.6v4.103c0 .624.523 1.248 1.236 1.248h4.753v4.801c0 .624.523 1.248 1.236 1.248h4.065V12.6Z"/></svg>
|
||||
|
After Width: | Height: | Size: 440 B |
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Ubiquiti</title><path d="M23.1627 0h-1.4882v1.4882h1.4882zm-5.2072 10.4226V7.4409l.0007.001h2.9755v2.9762h2.9756v.9433c0 1.0906-.0927 2.3827-.306 3.3973-.1194.5672-.3004 1.1308-.5127 1.672-.2175.5537-.468 1.0841-.7408 1.5595a11.6795 11.6795 0 0 1-1.2456 1.7762l-.0253.0294-.0417.0488c-.1148.1347-.2283.2679-.3531.398a11.7612 11.7612 0 0 1-.4494.4492c-1.9046 1.8343-4.3861 2.98-6.9808 3.243-.3122.032-.939.0652-1.2519.0652-.3139-.001-.9397-.0331-1.252-.0651-2.5946-.263-5.0761-1.4097-6.9806-3.243a11.75 11.75 0 0 1-.4495-.4494c-.131-.1356-.249-.2748-.3683-.4154l-.0006-.0004-.0512-.0603a11.6576 11.6576 0 0 1-1.2456-1.7762c-.2727-.4763-.5233-1.0058-.7408-1.5595-.2123-.5414-.3933-1.1048-.5128-1.6718C.1854 13.743.0927 12.452.0927 11.3616V.1864h5.9518v10.2362s0 .7847.0099 1.0415l.0022.0599v.0004c.0127.332.0247.6575.0594.9812.098.919.3014 1.7913.7203 2.5288.1213.213.2443.42.3915.616.8953 1.1939 2.2577 2.0901 3.9573 2.3398.2022.0294.6108.0552.8149.0552.204 0 .6125-.0258.8149-.0552 1.6996-.2497 3.062-1.146 3.9573-2.3398.148-.196.2701-.403.3914-.616.419-.7375.6224-1.6095.7204-2.5288.0346-.3243.047-.6503.0594-.9831l.0022-.0584c.0099-.2568.0099-1.0415.0099-1.0415zm.7427-8.19h2.2326v2.2319h2.9764v2.9764h-2.9764V4.4654h-2.2326V2.2328Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |