🎁 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 include $(TOPDIR)/rules.mk
PKG_NAME:=dae PKG_NAME:=dae
PKG_VERSION:=2026.07.26 PKG_VERSION:=2026.07.27
PKG_RELEASE:=22 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_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/dae-src
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_HASH:=skip PKG_HASH:=skip
+3 -3
View File
@@ -5,10 +5,10 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=daed PKG_NAME:=daed
PKG_VERSION:=2026.07.26 PKG_VERSION:=2026.07.27
PKG_RELEASE:=30 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_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/daed-src
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_HASH:=skip PKG_HASH:=skip
+2 -2
View File
@@ -8,8 +8,8 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=go-ethereum PKG_NAME:=go-ethereum
PKG_VERSION:=1.17.4 PKG_VERSION:=1.17.5
PKG_RELEASE:=7 PKG_RELEASE:=8
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/ethereum/go-ethereum/tar.gz/v${PKG_VERSION}? 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_NAME:=kaiplus
PKG_VERSION:=1.0.5 PKG_VERSION:=1.0.5
PKG_RELEASE:=1 PKG_RELEASE:=2
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/kaiplus/ PKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/kaiplus/
PKG_HASH:=skip PKG_HASH:=skip
+2 -1
View File
@@ -1,5 +1,6 @@
config kaiplus config kaiplus
option 'enabled' '0' option 'enabled' '0'
option 'data_dir' '' option 'data_dir' ''
option 'port' '8198' option 'port' '8189'
option 'base_path' '/apps/kaiplus/'
option 'system_role' 'istoreos' option 'system_role' 'istoreos'
+3 -1
View File
@@ -6,7 +6,8 @@ USE_PROCD=1
get_config() { get_config() {
config_get_bool enabled "$1" enabled 1 config_get_bool enabled "$1" enabled 1
config_get data_dir "$1" data_dir "" 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" 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 --data-dir "$data_dir"
procd_append_param command --static-dir /usr/share/kaiplus/www procd_append_param command --static-dir /usr/share/kaiplus/www
procd_append_param command --defaults-dir /usr/share/kaiplus/defaults 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_append_param command --system-role "$system_role"
procd_set_param stdout 1 procd_set_param stdout 1
procd_set_param stderr 1 procd_set_param stderr 1
+7 -7
View File
@@ -10,9 +10,9 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_LINKEASE:=$(ARCH) PKG_ARCH_LINKEASE:=$(ARCH)
PKG_NAME:=linkease PKG_NAME:=linkease
# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable
PKG_SOURCE_DATE:=1.7.5 PKG_SOURCE_DATE:=1.7.5
PKG_RELEASE:=1 PKG_RELEASE:=2
ARCH_HEXCODE:= ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64) ifeq ($(ARCH),x86_64)
ARCH_HEXCODE=8664 ARCH_HEXCODE=8664
@@ -23,11 +23,11 @@ ARCH_HEXCODE=aa32
else ifeq ($(ARCH),mipsel) else ifeq ($(ARCH),mipsel)
ARCH_HEXCODE=1b0c ARCH_HEXCODE=1b0c
endif 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_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_SOURCE_DATE)
PKG_BUILD_PARALLEL:=1 PKG_BUILD_PARALLEL:=1
@@ -40,7 +40,7 @@ define Package/$(PKG_NAME)
CATEGORY:=Network CATEGORY:=Network
SUBMENU:=Web Servers/Proxies SUBMENU:=Web Servers/Proxies
TITLE:=LinkEase - the file cloud TITLE:=LinkEase - the file cloud
DEPENDS:=@(arm||x86_64||aarch64) +linkmount DEPENDS:=@(arm||x86_64||aarch64)
PKGARCH:=all PKGARCH:=all
URL:=https://www.linkease.com/ URL:=https://www.linkease.com/
endef endef
+2 -4
View File
@@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
source /lib/functions.sh . /lib/functions.sh
case "$1" in case "$1" in
save) save)
@@ -40,7 +40,6 @@ case "$1" in
config_get PUB_DIR main pub_dir "" config_get PUB_DIR main pub_dir ""
config_get DL_DIR main dl_dir "" config_get DL_DIR main dl_dir ""
config_get TMP_DIR main tmp_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 if [ "$ROOT_DIR" = "$MAIN_DIR" ]; then
exit 0 exit 0
fi 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 exit 1
esac esac
+1
View File
@@ -1,3 +1,4 @@
config linkease config linkease
option port '8897' option port '8897'
option enabled '1' option enabled '1'
option allowPublic '0'
Executable → Regular
+33 -9
View File
@@ -3,24 +3,48 @@
START=99 START=99
USE_PROCD=1 USE_PROCD=1
PROG=/usr/sbin/linkease
LOCAL_API=/var/run/linkease.sock
get_config() { get_config() {
config_get_bool enabled $1 enabled 1 config_get_bool enabled "$1" enabled 1
config_get_bool logger $1 logger config_get_bool logger "$1" logger 0
config_get_bool allowPublic $1 allowPublic config_get_bool allowPublic "$1" allowPublic 0
config_get port $1 port 8897 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() { start_service() {
config_load linkease config_load linkease
config_foreach get_config 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_open_instance
procd_set_param limits nofile="65535 65535" procd_set_param limits nofile="65535 65535"
procd_set_param command /usr/sbin/linkease procd_set_param command "$PROG"
[ -n "$port" ] && procd_append_param command --deviceAddr ":$port" --localApi /var/run/linkease.sock procd_append_param command --deviceAddr ":$port" --localApi "$LOCAL_API"
[ "$allowPublic" == 1 ] && procd_append_param command --allowPublic [ "$allowPublic" = "1" ] && procd_append_param command --allowPublic
[ "$logger" == 1 ] && procd_set_param stderr 1 [ "$logger" = "1" ] && procd_set_param stderr 1
procd_set_param respawn procd_set_param respawn
procd_close_instance procd_close_instance
} }
+32 -3
View File
@@ -8,23 +8,52 @@
EEOF 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 uci -q batch <<-EOF >/dev/null
delete ucitrack.@linkease[-1] delete ucitrack.@linkease[-1]
add ucitrack linkease add ucitrack linkease
set ucitrack.@linkease[-1].init=linkease set ucitrack.@linkease[-1].init=linkease
commit ucitrack commit ucitrack
EOF
if [ "$allow_public" = "1" ]; then
uci -q batch <<-EOF >/dev/null
delete firewall.linkease delete firewall.linkease
set firewall.linkease=rule set firewall.linkease=rule
set firewall.linkease.name="linkease" set firewall.linkease.name="linkease"
set firewall.linkease.target="ACCEPT" set firewall.linkease.target="ACCEPT"
set firewall.linkease.src="wan" set firewall.linkease.src="wan"
set firewall.linkease.proto="tcp" set firewall.linkease.proto="tcp"
set firewall.linkease.dest_port="8897" set firewall.linkease.dest_port="$port"
commit firewall commit firewall
EOF EOF
else
uci -q batch <<-EOF >/dev/null
delete firewall.linkease
commit firewall
EOF
fi
/etc/init.d/linkease enable /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 include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-amlogic PKG_NAME:=luci-app-amlogic
PKG_VERSION:=3.1.319 PKG_VERSION:=3.1.320
PKG_RELEASE:=16 PKG_RELEASE:=17
PKG_LICENSE:=GPL-2.0 License PKG_LICENSE:=GPL-2.0 License
PKG_MAINTAINER:=ophub <https://github.com/ophub/luci-app-amlogic> PKG_MAINTAINER:=ophub <https://github.com/ophub/luci-app-amlogic>
@@ -57,22 +57,24 @@ return view.extend({
handleSaveApply: null, handleSaveApply: null,
handleReset: null, handleReset: null,
// On load, call sync_menu to update sidebar menu flags from runtime platform detection. If the install menu becomes // On load, call sync_menu to update sidebar menu flags from runtime platform detection. If the sidebar nav is out of
// visible but is not in the current nav, reload once to pick up the new menu (guarded by #menu-synced hash). // sync with the server-side menu flags, reload once to pick up the new menu (guarded by #menu-synced hash).
load: function () { load: function () {
// Call sync_menu; if the install menu is now visible on the server but // Call sync_menu; reload once when the sidebar nav disagrees with the
// absent in the browser nav, reload once (guarded by #menu-synced hash). // server-side menu flags in either direction (guarded by #menu-synced hash).
const alreadyReloaded = window.location.hash === '#menu-synced'; const alreadyReloaded = window.location.hash === '#menu-synced';
const syncMenuPromise = callSyncMenu().then(function (res) { const syncMenuPromise = callSyncMenu().then(function (res) {
if (alreadyReloaded) return; if (alreadyReloaded || !res) return;
if (res && res.show_install === 'yes') { // Check if the sidebar navigation already contains the install link.
// Check if the sidebar navigation already contains the install link. const installLink = document.querySelector('a[href*="amlogic/install"]');
const installLink = document.querySelector('a[href*="amlogic/install"]'); // Menu became visible on the server but is absent in the browser nav.
if (!installLink) { const needShow = (res.show_install === 'yes' && !installLink);
// Server-side index cache updated; reload to pick up new nav. // Menu became hidden on the server but is still present in the browser nav.
window.location.replace(window.location.pathname + '#menu-synced'); const needHide = (res.show_install === 'no' && installLink);
window.location.reload(); 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 () {}); }).catch(function () {});
return Promise.all([callAuthor(), syncMenuPromise]).then(function (r) { return r[0]; }); 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 | \ SHOW_INSTALL=$(grep -E '^SHOW_INSTALL_MENU=' /etc/flippy-openwrt-release 2>/dev/null | \
awk -F= '{print $2}' | tr -d '"' | xargs) awk -F= '{print $2}' | tr -d '"' | xargs)
case "$PLATFORM" in # Detect whether the root fs is already on eMMC (mmcblk*p* with device/type == "MMC").
*amlogic*) MENU_INSTALL=yes ;; # Mirrors root_on_internal_storage() in luci.amlogic: all other boot media
*) [ "$SHOW_INSTALL" = "yes" ] && MENU_INSTALL=yes || MENU_INSTALL=no ;; # (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 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 case "$PLATFORM" in
*qemu*) MENU_ARMCPU=no ;; *qemu*) MENU_ARMCPU=no ;;
*) MENU_ARMCPU=yes ;; *) MENU_ARMCPU=yes ;;
+4 -4
View File
@@ -1,7 +1,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"PO-Revision-Date: 2026-04-24 15:14+0000\n" "PO-Revision-Date: 2026-07-03 15:29+0000\n"
"Last-Translator: \"د.عبدالعزيز الجهني\" <myzezo@gmail.com>\n" "Last-Translator: Develper openmn <devopenm@proton.me>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Arabic <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsddns/ar/>\n" "luciapplicationsddns/ar/>\n"
"Language: ar\n" "Language: ar\n"
@@ -9,7 +9,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "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" "&& 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 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:423
msgid "\"../\" not allowed in path for Security Reason." 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 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:532
msgid "Cancel" msgid "Cancel"
msgstr "الغاء" msgstr "إلغاء"
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:981 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:981
msgid "Check Interval" msgid "Check Interval"
+5 -5
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: luci-app-ddns 2.4.0-1\n" "Project-Id-Version: luci-app-ddns 2.4.0-1\n"
"POT-Creation-Date: 2016-01-30 11:07+0100\n" "POT-Creation-Date: 2016-01-30 11:07+0100\n"
"PO-Revision-Date: 2026-04-18 17:10+0000\n" "PO-Revision-Date: 2026-06-26 11:18+0000\n"
"Last-Translator: Franco Castillo <castillofrancodamian@gmail.com>\n" "Last-Translator: apemay <apemay.dev@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Spanish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsddns/es/>\n" "luciapplicationsddns/es/>\n"
"Language: es\n" "Language: es\n"
@@ -11,7 +11,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:423
msgid "\"../\" not allowed in path for Security Reason." 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 " "Source URL for services file. Defaults to the master openwrt ddns package "
"repo." "repo."
msgstr "" msgstr ""
"URL utilizada para descargar el archivo de servicios. De forma " "URL de origen del archivo de servicios. De forma predeterminada, es el "
"predeterminada, es el repositorio principal del paquete ddns de openwrt ." "repositorio principal del paquete DDNS de OpenWrt."
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:201 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:201
msgid "Start DDNS" msgid "Start DDNS"
+4 -5
View File
@@ -2,9 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: LuCI: ddns\n" "Project-Id-Version: LuCI: ddns\n"
"POT-Creation-Date: 2017-10-17 21:00+0300\n" "POT-Creation-Date: 2017-10-17 21:00+0300\n"
"PO-Revision-Date: 2026-04-25 09:44+0000\n" "PO-Revision-Date: 2026-07-03 15:28+0000\n"
"Last-Translator: SnIPeRSnIPeR " "Last-Translator: chigelo <chigelo@gmail.com>\n"
"<snipersniper@users.noreply.hosted.weblate.org>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsddns/ru/>\n" "luciapplicationsddns/ru/>\n"
"Language: ru\n" "Language: ru\n"
@@ -13,7 +12,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "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" "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: Это технический перевод, не дословный. Главное-удобный русский " "Project-Info: Это технический перевод, не дословный. Главное-удобный русский "
"интерфейс, все проверялось в графическом режиме, совместим с другими apps\n" "интерфейс, все проверялось в графическом режиме, совместим с другими 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:491
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1124 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1124
msgid "Name" msgid "Name"
msgstr "Название" msgstr "Имя"
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:333 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:333
msgid "" msgid ""
+4 -4
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: luci-app-ddns 2.4.0-1\n" "Project-Id-Version: luci-app-ddns 2.4.0-1\n"
"POT-Creation-Date: 2016-01-30 11:07+0100\n" "POT-Creation-Date: 2016-01-30 11:07+0100\n"
"PO-Revision-Date: 2026-05-12 09:07+0000\n" "PO-Revision-Date: 2026-07-08 15:16+0000\n"
"Last-Translator: Oleksandr Yurov <oyurov@icloud.com>\n" "Last-Translator: Dan <jonweblin2205@protonmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsddns/uk/>\n" "luciapplicationsddns/uk/>\n"
"Language: uk\n" "Language: uk\n"
@@ -12,7 +12,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "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" "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 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:423
msgid "\"../\" not allowed in path for Security Reason." 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:491
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1124 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:1124
msgid "Name" msgid "Name"
msgstr "Імʼя" msgstr "Назва"
#: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:333 #: applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js:333
msgid "" msgid ""
@@ -228,7 +228,7 @@ const methods = {
const hasWget = () => { const hasWget = () => {
return cache.has_wget ??= hasCommand('wget'); return cache.has_wget ??= hasCommand('wget');
} };
const hasWgetSsl = () => { const hasWgetSsl = () => {
return cache.has_wgetssl ??= hasWget() && system(`wget 2>&1 | grep -iqF 'https'`) == 0 ? true : false; return cache.has_wgetssl ??= hasWget() && system(`wget 2>&1 | grep -iqF 'https'`) == 0 ? true : false;
+4 -4
View File
@@ -1,7 +1,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"PO-Revision-Date: 2026-04-24 15:13+0000\n" "PO-Revision-Date: 2026-07-03 15:29+0000\n"
"Last-Translator: \"د.عبدالعزيز الجهني\" <myzezo@gmail.com>\n" "Last-Translator: Develper openmn <devopenm@proton.me>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Arabic <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsdockerman/ar/>\n" "luciapplicationsdockerman/ar/>\n"
"Language: ar\n" "Language: ar\n"
@@ -9,7 +9,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "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" "&& 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 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505
msgid "/mnt/path" 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.js:1933
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:517 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:517
msgid "Cancel" msgid "Cancel"
msgstr "الغاء" msgstr "إلغاء"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:35 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:35
msgid "Causes errors when a chosen API > Docker endpoint API support." msgid "Causes errors when a chosen API > Docker endpoint API support."
+3 -3
View File
@@ -1,6 +1,6 @@
msgid "" msgid ""
msgstr "" 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" "Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Czech <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsdockerman/cs/>\n" "luciapplicationsdockerman/cs/>\n"
@@ -8,7 +8,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\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 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505
msgid "/mnt/path" msgid "/mnt/path"
@@ -2195,7 +2195,7 @@ msgstr "obraz"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:755 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:755
msgid "json-file" msgid "json-file"
msgstr "" msgstr "json soubor"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:336 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:336
msgid "kill" msgid "kill"
+5 -5
View File
@@ -1,6 +1,6 @@
msgid "" msgid ""
msgstr "" 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" "Last-Translator: Hyeonjeong Lee <h9101654@gmail.com>\n"
"Language-Team: Korean <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Korean <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsdockerman/ko/>\n" "luciapplicationsdockerman/ko/>\n"
@@ -8,7 +8,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\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 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505
msgid "/mnt/path" msgid "/mnt/path"
@@ -1376,7 +1376,7 @@ msgstr ""
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:351 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:351
msgid "Open in browser" msgid "Open in browser"
msgstr "" msgstr "브라우저에서 열기"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:899 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:899
msgid "Operation failed" msgid "Operation failed"
@@ -1598,11 +1598,11 @@ msgstr ""
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:535 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:535
msgid "Remove tag" msgid "Remove tag"
msgstr "" msgstr "태그 제거"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:625 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:625
msgid "Repository" msgid "Repository"
msgstr "" msgstr "저장소"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:658 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/images.js:658
msgid "Repository cannot be empty" msgid "Repository cannot be empty"
+17 -18
View File
@@ -1,8 +1,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"PO-Revision-Date: 2026-04-25 12:14+0000\n" "PO-Revision-Date: 2026-07-05 14:58+0000\n"
"Last-Translator: SnIPeRSnIPeR " "Last-Translator: Deni Dgabiev <ghostcraft412@gmail.com>\n"
"<snipersniper@users.noreply.hosted.weblate.org>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsdockerman/ru/>\n" "luciapplicationsdockerman/ru/>\n"
"Language: ru\n" "Language: ru\n"
@@ -10,7 +9,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "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" "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 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505
msgid "/mnt/path" msgid "/mnt/path"
@@ -67,11 +66,11 @@ msgstr "Дополнительно"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:590 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:590
msgid "Aliases" msgid "Aliases"
msgstr "" msgstr "Псевдонимы"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1923 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1923
msgid "Aliases (optional):" msgid "Aliases (optional):"
msgstr "" msgstr "Псевдонимы (опционально):"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:342 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/events.js:342
msgid "All Subtypes" msgid "All Subtypes"
@@ -489,7 +488,7 @@ msgstr "Отладка"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:753 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:753
msgid "Default (daemon)" msgid "Default (daemon)"
msgstr "" msgstr "По умолчанию (демон)"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:57 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/configuration.js:57
msgid "Default bridge" msgid "Default bridge"
@@ -892,7 +891,7 @@ msgstr "IPv4-адрес"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1919 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1919
msgid "IPv4 Address (optional):" msgid "IPv4 Address (optional):"
msgstr "" msgstr "IPv4-адрес (опционально):"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:64 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:64
msgid "IPv6" msgid "IPv6"
@@ -906,7 +905,7 @@ msgstr "IPv6‑адрес"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1921 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1921
msgid "IPv6 Address (optional):" 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/container.js:586
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network_new.js:134 #: 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 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:751
msgid "Log driver" msgid "Log driver"
msgstr "" msgstr "Драйвер логирования"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:745 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:745
msgid "Log driver options" 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:121
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:241 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:241
msgid "Name" msgid "Name"
msgstr "Название" msgstr "Имя"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:213 #: 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" 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 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:282
msgid "Network Aliases" msgid "Network Aliases"
msgstr "" msgstr "Сетевые псевдонимы"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:100 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/network.js:100
msgid "Network Configurations" msgid "Network Configurations"
@@ -1401,7 +1400,7 @@ msgstr "Только для пользовательских сетей"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:351 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:351
msgid "Open in browser" msgid "Open in browser"
msgstr "" msgstr "Открыть в браузере"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:899 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:899
msgid "Operation failed" 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:354
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1801 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container.js:1801
msgid "Start" msgid "Start"
msgstr "Запустить" msgstr "Начало"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:208 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/containers.js:208
msgid "Start this container" msgid "Start this container"
@@ -2200,7 +2199,7 @@ msgstr "образ"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:755 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:755
msgid "json-file" msgid "json-file"
msgstr "" msgstr "json-файл"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:336 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:336
msgid "kill" msgid "kill"
@@ -2212,7 +2211,7 @@ msgstr "загрузить"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:754 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:754
msgid "local" msgid "local"
msgstr "" msgstr "локальный"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:383 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:383
msgid "mount" msgid "mount"
@@ -2228,7 +2227,7 @@ msgstr "узел"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:757 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:757
msgid "none" msgid "none"
msgstr "" msgstr "отсутствует"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:337 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:337
msgid "oom" msgid "oom"
@@ -2297,7 +2296,7 @@ msgstr "остановить"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:756 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:756
msgid "syslog" msgid "syslog"
msgstr "" msgstr "syslog"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:364 #: applications/luci-app-dockerman/htdocs/luci-static/resources/dockerman/common.js:364
msgid "tag" msgid "tag"
+3 -3
View File
@@ -1,6 +1,6 @@
msgid "" msgid ""
msgstr "" 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" "Last-Translator: Dan <jonweblin2205@protonmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsdockerman/uk/>\n" "luciapplicationsdockerman/uk/>\n"
@@ -9,7 +9,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "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" "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 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:505
msgid "/mnt/path" 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:121
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:241 #: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/volumes.js:241
msgid "Name" msgid "Name"
msgstr "Імʼя" msgstr "Назва"
#: applications/luci-app-dockerman/htdocs/luci-static/resources/view/dockerman/container_new.js:213 #: 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" 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 LUCI_TITLE:=KaiPlus
PKG_VERSION:=1.0.0 PKG_VERSION:=1.0.0
PKG_RELEASE:=1 PKG_RELEASE:=2
LUCI_DEPENDS:=+kaiplus +luci-compat LUCI_DEPENDS:=+kaiplus +luci-compat
LUCI_MINIFY_CSS:=0 LUCI_MINIFY_CSS:=0
LUCI_MINIFY_JS:=0 LUCI_MINIFY_JS:=0
@@ -15,10 +15,12 @@ end
function kaiplus_status() function kaiplus_status()
local sys = require "luci.sys" local sys = require "luci.sys"
local uci = require "luci.model.uci".cursor() 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 = { local status = {
running = (sys.call("pidof kaiplus_bin >/dev/null") == 0), 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.prepare_content("application/json")
luci.http.write_json(status) 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:section(SimpleSection).template = "kaiplus/kaiplus_status"
m.on_after_commit = function(self) 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 end
s = m:section(TypedSection, "kaiplus", translate("Global settings")) s = m:section(TypedSection, "kaiplus", translate("Global settings"))
@@ -29,7 +32,7 @@ end
data_dir.default = default_path data_dir.default = default_path
local port = s:option(Value, "port", translate("Web port")) local port = s:option(Value, "port", translate("Web port"))
port.default = "8198" port.default = "8189"
port.rmempty = false port.rmempty = false
port.datatype = "port" port.datatype = "port"
port.description = translate("Port for the KaiPlus web service.") 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>'; el.innerHTML = '<br/><em style=\"color:red\"><%:The KaiPlus service is not running.%></em>';
} }
if (st.running) { 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>' 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 "" msgid ""
msgstr "" msgstr ""
"PO-Revision-Date: 2026-01-21 18:32+0000\n" "PO-Revision-Date: 2026-07-23 06:18+0000\n"
"Last-Translator: niky1987 <niky1987@libero.it>\n" "Last-Translator: Random <random-r@users.noreply.hosted.weblate.org>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Italian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsksmbd/it/>\n" "luciapplicationsksmbd/it/>\n"
"Language: it\n" "Language: it\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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 #: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:58
msgid "Add optional guest access to IPC$ share, disabled by default" 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 #: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:109
msgid "Inherit owner" msgid "Inherit owner"
msgstr "" msgstr "Eredita il proprietario"
#: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:36 #: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:36
msgid "Interface" msgid "Interface"
+4 -5
View File
@@ -1,8 +1,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"PO-Revision-Date: 2026-04-25 12:14+0000\n" "PO-Revision-Date: 2026-07-03 15:29+0000\n"
"Last-Translator: SnIPeRSnIPeR " "Last-Translator: chigelo <chigelo@gmail.com>\n"
"<snipersniper@users.noreply.hosted.weblate.org>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsksmbd/ru/>\n" "luciapplicationsksmbd/ru/>\n"
"Language: ru\n" "Language: ru\n"
@@ -10,7 +9,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "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" "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 #: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:58
msgid "Add optional guest access to IPC$ share, disabled by default" 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 #: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:81
msgid "Name" msgid "Name"
msgstr "Название" msgstr "Имя"
#: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:22 #: 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 #: applications/luci-app-ksmbd/root/usr/share/luci/menu.d/luci-app-ksmbd.json:3
+4 -4
View File
@@ -1,7 +1,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"PO-Revision-Date: 2026-05-12 09:06+0000\n" "PO-Revision-Date: 2026-07-08 15:16+0000\n"
"Last-Translator: Oleksandr Yurov <oyurov@icloud.com>\n" "Last-Translator: Dan <jonweblin2205@protonmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsksmbd/uk/>\n" "luciapplicationsksmbd/uk/>\n"
"Language: uk\n" "Language: uk\n"
@@ -9,7 +9,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "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" "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 #: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:58
msgid "Add optional guest access to IPC$ share, disabled by default" 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 #: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:81
msgid "Name" msgid "Name"
msgstr "Імʼя" msgstr "Назва"
#: applications/luci-app-ksmbd/htdocs/luci-static/resources/view/ksmbd.js:22 #: 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 #: 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 include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for linkease LUCI_TITLE:=LuCI support for linkease
LUCI_DEPENDS:=+linkease LUCI_DEPENDS:=+luci-lib-linkeasefile
LUCI_PKGARCH:=all 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 MUST be empty for luci.mk
PKG_RELEASE:=1 PKG_RELEASE:=2
LUCI_MINIFY_CSS:=0 LUCI_MINIFY_CSS:=0
LUCI_MINIFY_JS:=0 LUCI_MINIFY_JS:=0
@@ -9,7 +9,6 @@ function index()
entry({"admin", "services", "linkease_status"}, call("linkease_status")) entry({"admin", "services", "linkease_status"}, call("linkease_status"))
entry({"admin", "services", "linkease", "file"}, call("linkease_file_template")).leaf = true
end end
@@ -27,13 +26,3 @@ function linkease_status()
luci.http.write_json(status) luci.http.write_json(status)
end 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_NAME:=luci-app-passwall
PKG_VERSION:=26.7.24 PKG_VERSION:=26.7.24
PKG_RELEASE:=194 PKG_RELEASE:=195
PKG_PO_VERSION:=$(PKG_VERSION) PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \ 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 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 else
config_file="acl/${tcp_node}_SOCKS_${socks_port}.json" 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 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
# local log_file=$TMP_ACL_PATH/ipt2socks_${tcp_node}_${redir_port}.log # log_file=$TMP_ACL_PATH/ipt2socks_${tcp_node}_${redir_port}.log
# log_file="/dev/null" 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 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 fi
run_dns ${_dns_port} 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 run_${type} flag=$udp_node node=$udp_node udp_redir_port=$redir_port config_file=$config_file log_file=$log_file loglevel=$loglevel
else else
config_file="acl/${udp_node}_SOCKS_${socks_port}.json" 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 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
# local log_file=$TMP_ACL_PATH/ipt2socks_${udp_node}_${redir_port}.log # log_file=$TMP_ACL_PATH/ipt2socks_${udp_node}_${redir_port}.log
# log_file="/dev/null" 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 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
fi fi
@@ -476,7 +476,7 @@ ln_run() {
fi fi
#echo "${file_func} $*" >&2 #echo "${file_func} $*" >&2
[ -n "${file_func}" ] || echolog " - 找不到 ${ln_name},无法启动..." [ -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 persist_log_path=$(config_t_get global persist_log_path)
local sys_log=$(config_t_get global sys_log "0") 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_NAME:=luci-app-qosmate
PKG_VERSION:=1.0.14 PKG_VERSION:=1.0.14
PKG_RELEASE:=2 PKG_RELEASE:=3
PKG_MAINTAINER:=Markus Hütter <mh@hudra.net> PKG_MAINTAINER:=Markus Hütter <mh@hudra.net>
PKG_LICENSE:=GPL-3.0-or-later PKG_LICENSE:=GPL-3.0-or-later
@@ -10,6 +10,14 @@
function addRelevanceInfo(description, settingName, rootQdisc) { function addRelevanceInfo(description, settingName, rootQdisc) {
var isRelevant = true; var isRelevant = true;
var note = ''; 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 // Check basic ROOT_QDISC relevance
if (rootQdisc !== 'cake' && rootQdisc !== 'hybrid') { if (rootQdisc !== 'cake' && rootQdisc !== 'hybrid') {
@@ -7,7 +7,6 @@
'require fs'; 'require fs';
'require poll'; 'require poll';
'require tools.widgets as widgets'; 'require tools.widgets as widgets';
const UI_VERSION = '1.2.0'; const UI_VERSION = '1.2.0';
const UI_UPD_CHANNEL = 'release'; const UI_UPD_CHANNEL = 'release';
@@ -554,7 +553,7 @@ return view.extend({
} }
statusHtml.appendChild( 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', { E('span', {
'style': 'color: ' + color + '; font-size: 15px; font-weight: bold; min-width: 20px;' 'style': 'color: ' + color + '; font-size: 15px; font-weight: bold; min-width: 20px;'
}, icon), }, icon),
@@ -780,11 +779,7 @@ return view.extend({
opt.validate = function(section_id, value) { opt.validate = function(section_id, value) {
if (value === '' || value === null) return true; if (value === '' || value === null) return true;
if (!/^\d+$/.test(value)) return _('Must be a non-negative integer or empty'); if (!/^\d+$/.test(value)) return _('Must be a non-negative integer or empty');
var intValue = parseInt(value, 10); // 0 is valid for every qdisc: it disables shaping for that direction
var rootQdisc = this.section.formvalue(section_id, 'ROOT_QDISC');
if (intValue === 0 && rootQdisc === 'hfsc') {
return _('Value must be greater than 0 for HFSC');
}
return true; return true;
}; };
} }
@@ -797,8 +792,8 @@ return view.extend({
o.editable = true; o.editable = true;
o.default = wanInterface; o.default = wanInterface;
createOption('DOWNRATE', _('Download Rate (kbps)'), _('Set the download rate in kbps'), _('Default: 90000'), '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'), _('Default: 45000'), '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 to get QDisc description based on value
function getQdiscDescriptionForValue(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 // Warning for bandwidth ratio
o = s_basic.option(form.DummyValue, '_ratio_warning', _('Bandwidth Ratio Warning')); o = s_basic.option(form.DummyValue, '_ratio_warning', _('Bandwidth Ratio Warning'));
o.rawhtml = true; o.rawhtml = true;
@@ -1492,6 +1492,21 @@ return view.extend({
infoContainer.appendChild(row); 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 // Add CAKE-specific or HFSC-specific info
if (qosStats.root_qdisc === 'cake') { if (qosStats.root_qdisc === 'cake') {
if (qosStats.priority_queue_ingress) { if (qosStats.priority_queue_ingress) {
+12 -10
View File
@@ -3,8 +3,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-05-19 19:36+0200\n" "POT-Creation-Date: 2009-05-19 19:36+0200\n"
"PO-Revision-Date: 2025-11-28 22:04+0000\n" "PO-Revision-Date: 2026-07-23 06:18+0000\n"
"Last-Translator: niky1987 <niky1987@libero.it>\n" "Last-Translator: Random <random-r@users.noreply.hosted.weblate.org>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Italian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationssamba4/it/>\n" "luciapplicationssamba4/it/>\n"
"Language: it\n" "Language: it\n"
@@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:120
msgid "Allow guests" 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 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:71
msgid "Disable Netbios" msgid "Disable Netbios"
msgstr "" msgstr "Disabilita Netbios"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:77 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:77
msgid "Disable Winbind" msgid "Disable Winbind"
msgstr "" msgstr "Disabilita Winbind"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:32 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:32
msgid "Edit Template" msgid "Edit Template"
@@ -81,7 +81,7 @@ msgstr ""
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:64 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:64
msgid "Enable macOS compatible shares" msgid "Enable macOS compatible shares"
msgstr "" msgstr "Abilita condivisioni compatibili con macOS"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:58 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:58
msgid "" msgid ""
@@ -95,6 +95,8 @@ msgid ""
"Enables Apple's AAPL extension globally and adds macOS compatibility options " "Enables Apple's AAPL extension globally and adds macOS compatibility options "
"to all shares." "to all shares."
msgstr "" 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 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:115
msgid "Force Root" msgid "Force Root"
@@ -114,11 +116,11 @@ msgstr ""
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:126 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:126
msgid "Guests only" msgid "Guests only"
msgstr "" msgstr "Solo ospiti"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:131 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:131
msgid "Inherit owner" msgid "Inherit owner"
msgstr "" msgstr "Eredita il proprietario"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:34 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:34
msgid "Interface" msgid "Interface"
@@ -177,11 +179,11 @@ msgstr ""
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:153 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:153
msgid "Time-machine size in GB" 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 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:148
msgid "Vfs objects" msgid "Vfs objects"
msgstr "" msgstr "Oggetti Vfs"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:51 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:51
msgid "Workgroup" msgid "Workgroup"
+4 -5
View File
@@ -2,9 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: LuCI: samba\n" "Project-Id-Version: LuCI: samba\n"
"POT-Creation-Date: 2009-05-19 19:36+0200\n" "POT-Creation-Date: 2009-05-19 19:36+0200\n"
"PO-Revision-Date: 2026-04-25 12:14+0000\n" "PO-Revision-Date: 2026-07-03 15:28+0000\n"
"Last-Translator: SnIPeRSnIPeR " "Last-Translator: chigelo <chigelo@gmail.com>\n"
"<snipersniper@users.noreply.hosted.weblate.org>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationssamba4/ru/>\n" "luciapplicationssamba4/ru/>\n"
"Language: ru\n" "Language: ru\n"
@@ -13,7 +12,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "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" "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: Это технический перевод, не дословный. Главное-удобный русский " "Project-Info: Это технический перевод, не дословный. Главное-удобный русский "
"интерфейс, все проверялось в графическом режиме, совместим с другими apps\n" "интерфейс, все проверялось в графическом режиме, совместим с другими apps\n"
@@ -139,7 +138,7 @@ msgstr "Слушать только на данном интерфейсе ил
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:98 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:98
msgid "Name" msgid "Name"
msgstr "Название" msgstr "Имя"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:23 #: 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 #: applications/luci-app-samba4/root/usr/share/luci/menu.d/luci-app-samba4.json:3
+3 -3
View File
@@ -1,7 +1,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "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" "Last-Translator: Dan <jonweblin2205@protonmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationssamba4/uk/>\n" "luciapplicationssamba4/uk/>\n"
@@ -11,7 +11,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "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" "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 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:120
msgid "Allow guests" msgid "Allow guests"
@@ -136,7 +136,7 @@ msgstr ""
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:98 #: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:98
msgid "Name" msgid "Name"
msgstr "Імʼя" msgstr "Назва"
#: applications/luci-app-samba4/htdocs/luci-static/resources/view/samba4.js:23 #: 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 #: 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_LICENSE:=GPL-3.0-or-later
PKG_MAINTAINER:=Nick Peng <pymumu@gmail.com> PKG_MAINTAINER:=Nick Peng <pymumu@gmail.com>
PKG_VERSION:=1.2025.47.2 PKG_VERSION:=1.2025.47.2
PKG_RELEASE:=10 PKG_RELEASE:=11
LUCI_TITLE:=LuCI for smartdns LUCI_TITLE:=LuCI for smartdns
LUCI_DESCRIPTION:=Provides Luci for smartdns LUCI_DESCRIPTION:=Provides Luci for smartdns
+16 -17
View File
@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"POT-Creation-Date: 2020-07-02 17:20-0300\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" "Last-Translator: apemay <apemay.dev@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Spanish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationssmartdns/es/>\n" "luciapplicationssmartdns/es/>\n"
@@ -170,7 +170,7 @@ msgstr "Descripción"
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:75 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:75
msgid "Dnsmasq Forwarded To Smartdns Failure" 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 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:718
msgid "Do not check certificate." msgid "Do not check certificate."
@@ -419,8 +419,8 @@ msgid ""
"Include other config files from /etc/smartdns/conf.d or custom path, can be " "Include other config files from /etc/smartdns/conf.d or custom path, can be "
"downloaded from the download page." "downloaded from the download page."
msgstr "" msgstr ""
"Incluye otros archivos de configuración desde /etc/smartdns/conf.d o una " "Incluir otros archivos de configuración desde /etc/smartdns/conf.d o una "
"ruta personalizada, se puede obtener desde la página de descarga." "ruta personalizada. Se pueden descargar desde la página de descargas."
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:282 #: 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." 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 " "SmartDNS is a local high-performance DNS server, supports finding fastest "
"IP, supports ad filtering, and supports avoiding DNS poisoning." "IP, supports ad filtering, and supports avoiding DNS poisoning."
msgstr "" msgstr ""
"SmartDNS es un servidor DNS local de alto rendimiento, admite la búsqueda de " "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 " "la IP más rápida, el filtrado de anuncios y evita el envenenamiento de DNS."
"de DNS."
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1141 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1141
msgid "SmartDNS official website" 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 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:376
msgid "Smartdns local server port" 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 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:153
msgid "" msgid ""
@@ -755,18 +754,18 @@ msgid ""
"Smartdns response mode, First Ping: return the first ping IP, Fastest IP: " "Smartdns response mode, First Ping: return the first ping IP, Fastest IP: "
"return the fastest IP, Fastest Response: return the fastest DNS response." "return the fastest IP, Fastest Response: return the fastest DNS response."
msgstr "" msgstr ""
"Modo de respuesta de SmartDNS, Primer Ping: devuelve la primera IP que " "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 " "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." "rápida: devuelve la respuesta DNS más rápida."
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:146 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:146
msgid "Smartdns server name" 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:168
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1015 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1015
msgid "Smartdns speed check mode." 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 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:1118
msgid "" 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 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:507
msgid "Upload domain list file to /etc/smartdns/domain-set" 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:891
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:991 #: 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 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:500
msgid "Upload smartdns config file to /etc/smartdns/conf.d" 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 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:630
msgid "Upstream Servers" msgid "Upstream Servers"
@@ -929,11 +928,11 @@ msgstr "abrir sitio web"
#: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:555 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:555
msgid "smartdns config (/etc/smartdns/conf.d)" 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 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:584
msgid "smartdns custom settings" 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 #: applications/luci-app-smartdns/htdocs/luci-static/resources/view/smartdns/smartdns.js:667
msgid "tcp" msgid "tcp"
+4 -4
View File
@@ -3,8 +3,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-05-19 19:36+0200\n" "POT-Creation-Date: 2009-05-19 19:36+0200\n"
"PO-Revision-Date: 2025-11-28 22:04+0000\n" "PO-Revision-Date: 2026-07-23 06:18+0000\n"
"Last-Translator: niky1987 <niky1987@libero.it>\n" "Last-Translator: Random <random-r@users.noreply.hosted.weblate.org>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Italian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsupnp/it/>\n" "luciapplicationsupnp/it/>\n"
"Language: it\n" "Language: it\n"
@@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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 #: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:180
msgctxt "" msgctxt ""
@@ -115,7 +115,7 @@ msgstr "Velocità di download"
#: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:144 #: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:144
msgid "Enable PCP/NAT-PMP protocols" 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 #: applications/luci-app-upnp/htdocs/luci-static/resources/view/upnp/upnp.js:141
msgid "Enable UPnP IGD protocol" msgid "Enable UPnP IGD protocol"
+17 -18
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"POT-Creation-Date: \n" "POT-Creation-Date: \n"
"PO-Revision-Date: 2026-03-29 19:31+0000\n" "PO-Revision-Date: 2026-06-27 12:01+0000\n"
"Last-Translator: Franco Castillo <castillofrancodamian@gmail.com>\n" "Last-Translator: apemay <apemay.dev@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Spanish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationswatchcat/es/>\n" "luciapplicationswatchcat/es/>\n"
"Language: es\n" "Language: es\n"
@@ -11,7 +11,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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 #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:94
msgid "" msgid ""
@@ -21,12 +21,12 @@ msgid ""
"to fail. Enter the number of seconds to wait for the soft reboot to fail or " "to fail. Enter the number of seconds to wait for the soft reboot to fail or "
"use 0 to disable the forced reboot delay." "use 0 to disable the forced reboot delay."
msgstr "" msgstr ""
"<i>Se aplica a los modos de Reinicio por Ping y Reinicio periódico</i><br /> " "<i>Se aplica a los modos Reinicio por ping y Reinicio periódico</i><br /> Al "
"Al reiniciar el enrutador, el servicio desencadenará un reinicio suave. " "reiniciar el enrutador, el servicio activará un reinicio suave. Introducir "
"Poniendo un valor distinto de cero aquí, se desencadenará un reinicio " "aquí un valor distinto de cero activará un reinicio completo retrasado si el "
"completo retrasado si falla el reinicio suave. Ponga el número de segundos " "reinicio suave falla. Introduzca el número de segundos que esperar a que "
"que hay que esperar a que el reinicio suave falle o use 0 para desactivar el " "falle el reinicio suave o use 0 para desactivar el retraso del reinicio "
"retraso de reinicio forzado." "forzado."
#: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:111 #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:111
msgid "" msgid ""
@@ -73,7 +73,7 @@ msgstr "Ajustes generales"
#: applications/luci-app-watchcat/root/usr/share/rpcd/acl.d/luci-app-watchcat.json:3 #: applications/luci-app-watchcat/root/usr/share/rpcd/acl.d/luci-app-watchcat.json:3
msgid "Grant access to LuCI app watchcat" 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 #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:12
msgid "" msgid ""
@@ -191,14 +191,13 @@ msgid ""
"time. <br /> Run Script: Run a script if a ping to a specified host fails " "time. <br /> Run Script: Run a script if a ping to a specified host fails "
"for a specified duration of time. <br />" "for a specified duration of time. <br />"
msgstr "" msgstr ""
"Reinicio de ping: si el ping al host especificado siempre falla dentro del " "Reinicio por ping: reinicia este dispositivo si un ping al host especificado "
"tiempo especificado, el dispositivo se reiniciará. <br />Reinicio " "falla durante un periodo de tiempo especificado. <br />Reinicio periódico: "
"programado: reinicia el dispositivo después de un intervalo de tiempo " "reinicia este dispositivo después de un intervalo de tiempo especificado. "
"específico. <br />Reiniciar interfaz: si dentro del tiempo especificado, el " "<br />Reiniciar interfaz: reinicia una interfaz de red si un ping al host "
"ping del host especificado siempre falla, reinicie la interfaz de red " "especificado falla durante un periodo de tiempo especificado. <br />Ejecutar "
"específica. <br />Ejecutar secuencia de comandos: si dentro del tiempo " "script: ejecuta un script si un ping al host especificado falla durante un "
"especificado, el ping del host especificado siempre falla, ejecute una " "periodo de tiempo especificado.<br />"
"secuencia de comandos específica. <br />"
#: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:29 #: applications/luci-app-watchcat/htdocs/luci-static/resources/view/watchcat.js:29
msgid "Restart Interface" 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 table = require "table"
local util = require "luci.util" local util = require "luci.util"
module("luci.controller.linkease_backend", package.seeall) module("luci.controller.linkease_file", package.seeall)
local BLOCKSIZE = 2048 local BLOCKSIZE = 2048
local LINKEASE_UNIX = "/var/run/linkease.sock" local LINKEASE_UNIX = "/var/run/linkease.sock"
function index() function index()
entry({"linkease"}, call("linkease_backend")).leaf=true 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 end
local function sink_socket(sock, io_err) 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_NAME:=qBittorrent-Enhanced-Edition
PKG_VERSION:=5.2.3.10 PKG_VERSION:=5.2.3.10
PKG_RELEASE:=12 PKG_RELEASE:=13
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/c0re100/qBittorrent-Enhanced-Edition/tar.gz/release-$(PKG_VERSION)? 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_CPE_ID:=cpe:/a:qbittorrent:qbittorrent
PKG_BUILD_DEPENDS:=qt6tools/host PKG_BUILD_DEPENDS:=qt6tools/host
PKG_BUILD_FLAGS:=no-mips16
PKG_BUILD_PARALLEL:=1 PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
+2 -1
View File
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=qBittorrent PKG_NAME:=qBittorrent
PKG_VERSION:=5.2.3 PKG_VERSION:=5.2.3
PKG_RELEASE:=4 PKG_RELEASE:=5
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/qbittorrent/qBittorrent/tar.gz/release-$(PKG_VERSION)? 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_CPE_ID:=cpe:/a:qbittorrent:qbittorrent
PKG_BUILD_DEPENDS:=qt6tools/host PKG_BUILD_DEPENDS:=qt6tools/host
PKG_BUILD_FLAGS:=no-mips16
PKG_BUILD_PARALLEL:=1 PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk 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