add luci-app-excalidraw

This commit is contained in:
janson
2022-12-13 21:13:46 +08:00
parent b1adff8045
commit 2060083b30
12 changed files with 323 additions and 12 deletions

View File

@@ -0,0 +1,18 @@
include $(TOPDIR)/rules.mk
PKG_VERSION:=1.0.0-20221212
PKG_RELEASE:=
LUCI_TITLE:=LuCI support for Excalidraw
LUCI_PKGARCH:=all
LUCI_DEPENDS:=+docker +luci-lib-taskd +luci-lib-docker
define Package/luci-app-excalidraw/conffiles
/etc/config/excalidraw
endef
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature

View File

@@ -0,0 +1,7 @@
module("luci.controller.excalidraw", package.seeall)
function index()
entry({"admin", "services", "excalidraw"}, alias("admin", "services", "excalidraw", "config"), _("Excalidraw"), 30).dependent = true
entry({"admin", "services", "excalidraw", "config"}, cbi("excalidraw"))
end

View File

@@ -0,0 +1,57 @@
--[[
LuCI - Lua Configuration Interface
]]--
local taskd = require "luci.model.tasks"
local docker = require "luci.docker"
local excalidraw_model = require "luci.model.excalidraw"
local m, s, o
m = taskd.docker_map("excalidraw", "excalidraw", "/usr/libexec/istorec/excalidraw.sh",
translate("Excalidraw"),
translate("Excalidraw is a self-host virtual whiteboard for sketching hand-drawn like diagrams.")
.. translate("Official website:") .. ' <a href=\"https://excalidraw.com/\" target=\"_blank\">https://excalidraw.com/</a>')
local dk = docker.new({socket_path="/var/run/docker.sock"})
local dockerd_running = dk:_ping().code == 200
local docker_info = dockerd_running and dk:info().body or {}
local docker_aspace = 0
if docker_info.DockerRootDir then
local statvfs = nixio.fs.statvfs(docker_info.DockerRootDir)
docker_aspace = statvfs and (statvfs.bavail * statvfs.bsize) or 0
end
s = m:section(SimpleSection, translate("Service Status"), translate("Excalidraw status:"))
s:append(Template("excalidraw/status"))
s = m:section(TypedSection, "main", translate("Setup"),
(docker_aspace < 2147483648 and
(translate("The free space of Docker is less than 2GB, which may cause the installation to fail.")
.. "<br>") or "") .. translate("The following parameters will only take effect during installation or upgrade:"))
s.addremove=false
s.anonymous=true
o = s:option(Value, "port", translate("Port").."<b>*</b>")
o.default = "8090"
o.datatype = "port"
o = s:option(Value, "image_ver", translate("Image").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
o.default = "v0.13.0"
o:value("v0.13.0", "v0.13.0")
local blocks = excalidraw_model.blocks()
local home = excalidraw_model.home()
o = s:option(Value, "config_path", translate("Config path").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
local paths, default_path = excalidraw_model.find_paths(blocks, home, "Configs")
for _, val in pairs(paths) do
o:value(val, val)
end
o.default = default_path
return m

View File

@@ -0,0 +1,55 @@
local util = require "luci.util"
local jsonc = require "luci.jsonc"
local excalidraw = {}
excalidraw.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
excalidraw.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
excalidraw.find_paths = function(blocks, home_dirs, path_name)
local default_path = ''
local configs = {}
default_path = home_dirs[path_name] .. "/Excalidraw"
if #blocks == 0 then
table.insert(configs, default_path)
else
for _, val in pairs(blocks) do
table.insert(configs, val .. "/" .. path_name .. "/Excalidraw")
end
local without_conf_dir = "/root/" .. path_name .. "/Excalidraw"
if default_path == without_conf_dir then
default_path = configs[1]
end
end
return configs, default_path
end
return excalidraw

View File

@@ -0,0 +1,31 @@
<%
local util = require "luci.util"
local container_status = util.trim(util.exec("/usr/libexec/istorec/excalidraw.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"><%:Excalidraw is running%></button>
<% else %>
<button class="cbi-button cbi-button-negative" disabled="true"><%:Excalidraw is not running%></button>
<% end %>
</div>
</div>
<%
if container_running then
local port=util.trim(util.exec("/usr/libexec/istorec/excalidraw.sh port"))
if port == "" then
port="8090"
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 Excalidraw%>" onclick="window.open('http://'+location.hostname+':<%=port%>/', '_blank')">
</div>
</div>
<% end %>

View File

@@ -0,0 +1,50 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "Official website:"
msgstr "官方网站:"
msgid "Excalidraw"
msgstr "Excalidraw画板"
msgid "Excalidraw is a self-host virtual whiteboard for sketching hand-drawn like diagrams."
msgstr "Excalidraw 是支持多人协同的私有化在线画板工具。"
msgid "Config path"
msgstr "配置文件路径"
msgid "Port"
msgstr "端口"
msgid "Service Status"
msgstr "服务状态"
msgid "Excalidraw status:"
msgstr "Excalidraw 的状态信息如下:"
msgid "Setup"
msgstr "安装配置"
msgid "The following parameters will only take effect during installation or upgrade:"
msgstr "以下参数只在安装或者升级时才会生效:"
msgid "Status"
msgstr "状态"
msgid "Excalidraw is running"
msgstr "Excalidraw 运行中"
msgid "Excalidraw is not running"
msgstr "Excalidraw 未运行"
msgid "Open Excalidraw"
msgstr "打开 Excalidraw"
msgid "The free space of Docker is less than 2GB, which may cause the installation to fail."
msgstr "Docker 可用空间已不足2GB可能导致安装失败。"
msgid "Excalidraw Claim Token"
msgstr "Excalidraw Claim 令牌"
msgid "Please make sure there has enough space"
msgstr "请确保有足够空间"

View File

@@ -0,0 +1,5 @@
config main
option 'port' '8090'
option 'config_path' ''
option 'image_ver' ''

View File

@@ -0,0 +1,71 @@
#!/bin/sh
# Author Xiaobao(xiaobao@linkease.com)
ACTION=${1}
shift 1
do_install() {
local port=`uci get excalidraw.@main[0].port 2>/dev/null`
local config=`uci get excalidraw.@main[0].config_path 2>/dev/null`
local image_ver=`uci get excalidraw.@main[0].image_ver 2>/dev/null`
if [ -z "$config" ]; then
echo "config path is empty!"
exit 1
fi
mkdir -p $config
RET=$?
if [ ! "$RET" = "0" ]; then
echo "mkdir config path failed"
exit 1
fi
[ -z $port ] && port=8090
sed 's/PORT_VAR/'$port'/g; s/IMAGE_VER_VAR/'$image_ver'/g' /usr/share/excalidraw/docker-compose.template.yaml > $config/docker-compose.yaml
RET=$?
if [ ! "$RET" = "0" ]; then
echo "convert docker-compose.yaml failed"
exit 1
fi
cd $config
docker-compose down || true
docker-compose up -d
}
usage() {
echo "usage: $0 sub-command"
echo "where sub-command is one of:"
echo " install Install the excalidraw"
echo " upgrade Upgrade the excalidraw"
echo " rm/start/stop/restart Remove/Start/Stop/Restart the excalidraw"
echo " status Excalidraw status"
echo " port Excalidraw port"
}
case ${ACTION} in
"install")
do_install
;;
"upgrade")
do_install
;;
"rm")
docker rm -f excalidraw
;;
"start" | "stop" | "restart")
config=`uci get excalidraw.@main[0].config_path 2>/dev/null`
cd $config && docker-compose ${ACTION}
;;
"status")
docker ps --all -f 'name=excalidraw_frontend_1' --format '{{.State}}'
;;
"port")
docker ps --all -f 'name=excalidraw_frontend_1' --format '{{.Ports}}' | grep -om1 '0.0.0.0:[0-9]*' | sed 's/0.0.0.0://'
;;
*)
usage
exit 1
;;
esac

View File

@@ -0,0 +1,25 @@
version: "3"
networks:
excalidrawnet:
services:
frontend:
image: janson/excalidraw:IMAGE_VER_VAR
ports:
- PORT_VAR:80
networks:
- excalidrawnet
storage:
image: janson/excalidraw-storage-backend:IMAGE_VER_VAR
restart: always
environment:
- PORT=8081
networks:
- excalidrawnet
room:
image: janson/excalidraw-room:IMAGE_VER_VAR
networks:
- excalidrawnet

View File

@@ -27,7 +27,7 @@ do_install() {
fi
cd $config
docker-compose down
docker-compose down || true
docker-compose up -d
echo "Wait 120 to intialize"
sleep 120

View File

@@ -1,11 +0,0 @@
#!/bin/sh
image_name=`uci get xteve.@main[0].image_name 2>/dev/null`
if [ "$image_name" == "alturismo/xteve_guide2go" -a "`uname -m`" != "x86_64" ]; then
uci -q batch <<-EOF >/dev/null
set xteve.@main[0].image_name=""
commit xteve
EOF
fi
exit 0

View File

@@ -4,6 +4,9 @@ msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "Official website:"
msgstr "官方网站:"
msgid "Xunlei"
msgstr "Xunlei下载"
msgid "Xunlei is an download tool, made by Xunlei, Inc."
msgstr "Xunlei 是一个下载工具。"