From 6b1e491c93c14d2689b03011cca4550d47f93451 Mon Sep 17 00:00:00 2001 From: Ben Date: Sun, 3 Sep 2023 05:21:07 +0000 Subject: [PATCH] first commit --- Makefile | 16 +++ README.md | 0 luasrc/controller/joplin.lua | 15 +++ luasrc/model/cbi/joplin.lua | 47 +++++++ luasrc/model/joplin.lua | 55 +++++++++ luasrc/view/joplin/status.htm | 31 +++++ root/etc/config/joplin | 4 + root/etc/uci-defaults/luci-app-joplin | 14 +++ root/usr/libexec/apps/joplin/joplin.sh | 115 ++++++++++++++++++ .../usr/share/rpcd/acl.d/luci-app-joplin.json | 11 ++ 10 files changed, 308 insertions(+) create mode 100644 Makefile create mode 100644 README.md create mode 100644 luasrc/controller/joplin.lua create mode 100644 luasrc/model/cbi/joplin.lua create mode 100644 luasrc/model/joplin.lua create mode 100644 luasrc/view/joplin/status.htm create mode 100644 root/etc/config/joplin create mode 100644 root/etc/uci-defaults/luci-app-joplin create mode 100644 root/usr/libexec/apps/joplin/joplin.sh create mode 100644 root/usr/share/rpcd/acl.d/luci-app-joplin.json diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..dd9229f --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ + + +include $(TOPDIR)/rules.mk + + +LUCI_TITLE:=LuCI support for joplin +LUCI_PKGARCH:=all +LUCI_DEPENDS:=+lsblk +docker +luci-lib-taskd + +define Package/luci-app-joplin/conffiles +/etc/config/joplin +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/luasrc/controller/joplin.lua b/luasrc/controller/joplin.lua new file mode 100644 index 0000000..826fac9 --- /dev/null +++ b/luasrc/controller/joplin.lua @@ -0,0 +1,15 @@ + +module("luci.controller.joplin", package.seeall) + +function index() + entry({"admin", "apps"}, firstchild(), _("Apps") , 45).dependent = false + if not nixio.fs.access("/etc/config/joplin") then + return + end + + local page = entry({"admin", "apps", "joplin"}, cbi("joplin"), _("joplin")) + page.order = 10 + page.dependent = true + page.acl_depends = { "luci-app-joplin" } + entry({"admin","apps","joplin","status"},call("act_status")).leaf=true +end diff --git a/luasrc/model/cbi/joplin.lua b/luasrc/model/cbi/joplin.lua new file mode 100644 index 0000000..89f6115 --- /dev/null +++ b/luasrc/model/cbi/joplin.lua @@ -0,0 +1,47 @@ +--[[ +LuCI - Lua Configuration Interface +]]-- + +local taskd = require "luci.model.tasks" +local joplin_model = require "luci.model.joplin" +local m, s, o + +m = taskd.docker_map("joplin", "joplin", "/usr/libexec/apps/joplin/joplin.sh", + translate("joplin"), + translate("Joplin Server can run in a Docker container on your server or anywhere you want to run it with Docker. Joplin Server will allow you to sync notes from the desktop application and mobile phone applications so you can view, edit or add notes anywhere on the go.") + .. translate("Official website:") .. ' https://hub.docker.com/r/florider89/joplin-server/') + +s = m:section(SimpleSection, translate("Service Status"), translate("joplin status:")) +s:append(Template("joplin/status")) + +s = m:section(TypedSection, "joplin", translate("Setup"), 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").."*") +o.rmempty = false +o.default = "22300" +o.datatype = "port" + +o = s:option(Value, "image_name", translate("Image").."*") +o.rmempty = false +o.datatype = "string" +o:value("florider89/joplin-server:latest", "florider89/joplin-server:latest") +o.default = "florider89/joplin-server:latest" + +local blocks = joplin_model.blocks() +local home = joplin_model.home() + +o = s:option(Value, "config_path", translate("Config path").."*") +o.rmempty = false +o.datatype = "string" +o:value("/opt/docker2/compose/Config", "/opt/docker2/compose/Config") +o.default = "/opt/docker2/compose/Config" + +local paths, default_path = joplin_model.find_paths(blocks, home, "Configs") +for _, val in pairs(paths) do + o:value(val, val) +end +o.default = default_path + +return m diff --git a/luasrc/model/joplin.lua b/luasrc/model/joplin.lua new file mode 100644 index 0000000..281fe48 --- /dev/null +++ b/luasrc/model/joplin.lua @@ -0,0 +1,55 @@ +local util = require "luci.util" +local jsonc = require "luci.jsonc" + +local joplin = {} + +joplin.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 + +joplin.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 + +joplin.find_paths = function(blocks, home_dirs, path_name) + local default_path = '' + local configs = {} + + default_path = home_dirs[path_name] .. "/joplin" + if #blocks == 0 then + table.insert(configs, default_path) + else + for _, val in pairs(blocks) do + table.insert(configs, val .. "/" .. path_name .. "/joplin") + end + local without_conf_dir = "/root/" .. path_name .. "/joplin" + if default_path == without_conf_dir then + default_path = configs[1] + end + end + + return configs, default_path +end + +return joplin diff --git a/luasrc/view/joplin/status.htm b/luasrc/view/joplin/status.htm new file mode 100644 index 0000000..f9b5fd1 --- /dev/null +++ b/luasrc/view/joplin/status.htm @@ -0,0 +1,31 @@ +<% +local util = require "luci.util" +local container_status = util.trim(util.exec("/usr/libexec/apps/joplin/joplin.sh status")) +local container_install = (string.len(container_status) > 0) +local container_running = container_status == "running" +-%> +
+ +
+ <% if container_running then %> + + <% else %> + + <% end %> +
+
+<% +if container_running then + local port=util.trim(util.exec("/usr/libexec/apps/joplin/joplin.sh port")) + if port == "" then + port="22300" + end +-%> +
+ +
+ + +
+
+<% end %> diff --git a/root/etc/config/joplin b/root/etc/config/joplin new file mode 100644 index 0000000..fc6096a --- /dev/null +++ b/root/etc/config/joplin @@ -0,0 +1,4 @@ +config joplin + option 'port' '22300' + option 'config_path' '/opt/docker2/compose/Config' + option 'image_name' 'florider89/joplin-server:latest' diff --git a/root/etc/uci-defaults/luci-app-joplin b/root/etc/uci-defaults/luci-app-joplin new file mode 100644 index 0000000..f7f8a14 --- /dev/null +++ b/root/etc/uci-defaults/luci-app-joplin @@ -0,0 +1,14 @@ +#!/bin/sh + +config_dir=`uci -q get joplin.@joplin[0].config_path` + +data_dir=`docker inspect --format '{{.Mounts}}' joplin | grep -Eom1 '[^ ]+/_data /var/www/html local true ' | cut -d' ' -f1` + +if [ -n "$data_dir" -a "$data_dir" != "$config_dir" ]; then + uci -q batch <<-EOF >/dev/null + set joplin.@joplin[0].config_path="$data_dir" + commit joplin +EOF +fi + +exit 0 diff --git a/root/usr/libexec/apps/joplin/joplin.sh b/root/usr/libexec/apps/joplin/joplin.sh new file mode 100644 index 0000000..56660fa --- /dev/null +++ b/root/usr/libexec/apps/joplin/joplin.sh @@ -0,0 +1,115 @@ +#!/bin/sh + +ACTION=${1} +shift 1 + +get_image() { + IMAGE_NAME="florider89/joplin-server:latest" +} + +do_install_detail() { + local config=`uci get joplin.@joplin[0].config_path 2>/dev/null` + local port=`uci get joplin.@joplin[0].port 2>/dev/null` + local IMAGE_NAME=`uci get joplin.@joplin[0].image_name 2>/dev/null` + + #Generate the generic environment variables for the docker-compose + + GEN_PASS=$(< /dev/urandom tr -dc A-Za-z0-9 2>/dev/null | head -c14; echo) + GEN_PASS2=$(< /dev/urandom tr -dc A-Za-z0-9 2>/dev/null | head -c14; echo) + + # Get our local LAN IP Address + LAN_IP=$(uci get network.lan.ipaddr) + # Strip trailing network mask + LAN_IP="${LAN_IP%/*}" + + if [ -z "$config" ]; then + echo "config path is empty!" + exit 1 + fi + + [ -z "$port" ] && port=22300 + [ -z "$IMAGE_NAME" ] && IMAGE_NAME=florider89/joplin-server:latest + + + # Create Docker Compose file with custom variables + + # Create Docker Compose file with custom variables +touch docker-compose.yml +cat > docker-compose.yml <