🎁 Sync 2026-07-27 21:05:23

This commit is contained in:
github-actions[bot] committed 2026-07-27 21:05:23 +08:00
1 parent 076b725e5a
commit 46ba553e1c
106 files changed
+1561 -391

No files matched your search

+3 -3
View File
@@ -5,10 +5,10 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=dae
PKG_VERSION:=2026.07.26
PKG_RELEASE:=22
PKG_VERSION:=2026.07.27
PKG_RELEASE:=23
PKG_SOURCE:=dae-src-2026.07.26-92a3fbf117a3.tar.gz
PKG_SOURCE:=dae-src-2026.07.27-c8388938b36a.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
+3 -3
View File
@@ -5,10 +5,10 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=daed
PKG_VERSION:=2026.07.26
PKG_RELEASE:=30
PKG_VERSION:=2026.07.27
PKG_RELEASE:=31
PKG_SOURCE:=daed-src-2026.07.26-ecbc5c99d632.tar.gz
PKG_SOURCE:=daed-src-2026.07.27-ed986932608b.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
+2 -2
View File
@@ -8,8 +8,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=go-ethereum
PKG_VERSION:=1.17.4
PKG_RELEASE:=7
PKG_VERSION:=1.17.5
PKG_RELEASE:=8
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/ethereum/go-ethereum/tar.gz/v${PKG_VERSION}?
+1 -1
View File
@@ -10,7 +10,7 @@ PKG_ARCH_kaiplus:=$(ARCH)
PKG_NAME:=kaiplus
PKG_VERSION:=1.0.5
PKG_RELEASE:=1
PKG_RELEASE:=2
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/kaiplus/
PKG_HASH:=skip
+2 -1
View File
@@ -1,5 +1,6 @@
config kaiplus
option 'enabled' '0'
option 'data_dir' ''
option 'port' '8198'
option 'port' '8189'
option 'base_path' '/apps/kaiplus/'
option 'system_role' 'istoreos'
+3 -1
View File
@@ -6,7 +6,8 @@ USE_PROCD=1
get_config() {
config_get_bool enabled "$1" enabled 1
config_get data_dir "$1" data_dir ""
config_get port "$1" port "8198"
config_get port "$1" port "8189"
config_get base_path "$1" base_path "/apps/kaiplus/"
config_get system_role "$1" system_role "istoreos"
}
@@ -61,6 +62,7 @@ start_service() {
procd_append_param command --data-dir "$data_dir"
procd_append_param command --static-dir /usr/share/kaiplus/www
procd_append_param command --defaults-dir /usr/share/kaiplus/defaults
procd_append_param command --base-path "$base_path"
procd_append_param command --system-role "$system_role"
procd_set_param stdout 1
procd_set_param stderr 1
+7 -7
View File
@@ -10,9 +10,9 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_LINKEASE:=$(ARCH)
PKG_NAME:=linkease
# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable
PKG_SOURCE_DATE:=1.7.5
PKG_RELEASE:=1
PKG_RELEASE:=2
ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64)
ARCH_HEXCODE=8664
@@ -23,11 +23,11 @@ ARCH_HEXCODE=aa32
else ifeq ($(ARCH),mipsel)
ARCH_HEXCODE=1b0c
endif
PKG_SOURCE_VERSION:=$(ARCH_HEXCODE)
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_SOURCE_DATE).tar.gz
PKG_SOURCE_URL:=http://dl.istoreos.com/binary/LinkEase/LinuxStorage/
PKG_HASH:=skip
PKG_SOURCE_VERSION:=$(ARCH_HEXCODE)
PKG_SOURCE:=linkease-binary-$(PKG_SOURCE_DATE).tar.gz
PKG_SOURCE_URL:=https://dl.istoreos.com/binary/LinkEase/LinuxStorage/
PKG_HASH:=skip
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_SOURCE_DATE)
PKG_BUILD_PARALLEL:=1
@@ -40,7 +40,7 @@ define Package/$(PKG_NAME)
CATEGORY:=Network
SUBMENU:=Web Servers/Proxies
TITLE:=LinkEase - the file cloud
DEPENDS:=@(arm||x86_64||aarch64) +linkmount
DEPENDS:=@(arm||x86_64||aarch64)
PKGARCH:=all
URL:=https://www.linkease.com/
endef
+2 -4
View File
@@ -1,6 +1,6 @@
#!/bin/sh
source /lib/functions.sh
. /lib/functions.sh
case "$1" in
save)
@@ -40,7 +40,6 @@ case "$1" in
config_get PUB_DIR main pub_dir ""
config_get DL_DIR main dl_dir ""
config_get TMP_DIR main tmp_dir ""
# echo "$MAIN_DIR $CONF_DIR $PUB_DIR $DL_DIR $TMP_DIR"
if [ "$ROOT_DIR" = "$MAIN_DIR" ]; then
exit 0
fi
@@ -83,7 +82,6 @@ case "$1" in
;;
*)
echo "Usage: $0 {save|load|status}"
echo "Usage: $0 {save|load|local_save|local_load|status}"
exit 1
esac
+1
View File
@@ -1,3 +1,4 @@
config linkease
option port '8897'
option enabled '1'
option allowPublic '0'
Executable → Regular
+33 -9
View File
@@ -3,24 +3,48 @@
START=99
USE_PROCD=1
PROG=/usr/sbin/linkease
LOCAL_API=/var/run/linkease.sock
get_config() {
config_get_bool enabled $1 enabled 1
config_get_bool logger $1 logger
config_get_bool allowPublic $1 allowPublic
config_get port $1 port 8897
config_get_bool enabled "$1" enabled 1
config_get_bool logger "$1" logger 0
config_get_bool allowPublic "$1" allowPublic 0
config_get port "$1" port 8897
}
stop_linkeaselite_runtime() {
[ -x /etc/init.d/linkeaselite ] && /etc/init.d/linkeaselite stop >/dev/null 2>&1
if uci -q get linkeaselite.@linkeaselite[0] >/dev/null 2>&1; then
uci -q set linkeaselite.@linkeaselite[0].enabled="0"
uci -q commit linkeaselite
fi
}
stop_linkeasefull_runtime() {
[ -x /etc/init.d/linkeasefull ] && /etc/init.d/linkeasefull stop >/dev/null 2>&1
if uci -q get linkeasefull.@linkeasefull[0] >/dev/null 2>&1; then
uci -q set linkeasefull.@linkeasefull[0].enabled="0"
uci -q commit linkeasefull
fi
}
start_service() {
config_load linkease
config_foreach get_config linkease
[ $enabled != 1 ] && return 1
[ "$enabled" != "1" ] && return 1
[ -x "$PROG" ] || return 1
stop_linkeaselite_runtime
stop_linkeasefull_runtime
rm -f "$LOCAL_API"
procd_open_instance
procd_set_param limits nofile="65535 65535"
procd_set_param command /usr/sbin/linkease
[ -n "$port" ] && procd_append_param command --deviceAddr ":$port" --localApi /var/run/linkease.sock
[ "$allowPublic" == 1 ] && procd_append_param command --allowPublic
[ "$logger" == 1 ] && procd_set_param stderr 1
procd_set_param command "$PROG"
procd_append_param command --deviceAddr ":$port" --localApi "$LOCAL_API"
[ "$allowPublic" = "1" ] && procd_append_param command --allowPublic
[ "$logger" = "1" ] && procd_set_param stderr 1
procd_set_param respawn
procd_close_instance
}
+32 -3
View File
@@ -8,23 +8,52 @@
EEOF
}
if ! uci -q get linkease.@linkease[0] >/dev/null; then
uci -q add linkease linkease >/dev/null
fi
set_default() {
key="$1"
value="$2"
current="$(uci -q get "linkease.@linkease[0].$key" 2>/dev/null || true)"
[ -n "$current" ] && return 0
uci -q set "linkease.@linkease[0].$key=$value"
}
set_default enabled 1
set_default port 8897
set_default allowPublic 0
uci -q commit linkease
port="$(uci -q get linkease.@linkease[0].port 2>/dev/null || true)"
[ -n "$port" ] || port=8897
allow_public="$(uci -q get linkease.@linkease[0].allowPublic 2>/dev/null || true)"
uci -q batch <<-EOF >/dev/null
delete ucitrack.@linkease[-1]
add ucitrack linkease
set ucitrack.@linkease[-1].init=linkease
commit ucitrack
EOF
if [ "$allow_public" = "1" ]; then
uci -q batch <<-EOF >/dev/null
delete firewall.linkease
set firewall.linkease=rule
set firewall.linkease.name="linkease"
set firewall.linkease.target="ACCEPT"
set firewall.linkease.src="wan"
set firewall.linkease.proto="tcp"
set firewall.linkease.dest_port="8897"
set firewall.linkease.dest_port="$port"
commit firewall
EOF
else
uci -q batch <<-EOF >/dev/null
delete firewall.linkease
commit firewall
EOF
fi
/etc/init.d/linkease enable
/etc/init.d/linkease start
/etc/init.d/linkease restart
exit 0
exit 0
+76
View File
@@ -0,0 +1,76 @@
#
# Copyright (C) 2026 iStoreOS
#
# This is free software, licensed under the GNU General Public License v3.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=linkeasefull
PKG_SOURCE_DATE:=3.0.4
PKG_RELEASE:=1
ifeq ($(ARCH),x86_64)
LINKEASE_RUNTIME_ARCH:=amd64
PKG_HASH:=skip
else ifeq ($(ARCH),aarch64)
LINKEASE_RUNTIME_ARCH:=arm64
PKG_HASH:=skip
endif
PKG_SOURCE:=linkease-runtime-$(PKG_SOURCE_DATE)-linux-$(LINKEASE_RUNTIME_ARCH).tar.gz
PKG_SOURCE_URL:=https://github.com/linkease/linkease-desktop/releases/download/linkease-runtime-v$(PKG_SOURCE_DATE)/
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_SOURCE_DATE)
PKG_BUILD_PARALLEL:=1
PKG_USE_MIPS16:=0
TAR_CMD=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 $(TAR_OPTIONS)
include $(INCLUDE_DIR)/package.mk
define Package/$(PKG_NAME)
SECTION:=net
CATEGORY:=Network
SUBMENU:=Web Servers/Proxies
TITLE:=LinkEase Full - the local web desktop
DEPENDS:=@(x86_64||aarch64) +linkease +ca-bundle
URL:=https://www.linkease.com/
endef
define Package/$(PKG_NAME)/description
LinkEase Full provides the local web desktop entry for LinkEase and reuses the standard LinkEase LuCI file entry.
endef
define Package/$(PKG_NAME)/conffiles
/etc/config/linkeasefull
endef
define Package/$(PKG_NAME)/postinst
#!/bin/sh
if [ -z "$${IPKG_INSTROOT}" ]; then
[ -f /etc/uci-defaults/linkeasefull ] && /etc/uci-defaults/linkeasefull && rm -f /etc/uci-defaults/linkeasefull
exit 0
fi
endef
define Build/Configure
endef
define Build/Compile
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/bin $(1)/usr/libexec/linkeasefull/linkmount_bin $(1)/usr/libexec/linkeasefull/scripts $(1)/etc/config $(1)/etc/init.d $(1)/etc/uci-defaults
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/linkease-full $(1)/usr/bin/linkease-full
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/linkremote-agent $(1)/usr/bin/linkremote-agent
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/hostlink $(1)/usr/bin/hostlink
$(INSTALL_BIN) $(PKG_BUILD_DIR)/linkmount_bin/linkmount_bin $(1)/usr/libexec/linkeasefull/linkmount_bin/linkmount_bin
$(CP) $(PKG_BUILD_DIR)/linkmount_bin/lib $(1)/usr/libexec/linkeasefull/linkmount_bin/lib
$(CP) $(PKG_BUILD_DIR)/linkmount_bin/ver.json $(1)/usr/libexec/linkeasefull/linkmount_bin/ver.json
$(CP) $(PKG_BUILD_DIR)/scripts/. $(1)/usr/libexec/linkeasefull/scripts/
$(INSTALL_CONF) ./files/linkeasefull.config $(1)/etc/config/linkeasefull
$(INSTALL_BIN) ./files/linkeasefull.init $(1)/etc/init.d/linkeasefull
$(INSTALL_BIN) ./files/linkeasefull.uci-default $(1)/etc/uci-defaults/linkeasefull
endef
$(eval $(call BuildPackage,$(PKG_NAME)))
+3
View File
@@ -0,0 +1,3 @@
config linkeasefull
option enabled '1'
option data_root_parent ''
+131
View File
@@ -0,0 +1,131 @@
#!/bin/sh /etc/rc.common
START=100
STOP=10
USE_PROCD=1
PROG=/usr/bin/linkease-full
LINKEASE_LIBEXEC=/usr/libexec/linkeasefull
LINKEASE_FULL_PORT=19290
LINKEASE_BASE_PATH=/apps/
LINKEASE_LEGACY_ADDR=0.0.0.0:8897
is_persistent_data_root_parent() {
[ -n "$1" ] || return 1
case "$1" in
/tmp|/tmp/*|/var|/var/*|/run|/run/*|/dev|/dev/*|/proc|/proc/*|/sys|/sys/*|/rom|/rom/*|/overlay|/overlay/*) return 1 ;;
esac
[ -d "$1" ] || return 1
return 0
}
resolve_data_root_parent() {
if [ -n "$data_root_parent" ]; then
is_persistent_data_root_parent "$data_root_parent"
return $?
fi
local_home="$(uci -q get linkease.@linkease[0].local_home || true)"
if is_persistent_data_root_parent "$local_home"; then
data_root_parent="$local_home"
return 0
fi
if [ -f /etc/config/quickstart ]; then
quickstart_main_dir="$(uci -q get quickstart.main.main_dir || true)"
if [ -n "$quickstart_main_dir" ]; then
if is_persistent_data_root_parent "$quickstart_main_dir"; then
data_root_parent="$quickstart_main_dir"
return 0
fi
fi
fi
return 1
}
stop_other_linkease_runtimes() {
[ -x /etc/init.d/linkease ] && /etc/init.d/linkease stop >/dev/null 2>&1
[ -x /etc/init.d/linkeaselite ] && /etc/init.d/linkeaselite stop >/dev/null 2>&1
if uci -q get linkease.@linkease[0] >/dev/null 2>&1; then
uci -q set linkease.@linkease[0].enabled="0"
uci -q commit linkease
fi
if uci -q get linkeaselite.@linkeaselite[0] >/dev/null 2>&1; then
uci -q set linkeaselite.@linkeaselite[0].enabled="0"
uci -q commit linkeaselite
fi
}
read_config() {
section="$1"
config_get_bool enabled "$section" enabled 1
config_get data_root_parent "$section" data_root_parent ""
if ! resolve_data_root_parent; then
data_root_parent=""
return 1
fi
data_root="$data_root_parent/.linkease_data"
recycle_root="$data_root_parent/.linkease_recycle"
}
start_service() {
config_load linkeasefull
config_foreach read_config linkeasefull
[ "$enabled" = "1" ] || return 1
[ -x "$PROG" ] || return 1
if [ -z "$data_root_parent" ]; then
echo "linkeasefull: please choose a persistent disk storage path in LuCI" >&2
return 1
fi
stop_other_linkease_runtimes
mkdir -p "$data_root/users/admin" "$data_root/system" "$data_root/tmp" "$recycle_root"
mkdir -p "$data_root/apptunnel" "$data_root/mountremote" "$data_root/logs"
procd_open_instance linkeasefull
procd_set_param limits nofile="65535 65535"
procd_set_param command "$PROG"
procd_set_param env \
"SERVER_HOST=0.0.0.0" \
"SERVER_PORT=$LINKEASE_FULL_PORT" \
"SERVER_MODE=release" \
"SERVER_BASE_PATH=$LINKEASE_BASE_PATH" \
"LINKEASE_AUTH_PROVIDER=openwrt_luci" \
"LINKEASE_EDITION=nas-full" \
"KAIPLUS_ENABLED=0" \
"LINKEASE_DATA_ROOT=$data_root" \
"LINKEASE_RECYCLE_ROOT=$recycle_root" \
"LINKEASE_APPTUNNEL_INTERNAL_ADDR=127.0.0.1:19810" \
"LINKEASE_APPTUNNEL_LEGACY_ADDR=$LINKEASE_LEGACY_ADDR" \
"LINKEASE_APPTUNNEL_DATA_DIR=$data_root/apptunnel" \
"LINKEASE_APPTUNNEL_CACHE_DIR=$data_root/apptunnel/cache" \
"LINKEASE_APPTUNNEL_RUNTIME_DIR=$data_root/apptunnel/runtime" \
"LINKEASE_APPTUNNEL_LOG_DIR=$data_root/logs" \
"APPTUNNEL_MOUNTREMOTE_MODE=real" \
"APPTUNNEL_MOUNTREMOTE_LINKREMOTE_AGENT_BINARY=/usr/bin/linkremote-agent" \
"APPTUNNEL_MOUNTREMOTE_SMBD_BINARY=$LINKEASE_LIBEXEC/linkmount_bin/linkmount_bin" \
"APPTUNNEL_MOUNTREMOTE_WORK_DIR=$data_root/mountremote" \
"APPTUNNEL_MOUNTREMOTE_SOCKET_DIR=$data_root/mountremote" \
"APPTUNNEL_MOUNTREMOTE_SAMBA_DIR=$data_root/mountremote/samba" \
"APPTUNNEL_MOUNTREMOTE_STORE_PATH=$data_root/mountremote/mounts.json" \
"APPTUNNEL_MOUNTREMOTE_STARTUP_RECONCILE=true" \
"APPTUNNEL_MOUNTREMOTE_ROOT_WATCH_DIR=$data_root/mountremote/root-watch" \
"APPTUNNEL_MOUNTREMOTE_ALLOWED_MOUNT_PREFIX=$data_root_parent" \
"MOUNTREMOTE_ALLOWED_MOUNT_PREFIX=$data_root_parent" \
"LINKEASE_LINKMOUNT_BIN=$LINKEASE_LIBEXEC/linkmount_bin/linkmount_bin" \
"LINKEASE_LINKMOUNT_LIB_DIR=$LINKEASE_LIBEXEC/linkmount_bin/lib" \
"USER_DATA_PATH=$data_root/users/admin" \
"SYSTEM_DATA_PATH=$data_root/system" \
"TEMP_PATH=$data_root/tmp"
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}
service_triggers() {
procd_add_reload_trigger "linkeasefull"
}
@@ -0,0 +1,36 @@
#!/bin/sh
[ ! -f "/usr/share/ucitrack/luci-app-linkeasefull.json" ] && {
cat > /usr/share/ucitrack/luci-app-linkeasefull.json << EEOF
{
"config": "linkeasefull",
"init": "linkeasefull"
}
EEOF
}
if ! uci -q get linkeasefull.@linkeasefull[0] >/dev/null; then
uci -q add linkeasefull linkeasefull >/dev/null
fi
set_default() {
key="$1"
value="$2"
current="$(uci -q get "linkeasefull.@linkeasefull[0].$key" 2>/dev/null || true)"
[ -n "$current" ] && return 0
uci -q set "linkeasefull.@linkeasefull[0].$key=$value"
}
set_default enabled 1
uci -q commit linkeasefull
uci -q batch <<-EOF >/dev/null
delete ucitrack.@linkeasefull[-1]
add ucitrack linkeasefull
set ucitrack.@linkeasefull[-1].init=linkeasefull
commit ucitrack
EOF
/etc/init.d/linkeasefull enable
/etc/init.d/linkeasefull restart
exit 0
+75
View File
@@ -0,0 +1,75 @@
#
# Copyright (C) 2015-2016 OpenWrt.org
# Copyright (C) 2026 LinkEaseLite Contributors
#
# This is free software, licensed under the GNU General Public License v3.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=linkeaselite
PKG_SOURCE_DATE:=3.0.0
PKG_RELEASE:=1
PKG_SOURCE:=linkeaselite-binary-$(PKG_SOURCE_DATE).tar.gz
PKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/linkeaselite-v$(PKG_SOURCE_DATE)/
PKG_HASH:=skip
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_SOURCE_DATE)
PKG_BUILD_PARALLEL:=1
PKG_USE_MIPS16:=0
TAR_CMD=$(HOST_TAR) -C $(PKG_BUILD_DIR) $(TAR_OPTIONS)
include $(INCLUDE_DIR)/package.mk
define Package/$(PKG_NAME)
SECTION:=net
CATEGORY:=Network
SUBMENU:=Web Servers/Proxies
TITLE:=LinkEaseLite - the file cloud
DEPENDS:=@(arm||x86_64||aarch64) +ca-bundle
URL:=https://www.linkease.com/
endef
define Package/$(PKG_NAME)/description
LinkEaseLite is a lightweight LinkEase runtime for small-memory OpenWrt devices.
endef
define Package/$(PKG_NAME)/conffiles
/etc/config/linkeaselite
endef
define Package/$(PKG_NAME)/postinst
#!/bin/sh
if [ -z "$${IPKG_INSTROOT}" ]; then
[ -f /etc/uci-defaults/linkeaselite ] && /etc/uci-defaults/linkeaselite && rm -f /etc/uci-defaults/linkeaselite
exit 0
fi
endef
define Package/$(PKG_NAME)/postrm
#!/bin/sh
if [ -z "$${IPKG_INSTROOT}" ]; then
uci -q delete firewall.linkeaselite
uci -q commit firewall
/etc/init.d/firewall reload
fi
exit 0
endef
define Build/Configure
endef
define Build/Compile
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d $(1)/etc/uci-defaults
$(INSTALL_BIN) $(PKG_BUILD_DIR)/linkease-lite.$(ARCH) $(1)/usr/sbin/linkease-lite
$(INSTALL_BIN) ./files/linkeaselite-config.sh $(1)/usr/sbin/linkeaselite-config.sh
$(INSTALL_CONF) ./files/linkeaselite.config $(1)/etc/config/linkeaselite
$(INSTALL_BIN) ./files/linkeaselite.init $(1)/etc/init.d/linkeaselite
$(INSTALL_BIN) ./files/linkeaselite.uci-default $(1)/etc/uci-defaults/linkeaselite
endef
$(eval $(call BuildPackage,$(PKG_NAME)))
+78
View File
@@ -0,0 +1,78 @@
#!/bin/sh
. /lib/functions.sh
case "$1" in
save)
if [ -n "$2" ]; then
uci set "linkeaselite.@linkeaselite[0].preconfig=$2"
uci commit linkeaselite
fi
;;
load)
data="`uci -q get linkeaselite.@linkeaselite[0].preconfig`"
if [ -z "${data}" ]; then
echo "nil"
else
echo "${data}"
fi
;;
local_save)
if [ -n "$2" ]; then
uci set "linkeaselite.@linkeaselite[0].local_home=$2"
uci commit linkeaselite
ROOT_DIR="$2"
if [ -f "/etc/config/quickstart" ]; then
config_load quickstart
config_get MAIN_DIR main main_dir ""
config_get CONF_DIR main conf_dir ""
config_get PUB_DIR main pub_dir ""
config_get DL_DIR main dl_dir ""
config_get TMP_DIR main tmp_dir ""
[ "$ROOT_DIR" = "$MAIN_DIR" ] && exit 0
uci set "quickstart.main.main_dir=$ROOT_DIR"
if [ -z "$CONF_DIR" ] || [ "$CONF_DIR" = "$MAIN_DIR/Configs" ]; then
uci set "quickstart.main.conf_dir=$ROOT_DIR/Configs"
fi
if [ -z "$PUB_DIR" ] || [ "$PUB_DIR" = "$MAIN_DIR/Public" ]; then
uci set "quickstart.main.pub_dir=$ROOT_DIR/Public"
fi
if [ -z "$DL_DIR" ] || [ "$DL_DIR" = "$MAIN_DIR/Public/Downloads" ]; then
uci set "quickstart.main.dl_dir=$ROOT_DIR/Public/Downloads"
fi
if [ -z "$TMP_DIR" ] || [ "$TMP_DIR" = "$MAIN_DIR/Caches" ]; then
uci set "quickstart.main.tmp_dir=$ROOT_DIR/Caches"
fi
uci commit quickstart
fi
fi
;;
local_load)
if [ -f "/etc/config/quickstart" ]; then
data="`uci -q get quickstart.main.main_dir`"
fi
if [ -z "$data" ]; then
data="`uci -q get linkeaselite.@linkeaselite[0].local_home`"
fi
if [ -z "${data}" ]; then
echo "nil"
else
echo "${data}"
fi
;;
status)
if pidof linkease-lite >/dev/null 2>&1; then
echo "running"
else
echo "stopped"
fi
;;
*)
echo "Usage: $0 {save|load|local_save|local_load|status}"
exit 1
esac
+4
View File
@@ -0,0 +1,4 @@
config linkeaselite
option enabled '1'
option port '8897'
option allowPublic '0'
+68
View File
@@ -0,0 +1,68 @@
#!/bin/sh /etc/rc.common
START=99
STOP=10
USE_PROCD=1
PROG=/usr/sbin/linkease-lite
LOCAL_API=/var/run/linkeaselite.sock
read_config() {
section="$1"
config_get_bool enabled "$section" enabled 1
config_get port "$section" port 8897
config_get_bool allowPublic "$section" allowPublic 0
}
sync_firewall() {
uci -q delete firewall.linkeaselite
if [ "$allowPublic" = "1" ]; then
uci -q set firewall.linkeaselite=rule
uci -q set firewall.linkeaselite.name="linkeaselite"
uci -q set firewall.linkeaselite.target="ACCEPT"
uci -q set firewall.linkeaselite.src="wan"
uci -q set firewall.linkeaselite.proto="tcp"
uci -q set firewall.linkeaselite.dest_port="$port"
fi
uci -q commit firewall
/etc/init.d/firewall reload
}
stop_linkease_runtimes() {
[ -x /etc/init.d/linkeasefull ] && /etc/init.d/linkeasefull stop >/dev/null 2>&1
[ -x /etc/init.d/linkease ] && /etc/init.d/linkease stop >/dev/null 2>&1
if uci -q get linkease.@linkease[0] >/dev/null 2>&1; then
uci -q set linkease.@linkease[0].enabled="0"
uci -q commit linkease
fi
if uci -q get linkeasefull.@linkeasefull[0] >/dev/null 2>&1; then
uci -q set linkeasefull.@linkeasefull[0].enabled="0"
uci -q commit linkeasefull
fi
}
start_service() {
config_load linkeaselite
config_foreach read_config linkeaselite
sync_firewall
[ "$enabled" = "1" ] || return 1
[ -x "$PROG" ] || return 1
stop_linkease_runtimes
rm -f "$LOCAL_API"
procd_open_instance linkeaselite
procd_set_param limits nofile="65535 65535"
procd_set_param command "$PROG"
procd_append_param command --deviceAddr ":$port" --localApi "$LOCAL_API"
[ "$allowPublic" = "1" ] && procd_append_param command --allowPublic
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}
service_triggers() {
procd_add_reload_trigger "linkeaselite"
}
@@ -0,0 +1,60 @@
#!/bin/sh
[ ! -f "/usr/share/ucitrack/luci-app-linkeaselite.json" ] && {
cat > /usr/share/ucitrack/luci-app-linkeaselite.json << EEOF
{
"config": "linkeaselite",
"init": "linkeaselite"
}
EEOF
}
if ! uci -q get linkeaselite.@linkeaselite[0] >/dev/null; then
uci -q add linkeaselite linkeaselite >/dev/null
fi
set_default() {
key="$1"
value="$2"
current="$(uci -q get "linkeaselite.@linkeaselite[0].$key" 2>/dev/null || true)"
[ -n "$current" ] && return 0
uci -q set "linkeaselite.@linkeaselite[0].$key=$value"
}
set_default enabled 1
set_default port 8897
set_default allowPublic 0
uci -q commit linkeaselite
port="$(uci -q get linkeaselite.@linkeaselite[0].port 2>/dev/null || true)"
[ -n "$port" ] || port=8897
allow_public="$(uci -q get linkeaselite.@linkeaselite[0].allowPublic 2>/dev/null || true)"
uci -q batch <<-EOF >/dev/null
delete ucitrack.@linkeaselite[-1]
add ucitrack linkeaselite
set ucitrack.@linkeaselite[-1].init=linkeaselite
commit ucitrack
EOF
if [ "$allow_public" = "1" ]; then
uci -q batch <<-EOF >/dev/null
delete firewall.linkeaselite
set firewall.linkeaselite=rule
set firewall.linkeaselite.name="linkeaselite"
set firewall.linkeaselite.target="ACCEPT"
set firewall.linkeaselite.src="wan"
set firewall.linkeaselite.proto="tcp"
set firewall.linkeaselite.dest_port="$port"
commit firewall
EOF
else
uci -q batch <<-EOF >/dev/null
delete firewall.linkeaselite
commit firewall
EOF
fi
/etc/init.d/linkeaselite enable
/etc/init.d/linkeaselite restart
exit 0
-63
View File
@@ -1,63 +0,0 @@
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_ARCH_LINKEASE:=$(ARCH)
PKG_NAME:=linkmount
# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable
PKG_SOURCE_DATE:=1.0.3
PKG_RELEASE:=1
ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64)
ARCH_HEXCODE=8664
else ifeq ($(ARCH),aarch64)
ARCH_HEXCODE=aa64
else ifeq ($(ARCH),arm)
ARCH_HEXCODE=aa32
else ifeq ($(ARCH),mipsel)
ARCH_HEXCODE=1b0c
endif
PKG_SOURCE_VERSION:=$(ARCH_HEXCODE)
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_SOURCE_DATE).tar.gz
PKG_SOURCE_URL:=https://dl.istoreos.com/binary/LinkEase/AutoUpgrade/linkmount/
PKG_HASH:=skip
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_SOURCE_DATE)
PKG_BUILD_PARALLEL:=1
PKG_USE_MIPS16:=0
include $(INCLUDE_DIR)/package.mk
define Package/$(PKG_NAME)
SECTION:=net
CATEGORY:=Network
SUBMENU:=Web Servers/Proxies
TITLE:=LinkMount - the file cloud
DEPENDS:=@(arm||x86_64||aarch64)
PKGARCH:=all
URL:=https://www.linkease.com/
endef
define Package/$(PKG_NAME)/description
LinkMount is used by LinkEase
endef
define Build/Configure
endef
define Build/Compile
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/sbin/linkmount
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_ARCH_LINKEASE)/bin/linkmount_bin $(1)/usr/sbin/linkmount/linkmount_bin
$(CP) $(PKG_BUILD_DIR)/$(PKG_ARCH_LINKEASE)/bin/lib $(1)/usr/sbin/linkmount/lib
endef
$(eval $(call BuildPackage,$(PKG_NAME)))
+2 -2
View File
@@ -16,8 +16,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-amlogic
PKG_VERSION:=3.1.319
PKG_RELEASE:=16
PKG_VERSION:=3.1.320
PKG_RELEASE:=17
PKG_LICENSE:=GPL-2.0 License
PKG_MAINTAINER:=ophub <https://github.com/ophub/luci-app-amlogic>
@@ -57,22 +57,24 @@ return view.extend({
handleSaveApply: null,
handleReset: null,
// On load, call sync_menu to update sidebar menu flags from runtime platform detection. If the install menu becomes
// visible but is not in the current nav, reload once to pick up the new menu (guarded by #menu-synced hash).
load: function () {
// Call sync_menu; if the install menu is now visible on the server but
// absent in the browser nav, reload once (guarded by #menu-synced hash).
// On load, call sync_menu to update sidebar menu flags from runtime platform detection. If the sidebar nav is out of
// sync with the server-side menu flags, reload once to pick up the new menu (guarded by #menu-synced hash).
load: function () {
// Call sync_menu; reload once when the sidebar nav disagrees with the
// server-side menu flags in either direction (guarded by #menu-synced hash).
const alreadyReloaded = window.location.hash === '#menu-synced';
const syncMenuPromise = callSyncMenu().then(function (res) {
if (alreadyReloaded) return;
if (res && res.show_install === 'yes') {
// Check if the sidebar navigation already contains the install link.
const installLink = document.querySelector('a[href*="amlogic/install"]');
if (!installLink) {
// Server-side index cache updated; reload to pick up new nav.
window.location.replace(window.location.pathname + '#menu-synced');
window.location.reload();
}
if (alreadyReloaded || !res) return;
// Check if the sidebar navigation already contains the install link.
const installLink = document.querySelector('a[href*="amlogic/install"]');
// Menu became visible on the server but is absent in the browser nav.
const needShow = (res.show_install === 'yes' && !installLink);
// Menu became hidden on the server but is still present in the browser nav.
const needHide = (res.show_install === 'no' && installLink);
if (needShow || needHide) {
// Server-side index cache updated; reload to pick up new nav.
window.location.replace(window.location.pathname + '#menu-synced');
window.location.reload();
}
}).catch(function () {});
return Promise.all([callAuthor(), syncMenuPromise]).then(function (r) { return r[0]; });
@@ -20,10 +20,28 @@ PLATFORM=$(grep -E '^PLATFORM=' /etc/flippy-openwrt-release 2>/dev/null | \
SHOW_INSTALL=$(grep -E '^SHOW_INSTALL_MENU=' /etc/flippy-openwrt-release 2>/dev/null | \
awk -F= '{print $2}' | tr -d '"' | xargs)
case "$PLATFORM" in
*amlogic*) MENU_INSTALL=yes ;;
*) [ "$SHOW_INSTALL" = "yes" ] && MENU_INSTALL=yes || MENU_INSTALL=no ;;
# Detect whether the root fs is already on eMMC (mmcblk*p* with device/type == "MMC").
# Mirrors root_on_internal_storage() in luci.amlogic: all other boot media
# (TF/SD, NVMe, SATA, USB) keep the install menu visible.
ROOT_PT=$(df / | tail -n1 | awk '{print $1}' | awk -F '/' '{print $3}')
IS_INSTALLED=0
case "$ROOT_PT" in
mmcblk*p*)
BASE_DEV="${ROOT_PT%p*}"
[ "$(cat /sys/block/${BASE_DEV}/device/type 2>/dev/null | xargs)" = "MMC" ] && IS_INSTALLED=1
;;
esac
case "$PLATFORM" in
*amlogic*|*allwinner*) CAN_INSTALL=yes ;;
*) [ "$SHOW_INSTALL" = "yes" ] && CAN_INSTALL=yes || CAN_INSTALL=no ;;
esac
if [ "$CAN_INSTALL" = "yes" ] && [ "$IS_INSTALLED" = "0" ]; then
MENU_INSTALL=yes
else
MENU_INSTALL=no
fi
case "$PLATFORM" in
*qemu*) MENU_ARMCPU=no ;;
*) MENU_ARMCPU=yes ;;
+4 -4
View File
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-04-24 15:14+0000\n"
"Last-Translator: \"د.عبدالعزيز الجهني\" <myzezo@gmail.com>\n"
"PO-Revision-Date: 2026-07-03 15:29+0000\n"
"Last-Translator: Develper openmn <devopenm@proton.me>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsddns/ar/>\n"
"Language: ar\n"
@@ -9,7 +9,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Weblate 5.17.1-dev\n"
"X-Generator: Weblate 2026.7.1.dev0\n"
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:423
msgid "\"../\" not allowed in path for Security Reason."
@@ -74,7 +74,7 @@ msgstr ""
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:532
msgid "Cancel"
msgstr "الغاء"
msgstr "إلغاء"
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:981
msgid "Check Interval"
+5 -5
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: luci-app-ddns 2.4.0-1\n"
"POT-Creation-Date: 2016-01-30 11:07+0100\n"
"PO-Revision-Date: 2026-04-18 17:10+0000\n"
"Last-Translator: Franco Castillo <castillofrancodamian@gmail.com>\n"
"PO-Revision-Date: 2026-06-26 11:18+0000\n"
"Last-Translator: apemay <apemay.dev@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsddns/es/>\n"
"Language: es\n"
@@ -11,7 +11,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.17.1-dev\n"
"X-Generator: Weblate 2026.7.dev0\n"
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:423
msgid "\"../\" not allowed in path for Security Reason."
@@ -691,8 +691,8 @@ msgid ""
"Source URL for services file. Defaults to the master openwrt ddns package "
"repo."
msgstr ""
"URL utilizada para descargar el archivo de servicios. De forma "
"predeterminada, es el repositorio principal del paquete ddns de openwrt ."
"URL de origen del archivo de servicios. De forma predeterminada, es el "
"repositorio principal del paquete DDNS de OpenWrt."
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:201
msgid "Start DDNS"
+4 -5
View File
@@ -2,9 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: LuCI: ddns\n"
"POT-Creation-Date: 2017-10-17 21:00+0300\n"
"PO-Revision-Date: 2026-04-25 09:44+0000\n"
"Last-Translator: SnIPeRSnIPeR "
"<snipersniper@users.noreply.hosted.weblate.org>\n"
"PO-Revision-Date: 2026-07-03 15:28+0000\n"
"Last-Translator: chigelo <chigelo@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsddns/ru/>\n"
"Language: ru\n"
@@ -13,7 +12,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"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"
"X-Generator: Weblate 5.17.1-dev\n"
"X-Generator: Weblate 2026.7.1.dev0\n"
"Project-Info: Это технический перевод, не дословный. Главное-удобный русский "
"интерфейс, все проверялось в графическом режиме, совместим с другими apps\n"
@@ -447,7 +446,7 @@ msgstr ""
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:491
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1124
msgid "Name"
msgstr "Название"
msgstr "Имя"
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:333
msgid ""
+4 -4
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: luci-app-ddns 2.4.0-1\n"
"POT-Creation-Date: 2016-01-30 11:07+0100\n"
"PO-Revision-Date: 2026-05-12 09:07+0000\n"
"Last-Translator: Oleksandr Yurov <oyurov@icloud.com>\n"
"PO-Revision-Date: 2026-07-08 15:16+0000\n"
"Last-Translator: Dan <jonweblin2205@protonmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsddns/uk/>\n"
"Language: uk\n"
@@ -12,7 +12,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"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"
"X-Generator: Weblate 2026.5-dev\n"
"X-Generator: Weblate 2026.7.1.dev0\n"
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:423
msgid "\"../\" not allowed in path for Security Reason."
@@ -437,7 +437,7 @@ msgstr ""
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:491
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1124
msgid "Name"
msgstr "Імʼя"
msgstr "Назва"
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:333
msgid ""
@@ -228,7 +228,7 @@ const methods = {
const hasWget = () => {
return cache.has_wget ??= hasCommand('wget');
}
};
const hasWgetSsl = () => {
return cache.has_wgetssl ??= hasWget() && system(`wget 2>&1 | grep -iqF 'https'`) == 0 ? true : false;
+4 -4
View File
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-04-24 15:13+0000\n"
"Last-Translator: \"د.عبدالعزيز الجهني\" <myzezo@gmail.com>\n"
"PO-Revision-Date: 2026-07-03 15:29+0000\n"
"Last-Translator: Develper openmn <devopenm@proton.me>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsdockerman/ar/>\n"
"Language: ar\n"
@@ -9,7 +9,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Weblate 5.17.1-dev\n"
"X-Generator: Weblate 2026.7.1.dev0\n"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505
msgid "/mnt/path"
@@ -224,7 +224,7 @@ msgstr "وحدات المعالجة المركزية"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1933
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:517
msgid "Cancel"
msgstr "الغاء"
msgstr "إلغاء"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:35
msgid "Causes errors when a chosen API > Docker endpoint API support."
+3 -3
View File
@@ -1,6 +1,6 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-06-11 08:15+0000\n"
"PO-Revision-Date: 2026-07-13 02:01+0000\n"
"Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsdockerman/cs/>\n"
@@ -8,7 +8,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"X-Generator: Weblate 2026.6\n"
"X-Generator: Weblate 2026.7.1.dev0\n"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505
msgid "/mnt/path"
@@ -2195,7 +2195,7 @@ msgstr "obraz"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:755
msgid "json-file"
msgstr ""
msgstr "json soubor"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:336
msgid "kill"
+5 -5
View File
@@ -1,6 +1,6 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-06-05 19:02+0000\n"
"PO-Revision-Date: 2026-06-27 12:02+0000\n"
"Last-Translator: Hyeonjeong Lee <h9101654@gmail.com>\n"
"Language-Team: Korean <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsdockerman/ko/>\n"
@@ -8,7 +8,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 2026.6\n"
"X-Generator: Weblate 2026.7.dev0\n"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505
msgid "/mnt/path"
@@ -1376,7 +1376,7 @@ msgstr ""
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:351
msgid "Open in browser"
msgstr ""
msgstr "브라우저에서 열기"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:899
msgid "Operation failed"
@@ -1598,11 +1598,11 @@ msgstr ""
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:535
msgid "Remove tag"
msgstr ""
msgstr "태그 제거"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:625
msgid "Repository"
msgstr ""
msgstr "저장소"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:658
msgid "Repository cannot be empty"
+17 -18
View File
@@ -1,8 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-04-25 12:14+0000\n"
"Last-Translator: SnIPeRSnIPeR "
"<snipersniper@users.noreply.hosted.weblate.org>\n"
"PO-Revision-Date: 2026-07-05 14:58+0000\n"
"Last-Translator: Deni Dgabiev <ghostcraft412@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsdockerman/ru/>\n"
"Language: ru\n"
@@ -10,7 +9,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"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"
"X-Generator: Weblate 5.17.1-dev\n"
"X-Generator: Weblate 2026.7.1.dev0\n"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505
msgid "/mnt/path"
@@ -67,11 +66,11 @@ msgstr "Дополнительно"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:590
msgid "Aliases"
msgstr ""
msgstr "Псевдонимы"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1923
msgid "Aliases (optional):"
msgstr ""
msgstr "Псевдонимы (опционально):"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:342
msgid "All Subtypes"
@@ -489,7 +488,7 @@ msgstr "Отладка"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:753
msgid "Default (daemon)"
msgstr ""
msgstr "По умолчанию (демон)"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:57
msgid "Default bridge"
@@ -892,7 +891,7 @@ msgstr "IPv4-адрес"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1919
msgid "IPv4 Address (optional):"
msgstr ""
msgstr "IPv4-адрес (опционально):"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:64
msgid "IPv6"
@@ -906,7 +905,7 @@ msgstr "IPv6‑адрес"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1921
msgid "IPv6 Address (optional):"
msgstr ""
msgstr "IPv6-адрес (опционально):"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:586
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:134
@@ -1102,7 +1101,7 @@ msgstr "Опции журналирования"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:751
msgid "Log driver"
msgstr ""
msgstr "Драйвер логирования"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:745
msgid "Log driver options"
@@ -1214,7 +1213,7 @@ msgstr "Монтирования/Привязки"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:121
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:241
msgid "Name"
msgstr "Название"
msgstr "Имя"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:213
msgid "Name of the container that can be selected during container creation"
@@ -1230,7 +1229,7 @@ msgstr "Статистика сети"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:282
msgid "Network Aliases"
msgstr ""
msgstr "Сетевые псевдонимы"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:100
msgid "Network Configurations"
@@ -1401,7 +1400,7 @@ msgstr "Только для пользовательских сетей"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:351
msgid "Open in browser"
msgstr ""
msgstr "Открыть в браузере"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:899
msgid "Operation failed"
@@ -1755,7 +1754,7 @@ msgstr ""
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:354
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1801
msgid "Start"
msgstr "Запустить"
msgstr "Начало"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:208
msgid "Start this container"
@@ -2200,7 +2199,7 @@ msgstr "образ"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:755
msgid "json-file"
msgstr ""
msgstr "json-файл"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:336
msgid "kill"
@@ -2212,7 +2211,7 @@ msgstr "загрузить"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:754
msgid "local"
msgstr ""
msgstr "локальный"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:383
msgid "mount"
@@ -2228,7 +2227,7 @@ msgstr "узел"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:757
msgid "none"
msgstr ""
msgstr "отсутствует"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:337
msgid "oom"
@@ -2297,7 +2296,7 @@ msgstr "остановить"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:756
msgid "syslog"
msgstr ""
msgstr "syslog"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:364
msgid "tag"
+3 -3
View File
@@ -1,6 +1,6 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-05-21 05:04+0000\n"
"PO-Revision-Date: 2026-07-08 15:16+0000\n"
"Last-Translator: Dan <jonweblin2205@protonmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsdockerman/uk/>\n"
@@ -9,7 +9,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"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"
"X-Generator: Weblate 2026.6.dev0\n"
"X-Generator: Weblate 2026.7.1.dev0\n"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505
msgid "/mnt/path"
@@ -1211,7 +1211,7 @@ msgstr "Монтування/Привʼязки"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:121
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:241
msgid "Name"
msgstr "Імʼя"
msgstr "Назва"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:213
msgid "Name of the container that can be selected during container creation"
+1 -1
View File
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=KaiPlus
PKG_VERSION:=1.0.0
PKG_RELEASE:=1
PKG_RELEASE:=2
LUCI_DEPENDS:=+kaiplus +luci-compat
LUCI_MINIFY_CSS:=0
LUCI_MINIFY_JS:=0
@@ -15,10 +15,12 @@ end
function kaiplus_status()
local sys = require "luci.sys"
local uci = require "luci.model.uci".cursor()
local port = uci:get_first("kaiplus", "kaiplus", "port", "8198")
local port = uci:get_first("kaiplus", "kaiplus", "port", "8189")
local base_path = uci:get_first("kaiplus", "kaiplus", "base_path", "/apps/kaiplus/")
local status = {
running = (sys.call("pidof kaiplus_bin >/dev/null") == 0),
port = port
port = port,
base_path = base_path
}
luci.http.prepare_content("application/json")
luci.http.write_json(status)
@@ -5,7 +5,10 @@ m = Map("kaiplus", translate("KaiPlus"), translate("KaiPlus is an AI workspace a
m:section(SimpleSection).template = "kaiplus/kaiplus_status"
m.on_after_commit = function(self)
sys.call("/etc/init.d/kaiplus restart >/dev/null 2>&1 &")
sys.call("/etc/init.d/kaiplus restart >/dev/null 2>&1")
if sys.call("[ -x /etc/init.d/linkease ]") == 0 then
sys.call("/etc/init.d/linkease restart >/dev/null 2>&1 &")
end
end
s = m:section(TypedSection, "kaiplus", translate("Global settings"))
@@ -29,7 +32,7 @@ end
data_dir.default = default_path
local port = s:option(Value, "port", translate("Web port"))
port.default = "8198"
port.default = "8189"
port.rmempty = false
port.datatype = "port"
port.description = translate("Port for the KaiPlus web service.")
@@ -6,8 +6,15 @@ XHR.poll(5, '<%=url("admin/services/kaiplus_status")%>', null, function(x, st) {
el.innerHTML = '<br/><em style=\"color:red\"><%:The KaiPlus service is not running.%></em>';
}
if (st.running) {
var basePath = st.base_path || "/apps/kaiplus/";
if (basePath.charAt(0) !== "/") {
basePath = "/" + basePath;
}
if (basePath.charAt(basePath.length - 1) !== "/") {
basePath = basePath + "/";
}
el.innerHTML = '<br/><em style=\"color:green\"><%:The KaiPlus service is running.%></em>'
+ "<br/><br/><input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\" <%:Click to open KaiPlus%> \" onclick=\"window.open('http://" + window.location.hostname + ":" + st.port + "/')\"/>";
+ "<br/><br/><input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\" <%:Click to open KaiPlus%> \" onclick=\"window.open('http://' + window.location.hostname + ':' + st.port + basePath)\"/>";
}
}
});
+4 -4
View File
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-01-21 18:32+0000\n"
"Last-Translator: niky1987 <niky1987@libero.it>\n"
"PO-Revision-Date: 2026-07-23 06:18+0000\n"
"Last-Translator: Random <random-r@users.noreply.hosted.weblate.org>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsksmbd/it/>\n"
"Language: it\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 5.16-dev\n"
"X-Generator: Weblate 2026.8.dev0\n"
#: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:58
msgid "Add optional guest access to IPC$ share, disabled by default"
@@ -82,7 +82,7 @@ msgstr ""
#: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:109
msgid "Inherit owner"
msgstr ""
msgstr "Eredita il proprietario"
#: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:36
msgid "Interface"
+4 -5
View File
@@ -1,8 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-04-25 12:14+0000\n"
"Last-Translator: SnIPeRSnIPeR "
"<snipersniper@users.noreply.hosted.weblate.org>\n"
"PO-Revision-Date: 2026-07-03 15:29+0000\n"
"Last-Translator: chigelo <chigelo@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsksmbd/ru/>\n"
"Language: ru\n"
@@ -10,7 +9,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"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"
"X-Generator: Weblate 5.17.1-dev\n"
"X-Generator: Weblate 2026.7.1.dev0\n"
#: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:58
msgid "Add optional guest access to IPC$ share, disabled by default"
@@ -96,7 +95,7 @@ msgstr "Слушать только на данном интерфейсе ил
#: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:81
msgid "Name"
msgstr "Название"
msgstr "Имя"
#: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:22
#: applications/luci-app-ksmbd/root/usr/share/luci/menu.d/luci-app-ksmbd.json:3
+4 -4
View File
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-05-12 09:06+0000\n"
"Last-Translator: Oleksandr Yurov <oyurov@icloud.com>\n"
"PO-Revision-Date: 2026-07-08 15:16+0000\n"
"Last-Translator: Dan <jonweblin2205@protonmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsksmbd/uk/>\n"
"Language: uk\n"
@@ -9,7 +9,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"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"
"X-Generator: Weblate 2026.5-dev\n"
"X-Generator: Weblate 2026.7.1.dev0\n"
#: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:58
msgid "Add optional guest access to IPC$ share, disabled by default"
@@ -98,7 +98,7 @@ msgstr ""
#: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:81
msgid "Name"
msgstr "Імʼя"
msgstr "Назва"
#: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:22
#: applications/luci-app-ksmbd/root/usr/share/luci/menu.d/luci-app-ksmbd.json:3
+3 -3
View File
@@ -6,11 +6,11 @@
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for linkease
LUCI_DEPENDS:=+linkease
LUCI_DEPENDS:=+luci-lib-linkeasefile
LUCI_PKGARCH:=all
PKG_VERSION:=2.1.70-r3
PKG_VERSION:=2.1.70-r4
# PKG_RELEASE MUST be empty for luci.mk
PKG_RELEASE:=1
PKG_RELEASE:=2
LUCI_MINIFY_CSS:=0
LUCI_MINIFY_JS:=0
@@ -9,7 +9,6 @@ function index()
entry({"admin", "services", "linkease_status"}, call("linkease_status"))
entry({"admin", "services", "linkease", "file"}, call("linkease_file_template")).leaf = true
end
@@ -27,13 +26,3 @@ function linkease_status()
luci.http.write_json(status)
end
function get_params(name)
local data = {
prefix=luci.dispatcher.build_url(unpack({"admin", "services", "linkease", name})),
}
return data
end
function linkease_file_template()
luci.template.render("linkease/file", get_params("file"))
end
+18
View File
@@ -0,0 +1,18 @@
#
# Copyright (C) 2026 iStoreOS
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for linkeasefull
LUCI_DEPENDS:=+linkeasefull +luci-lib-linkeasefile
LUCI_PKGARCH:=all
PKG_VERSION:=1.0.1
PKG_RELEASE:=1
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
@@ -0,0 +1,89 @@
module("luci.controller.linkeasefull", package.seeall)
function index()
if not nixio.fs.access("/etc/config/linkeasefull") then
return
end
entry({"admin", "services", "linkeasefull"}, cbi("linkeasefull"), _("LinkEase Full"), 21).dependent = true
entry({"admin", "services", "linkeasefull_status"}, call("linkeasefull_status"))
entry({"admin", "services", "linkeasefull", "auth"}, call("linkeasefull_auth")).leaf = true
end
local function uhttpd_has_apps_proxy_prefix()
local uci = require "luci.model.uci".cursor()
local mappings = uci:get_list("uhttpd", "main", "proxy_prefix") or {}
for _, mapping in ipairs(mappings) do
if mapping == "/apps=http://127.0.0.1:19290" then
return true
end
end
return false
end
function linkeasefull_status()
local sys = require "luci.sys"
local uci = require "luci.model.uci".cursor()
local status = {
running = (sys.call("pidof linkease-full >/dev/null") == 0),
full_port = 19290,
legacy_port = 8897,
base_path = "/apps/",
lan_ip = uci:get("network", "lan", "ipaddr") or "",
proxy_prefix_enabled = uhttpd_has_apps_proxy_prefix()
}
luci.http.prepare_content("application/json")
luci.http.write_json(status)
end
local function retrieve_luci_session()
local http = require "luci.http"
local util = require "luci.util"
for _, key in ipairs({"sysauth_https", "sysauth_http", "sysauth"}) do
local sid = http.getcookie(key)
if sid and sid ~= "" then
local sdat = util.ubus("session", "get", { ubus_rpc_session = sid })
if sdat and type(sdat.values) == "table" then
return sid
end
end
end
return nil
end
local function valid_apps_return(value)
if not value or value == "" then
return false
end
if value == "/apps" then
return true
end
local prefix = value:sub(1, 6)
return prefix == "/apps/" or prefix == "/apps?" or prefix == "/apps#"
end
local function valid_cookie_value(value)
return value and value:match("^[A-Za-z0-9._%-_]+$") ~= nil
end
function linkeasefull_auth()
local http = require "luci.http"
local sid = retrieve_luci_session()
if not valid_cookie_value(sid) then
http.status(403, "Forbidden")
return
end
local target = http.formvalue("return") or "/apps/"
if not valid_apps_return(target) then
target = "/apps/"
end
http.header("Set-Cookie", "linkease_openwrt_sid=" .. sid .. "; Path=/apps; HttpOnly; SameSite=Lax")
http.redirect(target)
end
@@ -0,0 +1,86 @@
local fs = require "nixio.fs"
local m, s
local function starts_with(value, prefix)
return value:sub(1, #prefix) == prefix
end
local function decode_mount_path(value)
return value:gsub("\\040", " "):gsub("\\011", "\t"):gsub("\\012", "\n"):gsub("\\134", "\\")
end
local function is_persistent_mount(path, fstype)
if path == "" or path == "/" then
return false
end
if starts_with(path, "/tmp") or starts_with(path, "/var") or starts_with(path, "/run") then
return false
end
if starts_with(path, "/dev") or starts_with(path, "/proc") or starts_with(path, "/sys") then
return false
end
if starts_with(path, "/rom") or starts_with(path, "/overlay") then
return false
end
if fstype == "tmpfs" or fstype == "devtmpfs" or fstype == "overlay" or fstype == "squashfs" then
return false
end
return true
end
local function storage_mounts()
local mounts = {}
for line in io.lines("/proc/mounts") do
local device, path, fstype = line:match("^(%S+)%s+(%S+)%s+(%S+)")
path = path and decode_mount_path(path) or ""
if device and fstype and is_persistent_mount(path, fstype) then
mounts[#mounts + 1] = {
path = path,
label = string.format("%s (%s)", path, fstype)
}
end
end
table.sort(mounts, function(a, b) return a.path < b.path end)
return mounts
end
m = Map("linkeasefull", translate("LinkEase Full"), translate("LinkEase Full uses fixed entries at port 19290 /apps/ and legacy port 8897."))
m:section(SimpleSection).template = "linkeasefull_status"
s = m:section(TypedSection, "linkeasefull", translate("Storage"))
s.addremove = false
s.anonymous = true
s:option(Flag, "enabled", translate("Enable")).rmempty = false
local data = s:option(ListValue, "data_root_parent", translate("Storage path"), translate("Choose a mounted persistent disk. /tmp is not allowed."))
data.rmempty = false
local current = m.uci:get_first("linkeasefull", "linkeasefull", "data_root_parent") or ""
local has_current = false
for _, mount in ipairs(storage_mounts()) do
data:value(mount.path, mount.label)
if mount.path == current then
has_current = true
end
end
if current ~= "" and not has_current and fs.stat(current, "type") == "dir" and is_persistent_mount(current, "") then
data:value(current, current)
end
function data.validate(self, value)
if value == nil or value == "" then
return nil, translate("Please choose a mounted persistent disk.")
end
if not is_persistent_mount(value, "") then
return nil, translate("/tmp and system paths cannot be used for LinkEase Full storage.")
end
if fs.stat(value, "type") ~= "dir" then
return nil, translate("The selected storage path does not exist.")
end
return value
end
return m
@@ -0,0 +1,34 @@
<script type="text/javascript">//<![CDATA[
XHR.poll(5, '<%=url("admin/services/linkeasefull_status")%>', null,
function(x, st)
{
var tb = document.getElementById('linkeasefull_status');
if (st && tb)
{
var lanHost = st.lan_ip || window.location.hostname;
var fullUrl = st.proxy_prefix_enabled
? window.location.protocol + "//" + window.location.host + "/apps/"
: "http://" + lanHost + ":" + (st.full_port || 19290) + "/apps/";
var legacyUrl = "http://" + lanHost + ":" + (st.legacy_port || 8897) + "/";
var overallStatus = st.running
? '<br/><em style=\"color:green\"><%:The LinkEase Full service is running.%></em>'
: '<br/><em style=\"color:red\"><%:The LinkEase Full service is not running.%></em>';
tb.innerHTML = overallStatus;
if (st.running)
{
tb.innerHTML = tb.innerHTML
+ "<br/><br/><input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\" <%:Open Full Entry%> \" onclick=\"window.open('" + fullUrl + "')\"/>"
+ " <input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\" <%:Open Standard Entry%> \" onclick=\"window.open('" + legacyUrl + "')\"/>";
}
}
}
);
//]]></script>
<fieldset class="cbi-section">
<legend><%:LinkEase Full Status%></legend>
<p id="linkeasefull_status">
<em><%:Collecting data...%></em>
</p>
</fieldset>
@@ -0,0 +1,35 @@
msgid "LinkEase Full"
msgstr "易有云完整版"
msgid "LinkEase Full provides the local web desktop entry for LinkEase."
msgstr "易有云完整版提供本地 Web 桌面入口。"
msgid "Global settings"
msgstr "全局设置"
msgid "Enable"
msgstr "启用"
msgid "Port"
msgstr "端口"
msgid "Base Path"
msgstr "基础路径"
msgid "Data Root Parent"
msgstr "数据根目录父路径"
msgid "The LinkEase Full service is running."
msgstr "易有云完整版服务已启动"
msgid "The LinkEase Full service is not running."
msgstr "易有云完整版服务未启动"
msgid "Click to open LinkEase Full"
msgstr "点击打开易有云完整版"
msgid "LinkEase Full Status"
msgstr "易有云完整版服务状态"
msgid "Collecting data..."
msgstr "收集数据..."
+1
View File
@@ -0,0 +1 @@
zh-cn
@@ -0,0 +1,4 @@
#!/bin/sh
rm -f /tmp/luci-indexcache /tmp/luci-indexcache.*
exit 0
+18
View File
@@ -0,0 +1,18 @@
# Copyright (C) 2016 Openwrt.org
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for linkeaselite
LUCI_DEPENDS:=+linkeaselite
LUCI_PKGARCH:=all
PKG_VERSION:=1.0.0
PKG_RELEASE:=1
LUCI_MINIFY_CSS:=0
LUCI_MINIFY_JS:=0
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
@@ -0,0 +1,31 @@
module("luci.controller.linkeaselite", package.seeall)
function index()
if not nixio.fs.access("/etc/config/linkeaselite") then
return
end
local page = entry({"admin", "services", "linkeaselite"}, firstchild(), _("LinkEaseLite"), 20)
page.dependent = true
entry({"admin", "services", "linkeaselite", "config"}, cbi("linkeaselite"), _("Settings"), 10).leaf = true
entry({"admin", "services", "linkeaselite_status"}, call("linkeaselite_status"))
entry({"admin", "services", "linkeaselite", "file"}, call("linkeaselite_file_removed")).leaf = true
end
function linkeaselite_status()
local sys = require "luci.sys"
local uci = require "luci.model.uci".cursor()
local port = tonumber(uci:get_first("linkeaselite", "linkeaselite", "port"))
local status = {
running = (sys.call("pidof linkease-lite >/dev/null") == 0),
port = (port or 8897)
}
luci.http.prepare_content("application/json")
luci.http.write_json(status)
end
function linkeaselite_file_removed()
luci.http.status(404, "Not Found")
end
@@ -0,0 +1,24 @@
local m, s
local sys = require "luci.sys"
m = Map("linkeaselite", translate("LinkEaseLite"), translate("LinkEaseLite is an efficient data transfer tool for small-memory devices."))
m:section(SimpleSection).template = "linkeaselite_status"
m.on_after_commit = function(self)
sys.call("/etc/init.d/linkeaselite restart >/dev/null 2>&1")
end
s = m:section(TypedSection, "linkeaselite", translate("Global settings"))
s.addremove = false
s.anonymous = true
s:option(Flag, "enabled", translate("Enable")).rmempty = false
local port = s:option(Value, "port", translate("Port"))
port.rmempty = false
port.datatype = "port"
port.default = "8897"
s:option(Flag, "allowPublic", translate("AllowPublic"), translate("Allowing access via public IP addresses can lead to insufficient security.")).rmempty = false
return m
@@ -0,0 +1,42 @@
<script type="text/javascript">//<![CDATA[
XHR.poll(5, '<%=url("admin/services/linkeaselite_status")%>', null,
function(x, st)
{
var tb = document.getElementById('linkeaselite_status');
if (st && tb)
{
var legacyUrl = "http://" + window.location.hostname + ":" + (st.port || 8897) + "/";
var overallStatus = st.running
? '<br/><em style=\"color:green\"><%:The LinkEaseLite service is running.%></em>'
: '<br/><em style=\"color:red\"><%:The LinkEaseLite service is not running.%></em>';
tb.innerHTML = overallStatus;
function appendBreak()
{
tb.appendChild(document.createElement("br"));
}
function appendButton(value, action)
{
var button = document.createElement("input");
button.className = "btn cbi-button cbi-button-apply";
button.type = "button";
button.value = value;
button.onclick = action;
tb.appendChild(button);
}
appendBreak();
appendBreak();
appendButton(" <%:Click to open LinkEaseLite%> ", function() { window.open(legacyUrl); });
}
}
);
//]]></script>
<fieldset class="cbi-section">
<legend><%:LinkEaseLite Status%></legend>
<p id="linkeaselite_status">
<em><%:Collecting data...%></em>
</p>
</fieldset>
@@ -0,0 +1,35 @@
msgid "LinkEaseLite"
msgstr "易有云Lite"
msgid "LinkEaseLite is an efficient data transfer tool for small-memory devices."
msgstr "易有云Lite是面向小内存设备的轻量数据传输工具。"
msgid "Global settings"
msgstr "全局设置"
msgid "Enable"
msgstr "启用"
msgid "Port"
msgstr "端口"
msgid "AllowPublic"
msgstr "公网访问"
msgid "Allowing access via public IP addresses can lead to insufficient security."
msgstr "允许公网IP访问,会导致不够安全。"
msgid "Click to open LinkEaseLite"
msgstr "点击打开易有云Lite"
msgid "The LinkEaseLite service is running."
msgstr "易有云Lite服务已启动"
msgid "The LinkEaseLite service is not running."
msgstr "易有云Lite服务未启动"
msgid "LinkEaseLite Status"
msgstr "易有云Lite服务状态"
msgid "Collecting data..."
msgstr "收集数据..."
+1
View File
@@ -0,0 +1 @@
zh-cn
@@ -0,0 +1,4 @@
#!/bin/sh
rm -f /tmp/luci-indexcache /tmp/luci-indexcache.*
exit 0
+1 -1
View File
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=26.7.24
PKG_RELEASE:=194
PKG_RELEASE:=195
PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \
@@ -1754,9 +1754,9 @@ acl_app() {
run_${type} flag=$tcp_node node=$tcp_node tcp_redir_port=$redir_port ${_extra_param} config_file=$config_file log_file=$log_file loglevel=$loglevel
else
config_file="acl/${tcp_node}_SOCKS_${socks_port}.json"
run_socks flag=$tcp_node node=$tcp_node bind=127.0.0.1 socks_port=$socks_port config_file=$config_file
# local log_file=$TMP_ACL_PATH/ipt2socks_${tcp_node}_${redir_port}.log
# log_file="/dev/null"
run_socks flag=$tcp_node node=$tcp_node bind=127.0.0.1 socks_port=$socks_port config_file=$config_file log_file=$log_file
# log_file=$TMP_ACL_PATH/ipt2socks_${tcp_node}_${redir_port}.log
log_file="/dev/null"
run_ipt2socks flag=acl_${tcp_node} tcp_tproxy=${is_tproxy} local_port=$redir_port socks_address=127.0.0.1 socks_port=$socks_port log_file=$log_file
fi
run_dns ${_dns_port}
@@ -1828,9 +1828,9 @@ acl_app() {
run_${type} flag=$udp_node node=$udp_node udp_redir_port=$redir_port config_file=$config_file log_file=$log_file loglevel=$loglevel
else
config_file="acl/${udp_node}_SOCKS_${socks_port}.json"
run_socks flag=$udp_node node=$udp_node bind=127.0.0.1 socks_port=$socks_port config_file=$config_file
# local log_file=$TMP_ACL_PATH/ipt2socks_${udp_node}_${redir_port}.log
# log_file="/dev/null"
run_socks flag=$udp_node node=$udp_node bind=127.0.0.1 socks_port=$socks_port config_file=$config_file log_file=$log_file
# log_file=$TMP_ACL_PATH/ipt2socks_${udp_node}_${redir_port}.log
log_file="/dev/null"
run_ipt2socks flag=acl_${udp_node} local_port=$redir_port socks_address=127.0.0.1 socks_port=$socks_port log_file=$log_file
fi
fi
@@ -476,7 +476,7 @@ ln_run() {
fi
#echo "${file_func} $*" >&2
[ -n "${file_func}" ] || echolog " - 找不到 ${ln_name},无法启动..."
[ "${output}" != "/dev/null" ] && [ "${ln_name}" != "chinadns-ng" ] && {
[ "${output}" != "/dev/null" ] && [ -n "$(echo "${output}" | grep -E "default|SOCKS_")" ] && [ "${ln_name}" != "chinadns-ng" ] && {
local persist_log_path=$(config_t_get global persist_log_path)
local sys_log=$(config_t_get global sys_log "0")
}
+1 -1
View File
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-qosmate
PKG_VERSION:=1.0.14
PKG_RELEASE:=2
PKG_RELEASE:=3
PKG_MAINTAINER:=Markus Hütter <mh@hudra.net>
PKG_LICENSE:=GPL-3.0-or-later
@@ -10,6 +10,14 @@
function addRelevanceInfo(description, settingName, rootQdisc) {
var isRelevant = true;
var note = '';
// A rate of 0 disables that direction, which makes its options ineffective
if (/INGRESS/.test(settingName) && parseInt(uci.get('qosmate', 'settings', 'DOWNRATE') || '0') === 0) {
return description + ' ⚠ Not used: ingress shaping is disabled (DOWNRATE=0)';
}
if (/EGRESS/.test(settingName) && parseInt(uci.get('qosmate', 'settings', 'UPRATE') || '0') === 0) {
return description + ' ⚠ Not used: egress shaping is disabled (UPRATE=0)';
}
// Check basic ROOT_QDISC relevance
if (rootQdisc !== 'cake' && rootQdisc !== 'hybrid') {
@@ -7,7 +7,6 @@
'require fs';
'require poll';
'require tools.widgets as widgets';
const UI_VERSION = '1.2.0';
const UI_UPD_CHANNEL = 'release';
@@ -554,7 +553,7 @@ return view.extend({
}
statusHtml.appendChild(
E('div', { 'style': 'display: flex; align-items: center; gap: 4px;' }, [
E('div', { 'style': 'display: flex; align-items: center; gap: 4px;', 'title': detail }, [
E('span', {
'style': 'color: ' + color + '; font-size: 15px; font-weight: bold; min-width: 20px;'
}, icon),
@@ -780,11 +779,7 @@ return view.extend({
opt.validate = function(section_id, value) {
if (value === '' || value === null) return true;
if (!/^\d+$/.test(value)) return _('Must be a non-negative integer or empty');
var intValue = parseInt(value, 10);
var rootQdisc = this.section.formvalue(section_id, 'ROOT_QDISC');
if (intValue === 0 && rootQdisc === 'hfsc') {
return _('Value must be greater than 0 for HFSC');
}
// 0 is valid for every qdisc: it disables shaping for that direction
return true;
};
}
@@ -797,8 +792,8 @@ return view.extend({
o.editable = true;
o.default = wanInterface;
createOption('DOWNRATE', _('Download Rate (kbps)'), _('Set the download rate in kbps'), _('Default: 90000'), 'uinteger');
createOption('UPRATE', _('Upload Rate (kbps)'), _('Set the upload rate in kbps'), _('Default: 45000'), 'uinteger');
createOption('DOWNRATE', _('Download Rate (kbps)'), _('Set the download rate in kbps. 0 disables ingress shaping (no IFB device is created).'), _('Default: 90000'), 'uinteger');
createOption('UPRATE', _('Upload Rate (kbps)'), _('Set the upload rate in kbps. 0 disables egress shaping.'), _('Default: 45000'), 'uinteger');
// Function to get QDisc description based on value
function getQdiscDescriptionForValue(value) {
@@ -880,6 +875,37 @@ return view.extend({
}
};
// Notice when a direction is not shaped (rate 0, same convention as sqm-scripts)
o = s_basic.option(form.DummyValue, '_shaping_direction', _('Shaping Direction'));
o.rawhtml = true;
o.render = function(section_id) {
var downrate = parseInt(uci.get('qosmate', 'settings', 'DOWNRATE') || '0');
var uprate = parseInt(uci.get('qosmate', 'settings', 'UPRATE') || '0');
if (downrate > 0 && uprate > 0) return E('div');
var lines = [];
if (downrate === 0 && uprate === 0) {
lines.push(E('strong', {}, _('No shaping active: both rates are 0')));
lines.push(E('br'));
lines.push(_('Only nftables DSCP marking is applied, no queues are created.'));
} else if (downrate === 0) {
lines.push(E('strong', {}, _('Download shaping disabled (DOWNRATE=0)')));
lines.push(E('br'));
lines.push(_('No IFB device is created. TCP bulk detection is off because its thresholds derive from the download rate, CAKE ingress options have no effect, and incoming packets carry no DSCP.'));
lines.push(E('br'));
lines.push(_('Set ACK_FILTER_EGRESS explicitly in the CAKE tab: "auto" cannot decide without a download rate.'));
} else {
lines.push(E('strong', {}, _('Upload shaping disabled (UPRATE=0)')));
lines.push(E('br'));
lines.push(_('No egress qdisc is created, so traffic classification only affects the download queue.'));
}
return E('div', { 'class': 'cbi-value' }, [
E('label', { 'class': 'cbi-value-title' }, E('span', { 'style': 'color: orange; font-weight: bold;' }, '⚠')),
E('div', { 'class': 'cbi-value-field', 'style': 'color: orange;' }, lines)
]);
};
// Warning for bandwidth ratio
o = s_basic.option(form.DummyValue, '_ratio_warning', _('Bandwidth Ratio Warning'));
o.rawhtml = true;
@@ -1492,6 +1492,21 @@ return view.extend({
infoContainer.appendChild(row);
}
// A rate of 0 disables that direction, so one of the tabs stays empty on purpose
var statsUpRate = parseInt(uci.get('qosmate', 'settings', 'UPRATE') || '0');
var statsDownRate = parseInt(uci.get('qosmate', 'settings', 'DOWNRATE') || '0');
if (statsUpRate === 0 || statsDownRate === 0) {
var dirText = statsUpRate === 0 && statsDownRate === 0
? _('disabled in both directions (both rates are 0)')
: (statsDownRate === 0 ? _('egress only (DOWNRATE=0, no ingress statistics)')
: _('ingress only (UPRATE=0, no egress statistics)'));
var row = E('div', { 'style': 'margin-right: 1.5em; margin-bottom: 0.3em; color: orange;' });
row.appendChild(E('span', { 'style': 'font-weight: bold;' }, _('Shaping:')));
row.appendChild(document.createTextNode(' '));
row.appendChild(E('span', {}, dirText));
infoContainer.appendChild(row);
}
// Add CAKE-specific or HFSC-specific info
if (qosStats.root_qdisc === 'cake') {
if (qosStats.priority_queue_ingress) {
+12 -10
View File
@@ -3,8 +3,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-05-19 19:36+0200\n"
"PO-Revision-Date: 2025-11-28 22:04+0000\n"
"Last-Translator: niky1987 <niky1987@libero.it>\n"
"PO-Revision-Date: 2026-07-23 06:18+0000\n"
"Last-Translator: Random <random-r@users.noreply.hosted.weblate.org>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationssamba4/it/>\n"
"Language: it\n"
@@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.15-dev\n"
"X-Generator: Weblate 2026.8.dev0\n"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:120
msgid "Allow guests"
@@ -60,11 +60,11 @@ msgstr "Disattiva Controller di Dominio Active Directory"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:71
msgid "Disable Netbios"
msgstr ""
msgstr "Disabilita Netbios"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:77
msgid "Disable Winbind"
msgstr ""
msgstr "Disabilita Winbind"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:32
msgid "Edit Template"
@@ -81,7 +81,7 @@ msgstr ""
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:64
msgid "Enable macOS compatible shares"
msgstr ""
msgstr "Abilita condivisioni compatibili con macOS"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:58
msgid ""
@@ -95,6 +95,8 @@ msgid ""
"Enables Apple's AAPL extension globally and adds macOS compatibility options "
"to all shares."
msgstr ""
"Abilita globalmente le estensioni AAPL di Apple ed aggiunge le opzioni di "
"compatibilità con macOS in tutte le condivisioni."
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:115
msgid "Force Root"
@@ -114,11 +116,11 @@ msgstr ""
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:126
msgid "Guests only"
msgstr ""
msgstr "Solo ospiti"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:131
msgid "Inherit owner"
msgstr ""
msgstr "Eredita il proprietario"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:34
msgid "Interface"
@@ -177,11 +179,11 @@ msgstr ""
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:153
msgid "Time-machine size in GB"
msgstr ""
msgstr "Dimensioni in GB di Time-machine"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:148
msgid "Vfs objects"
msgstr ""
msgstr "Oggetti Vfs"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:51
msgid "Workgroup"
+4 -5
View File
@@ -2,9 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: LuCI: samba\n"
"POT-Creation-Date: 2009-05-19 19:36+0200\n"
"PO-Revision-Date: 2026-04-25 12:14+0000\n"
"Last-Translator: SnIPeRSnIPeR "
"<snipersniper@users.noreply.hosted.weblate.org>\n"
"PO-Revision-Date: 2026-07-03 15:28+0000\n"
"Last-Translator: chigelo <chigelo@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationssamba4/ru/>\n"
"Language: ru\n"
@@ -13,7 +12,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"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"
"X-Generator: Weblate 5.17.1-dev\n"
"X-Generator: Weblate 2026.7.1.dev0\n"
"Project-Info: Это технический перевод, не дословный. Главное-удобный русский "
"интерфейс, все проверялось в графическом режиме, совместим с другими apps\n"
@@ -139,7 +138,7 @@ msgstr "Слушать только на данном интерфейсе ил
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:98
msgid "Name"
msgstr "Название"
msgstr "Имя"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:23
#: applications/luci-app-samba4/root/usr/share/luci/menu.d/luci-app-samba4.json:3
+3 -3
View File
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"PO-Revision-Date: 2026-05-15 10:43+0000\n"
"PO-Revision-Date: 2026-07-08 15:16+0000\n"
"Last-Translator: Dan <jonweblin2205@protonmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationssamba4/uk/>\n"
@@ -11,7 +11,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"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"
"X-Generator: Weblate 2026.5.dev0\n"
"X-Generator: Weblate 2026.7.1.dev0\n"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:120
msgid "Allow guests"
@@ -136,7 +136,7 @@ msgstr ""
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:98
msgid "Name"
msgstr "Імʼя"
msgstr "Назва"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:23
#: applications/luci-app-samba4/root/usr/share/luci/menu.d/luci-app-samba4.json:3
+1 -1
View File
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
PKG_LICENSE:=GPL-3.0-or-later
PKG_MAINTAINER:=Nick Peng <pymumu@gmail.com>
PKG_VERSION:=1.2025.47.2
PKG_RELEASE:=10
PKG_RELEASE:=11
LUCI_TITLE:=LuCI for smartdns
LUCI_DESCRIPTION:=Provides Luci for smartdns
+16 -17
View File
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2020-07-02 17:20-0300\n"
"PO-Revision-Date: 2026-06-25 19:51+0000\n"
"PO-Revision-Date: 2026-06-26 11:19+0000\n"
"Last-Translator: apemay <apemay.dev@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationssmartdns/es/>\n"
@@ -170,7 +170,7 @@ msgstr "Descripción"
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:75
msgid "Dnsmasq Forwarded To Smartdns Failure"
msgstr "Error de reenvío de Dnsmasq a Smartdns"
msgstr "Error de reenvío de Dnsmasq a SmartDNS"
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:718
msgid "Do not check certificate."
@@ -419,8 +419,8 @@ msgid ""
"Include other config files from /etc/smartdns/conf.d or custom path, can be "
"downloaded from the download page."
msgstr ""
"Incluye otros archivos de configuración desde /etc/smartdns/conf.d o una "
"ruta personalizada, se puede obtener desde la página de descarga."
"Incluir otros archivos de configuración desde /etc/smartdns/conf.d o una "
"ruta personalizada. Se pueden descargar desde la página de descargas."
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:282
msgid "Ipset name, Add domain result to ipset when speed check fails."
@@ -730,9 +730,8 @@ msgid ""
"SmartDNS is a local high-performance DNS server, supports finding fastest "
"IP, supports ad filtering, and supports avoiding DNS poisoning."
msgstr ""
"SmartDNS es un servidor DNS local de alto rendimiento, admite la búsqueda de "
"la IP más rápida, admite el filtrado de anuncios y evita el envenenamiento "
"de DNS."
"SmartDNS es un servidor DNS local de alto rendimiento. Admite la búsqueda de "
"la IP más rápida, el filtrado de anuncios y evita el envenenamiento de DNS."
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1141
msgid "SmartDNS official website"
@@ -740,7 +739,7 @@ msgstr "Sitio web oficial de SmartDNS"
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:376
msgid "Smartdns local server port"
msgstr "Puerto del servidor local Smartdns"
msgstr "Puerto del servidor local de SmartDNS"
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:153
msgid ""
@@ -755,18 +754,18 @@ msgid ""
"Smartdns response mode, First Ping: return the first ping IP, Fastest IP: "
"return the fastest IP, Fastest Response: return the fastest DNS response."
msgstr ""
"Modo de respuesta de SmartDNS, Primer Ping: devuelve la primera IP que "
"responde al ping, IP Más Rápida: devuelve la IP más rápida, Respuesta Más "
"Rápida: devuelve la respuesta DNS más rápida."
"Modo de respuesta de SmartDNS. Primer Ping: devuelve la primera IP que "
"responde al ping; IP más rápida: devuelve la IP más rápida; Respuesta más "
"rápida: devuelve la respuesta DNS más rápida."
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:146
msgid "Smartdns server name"
msgstr "Nombre del servidor de Smartdns"
msgstr "Nombre del servidor de SmartDNS"
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:168
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1015
msgid "Smartdns speed check mode."
msgstr "Modo de verificación de velocidad de smartdns."
msgstr "Modo de verificación de velocidad de SmartDNS."
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1118
msgid ""
@@ -844,7 +843,7 @@ msgstr "Cargar el archivo de lista de dominios"
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:507
msgid "Upload domain list file to /etc/smartdns/domain-set"
msgstr "Cargue el archivo de lista de dominios en /etc/smartdns/domain-set"
msgstr "Cargar el archivo de lista de dominios en /etc/smartdns/domain-set"
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:891
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:991
@@ -861,7 +860,7 @@ msgstr "Cargar el archivo de lista de dominios."
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:500
msgid "Upload smartdns config file to /etc/smartdns/conf.d"
msgstr "Cargue el archivo de configuración de smartdns en /etc/smartdns/conf.d"
msgstr "Cargar el archivo de configuración de SmartDNS en /etc/smartdns/conf.d"
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:630
msgid "Upstream Servers"
@@ -929,11 +928,11 @@ msgstr "abrir sitio web"
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:555
msgid "smartdns config (/etc/smartdns/conf.d)"
msgstr "Configuración de smartdns (/etc/smartdns/conf.d)"
msgstr "Configuración de SmartDNS (/etc/smartdns/conf.d)"
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:584
msgid "smartdns custom settings"
msgstr "configuraciones personalizadas de smartdns"
msgstr "configuraciones personalizadas de SmartDNS"
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:667
msgid "tcp"
+4 -4
View File
@@ -3,8 +3,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-05-19 19:36+0200\n"
"PO-Revision-Date: 2025-11-28 22:04+0000\n"
"Last-Translator: niky1987 <niky1987@libero.it>\n"
"PO-Revision-Date: 2026-07-23 06:18+0000\n"
"Last-Translator: Random <random-r@users.noreply.hosted.weblate.org>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsupnp/it/>\n"
"Language: it\n"
@@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.15-dev\n"
"X-Generator: Weblate 2026.8.dev0\n"
#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:180
msgctxt ""
@@ -115,7 +115,7 @@ msgstr "Velocità di download"
#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:144
msgid "Enable PCP/NAT-PMP protocols"
msgstr "Abilita il protocollo PCP/NAT-PMP"
msgstr "Attiva i protocolli PCP/NAT-PMP"
#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:141
msgid "Enable UPnP IGD protocol"
+17 -18
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2026-03-29 19:31+0000\n"
"Last-Translator: Franco Castillo <castillofrancodamian@gmail.com>\n"
"PO-Revision-Date: 2026-06-27 12:01+0000\n"
"Last-Translator: apemay <apemay.dev@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationswatchcat/es/>\n"
"Language: es\n"
@@ -11,7 +11,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.17-dev\n"
"X-Generator: Weblate 2026.7.dev0\n"
#: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:94
msgid ""
@@ -21,12 +21,12 @@ msgid ""
"to fail. Enter the number of seconds to wait for the soft reboot to fail or "
"use 0 to disable the forced reboot delay."
msgstr ""
"<i>Se aplica a los modos de Reinicio por Ping y Reinicio periódico</i><br /> "
"Al reiniciar el enrutador, el servicio desencadenará un reinicio suave. "
"Poniendo un valor distinto de cero aquí, se desencadenará un reinicio "
"completo retrasado si falla el reinicio suave. Ponga el número de segundos "
"que hay que esperar a que el reinicio suave falle o use 0 para desactivar el "
"retraso de reinicio forzado."
"<i>Se aplica a los modos Reinicio por ping y Reinicio periódico</i><br /> Al "
"reiniciar el enrutador, el servicio activará un reinicio suave. Introducir "
"aquí un valor distinto de cero activará un reinicio completo retrasado si el "
"reinicio suave falla. Introduzca el número de segundos que esperar a que "
"falle el reinicio suave o use 0 para desactivar el retraso del reinicio "
"forzado."
#: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:111
msgid ""
@@ -73,7 +73,7 @@ msgstr "Ajustes generales"
#: applications/luci-app-watchcat/root/usr/share/rpcd/acl.d/luci-app-watchcat.json:3
msgid "Grant access to LuCI app watchcat"
msgstr "Otorgar acceso a la aplicación LuCI watchcat"
msgstr "Conceder acceso a la aplicación LuCI watchcat"
#: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:12
msgid ""
@@ -191,14 +191,13 @@ msgid ""
"time. <br /> Run Script: Run a script if a ping to a specified host fails "
"for a specified duration of time. <br />"
msgstr ""
"Reinicio de ping: si el ping al host especificado siempre falla dentro del "
"tiempo especificado, el dispositivo se reiniciará. <br />Reinicio "
"programado: reinicia el dispositivo después de un intervalo de tiempo "
"específico. <br />Reiniciar interfaz: si dentro del tiempo especificado, el "
"ping del host especificado siempre falla, reinicie la interfaz de red "
"específica. <br />Ejecutar secuencia de comandos: si dentro del tiempo "
"especificado, el ping del host especificado siempre falla, ejecute una "
"secuencia de comandos específica. <br />"
"Reinicio por ping: reinicia este dispositivo si un ping al host especificado "
"falla durante un periodo de tiempo especificado. <br />Reinicio periódico: "
"reinicia este dispositivo después de un intervalo de tiempo especificado. "
"<br />Reiniciar interfaz: reinicia una interfaz de red si un ping al host "
"especificado falla durante un periodo de tiempo especificado. <br />Ejecutar "
"script: ejecuta un script si un ping al host especificado falla durante un "
"periodo de tiempo especificado.<br />"
#: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:29
msgid "Restart Interface"
+16
View File
@@ -0,0 +1,16 @@
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for linkease file
LUCI_DEPENDS:=+linkease
LUCI_PKGARCH:=all
PKG_VERSION:=2.1.70-r3
# PKG_RELEASE MUST be empty for luci.mk
PKG_RELEASE:=1
LUCI_MINIFY_CSS:=0
LUCI_MINIFY_JS:=0
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
@@ -7,13 +7,27 @@ local ltn12 = require "luci.ltn12"
local table = require "table"
local util = require "luci.util"
module("luci.controller.linkease_backend", package.seeall)
module("luci.controller.linkease_file", package.seeall)
local BLOCKSIZE = 2048
local LINKEASE_UNIX = "/var/run/linkease.sock"
function index()
entry({"linkease"}, call("linkease_backend")).leaf=true
local e = entry({"admin", "services", "linkease", "file"}, call("linkease_file_template"))
e.leaf = true
e.dependent = false
end
function get_params(name)
local data = {
prefix=luci.dispatcher.build_url(unpack({"admin", "services", "linkease", name})),
}
return data
end
function linkease_file_template()
luci.template.render("linkease/file", get_params("file"))
end
local function sink_socket(sock, io_err)
@@ -0,0 +1,4 @@
#!/bin/sh
rm -f /tmp/luci-indexcache /tmp/luci-indexcache.*
exit 0
+2 -1
View File
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=qBittorrent-Enhanced-Edition
PKG_VERSION:=5.2.3.10
PKG_RELEASE:=12
PKG_RELEASE:=13
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/c0re100/qBittorrent-Enhanced-Edition/tar.gz/release-$(PKG_VERSION)?
@@ -14,6 +14,7 @@ PKG_LICENSE_FILES:=COPYING
PKG_CPE_ID:=cpe:/a:qbittorrent:qbittorrent
PKG_BUILD_DEPENDS:=qt6tools/host
PKG_BUILD_FLAGS:=no-mips16
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk
+2 -1
View File
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=qBittorrent
PKG_VERSION:=5.2.3
PKG_RELEASE:=4
PKG_RELEASE:=5
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/qbittorrent/qBittorrent/tar.gz/release-$(PKG_VERSION)?
@@ -14,6 +14,7 @@ PKG_LICENSE_FILES:=COPYING
PKG_CPE_ID:=cpe:/a:qbittorrent:qbittorrent
PKG_BUILD_DEPENDS:=qt6tools/host
PKG_BUILD_FLAGS:=no-mips16
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk
Loaded 100 of 106 files, more files were not shown because too many files have changed in this diff. Show more