diff --git a/UnblockNeteaseMusic/Makefile b/UnblockNeteaseMusic/Makefile
index ad5a4ed4..44db4f3a 100644
--- a/UnblockNeteaseMusic/Makefile
+++ b/UnblockNeteaseMusic/Makefile
@@ -6,12 +6,12 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=UnblockNeteaseMusic
PKG_BASE_VERSION:=0.27.0
-PKG_RELEASE:=1
+PKG_RELEASE:=2
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/UnblockNeteaseMusic/server.git
PKG_SOURCE_DATE:=2022-10-09
-PKG_SOURCE_VERSION:=7aa15ad92d44159d8f1ffcd94338207947cdbff2
+PKG_SOURCE_VERSION:=39e21bfb4b7581f39785b190aeced201d23f0d41
PKG_MIRROR_HASH:=skip
PKG_VERSION:=$(PKG_BASE_VERSION)-$(PKG_SOURCE_DATE)-$(call version_abbrev,$(PKG_SOURCE_VERSION))
diff --git a/dae/Makefile b/dae/Makefile
index 0ad8d1ce..de1e9ad8 100644
--- a/dae/Makefile
+++ b/dae/Makefile
@@ -5,10 +5,10 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=dae
-PKG_VERSION:=2026.07.27
-PKG_RELEASE:=23
+PKG_VERSION:=2026.07.28
+PKG_RELEASE:=24
-PKG_SOURCE:=dae-src-2026.07.27-c8388938b36a.tar.gz
+PKG_SOURCE:=dae-src-2026.07.28-4cea31acd905.tar.gz
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/dae-src
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_HASH:=skip
diff --git a/daed/Makefile b/daed/Makefile
index b73c08c5..e1c7ca5d 100644
--- a/daed/Makefile
+++ b/daed/Makefile
@@ -5,10 +5,10 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=daed
-PKG_VERSION:=2026.07.27
-PKG_RELEASE:=31
+PKG_VERSION:=2026.07.28
+PKG_RELEASE:=32
-PKG_SOURCE:=daed-src-2026.07.27-ed986932608b.tar.gz
+PKG_SOURCE:=daed-src-2026.07.28-e4aa232d2993.tar.gz
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/daed-src
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_HASH:=skip
diff --git a/dnsproxy/Makefile b/dnsproxy/Makefile
index 7969d953..ebff35d7 100644
--- a/dnsproxy/Makefile
+++ b/dnsproxy/Makefile
@@ -5,8 +5,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=dnsproxy
-PKG_VERSION:=0.83.0
-PKG_RELEASE:=13
+PKG_VERSION:=0.83.1
+PKG_RELEASE:=14
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/AdguardTeam/dnsproxy/tar.gz/v$(PKG_VERSION)?
diff --git a/kaiplus/Makefile b/kaiplus/Makefile
index 70d2f29a..645aff3f 100644
--- a/kaiplus/Makefile
+++ b/kaiplus/Makefile
@@ -10,7 +10,7 @@ PKG_ARCH_kaiplus:=$(ARCH)
PKG_NAME:=kaiplus
PKG_VERSION:=1.0.5
-PKG_RELEASE:=2
+PKG_RELEASE:=3
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/kaiplus/
PKG_HASH:=skip
diff --git a/kaiplus/files/kaiplus.config b/kaiplus/files/kaiplus.config
index b9ddd2bf..d8169114 100644
--- a/kaiplus/files/kaiplus.config
+++ b/kaiplus/files/kaiplus.config
@@ -1,6 +1,5 @@
config kaiplus
option 'enabled' '0'
option 'data_dir' ''
- option 'port' '8189'
- option 'base_path' '/apps/kaiplus/'
+ option 'port' '8198'
option 'system_role' 'istoreos'
diff --git a/kaiplus/files/kaiplus.init b/kaiplus/files/kaiplus.init
index 96c05683..22200d2e 100644
--- a/kaiplus/files/kaiplus.init
+++ b/kaiplus/files/kaiplus.init
@@ -6,8 +6,7 @@ USE_PROCD=1
get_config() {
config_get_bool enabled "$1" enabled 1
config_get data_dir "$1" data_dir ""
- config_get port "$1" port "8189"
- config_get base_path "$1" base_path "/apps/kaiplus/"
+ config_get port "$1" port "8198"
config_get system_role "$1" system_role "istoreos"
}
@@ -62,7 +61,6 @@ start_service() {
procd_append_param command --data-dir "$data_dir"
procd_append_param command --static-dir /usr/share/kaiplus/www
procd_append_param command --defaults-dir /usr/share/kaiplus/defaults
- procd_append_param command --base-path "$base_path"
procd_append_param command --system-role "$system_role"
procd_set_param stdout 1
procd_set_param stderr 1
diff --git a/linkease/Makefile b/linkease/Makefile
index 582cb75c..dbbb0346 100644
--- a/linkease/Makefile
+++ b/linkease/Makefile
@@ -10,9 +10,9 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_LINKEASE:=$(ARCH)
PKG_NAME:=linkease
+# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable
PKG_SOURCE_DATE:=1.7.5
-PKG_RELEASE:=2
-
+PKG_RELEASE:=3
ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64)
ARCH_HEXCODE=8664
@@ -23,11 +23,11 @@ ARCH_HEXCODE=aa32
else ifeq ($(ARCH),mipsel)
ARCH_HEXCODE=1b0c
endif
-
PKG_SOURCE_VERSION:=$(ARCH_HEXCODE)
-PKG_SOURCE:=linkease-binary-$(PKG_SOURCE_DATE).tar.gz
-PKG_SOURCE_URL:=https://dl.istoreos.com/binary/LinkEase/LinuxStorage/
+PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_SOURCE_DATE).tar.gz
+PKG_SOURCE_URL:=http://dl.istoreos.com/binary/LinkEase/LinuxStorage/
PKG_HASH:=skip
+
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_SOURCE_DATE)
PKG_BUILD_PARALLEL:=1
@@ -40,7 +40,7 @@ define Package/$(PKG_NAME)
CATEGORY:=Network
SUBMENU:=Web Servers/Proxies
TITLE:=LinkEase - the file cloud
- DEPENDS:=@(arm||x86_64||aarch64)
+ DEPENDS:=@(arm||x86_64||aarch64) +linkmount
PKGARCH:=all
URL:=https://www.linkease.com/
endef
diff --git a/linkease/files/linkease-config.sh b/linkease/files/linkease-config.sh
old mode 100644
new mode 100755
index 62015a85..5427faa4
--- a/linkease/files/linkease-config.sh
+++ b/linkease/files/linkease-config.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-. /lib/functions.sh
+source /lib/functions.sh
case "$1" in
save)
@@ -40,6 +40,7 @@ case "$1" in
config_get PUB_DIR main pub_dir ""
config_get DL_DIR main dl_dir ""
config_get TMP_DIR main tmp_dir ""
+ # echo "$MAIN_DIR $CONF_DIR $PUB_DIR $DL_DIR $TMP_DIR"
if [ "$ROOT_DIR" = "$MAIN_DIR" ]; then
exit 0
fi
@@ -82,6 +83,7 @@ case "$1" in
;;
*)
- echo "Usage: $0 {save|load|local_save|local_load|status}"
+ echo "Usage: $0 {save|load|status}"
exit 1
esac
+
diff --git a/linkease/files/linkease.config b/linkease/files/linkease.config
index ee982437..5ece093b 100644
--- a/linkease/files/linkease.config
+++ b/linkease/files/linkease.config
@@ -1,4 +1,3 @@
config linkease
option port '8897'
option enabled '1'
- option allowPublic '0'
diff --git a/linkease/files/linkease.init b/linkease/files/linkease.init
old mode 100644
new mode 100755
index ef2cbf27..0c51d6cf
--- a/linkease/files/linkease.init
+++ b/linkease/files/linkease.init
@@ -3,48 +3,24 @@
START=99
USE_PROCD=1
-PROG=/usr/sbin/linkease
-LOCAL_API=/var/run/linkease.sock
-
get_config() {
- config_get_bool enabled "$1" enabled 1
- config_get_bool logger "$1" logger 0
- config_get_bool allowPublic "$1" allowPublic 0
- config_get port "$1" port 8897
-}
-
-stop_linkeaselite_runtime() {
- [ -x /etc/init.d/linkeaselite ] && /etc/init.d/linkeaselite stop >/dev/null 2>&1
- if uci -q get linkeaselite.@linkeaselite[0] >/dev/null 2>&1; then
- uci -q set linkeaselite.@linkeaselite[0].enabled="0"
- uci -q commit linkeaselite
- fi
-}
-
-stop_linkeasefull_runtime() {
- [ -x /etc/init.d/linkeasefull ] && /etc/init.d/linkeasefull stop >/dev/null 2>&1
- if uci -q get linkeasefull.@linkeasefull[0] >/dev/null 2>&1; then
- uci -q set linkeasefull.@linkeasefull[0].enabled="0"
- uci -q commit linkeasefull
- fi
+ config_get_bool enabled $1 enabled 1
+ config_get_bool logger $1 logger
+ config_get_bool allowPublic $1 allowPublic
+ config_get port $1 port 8897
}
start_service() {
config_load linkease
config_foreach get_config linkease
- [ "$enabled" != "1" ] && return 1
- [ -x "$PROG" ] || return 1
-
- stop_linkeaselite_runtime
- stop_linkeasefull_runtime
- rm -f "$LOCAL_API"
+ [ $enabled != 1 ] && return 1
procd_open_instance
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
- [ "$logger" = "1" ] && procd_set_param stderr 1
+ procd_set_param command /usr/sbin/linkease
+ [ -n "$port" ] && procd_append_param command --deviceAddr ":$port" --localApi /var/run/linkease.sock
+ [ "$allowPublic" == 1 ] && procd_append_param command --allowPublic
+ [ "$logger" == 1 ] && procd_set_param stderr 1
procd_set_param respawn
procd_close_instance
}
diff --git a/linkease/files/linkease.uci-default b/linkease/files/linkease.uci-default
index 225dd09e..873545db 100644
--- a/linkease/files/linkease.uci-default
+++ b/linkease/files/linkease.uci-default
@@ -8,52 +8,23 @@
EEOF
}
-if ! uci -q get linkease.@linkease[0] >/dev/null; then
- uci -q add linkease linkease >/dev/null
-fi
-
-set_default() {
- key="$1"
- value="$2"
- current="$(uci -q get "linkease.@linkease[0].$key" 2>/dev/null || true)"
- [ -n "$current" ] && return 0
- uci -q set "linkease.@linkease[0].$key=$value"
-}
-
-set_default enabled 1
-set_default port 8897
-set_default allowPublic 0
-uci -q commit linkease
-port="$(uci -q get linkease.@linkease[0].port 2>/dev/null || true)"
-[ -n "$port" ] || port=8897
-allow_public="$(uci -q get linkease.@linkease[0].allowPublic 2>/dev/null || true)"
-
uci -q batch <<-EOF >/dev/null
delete ucitrack.@linkease[-1]
add ucitrack linkease
set ucitrack.@linkease[-1].init=linkease
commit ucitrack
-EOF
-if [ "$allow_public" = "1" ]; then
- uci -q batch <<-EOF >/dev/null
delete firewall.linkease
set firewall.linkease=rule
set firewall.linkease.name="linkease"
set firewall.linkease.target="ACCEPT"
set firewall.linkease.src="wan"
set firewall.linkease.proto="tcp"
- set firewall.linkease.dest_port="$port"
+ set firewall.linkease.dest_port="8897"
commit firewall
EOF
-else
- uci -q batch <<-EOF >/dev/null
- delete firewall.linkease
- commit firewall
-EOF
-fi
/etc/init.d/linkease enable
-/etc/init.d/linkease restart
+/etc/init.d/linkease start
-exit 0
+exit 0
\ No newline at end of file
diff --git a/linkeasefull/Makefile b/linkeasefull/Makefile
deleted file mode 100644
index 2ffad84c..00000000
--- a/linkeasefull/Makefile
+++ /dev/null
@@ -1,76 +0,0 @@
-#
-# 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)))
diff --git a/linkeasefull/files/linkeasefull.config b/linkeasefull/files/linkeasefull.config
deleted file mode 100644
index b8fe9b57..00000000
--- a/linkeasefull/files/linkeasefull.config
+++ /dev/null
@@ -1,3 +0,0 @@
-config linkeasefull
- option enabled '1'
- option data_root_parent ''
diff --git a/linkeasefull/files/linkeasefull.init b/linkeasefull/files/linkeasefull.init
deleted file mode 100644
index 8c95e801..00000000
--- a/linkeasefull/files/linkeasefull.init
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/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"
-}
diff --git a/linkeasefull/files/linkeasefull.uci-default b/linkeasefull/files/linkeasefull.uci-default
deleted file mode 100644
index e178bf1e..00000000
--- a/linkeasefull/files/linkeasefull.uci-default
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/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
diff --git a/linkeaselite/Makefile b/linkeaselite/Makefile
deleted file mode 100644
index ee21775a..00000000
--- a/linkeaselite/Makefile
+++ /dev/null
@@ -1,75 +0,0 @@
-#
-# 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)))
diff --git a/linkeaselite/files/linkeaselite-config.sh b/linkeaselite/files/linkeaselite-config.sh
deleted file mode 100755
index 7dc6c7ae..00000000
--- a/linkeaselite/files/linkeaselite-config.sh
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/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
diff --git a/linkeaselite/files/linkeaselite.config b/linkeaselite/files/linkeaselite.config
deleted file mode 100644
index 1e610c0f..00000000
--- a/linkeaselite/files/linkeaselite.config
+++ /dev/null
@@ -1,4 +0,0 @@
-config linkeaselite
- option enabled '1'
- option port '8897'
- option allowPublic '0'
diff --git a/linkeaselite/files/linkeaselite.init b/linkeaselite/files/linkeaselite.init
deleted file mode 100755
index 276d6fd5..00000000
--- a/linkeaselite/files/linkeaselite.init
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/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"
-}
diff --git a/linkeaselite/files/linkeaselite.uci-default b/linkeaselite/files/linkeaselite.uci-default
deleted file mode 100644
index 6ebed20d..00000000
--- a/linkeaselite/files/linkeaselite.uci-default
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/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
diff --git a/linkmount/Makefile b/linkmount/Makefile
new file mode 100644
index 00000000..a6a3ec9c
--- /dev/null
+++ b/linkmount/Makefile
@@ -0,0 +1,63 @@
+#
+# 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:=3
+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)))
+
diff --git a/luci-app-kaiplus/Makefile b/luci-app-kaiplus/Makefile
index 1cd0a30f..23540bda 100644
--- a/luci-app-kaiplus/Makefile
+++ b/luci-app-kaiplus/Makefile
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=KaiPlus
PKG_VERSION:=1.0.0
-PKG_RELEASE:=2
+PKG_RELEASE:=3
LUCI_DEPENDS:=+kaiplus +luci-compat
LUCI_MINIFY_CSS:=0
LUCI_MINIFY_JS:=0
diff --git a/luci-app-kaiplus/luasrc/controller/kaiplus.lua b/luci-app-kaiplus/luasrc/controller/kaiplus.lua
index 9a0c080b..769bd805 100644
--- a/luci-app-kaiplus/luasrc/controller/kaiplus.lua
+++ b/luci-app-kaiplus/luasrc/controller/kaiplus.lua
@@ -15,12 +15,10 @@ end
function kaiplus_status()
local sys = require "luci.sys"
local uci = require "luci.model.uci".cursor()
- local port = uci:get_first("kaiplus", "kaiplus", "port", "8189")
- local base_path = uci:get_first("kaiplus", "kaiplus", "base_path", "/apps/kaiplus/")
+ local port = uci:get_first("kaiplus", "kaiplus", "port", "8198")
local status = {
running = (sys.call("pidof kaiplus_bin >/dev/null") == 0),
- port = port,
- base_path = base_path
+ port = port
}
luci.http.prepare_content("application/json")
luci.http.write_json(status)
diff --git a/luci-app-kaiplus/luasrc/model/cbi/kaiplus.lua b/luci-app-kaiplus/luasrc/model/cbi/kaiplus.lua
index 15a3a29d..91de5648 100644
--- a/luci-app-kaiplus/luasrc/model/cbi/kaiplus.lua
+++ b/luci-app-kaiplus/luasrc/model/cbi/kaiplus.lua
@@ -5,10 +5,7 @@ m = Map("kaiplus", translate("KaiPlus"), translate("KaiPlus is an AI workspace a
m:section(SimpleSection).template = "kaiplus/kaiplus_status"
m.on_after_commit = function(self)
- sys.call("/etc/init.d/kaiplus restart >/dev/null 2>&1")
- if sys.call("[ -x /etc/init.d/linkease ]") == 0 then
- sys.call("/etc/init.d/linkease restart >/dev/null 2>&1 &")
- end
+ sys.call("/etc/init.d/kaiplus restart >/dev/null 2>&1 &")
end
s = m:section(TypedSection, "kaiplus", translate("Global settings"))
@@ -32,7 +29,7 @@ end
data_dir.default = default_path
local port = s:option(Value, "port", translate("Web port"))
-port.default = "8189"
+port.default = "8198"
port.rmempty = false
port.datatype = "port"
port.description = translate("Port for the KaiPlus web service.")
diff --git a/luci-app-kaiplus/luasrc/view/kaiplus/kaiplus_status.htm b/luci-app-kaiplus/luasrc/view/kaiplus/kaiplus_status.htm
index 7fb4da6f..147688eb 100644
--- a/luci-app-kaiplus/luasrc/view/kaiplus/kaiplus_status.htm
+++ b/luci-app-kaiplus/luasrc/view/kaiplus/kaiplus_status.htm
@@ -6,15 +6,8 @@ XHR.poll(5, '<%=url("admin/services/kaiplus_status")%>', null, function(x, st) {
el.innerHTML = '
<%:The KaiPlus service is not 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 = '
<%:The KaiPlus service is running.%>'
- + "
\" onclick=\"window.open('http://' + window.location.hostname + ':' + st.port + basePath)\"/>";
+ + "
\" onclick=\"window.open('http://" + window.location.hostname + ":" + st.port + "/')\"/>";
}
}
});
diff --git a/luci-app-linkease/Makefile b/luci-app-linkease/Makefile
index 3ad83d03..5a62eac9 100644
--- a/luci-app-linkease/Makefile
+++ b/luci-app-linkease/Makefile
@@ -6,11 +6,11 @@
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for linkease
-LUCI_DEPENDS:=+luci-lib-linkeasefile
+LUCI_DEPENDS:=+linkease
LUCI_PKGARCH:=all
-PKG_VERSION:=2.1.70-r4
+PKG_VERSION:=2.1.70-r3
# PKG_RELEASE MUST be empty for luci.mk
-PKG_RELEASE:=2
+PKG_RELEASE:=3
LUCI_MINIFY_CSS:=0
LUCI_MINIFY_JS:=0
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.22632dc4.js b/luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.22632dc4.js
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.22632dc4.js
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.22632dc4.js
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.324cab41.js b/luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.324cab41.js
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.324cab41.js
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.324cab41.js
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.4a114b4a.js b/luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.4a114b4a.js
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.4a114b4a.js
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.4a114b4a.js
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.4ea0593d.js b/luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.4ea0593d.js
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.4ea0593d.js
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.4ea0593d.js
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.6424c2fc.js b/luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.6424c2fc.js
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.6424c2fc.js
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.6424c2fc.js
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.7191676b.js b/luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.7191676b.js
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.7191676b.js
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.7191676b.js
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.a0a5dece.js b/luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.a0a5dece.js
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.a0a5dece.js
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.a0a5dece.js
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.a6a47e72.js b/luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.a6a47e72.js
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.a6a47e72.js
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.a6a47e72.js
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.c69499bb.js b/luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.c69499bb.js
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.c69499bb.js
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.c69499bb.js
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.d52f0fe8.js b/luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.d52f0fe8.js
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.d52f0fe8.js
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.d52f0fe8.js
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.dc0a1b58.js b/luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.dc0a1b58.js
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/chunk.dc0a1b58.js
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.dc0a1b58.js
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/codicon.ttf b/luci-app-linkease/htdocs/luci-static/linkeasefile/codicon.ttf
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/codicon.ttf
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/codicon.ttf
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/archive.png b/luci-app-linkease/htdocs/luci-static/linkeasefile/icons/archive.png
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/archive.png
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/icons/archive.png
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/dir.png b/luci-app-linkease/htdocs/luci-static/linkeasefile/icons/dir.png
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/dir.png
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/icons/dir.png
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/doc.png b/luci-app-linkease/htdocs/luci-static/linkeasefile/icons/doc.png
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/doc.png
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/icons/doc.png
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/error.png b/luci-app-linkease/htdocs/luci-static/linkeasefile/icons/error.png
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/error.png
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/icons/error.png
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/image.png b/luci-app-linkease/htdocs/luci-static/linkeasefile/icons/image.png
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/image.png
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/icons/image.png
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/music.png b/luci-app-linkease/htdocs/luci-static/linkeasefile/icons/music.png
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/music.png
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/icons/music.png
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/notfound.png b/luci-app-linkease/htdocs/luci-static/linkeasefile/icons/notfound.png
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/notfound.png
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/icons/notfound.png
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/other.png b/luci-app-linkease/htdocs/luci-static/linkeasefile/icons/other.png
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/other.png
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/icons/other.png
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/video.png b/luci-app-linkease/htdocs/luci-static/linkeasefile/icons/video.png
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/icons/video.png
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/icons/video.png
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/index.js b/luci-app-linkease/htdocs/luci-static/linkeasefile/index.js
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/index.js
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/index.js
diff --git a/luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/style.css b/luci-app-linkease/htdocs/luci-static/linkeasefile/style.css
similarity index 100%
rename from luci-lib-linkeasefile/htdocs/luci-static/linkeasefile/style.css
rename to luci-app-linkease/htdocs/luci-static/linkeasefile/style.css
diff --git a/luci-app-linkease/luasrc/controller/linkease.lua b/luci-app-linkease/luasrc/controller/linkease.lua
index ca1cd6cf..a71b80b8 100644
--- a/luci-app-linkease/luasrc/controller/linkease.lua
+++ b/luci-app-linkease/luasrc/controller/linkease.lua
@@ -9,6 +9,7 @@ function index()
entry({"admin", "services", "linkease_status"}, call("linkease_status"))
+ entry({"admin", "services", "linkease", "file"}, call("linkease_file_template")).leaf = true
end
@@ -26,3 +27,13 @@ function linkease_status()
luci.http.write_json(status)
end
+function get_params(name)
+ local data = {
+ prefix=luci.dispatcher.build_url(unpack({"admin", "services", "linkease", name})),
+ }
+ return data
+end
+
+function linkease_file_template()
+ luci.template.render("linkease/file", get_params("file"))
+end
diff --git a/luci-lib-linkeasefile/luasrc/controller/linkease_file.lua b/luci-app-linkease/luasrc/controller/linkease_backend.lua
similarity index 91%
rename from luci-lib-linkeasefile/luasrc/controller/linkease_file.lua
rename to luci-app-linkease/luasrc/controller/linkease_backend.lua
index 76bb0fc8..576ba42e 100644
--- a/luci-lib-linkeasefile/luasrc/controller/linkease_file.lua
+++ b/luci-app-linkease/luasrc/controller/linkease_backend.lua
@@ -7,27 +7,13 @@ local ltn12 = require "luci.ltn12"
local table = require "table"
local util = require "luci.util"
-module("luci.controller.linkease_file", package.seeall)
+module("luci.controller.linkease_backend", package.seeall)
local BLOCKSIZE = 2048
local LINKEASE_UNIX = "/var/run/linkease.sock"
function index()
entry({"linkease"}, call("linkease_backend")).leaf=true
- local e = entry({"admin", "services", "linkease", "file"}, call("linkease_file_template"))
- e.leaf = true
- e.dependent = false
-end
-
-function get_params(name)
- local data = {
- prefix=luci.dispatcher.build_url(unpack({"admin", "services", "linkease", name})),
- }
- return data
-end
-
-function linkease_file_template()
- luci.template.render("linkease/file", get_params("file"))
end
local function sink_socket(sock, io_err)
diff --git a/luci-lib-linkeasefile/luasrc/view/linkease/file.htm b/luci-app-linkease/luasrc/view/linkease/file.htm
similarity index 100%
rename from luci-lib-linkeasefile/luasrc/view/linkease/file.htm
rename to luci-app-linkease/luasrc/view/linkease/file.htm
diff --git a/luci-app-linkeasefull/Makefile b/luci-app-linkeasefull/Makefile
deleted file mode 100644
index 5bf69195..00000000
--- a/luci-app-linkeasefull/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# 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
diff --git a/luci-app-linkeasefull/luasrc/controller/linkeasefull.lua b/luci-app-linkeasefull/luasrc/controller/linkeasefull.lua
deleted file mode 100644
index bed1f88f..00000000
--- a/luci-app-linkeasefull/luasrc/controller/linkeasefull.lua
+++ /dev/null
@@ -1,89 +0,0 @@
-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
diff --git a/luci-app-linkeasefull/luasrc/model/cbi/linkeasefull.lua b/luci-app-linkeasefull/luasrc/model/cbi/linkeasefull.lua
deleted file mode 100644
index 23950bc4..00000000
--- a/luci-app-linkeasefull/luasrc/model/cbi/linkeasefull.lua
+++ /dev/null
@@ -1,86 +0,0 @@
-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
diff --git a/luci-app-linkeasefull/luasrc/view/linkeasefull_status.htm b/luci-app-linkeasefull/luasrc/view/linkeasefull_status.htm
deleted file mode 100644
index 9637232e..00000000
--- a/luci-app-linkeasefull/luasrc/view/linkeasefull_status.htm
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-