commit fa1a9064754c5d2d56af380f3ea3b43c80683c54 Author: ben Date: Wed Sep 6 19:24:05 2023 -0400 first commit diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5ad2710 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ + + +include $(TOPDIR)/rules.mk + + +LUCI_TITLE:=LuCI support for mastodon +LUCI_PKGARCH:=all +LUCI_DEPENDS:=+lsblk +docker +luci-lib-taskd + +define Package/luci-app-mastodon/conffiles +/etc/config/mastodon +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/mastodon.lua b/luasrc/controller/mastodon.lua new file mode 100755 index 0000000..473c31d --- /dev/null +++ b/luasrc/controller/mastodon.lua @@ -0,0 +1,15 @@ + +module("luci.controller.mastodon", package.seeall) + +function index() + entry({"admin", "apps"}, firstchild(), _("Apps") , 45).dependent = false + if not nixio.fs.access("/etc/config/mastodon") then + return + end + + local page = entry({"admin", "apps", "mastodon"}, cbi("mastodon"), _("mastodon")) + page.order = 10 + page.dependent = true + page.acl_depends = { "luci-app-mastodon" } + entry({"admin","apps","mastodon","status"},call("act_status")).leaf=true +end diff --git a/luasrc/model/cbi/mastodon.lua b/luasrc/model/cbi/mastodon.lua new file mode 100644 index 0000000..13248de --- /dev/null +++ b/luasrc/model/cbi/mastodon.lua @@ -0,0 +1,47 @@ +--[[ +LuCI - Lua Configuration Interface +]]-- + +local taskd = require "luci.model.tasks" +local mastodon_model = require "luci.model.mastodon" +local m, s, o + +m = taskd.docker_map("mastodon", "mastodon", "/usr/libexec/apps/mastodon/mastodon.sh", + translate("mastodon"), + translate("Mastodon is a decentralized social network made up of independent servers organized around specific themes, topics, or interests. People can join servers, follow each other, engage in conversations, and otherwise do all sorts of things they'd expect to do on a social network like Twitter.") + .. translate("Official website:") .. ' https://joinmastodon.org/') + +s = m:section(SimpleSection, translate("Service Status"), translate("mastodon status:")) +s:append(Template("mastodon/status")) + +s = m:section(TypedSection, "mastodon", translate("Setup"), translate("Enter domain name instead of router ip if self hosting via domain.")) +s.addremove=false +s.anonymous=true + +o = s:option(Value, "port", translate("Port").."*") +o.rmempty = false +o.default = "8660" +o.datatype = "port" + +o = s:option(Value, "image_name", translate("Image").."*") +o.rmempty = false +o.datatype = "string" +o:value("lscr.io/linuxserver/mastodon:latest", "lscr.io/linuxserver/mastodon:latest") +o.default = "lscr.io/linuxserver/mastodon:latest" + +local blocks = mastodon_model.blocks() +local home = mastodon_model.home() + +o = s:option(Value, "config_path", translate("Enter router IP or domain name").."*") +o.rmempty = false +o.datatype = "string" +o:value("192.168.70.1", "192.168.70.1") +o.default = "192.168.70.1" + +local paths, default_path = mastodon_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/mastodon.lua b/luasrc/model/mastodon.lua new file mode 100644 index 0000000..da4807d --- /dev/null +++ b/luasrc/model/mastodon.lua @@ -0,0 +1,55 @@ +local util = require "luci.util" +local jsonc = require "luci.jsonc" + +local mastodon = {} + +mastodon.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 + +mastodon.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 + +mastodon.find_paths = function(blocks, home_dirs, path_name) + local default_path = '' + local configs = {} + + default_path = home_dirs[path_name] .. "/mastodon" + if #blocks == 0 then + table.insert(configs, default_path) + else + for _, val in pairs(blocks) do + table.insert(configs, val .. "/" .. path_name .. "/mastodon") + end + local without_conf_dir = "/root/" .. path_name .. "/mastodon" + if default_path == without_conf_dir then + default_path = configs[1] + end + end + + return configs, default_path +end + +return mastodon diff --git a/luasrc/view/mastodon/status.htm b/luasrc/view/mastodon/status.htm new file mode 100644 index 0000000..356c244 --- /dev/null +++ b/luasrc/view/mastodon/status.htm @@ -0,0 +1,31 @@ +<% +local util = require "luci.util" +local container_status = util.trim(util.exec("/usr/libexec/apps/mastodon/mastodon.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/mastodon/mastodon.sh port")) + if port == "" then + port="8660" + end +-%> +
+ +
+ + +
+
+<% end %> diff --git a/root/etc/config/mastodon b/root/etc/config/mastodon new file mode 100644 index 0000000..f7371b2 --- /dev/null +++ b/root/etc/config/mastodon @@ -0,0 +1,5 @@ +config mastodon + option 'port' '8660' + option 'config_path' '192.168.70.1' + option 'image_name' 'lscr.io/linuxserver/mastodon:latest' + diff --git a/root/etc/uci-defaults/luci-app-mastodon b/root/etc/uci-defaults/luci-app-mastodon new file mode 100644 index 0000000..4f5d63a --- /dev/null +++ b/root/etc/uci-defaults/luci-app-mastodon @@ -0,0 +1,14 @@ +#!/bin/sh + +config_dir=`uci -q get mastodon.@mastodon[0].config_path` + +data_dir=`docker inspect --format '{{.Mounts}}' mastodon | 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 mastodon.@mastodon[0].config_path="$data_dir" + commit mastodon +EOF +fi + +exit 0 diff --git a/root/usr/libexec/apps/mastodon/mastodon.sh b/root/usr/libexec/apps/mastodon/mastodon.sh new file mode 100755 index 0000000..26bbe4b --- /dev/null +++ b/root/usr/libexec/apps/mastodon/mastodon.sh @@ -0,0 +1,169 @@ +#!/bin/sh + +ACTION=${1} +shift 1 + +get_image() { + IMAGE_NAME="lscr.io/linuxserver/mastodon:latest" +} + +do_install_detail() { + local config=`uci get mastodon.@mastodon[0].config_path 2>/dev/null` + local port=`uci get mastodon.@mastodon[0].port 2>/dev/null` + local IMAGE_NAME=`uci get mastodon.@mastodon[0].image_name 2>/dev/null` + local username=`uci get mastodon.@mastodon[0].username 2>/dev/null` + local password=`uci get mastodon.@mastodon[0].password 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) + + +# rake secrets +secret=$(docker run --rm -it --entrypoint /bin/bash lscr.io/linuxserver/mastodon generate-secret) +base=$(docker run --rm -it --entrypoint /bin/bash lscr.io/linuxserver/mastodon generate-secret) + +output=$(docker run --rm -it --entrypoint /bin/bash lscr.io/linuxserver/mastodon generate-vapid) + +private_key=$(echo "$output" | grep VAPID_PRIVATE_KEY | awk -F= '{print $2}') +public_key=$(echo "$output" | grep VAPID_PUBLIC_KEY | awk -F= '{print $2}') + + + # Create Docker Compose file with custom variables +touch docker-compose.yml +cat > docker-compose.yml <