update 2023-12-01 23:35:39

This commit is contained in:
github-actions[bot] 2023-12-01 23:35:40 +08:00
parent 0480ae7349
commit 7d0553d64d
13 changed files with 377 additions and 2 deletions

View File

@ -0,0 +1,18 @@
include $(TOPDIR)/rules.mk
PKG_VERSION:=0.3.6-20231201
PKG_RELEASE:=
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
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature

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

View File

@ -0,0 +1,49 @@
--[[
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.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

View File

@ -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

View File

@ -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

View File

@ -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 %>

View File

@ -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>

View File

@ -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 "Home Assistant 的状态信息如下:"
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 "Home Assistant 未运行"
msgid "Open the WebVirtCloud"
msgstr "打开 WebVirtCloud"
msgid "Tool"
msgstr "操作"
msgid "Execute"
msgstr "执行"
msgid "Timezone"
msgstr "时区"

View File

@ -0,0 +1 @@
zh-cn

View File

@ -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' ''

View File

@ -0,0 +1,94 @@
#!/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 "docker pull ${IMAGE_NAME}"
docker pull ${IMAGE_NAME}
docker rm -f webvirtcloud
local cmd="docker run --restart=unless-stopped -d \
--cgroupns=host \
--tmpfs /tmp \
--tmpfs /run/lock \
-v /sys/fs/cgroup:/sys/fs/cgroup \
-v /mnt:/mnt:rslave \
-v \"$config/dbconfig:/srv/webvirtcloud/dbconfig\" \
-v \"$config/libvirt:/etc/libvirt\" \
-v \"$config/images:/var/lib/libvirt/images\" \
-v /usr/sbin/vmeasedaemon:/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`"
fi
[ -z "$tz" ] || cmd="$cmd -e TZ=\"$tz\""
cmd="$cmd --name webvirtcloud \"$IMAGE_NAME\""
echo "$cmd"
eval "$cmd"
sleep 5
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" | "stop" | "restart")
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

View File

@ -0,0 +1,11 @@
{
"luci-app-webvirtcloud": {
"description": "Grant UCI access for luci-app-webvirtcloud",
"read": {
"uci": [ "webvirtcloud" ]
},
"write": {
"uci": [ "webvirtcloud" ]
}
}
}

View File

@ -10,11 +10,11 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_VMEASE:=$(ARCH)
PKG_NAME:=vmease
PKG_VERSION:=0.3.6
PKG_VERSION:=0.3.7
PKG_RELEASE:=$(PKG_ARCH_VMEASE)-2
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=http://fw0.koolcenter.com/binary/vmease/
PKG_HASH:=9b5ef9577c3ea0fe2dd01274ac2615a6000b0d3374c1b0a9c2904356a6c5bb8d
PKG_HASH:=809d9b95fe8d46471dda8d8b91f2df8632c695c04dabd833f28a6548ab863075
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_VERSION)