add mtphotos

This commit is contained in:
janson 2024-03-14 20:03:45 +08:00
parent a21bf16601
commit 68255cd8b2
8 changed files with 313 additions and 0 deletions

View File

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

View File

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

View File

@ -0,0 +1,73 @@
--[[
LuCI - Lua Configuration Interface
]]--
local taskd = require "luci.model.tasks"
local docker = require "luci.docker"
local mtphotos_model = require "luci.model.mtphotos"
local m, s, o
m = taskd.docker_map("mtphotos", "mtphotos", "/usr/libexec/istorec/mtphotos.sh",
translate("MTPhotos"),
translate("MTPhotos is a photo manager, made by MTPhotos, Inc.")
.. translate("Official website:") .. ' <a href=\"https://mtmt.tech/\" target=\"_blank\">https://mtmt.tech/</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("MTPhotos status:"))
s:append(Template("mtphotos/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 = "8063"
o.datatype = "port"
o:depends("hostnet", 0)
o = s:option(Value, "image_name", translate("Image").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
o:value("mtphotos/mt-photos:nodb-latest", "mtphotos/mt-photos:nodb-latest")
o:value("mtphotos/mt-photos:latest", "mtphotos/mt-photos:latest")
if "x86_64" == docker_info.Architecture then
o.default = "mtphotos/mt-photos:latest"
else
o:value("mtphotos/mt-photos:arm-latest", "mtphotos/mt-photos:arm-latest")
o.default = "mtphotos/mt-photos:arm-latest"
end
local blocks = mtphotos_model.blocks()
local home = mtphotos_model.home()
o = s:option(Value, "config_path", translate("Config path").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
local paths, default_path = mtphotos_model.find_paths(blocks, home, "Configs")
for _, val in pairs(paths) do
o:value(val.."/Config", val.."/Config")
end
o.default = default_path.."/Config"
o = s:option(Value, "upload_path", translate("Upload path").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
for _, val in pairs(paths) do
o:value(val.."/Upload", val.."/Upload")
end
o.default = default_path.."/Upload"
return m

View File

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

View File

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

View File

@ -0,0 +1,47 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "Official website:"
msgstr "官方网站:"
msgid "MTPhotos is a photo manager, made by MTPhotos, Inc."
msgstr "MTPhotos 是一个相册管理软件。"
msgid "Config path"
msgstr "配置文件路径"
msgid "Upload path"
msgstr "上传文件路径"
msgid "Port"
msgstr "端口"
msgid "Service Status"
msgstr "服务状态"
msgid "MTPhotos status:"
msgstr "MTPhotos 的状态信息如下:"
msgid "Setup"
msgstr "安装配置"
msgid "The following parameters will only take effect during installation or upgrade:"
msgstr "以下参数只在安装或者升级时才会生效:"
msgid "Status"
msgstr "状态"
msgid "MTPhotos is running"
msgstr "MTPhotos 运行中"
msgid "MTPhotos is not running"
msgstr "MTPhotos 未运行"
msgid "Open MTPhotos"
msgstr "打开 MTPhotos"
msgid "The free space of Docker is less than 2GB, which may cause the installation to fail."
msgstr "Docker 可用空间已不足2GB可能导致安装失败。"
msgid "Please make sure there has enough space"
msgstr "请确保有足够空间"

View File

@ -0,0 +1,5 @@
config main
option 'port' '8063'
# option 'config_path' ''
# option 'upload_path' ''

View File

@ -0,0 +1,77 @@
#!/bin/sh
# Author Xiaobao(xiaobao@linkease.com)
ACTION=${1}
shift 1
do_install() {
local port=`uci get mtphotos.@main[0].port 2>/dev/null`
local image_name=`uci get mtphotos.@main[0].image_name 2>/dev/null`
local config=`uci get mtphotos.@main[0].config_path 2>/dev/null`
local upload=`uci get mtphotos.@main[0].upload_path 2>/dev/null`
if [ -z "$config" ]; then
echo "config path is empty!"
exit 1
fi
[ -z "$image_name" ] && image_name="mtphotos/mt-photos:latest"
echo "docker pull ${image_name}"
docker pull ${image_name}
docker rm -f mtphotos
[ -z "$port" ] && port=8063
local cmd="docker run --restart=unless-stopped -d -h MTPhotosServer \
-v \"$upload:/upload\" \
-v \"$config:/config\" "
cmd="$cmd\
--dns=172.17.0.1 \
-p $port:8063 "
local tz="`uci get system.@system[0].zonename | sed 's/ /_/g'`"
[ -z "$tz" ] || cmd="$cmd -e TZ=$tz"
cmd="$cmd -v /mnt:/mnt"
mountpoint -q /mnt && cmd="$cmd:rslave"
cmd="$cmd --name mtphotos \"$image_name\""
echo "$cmd"
eval "$cmd"
}
usage() {
echo "usage: $0 sub-command"
echo "where sub-command is one of:"
echo " install Install the mtphotos"
echo " upgrade Upgrade the mtphotos"
echo " rm/start/stop/restart Remove/Start/Stop/Restart the mtphotos"
echo " status MTPhotos status"
echo " port MTPhotos port"
}
case ${ACTION} in
"install")
do_install
;;
"upgrade")
do_install
;;
"rm")
docker rm -f mtphotos
;;
"start" | "stop" | "restart")
docker ${ACTION} mtphotos
;;
"status")
docker ps --all -f 'name=mtphotos' --format '{{.State}}'
;;
"port")
docker ps --all -f 'name=mtphotos' --format '{{.Ports}}' | grep -om1 '0.0.0.0:[0-9]*->8063/tcp' | sed 's/0.0.0.0:\([0-9]*\)->.*/\1/'
;;
*)
usage
exit 1
;;
esac