🎨 Sync 2026-08-05 00:15:00

This commit is contained in:
github-actions[bot]
2026-08-05 00:15:00 +08:00
parent 9b522ebf42
commit e40fd6d46b
72 changed files with 1246 additions and 78 deletions
+3 -3
View File
@@ -10,10 +10,10 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_BAIDUDRIVE:=$(ARCH)
PKG_NAME:=baidudrive
PKG_VERSION:=1.0.2
PKG_RELEASE:=4
PKG_VERSION:=baidudrive-runtime-v1.0.4
PKG_RELEASE:=5
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/prebuilt/
PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/baidudrive-runtime-v$(PKG_VERSION)/
PKG_HASH:=skip
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_VERSION)
+2
View File
@@ -115,6 +115,8 @@ start_service() {
logger -t baidudrive "Starting Baidu NAS SDK"
procd_open_instance baiduNas
procd_set_param env \
BAIDU_NAS_GLIBC_DIR="/opt/baidunas-glibc"
procd_set_param command "$sdk_dir/baiduNas" \
-ip "$sdk_host" \
-port "$sdk_port" \
+1 -1
View File
@@ -10,7 +10,7 @@ PKG_ARCH_kaiplus:=$(ARCH)
PKG_NAME:=kaiplus
PKG_VERSION:=1.0.5
PKG_RELEASE:=3
PKG_RELEASE:=4
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/kaiplus/
PKG_HASH:=skip
+2 -1
View File
@@ -1,5 +1,6 @@
config kaiplus
option 'enabled' '0'
option 'data_dir' ''
option 'port' '8198'
option 'port' '8189'
option 'base_path' '/apps/kaiplus/'
option 'system_role' 'istoreos'
+3 -1
View File
@@ -6,7 +6,8 @@ USE_PROCD=1
get_config() {
config_get_bool enabled "$1" enabled 1
config_get data_dir "$1" data_dir ""
config_get port "$1" port "8198"
config_get port "$1" port "8189"
config_get base_path "$1" base_path "/apps/kaiplus/"
config_get system_role "$1" system_role "istoreos"
}
@@ -61,6 +62,7 @@ start_service() {
procd_append_param command --data-dir "$data_dir"
procd_append_param command --static-dir /usr/share/kaiplus/www
procd_append_param command --defaults-dir /usr/share/kaiplus/defaults
procd_append_param command --base-path "$base_path"
procd_append_param command --system-role "$system_role"
procd_set_param stdout 1
procd_set_param stderr 1
@@ -1,16 +1,18 @@
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
# Copyright (C) 2015-2016 OpenWrt.org
# Copyright (C) 2020 jjm2473@gmail.com
#
# This is free software, licensed under the GNU General Public License v3.
#
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
PKG_NAME:=linkease-common-bin
PKG_SOURCE_DATE:=1.7.5
PKG_RELEASE:=1
ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64)
ARCH_HEXCODE=8664
@@ -21,12 +23,12 @@ 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_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)/linkease-binary-$(PKG_SOURCE_DATE)
PKG_BUILD_PARALLEL:=1
PKG_USE_MIPS16:=0
@@ -37,14 +39,14 @@ define Package/$(PKG_NAME)
SECTION:=net
CATEGORY:=Network
SUBMENU:=Web Servers/Proxies
TITLE:=LinkMount - the file cloud
TITLE:=LinkEase common binary tools
DEPENDS:=@(arm||x86_64||aarch64)
PKGARCH:=all
URL:=https://www.linkease.com/
endef
define Package/$(PKG_NAME)/description
LinkMount is used by LinkEase
Common LinkEase binary tools shared by LinkEase editions.
endef
define Build/Configure
@@ -54,10 +56,10 @@ 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
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/heif-converter.$(PKG_ARCH_LINKEASE) $(1)/usr/sbin/heif-converter
$(INSTALL_BIN) $(PKG_BUILD_DIR)/linkease-media.$(PKG_ARCH_LINKEASE) $(1)/usr/sbin/linkease-media
$(INSTALL_BIN) ./files/linkease-config.sh $(1)/usr/sbin/linkease-config.sh
endef
$(eval $(call BuildPackage,$(PKG_NAME)))
@@ -0,0 +1,112 @@
#!/bin/sh
. /lib/functions.sh
ensure_linkease_config() {
if ! uci -q get linkease.@linkease[0] >/dev/null; then
uci -q add linkease linkease >/dev/null
uci -q set linkease.@linkease[0].enabled='0'
uci -q set linkease.@linkease[0].port='8897'
uci -q set linkease.@linkease[0].allowPublic='0'
uci -q commit linkease
fi
}
sync_linkeasefull_local_home() {
if uci -q get linkeasefull.@linkeasefull[0] >/dev/null; then
uci -q set "linkeasefull.@linkeasefull[0].data_root_parent=$1"
uci -q commit linkeasefull
fi
}
case "$1" in
save)
ensure_linkease_config
if [ ! -z "$2" ]; then
uci set "linkease.@linkease[0].preconfig=$2"
uci commit linkease
fi
;;
load)
ensure_linkease_config
if [ -f "/usr/sbin/preconfig.data" ]; then
data="`cat /usr/sbin/preconfig.data`"
uci set "linkease.@linkease[0].preconfig=${data}"
uci commit linkease
rm /usr/sbin/preconfig.data
else
data="`uci -q get linkease.@linkease[0].preconfig`"
fi
if [ -z "${data}" ]; then
echo "nil"
else
echo "${data}"
fi
;;
local_save)
ensure_linkease_config
if [ ! -z "$2" ]; then
uci set "linkease.@linkease[0].local_home=$2"
uci commit linkease
sync_linkeasefull_local_home "$2"
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 ""
if [ "$ROOT_DIR" = "$MAIN_DIR" ]; then
exit 0
fi
uci set "quickstart.main.main_dir=$ROOT_DIR"
if [ -z "$CONF_DIR" -o "$CONF_DIR" = "$MAIN_DIR/Configs" ]; then
uci set "quickstart.main.conf_dir=$ROOT_DIR/Configs"
fi
if [ -z "$PUB_DIR" -o "$PUB_DIR" = "$MAIN_DIR/Public" ]; then
uci set "quickstart.main.pub_dir=$ROOT_DIR/Public"
fi
if [ -z "$DL_DIR" -o "$DL_DIR" = "$MAIN_DIR/Public/Downloads" ]; then
uci set "quickstart.main.dl_dir=$ROOT_DIR/Public/Downloads"
fi
if [ -z "$TMP_DIR" -o "$TMP_DIR" = "$MAIN_DIR/Caches" ]; then
uci set "quickstart.main.tmp_dir=$ROOT_DIR/Caches"
fi
uci commit quickstart
fi
fi
;;
local_load)
ensure_linkease_config
if [ -f "/etc/config/quickstart" ]; then
data="`uci -q get quickstart.main.main_dir`"
fi
if [ -z "$data" ]; then
data="`uci -q get linkease.@linkease[0].local_home`"
fi
if [ -z "$data" ]; then
data="`uci -q get linkeasefull.@linkeasefull[0].data_root_parent`"
fi
if [ -z "${data}" ]; then
echo "nil"
else
echo "${data}"
fi
;;
status)
echo "TODO"
;;
*)
echo "Usage: $0 {save|load|local_save|local_load|status}"
exit 1
esac
+7 -10
View File
@@ -10,9 +10,9 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_LINKEASE:=$(ARCH)
PKG_NAME:=linkease
# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable
PKG_SOURCE_DATE:=1.7.5
PKG_RELEASE:=3
PKG_RELEASE:=4
ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64)
ARCH_HEXCODE=8664
@@ -23,11 +23,11 @@ ARCH_HEXCODE=aa32
else ifeq ($(ARCH),mipsel)
ARCH_HEXCODE=1b0c
endif
PKG_SOURCE_VERSION:=$(ARCH_HEXCODE)
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_SOURCE_DATE).tar.gz
PKG_SOURCE_URL:=http://dl.istoreos.com/binary/LinkEase/LinuxStorage/
PKG_HASH:=skip
PKG_SOURCE_VERSION:=$(ARCH_HEXCODE)
PKG_SOURCE:=linkease-binary-$(PKG_SOURCE_DATE).tar.gz
PKG_SOURCE_URL:=https://dl.istoreos.com/binary/LinkEase/LinuxStorage/
PKG_HASH:=skip
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_SOURCE_DATE)
PKG_BUILD_PARALLEL:=1
@@ -40,7 +40,7 @@ define Package/$(PKG_NAME)
CATEGORY:=Network
SUBMENU:=Web Servers/Proxies
TITLE:=LinkEase - the file cloud
DEPENDS:=@(arm||x86_64||aarch64) +linkmount
DEPENDS:=@(arm||x86_64||aarch64) +linkease-common-bin
PKGARCH:=all
URL:=https://www.linkease.com/
endef
@@ -70,9 +70,6 @@ endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/sbin/linkease-plugins $(1)/etc/config $(1)/etc/init.d $(1)/etc/uci-defaults
$(INSTALL_BIN) $(PKG_BUILD_DIR)/linkease.$(PKG_ARCH_LINKEASE) $(1)/usr/sbin/linkease
$(INSTALL_BIN) $(PKG_BUILD_DIR)/heif-converter.$(PKG_ARCH_LINKEASE) $(1)/usr/sbin/heif-converter
$(INSTALL_BIN) $(PKG_BUILD_DIR)/linkease-media.$(PKG_ARCH_LINKEASE) $(1)/usr/sbin/linkease-media
$(INSTALL_BIN) ./files/linkease-config.sh $(1)/usr/sbin/linkease-config.sh
$(INSTALL_CONF) ./files/linkease.config $(1)/etc/config/linkease
$(INSTALL_BIN) ./files/linkease.init $(1)/etc/init.d/linkease
$(INSTALL_BIN) ./files/linkease.uci-default $(1)/etc/uci-defaults/linkease
+2 -4
View File
@@ -1,6 +1,6 @@
#!/bin/sh
source /lib/functions.sh
. /lib/functions.sh
case "$1" in
save)
@@ -40,7 +40,6 @@ case "$1" in
config_get PUB_DIR main pub_dir ""
config_get DL_DIR main dl_dir ""
config_get TMP_DIR main tmp_dir ""
# echo "$MAIN_DIR $CONF_DIR $PUB_DIR $DL_DIR $TMP_DIR"
if [ "$ROOT_DIR" = "$MAIN_DIR" ]; then
exit 0
fi
@@ -83,7 +82,6 @@ case "$1" in
;;
*)
echo "Usage: $0 {save|load|status}"
echo "Usage: $0 {save|load|local_save|local_load|status}"
exit 1
esac
+1
View File
@@ -1,3 +1,4 @@
config linkease
option port '8897'
option enabled '1'
option allowPublic '0'
Executable → Regular
+22 -9
View File
@@ -3,24 +3,37 @@
START=99
USE_PROCD=1
PROG=/usr/sbin/linkease
LOCAL_API=/var/run/linkease.sock
get_config() {
config_get_bool enabled $1 enabled 1
config_get_bool logger $1 logger
config_get_bool allowPublic $1 allowPublic
config_get port $1 port 8897
config_get_bool enabled "$1" enabled 1
config_get_bool logger "$1" logger 0
config_get_bool allowPublic "$1" allowPublic 0
config_get port "$1" port 8897
}
linkeasefull_enabled() {
[ "$(uci -q get linkeasefull.@linkeasefull[0].enabled 2>/dev/null)" = "1" ]
}
start_service() {
config_load linkease
config_foreach get_config linkease
[ $enabled != 1 ] && return 1
[ "$enabled" != "1" ] && return 1
[ -x "$PROG" ] || return 1
if linkeasefull_enabled; then
echo "linkease: linkeasefull is enabled; please disable linkeasefull before starting linkease" >&2
return 1
fi
rm -f "$LOCAL_API"
procd_open_instance
procd_set_param limits nofile="65535 65535"
procd_set_param command /usr/sbin/linkease
[ -n "$port" ] && procd_append_param command --deviceAddr ":$port" --localApi /var/run/linkease.sock
[ "$allowPublic" == 1 ] && procd_append_param command --allowPublic
[ "$logger" == 1 ] && procd_set_param stderr 1
procd_set_param command "$PROG"
procd_append_param command --deviceAddr ":$port" --localApi "$LOCAL_API"
[ "$allowPublic" = "1" ] && procd_append_param command --allowPublic
[ "$logger" = "1" ] && procd_set_param stderr 1
procd_set_param respawn
procd_close_instance
}
+32 -3
View File
@@ -8,23 +8,52 @@
EEOF
}
if ! uci -q get linkease.@linkease[0] >/dev/null; then
uci -q add linkease linkease >/dev/null
fi
set_default() {
key="$1"
value="$2"
current="$(uci -q get "linkease.@linkease[0].$key" 2>/dev/null || true)"
[ -n "$current" ] && return 0
uci -q set "linkease.@linkease[0].$key=$value"
}
set_default enabled 1
set_default port 8897
set_default allowPublic 0
uci -q commit linkease
port="$(uci -q get linkease.@linkease[0].port 2>/dev/null || true)"
[ -n "$port" ] || port=8897
allow_public="$(uci -q get linkease.@linkease[0].allowPublic 2>/dev/null || true)"
uci -q batch <<-EOF >/dev/null
delete ucitrack.@linkease[-1]
add ucitrack linkease
set ucitrack.@linkease[-1].init=linkease
commit ucitrack
EOF
if [ "$allow_public" = "1" ]; then
uci -q batch <<-EOF >/dev/null
delete firewall.linkease
set firewall.linkease=rule
set firewall.linkease.name="linkease"
set firewall.linkease.target="ACCEPT"
set firewall.linkease.src="wan"
set firewall.linkease.proto="tcp"
set firewall.linkease.dest_port="8897"
set firewall.linkease.dest_port="$port"
commit firewall
EOF
else
uci -q batch <<-EOF >/dev/null
delete firewall.linkease
commit firewall
EOF
fi
/etc/init.d/linkease enable
/etc/init.d/linkease start
/etc/init.d/linkease restart
exit 0
exit 0
+74
View File
@@ -0,0 +1,74 @@
#
# 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:=3
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/istoreos/istoreos-app-hub/releases/download/linkeasefull-runtime-v$(PKG_SOURCE_DATE)/
PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-runtime-$(PKG_SOURCE_DATE)-linux-$(LINKEASE_RUNTIME_ARCH)
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:=LinkEase Full - the local web desktop
DEPENDS:=@(x86_64||aarch64) +linkease-common-bin +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 shared LinkEase 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)/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
$(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 ''
+149
View File
@@ -0,0 +1,149 @@
#!/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
LOCAL_API=/var/run/linkease.sock
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
}
sync_shared_local_home() {
[ -x /usr/sbin/linkease-config.sh ] || return 0
/usr/sbin/linkease-config.sh local_save "$data_root_parent" >/dev/null 2>&1 || true
}
linkease_enabled() {
[ "$(uci -q get linkease.@linkease[0].enabled 2>/dev/null)" = "1" ]
}
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"
apptunnel_config_dir="/tmp/linkeasefull/apptunnel-config"
}
start_service() {
config_load linkeasefull
config_foreach read_config linkeasefull
[ "$enabled" = "1" ] || return 1
[ -x "$PROG" ] || return 1
if linkease_enabled; then
echo "linkeasefull: linkease is enabled; please disable linkease before starting linkeasefull" >&2
return 1
fi
if [ -z "$data_root_parent" ]; then
echo "linkeasefull: please choose a persistent disk storage path in LuCI" >&2
return 1
fi
sync_shared_local_home
rm -f "$LOCAL_API"
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"
mkdir -p "$apptunnel_config_dir"
# Do not set LINKEASE_CONFIG on OpenWrt. That variable belongs to
# Docker/file-backend deployments where users explicitly mount
# LINKEASE_CONFIG/preconfig.data. OpenWrt binding state is authoritative in
# UCI and must be accessed through /usr/sbin/linkease-config.sh. This is
# intentional: the user's data disk may be replaced, and the device must
# still be able to recover its binding from flash-backed OpenWrt config.
#
# Do not export LINKEASE_APPTUNNEL_PRECONFIG_SCRIPT or
# LINKEASE_APPTUNNEL_DEFAULT_ROOT_DIR here. Different devices have different
# storage roots, and hard-coded env wiring can pin apptunnel to a removed
# disk. The embedded clientruntime must discover linkease-config.sh and call
# local_load/local_save-compatible business APIs for the current root.
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_LOCAL_API=$LOCAL_API" \
"LINKEASE_APPTUNNEL_CONFIG_DIR=$apptunnel_config_dir" \
"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:=3
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
+1 -1
View File
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=KaiPlus
PKG_VERSION:=1.0.0
PKG_RELEASE:=3
PKG_RELEASE:=4
LUCI_DEPENDS:=+kaiplus +luci-compat
LUCI_MINIFY_CSS:=0
LUCI_MINIFY_JS:=0
@@ -15,10 +15,12 @@ end
function kaiplus_status()
local sys = require "luci.sys"
local uci = require "luci.model.uci".cursor()
local port = uci:get_first("kaiplus", "kaiplus", "port", "8198")
local port = uci:get_first("kaiplus", "kaiplus", "port", "8189")
local base_path = uci:get_first("kaiplus", "kaiplus", "base_path", "/apps/kaiplus/")
local status = {
running = (sys.call("pidof kaiplus_bin >/dev/null") == 0),
port = port
port = port,
base_path = base_path
}
luci.http.prepare_content("application/json")
luci.http.write_json(status)
@@ -5,7 +5,10 @@ m = Map("kaiplus", translate("KaiPlus"), translate("KaiPlus is an AI workspace a
m:section(SimpleSection).template = "kaiplus/kaiplus_status"
m.on_after_commit = function(self)
sys.call("/etc/init.d/kaiplus restart >/dev/null 2>&1 &")
sys.call("/etc/init.d/kaiplus restart >/dev/null 2>&1")
if sys.call("[ -x /etc/init.d/linkease ]") == 0 then
sys.call("/etc/init.d/linkease restart >/dev/null 2>&1 &")
end
end
s = m:section(TypedSection, "kaiplus", translate("Global settings"))
@@ -29,7 +32,7 @@ end
data_dir.default = default_path
local port = s:option(Value, "port", translate("Web port"))
port.default = "8198"
port.default = "8189"
port.rmempty = false
port.datatype = "port"
port.description = translate("Port for the KaiPlus web service.")
@@ -6,8 +6,15 @@ XHR.poll(5, '<%=url("admin/services/kaiplus_status")%>', null, function(x, st) {
el.innerHTML = '<br/><em style=\"color:red\"><%:The KaiPlus service is not running.%></em>';
}
if (st.running) {
var basePath = st.base_path || "/apps/kaiplus/";
if (basePath.charAt(0) !== "/") {
basePath = "/" + basePath;
}
if (basePath.charAt(basePath.length - 1) !== "/") {
basePath = basePath + "/";
}
el.innerHTML = '<br/><em style=\"color:green\"><%:The KaiPlus service is running.%></em>'
+ "<br/><br/><input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\" <%:Click to open KaiPlus%> \" onclick=\"window.open('http://" + window.location.hostname + ":" + st.port + "/')\"/>";
+ "<br/><br/><input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\" <%:Click to open KaiPlus%> \" onclick=\"window.open('http://' + window.location.hostname + ':' + st.port + basePath)\"/>";
}
}
});
+2 -3
View File
@@ -6,15 +6,14 @@
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for linkease
LUCI_DEPENDS:=+linkease
LUCI_DEPENDS:=+linkease +luci-lib-linkeasefile
LUCI_PKGARCH:=all
PKG_VERSION:=2.1.70-r3
# PKG_RELEASE MUST be empty for luci.mk
PKG_RELEASE:=3
PKG_RELEASE:=4
LUCI_MINIFY_CSS:=0
LUCI_MINIFY_JS:=0
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
@@ -8,32 +8,21 @@ function index()
entry({"admin", "services", "linkease"}, cbi("linkease"), _("LinkEase"), 20).dependent = true
entry({"admin", "services", "linkease_status"}, call("linkease_status"))
entry({"admin", "services", "linkease", "file"}, call("linkease_file_template")).leaf = true
end
function linkease_status()
local sys = require "luci.sys"
local uci = require "luci.model.uci".cursor()
local port = tonumber(uci:get_first("linkease", "linkease", "port"))
local full_enabled = (uci:get_first("linkeasefull", "linkeasefull", "enabled") == "1")
local status = {
running = (sys.call("pidof linkease >/dev/null") == 0),
port = (port or 8897)
port = (port or 8897),
conflict = full_enabled,
conflict_service = full_enabled and "linkeasefull" or ""
}
luci.http.prepare_content("application/json")
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
@@ -5,7 +5,11 @@
var tb = document.getElementById('linkease_status');
if (st && tb)
{
if (st.running)
if (st.conflict)
{
tb.innerHTML = '<br/><em style=\"color:red\"><%:LinkEase Full is enabled. Please disable LinkEase Full before starting LinkEase.%></em>';
}
else if (st.running)
{
tb.innerHTML = '<br/><em style=\"color:green\"><%:The LinkEase service is running.%></em>'
+ "<br/><br/><input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\" <%:Click to open LinkEase%> \" onclick=\"window.open('http://" + window.location.hostname + ":" + st.port + "/')\"/>"
+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.0
PKG_RELEASE:=3
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
@@ -0,0 +1,92 @@
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 linkease_enabled = (uci:get_first("linkease", "linkease", "enabled") == "1")
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(),
conflict = linkease_enabled,
conflict_service = linkease_enabled and "linkease" or ""
}
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,36 @@
<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://" + window.location.hostname + ":" + (st.legacy_port || 8897) + "/";
var overallStatus = st.conflict
? '<br/><em style=\"color:red\"><%:LinkEase is enabled. Please disable LinkEase before starting LinkEase Full.%></em>'
: 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.conflict && 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:=3
LUCI_MINIFY_CSS:=0
LUCI_MINIFY_JS:=0
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
@@ -0,0 +1,31 @@
module("luci.controller.linkeaselite", package.seeall)
function index()
if not nixio.fs.access("/etc/config/linkeaselite") then
return
end
local page = entry({"admin", "services", "linkeaselite"}, firstchild(), _("LinkEaseLite"), 20)
page.dependent = true
entry({"admin", "services", "linkeaselite", "config"}, cbi("linkeaselite"), _("Settings"), 10).leaf = true
entry({"admin", "services", "linkeaselite_status"}, call("linkeaselite_status"))
entry({"admin", "services", "linkeaselite", "file"}, call("linkeaselite_file_removed")).leaf = true
end
function linkeaselite_status()
local sys = require "luci.sys"
local uci = require "luci.model.uci".cursor()
local port = tonumber(uci:get_first("linkeaselite", "linkeaselite", "port"))
local status = {
running = (sys.call("pidof linkease-lite >/dev/null") == 0),
port = (port or 8897)
}
luci.http.prepare_content("application/json")
luci.http.write_json(status)
end
function linkeaselite_file_removed()
luci.http.status(404, "Not Found")
end
@@ -0,0 +1,24 @@
local m, s
local sys = require "luci.sys"
m = Map("linkeaselite", translate("LinkEaseLite"), translate("LinkEaseLite is an efficient data transfer tool for small-memory devices."))
m:section(SimpleSection).template = "linkeaselite_status"
m.on_after_commit = function(self)
sys.call("/etc/init.d/linkeaselite restart >/dev/null 2>&1")
end
s = m:section(TypedSection, "linkeaselite", translate("Global settings"))
s.addremove = false
s.anonymous = true
s:option(Flag, "enabled", translate("Enable")).rmempty = false
local port = s:option(Value, "port", translate("Port"))
port.rmempty = false
port.datatype = "port"
port.default = "8897"
s:option(Flag, "allowPublic", translate("AllowPublic"), translate("Allowing access via public IP addresses can lead to insufficient security.")).rmempty = false
return m
@@ -0,0 +1,42 @@
<script type="text/javascript">//<![CDATA[
XHR.poll(5, '<%=url("admin/services/linkeaselite_status")%>', null,
function(x, st)
{
var tb = document.getElementById('linkeaselite_status');
if (st && tb)
{
var legacyUrl = "http://" + window.location.hostname + ":" + (st.port || 8897) + "/";
var overallStatus = st.running
? '<br/><em style=\"color:green\"><%:The LinkEaseLite service is running.%></em>'
: '<br/><em style=\"color:red\"><%:The LinkEaseLite service is not running.%></em>';
tb.innerHTML = overallStatus;
function appendBreak()
{
tb.appendChild(document.createElement("br"));
}
function appendButton(value, action)
{
var button = document.createElement("input");
button.className = "btn cbi-button cbi-button-apply";
button.type = "button";
button.value = value;
button.onclick = action;
tb.appendChild(button);
}
appendBreak();
appendBreak();
appendButton(" <%:Click to open LinkEaseLite%> ", function() { window.open(legacyUrl); });
}
}
);
//]]></script>
<fieldset class="cbi-section">
<legend><%:LinkEaseLite Status%></legend>
<p id="linkeaselite_status">
<em><%:Collecting data...%></em>
</p>
</fieldset>
@@ -0,0 +1,35 @@
msgid "LinkEaseLite"
msgstr "易有云Lite"
msgid "LinkEaseLite is an efficient data transfer tool for small-memory devices."
msgstr "易有云Lite是面向小内存设备的轻量数据传输工具。"
msgid "Global settings"
msgstr "全局设置"
msgid "Enable"
msgstr "启用"
msgid "Port"
msgstr "端口"
msgid "AllowPublic"
msgstr "公网访问"
msgid "Allowing access via public IP addresses can lead to insufficient security."
msgstr "允许公网IP访问,会导致不够安全。"
msgid "Click to open LinkEaseLite"
msgstr "点击打开易有云Lite"
msgid "The LinkEaseLite service is running."
msgstr "易有云Lite服务已启动"
msgid "The LinkEaseLite service is not running."
msgstr "易有云Lite服务未启动"
msgid "LinkEaseLite Status"
msgstr "易有云Lite服务状态"
msgid "Collecting data..."
msgstr "收集数据..."
+1
View File
@@ -0,0 +1 @@
zh-cn
@@ -0,0 +1,4 @@
#!/bin/sh
rm -f /tmp/luci-indexcache /tmp/luci-indexcache.*
exit 0
+1 -1
View File
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=26.8.1
PKG_RELEASE:=201
PKG_RELEASE:=202
PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \
+1 -1
View File
@@ -1185,7 +1185,7 @@ function to_extract(app_name, file, subfix)
exec("/bin/rm", {"-f", file})
return {
code = 1,
error = i18n.translate("Not installed %s, Can't unzip!" % { tools_name })
error = i18n.translatef("Not installed %s, Can't unzip!", tools_name)
}
end
end
@@ -613,6 +613,7 @@ function gen_outbound(flag, node, tag, proxy_table)
idle_session_check_interval = "30s",
idle_session_timeout = "30s",
min_idle_session = 5,
client_metadata = api.compare_versions(local_version, ">=", "1.13.16") and "anytls/0.0.13" or nil,
tls = tls
}
end
+15
View File
@@ -0,0 +1,15 @@
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for linkease file
LUCI_DEPENDS:=+linkease-common-bin
LUCI_PKGARCH:=all
PKG_VERSION:=2.1.70-r3
# PKG_RELEASE MUST be empty for luci.mk
PKG_RELEASE:=3
LUCI_MINIFY_CSS:=0
LUCI_MINIFY_JS:=0
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

@@ -7,13 +7,27 @@ local ltn12 = require "luci.ltn12"
local table = require "table"
local util = require "luci.util"
module("luci.controller.linkease_backend", package.seeall)
module("luci.controller.linkease_file", package.seeall)
local BLOCKSIZE = 2048
local LINKEASE_UNIX = "/var/run/linkease.sock"
function index()
entry({"linkease"}, call("linkease_backend")).leaf=true
local e = entry({"admin", "services", "linkease", "file"}, call("linkease_file_template"))
e.leaf = true
e.dependent = false
end
function get_params(name)
local data = {
prefix=luci.dispatcher.build_url(unpack({"admin", "services", "linkease", name})),
}
return data
end
function linkease_file_template()
luci.template.render("linkease/file", get_params("file"))
end
local function sink_socket(sock, io_err)
@@ -188,4 +202,3 @@ function linkease_backend()
sock:close()
end
@@ -0,0 +1,4 @@
#!/bin/sh
rm -f /tmp/luci-indexcache /tmp/luci-indexcache.*
exit 0