🌴 Sync 2026-03-05 23:51:42

This commit is contained in:
github-actions[bot] committed 2026-03-05 23:51:42 +08:00
1 parent 0d155c70be
commit 32600acc60
14258 files changed
+3954570

No files matched your search

+24
View File
@@ -0,0 +1,24 @@
include $(TOPDIR)/rules.mk
PKG_VERSION:=0.8.5-20241221-1
PKG_RELEASE:=1
LUCI_TITLE:=LuCI support for webvirtcloud
LUCI_PKGARCH:=all
LUCI_DEPENDS:=+lsblk +docker +dockerd +luci-lib-taskd +vmease
define Package/luci-app-webvirtcloud/conffiles
/etc/config/webvirtcloud
endef
define Package/luci-app-webvirtcloud/prerm
#!/bin/sh
/usr/libexec/istorec/webvirtcloud.sh stop
exit 0
endef
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
+8
View File
@@ -0,0 +1,8 @@
module("luci.controller.webvirtcloud", package.seeall)
function index()
entry({"admin", "services", "webvirtcloud"}, alias("admin", "services", "webvirtcloud", "config"), _("KVM WebVirtCloud"), 30).dependent = true
entry({"admin", "services", "webvirtcloud", "config"}, cbi("webvirtcloud/config"), _("Config"), 10).leaf = true
entry({"admin", "services", "webvirtcloud", "tool"}, form("webvirtcloud/tool"), _("Tool"), 30).leaf = true
end
@@ -0,0 +1,50 @@
--[[
LuCI - Lua Configuration Interface
]]--
local taskd = require "luci.model.tasks"
local webvirtcloud_model = require "luci.model.webvirtcloud"
local m, s, o
m = taskd.docker_map("webvirtcloud", "webvirtcloud", "/usr/libexec/istorec/webvirtcloud.sh",
translate("KVM WebVirtCloud"),
translate("KVM web manager in iStoreOS using webvirtcloud.") .. " login: admin/admin. "
.. translate("Official website:") .. ' <a href=\"https://webvirt.cloud/\" target=\"_blank\">https://webvirt.cloud/</a>')
s = m:section(SimpleSection, translate("Service Status"), translate("WebVirtCloud status:"))
s:append(Template("webvirtcloud/status"))
s = m:section(TypedSection, "webvirtcloud", translate("Setup"), translate("The following parameters will only take effect during installation or upgrade:"))
s.addremove=false
s.anonymous=true
o = s:option(Value, "http_port", translate("HTTP Port").."<b>*</b>")
o.default = "6009"
o.datatype = "port"
o = s:option(Value, "image_name", translate("Image").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
o:value("linkease/webvirtcloud:latest", "linkease/webvirtcloud:latest")
o:value("linkease/webvirtcloud:0.8.5", "linkease/webvirtcloud:0.8.5")
o:value("linkease/webvirtcloud:0.3.6", "linkease/webvirtcloud:0.3.6")
o.default = "linkease/webvirtcloud:latest"
local blocks = webvirtcloud_model.blocks()
local home = webvirtcloud_model.home()
o = s:option(Value, "config_path", translate("Config path").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
local paths, default_path = webvirtcloud_model.find_paths(blocks, home, "Configs")
for _, val in pairs(paths) do
o:value(val, val)
end
o.default = default_path
o = s:option(Value, "time_zone", translate("Timezone"))
o.datatype = "string"
o:value("Asia/Shanghai", "Asia/Shanghai")
return m
@@ -0,0 +1,41 @@
--[[
LuCI - Lua Configuration Interface
]]--
local http = require 'luci.http'
m=SimpleForm("Tools")
m.submit = false
m.reset = false
s = m:section(SimpleSection)
o = s:option(Value, "action", translate("Action").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
o:value("gpu-passthrough", "gpu-passthrough")
o.default = "gpu-passthrough"
local t=Template("webvirtcloud/tool")
m:append(t)
local btn_do = s:option(Button, "_do")
btn_do.render = function(self, section, scope)
self.inputstyle = "add"
self.title = " "
self.inputtitle = translate("Execute")
Button.render(self, section, scope)
end
btn_do.write = function(self, section, value)
local action = m:get(section, "action")
if action == "gpu-passthrough" then
local cmd = string.format("/usr/libexec/istorec/webvirtcloud.sh %s", action)
cmd = "/etc/init.d/tasks task_add webvirtcloud " .. luci.util.shellquote(cmd) .. " >/dev/null 2>&1"
os.execute(cmd)
t.show_log_taskid = "webvirtcloud"
end
end
return m
@@ -0,0 +1,55 @@
local util = require "luci.util"
local jsonc = require "luci.jsonc"
local webvirtcloud = {}
webvirtcloud.blocks = function()
local f = io.popen("lsblk -s -f -b -o NAME,FSSIZE,MOUNTPOINT --json", "r")
local vals = {}
if f then
local ret = f:read("*all")
f:close()
local obj = jsonc.parse(ret)
for _, val in pairs(obj["blockdevices"]) do
local fsize = val["fssize"]
if fsize ~= nil and string.len(fsize) > 10 and val["mountpoint"] then
-- fsize > 1G
vals[#vals+1] = val["mountpoint"]
end
end
end
return vals
end
webvirtcloud.home = function()
local uci = require "luci.model.uci".cursor()
local home_dirs = {}
home_dirs["main_dir"] = uci:get_first("quickstart", "main", "main_dir", "/root")
home_dirs["Configs"] = uci:get_first("quickstart", "main", "conf_dir", home_dirs["main_dir"].."/Configs")
home_dirs["Public"] = uci:get_first("quickstart", "main", "pub_dir", home_dirs["main_dir"].."/Public")
home_dirs["Downloads"] = uci:get_first("quickstart", "main", "dl_dir", home_dirs["Public"].."/Downloads")
home_dirs["Caches"] = uci:get_first("quickstart", "main", "tmp_dir", home_dirs["main_dir"].."/Caches")
return home_dirs
end
webvirtcloud.find_paths = function(blocks, home_dirs, path_name)
local default_path = ''
local configs = {}
default_path = home_dirs[path_name] .. "/WebVirtCloud"
if #blocks == 0 then
table.insert(configs, default_path)
else
for _, val in pairs(blocks) do
table.insert(configs, val .. "/" .. path_name .. "/WebVirtCloud")
end
local without_conf_dir = "/root/" .. path_name .. "/WebVirtCloud"
if default_path == without_conf_dir then
default_path = configs[1]
end
end
return configs, default_path
end
return webvirtcloud
@@ -0,0 +1,31 @@
<%
local util = require "luci.util"
local container_status = util.trim(util.exec("/usr/libexec/istorec/webvirtcloud.sh status"))
local container_install = (string.len(container_status) > 0)
local container_running = container_status == "running"
-%>
<div class="cbi-value">
<label class="cbi-value-title"><%:Status%></label>
<div class="cbi-value-field">
<% if container_running then %>
<button class="cbi-button cbi-button-success" disabled="true"><%:WebVirtCloud is running%></button>
<% else %>
<button class="cbi-button cbi-button-negative" disabled="true"><%:WebVirtCloud is not running%></button>
<% end %>
</div>
</div>
<%
if container_running then
local port=util.trim(util.exec("/usr/libexec/istorec/webvirtcloud.sh port"))
if port == "" then
port="8123"
end
-%>
<div class="cbi-value cbi-value-last">
<label class="cbi-value-title">&nbsp;</label>
<div class="cbi-value-field">
<input type="button" class="btn cbi-button cbi-button-apply" name="start" value="<%:Open the WebVirtCloud%>" onclick="window.open('http://'+location.hostname+':<%=port%>/', '_blank')">
</div>
</div>
<% end %>
@@ -0,0 +1,11 @@
<%+tasks/embed%>
<script>
window.addEventListener("load", function(){
const taskd = window.taskd;
<% if self.show_log_taskid then -%>
taskd.show_log("<%=self.show_log_taskid%>");
<%- end %>
});
</script>
@@ -0,0 +1,48 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "Official website:"
msgstr "官方网站:"
msgid "KVM WebVirtCloud"
msgstr "KVM虚拟机(WebVirtCloud)"
msgid "KVM web manager in iStoreOS using webvirtcloud."
msgstr "iStoreOS 上面的 KVM 虚拟机,基于 WebVirtCloud 实现。"
msgid "Config path"
msgstr "配置文件路径"
msgid "Service Status"
msgstr "服务状态"
msgid "WebVirtCloud status:"
msgstr "WebVirtCloud 的状态信息如下:"
msgid "Setup"
msgstr "安装配置"
msgid "The following parameters will only take effect during installation or upgrade:"
msgstr "以下参数只在安装或者升级时才会生效:"
msgid "Status"
msgstr "状态"
msgid "WebVirtCloud is running"
msgstr "WebVirtCloud 运行中"
msgid "WebVirtCloud is not running"
msgstr "WebVirtCloud 未运行"
msgid "Open the WebVirtCloud"
msgstr "打开 WebVirtCloud"
msgid "Tool"
msgstr "操作"
msgid "Execute"
msgstr "执行"
msgid "Timezone"
msgstr "时区"
+1
View File
@@ -0,0 +1 @@
zh-cn
@@ -0,0 +1,8 @@
config webvirtcloud
option 'config_path' ''
option 'http_port' '6009'
option 'image_name' 'linkease/webvirtcloud:latest'
# option 'time_zone' ''
# option 'bootargs' ''
# option 'vfioargs' ''
# option 'mod_ignores' ''
@@ -0,0 +1,113 @@
#!/bin/sh
ACTION=${1}
shift 1
do_install() {
local config=`uci get webvirtcloud.@webvirtcloud[0].config_path 2>/dev/null`
local IMAGE_NAME=`uci get webvirtcloud.@webvirtcloud[0].image_name 2>/dev/null`
local tz=`uci get webvirtcloud.@webvirtcloud[0].time_zone 2>/dev/null`
local port=`uci get webvirtcloud.@webvirtcloud[0].http_port 2>/dev/null`
if [ -z "$config" ]; then
echo "config path is empty!"
exit 1
fi
[ -z "$port" ] && port=6009
echo "start vmease"
/etc/init.d/vmease start
sleep 1
echo "docker pull ${IMAGE_NAME}"
docker pull ${IMAGE_NAME}
docker rm -f webvirtcloud
mkdir -p "$config"
rm -rf "$config/vmwebvirt"
cp /usr/sbin/vmeasedaemon "$config/vmwebvirt"
local cmd="docker run --restart=unless-stopped -d \
--cgroupns=host \
--tmpfs /tmp \
--tmpfs /run/lock \
-v /sys/fs/cgroup:/sys/fs/cgroup \
-v \"$config/dbconfig:/srv/webvirtcloud/dbconfig\" \
-v \"$config/libvirt:/etc/libvirt\" \
-v \"$config/images:/var/lib/libvirt/images\" \
-v \"$config/vmwebvirt:/usr/sbin/vmwebvirt\" \
-v /var/run/vmease:/srv/vmease \
-p $port:80 \
--privileged \
--dns=172.17.0.1 \
--dns=223.5.5.5 "
if [ -z "$tz" ]; then
tz="`uci get system.@system[0].zonename | sed 's/ /_/g'`"
fi
[ -z "$tz" ] || cmd="$cmd -e TZ=\"$tz\""
cmd="$cmd -v /mnt:/mnt"
mountpoint -q /mnt && cmd="$cmd:rslave"
cmd="$cmd --name webvirtcloud \"$IMAGE_NAME\""
echo "$cmd"
eval "$cmd"
sleep 8
echo "Running status:"
/usr/sbin/vmeasedaemon runningStatus --pretty
}
do_gpu_passthrough() {
echo "TODO"
return 0
}
usage() {
echo "usage: $0 sub-command"
echo "where sub-command is one of:"
echo " install Install the webvirtcloud"
echo " upgrade Upgrade the webvirtcloud"
echo " rm/start/stop/restart Remove/Start/Stop/Restart the webvirtcloud"
echo " status webvirtcloud status"
echo " port webvirtcloud port"
}
case ${ACTION} in
"install")
do_install
;;
"upgrade")
do_install
;;
"rm")
docker rm -f webvirtcloud
;;
"start")
/etc/init.d/vmease start
sleep 1
docker ${ACTION} webvirtcloud
;;
"stop")
docker ${ACTION} webvirtcloud
;;
"restart")
/etc/init.d/vmease start
sleep 1
docker ${ACTION} webvirtcloud
;;
"status")
docker ps --all -f 'name=^/webvirtcloud$' --format '{{.State}}'
;;
"port")
docker ps --all -f 'name=^/webvirtcloud$' --format '{{.Ports}}' | grep -om1 '0.0.0.0:[0-9]*' | sed 's/0.0.0.0://'
;;
"gpu-passthrough")
do_gpu_passthrough
;;
*)
usage
exit 1
;;
esac
@@ -0,0 +1,11 @@
{
"luci-app-webvirtcloud": {
"description": "Grant UCI access for luci-app-webvirtcloud",
"read": {
"uci": [ "webvirtcloud" ]
},
"write": {
"uci": [ "webvirtcloud" ]
}
}
}