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 2028107b..b43122bf 100644
--- a/luci-app-linkease/Makefile
+++ b/luci-app-linkease/Makefile
@@ -6,9 +6,9 @@
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:=
LUCI_MINIFY_CSS:=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 @@
-
-
-