From a6cae546f67c5b3956a64474a1d8250335d8fe4d Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 2 Sep 2023 17:33:41 +0000 Subject: [PATCH] first commit --- Makefile | 16 ++ README.md | 0 luasrc/controller/whoogle.lua | 15 ++ luasrc/model/cbi/whoogle.lua | 47 ++++++ luasrc/model/whoogle.lua | 55 +++++++ luasrc/view/whoogle/status.htm | 31 ++++ root/etc/config/whoogle | 4 + root/etc/uci-defaults/luci-app-whoogle | 14 ++ root/usr/libexec/apps/whoogle/whoogle.sh | 138 ++++++++++++++++++ .../share/rpcd/acl.d/luci-app-whoogle.json | 11 ++ 10 files changed, 331 insertions(+) create mode 100644 Makefile create mode 100644 README.md create mode 100644 luasrc/controller/whoogle.lua create mode 100644 luasrc/model/cbi/whoogle.lua create mode 100644 luasrc/model/whoogle.lua create mode 100644 luasrc/view/whoogle/status.htm create mode 100644 root/etc/config/whoogle create mode 100644 root/etc/uci-defaults/luci-app-whoogle create mode 100644 root/usr/libexec/apps/whoogle/whoogle.sh create mode 100644 root/usr/share/rpcd/acl.d/luci-app-whoogle.json diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5656e3e --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ + + +include $(TOPDIR)/rules.mk + + +LUCI_TITLE:=LuCI support for whoogle +LUCI_PKGARCH:=all +LUCI_DEPENDS:=+lsblk +docker +luci-lib-taskd + +define Package/luci-app-whoogle/conffiles +/etc/config/whoogle +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/whoogle.lua b/luasrc/controller/whoogle.lua new file mode 100644 index 0000000..a404945 --- /dev/null +++ b/luasrc/controller/whoogle.lua @@ -0,0 +1,15 @@ + +module("luci.controller.whoogle", package.seeall) + +function index() + entry({"admin", "apps"}, firstchild(), _("Apps") , 45).dependent = false + if not nixio.fs.access("/etc/config/whoogle") then + return + end + + local page = entry({"admin", "apps", "whoogle"}, cbi("whoogle"), _("whoogle")) + page.order = 10 + page.dependent = true + page.acl_depends = { "luci-app-whoogle" } + entry({"admin","apps","whoogle","status"},call("act_status")).leaf=true +end diff --git a/luasrc/model/cbi/whoogle.lua b/luasrc/model/cbi/whoogle.lua new file mode 100644 index 0000000..ad5ae3c --- /dev/null +++ b/luasrc/model/cbi/whoogle.lua @@ -0,0 +1,47 @@ +--[[ +LuCI - Lua Configuration Interface +]]-- + +local taskd = require "luci.model.tasks" +local whoogle_model = require "luci.model.whoogle" +local m, s, o + +m = taskd.docker_map("whoogle", "whoogle", "/usr/libexec/apps/whoogle/whoogle.sh", + translate("whoogle"), + translate("Whoogle is a free open-source self-hosted metasearch engine that allows you to search and get your Google results without ads, JavaScript trackers, or AMP links. It also ignores cookies, and does not perform any IP address tracking.") + .. translate("Official website:") .. ' https://hub.docker.com/r/benbusby/whoogle-search/') + +s = m:section(SimpleSection, translate("Service Status"), translate("whoogle status:")) +s:append(Template("whoogle/status")) + +s = m:section(TypedSection, "whoogle", 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 = "5000" +o.datatype = "port" + +o = s:option(Value, "image_name", translate("Image").."*") +o.rmempty = false +o.datatype = "string" +o:value("benbusby/whoogle-search", "benbusby/whoogle-search") +o.default = "benbusby/whoogle-search" + +local blocks = whoogle_model.blocks() +local home = whoogle_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 = whoogle_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/whoogle.lua b/luasrc/model/whoogle.lua new file mode 100644 index 0000000..56ea7c1 --- /dev/null +++ b/luasrc/model/whoogle.lua @@ -0,0 +1,55 @@ +local util = require "luci.util" +local jsonc = require "luci.jsonc" + +local whoogle = {} + +whoogle.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 + +whoogle.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 + +whoogle.find_paths = function(blocks, home_dirs, path_name) + local default_path = '' + local configs = {} + + default_path = home_dirs[path_name] .. "/whoogle" + if #blocks == 0 then + table.insert(configs, default_path) + else + for _, val in pairs(blocks) do + table.insert(configs, val .. "/" .. path_name .. "/whoogle") + end + local without_conf_dir = "/root/" .. path_name .. "/whoogle" + if default_path == without_conf_dir then + default_path = configs[1] + end + end + + return configs, default_path +end + +return whoogle diff --git a/luasrc/view/whoogle/status.htm b/luasrc/view/whoogle/status.htm new file mode 100644 index 0000000..d55b3bc --- /dev/null +++ b/luasrc/view/whoogle/status.htm @@ -0,0 +1,31 @@ +<% +local util = require "luci.util" +local container_status = util.trim(util.exec("/usr/libexec/apps/whoogle/whoogle.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/whoogle/whoogle.sh port")) + if port == "" then + port="5000" + end +-%> +
+ +
+ + +
+
+<% end %> diff --git a/root/etc/config/whoogle b/root/etc/config/whoogle new file mode 100644 index 0000000..4efa66e --- /dev/null +++ b/root/etc/config/whoogle @@ -0,0 +1,4 @@ +config whoogle + option 'port' '5000' + option 'config_path' '/opt/docker2/config' + option 'image_name' 'benbusby/whoogle-search' diff --git a/root/etc/uci-defaults/luci-app-whoogle b/root/etc/uci-defaults/luci-app-whoogle new file mode 100644 index 0000000..3ebb11e --- /dev/null +++ b/root/etc/uci-defaults/luci-app-whoogle @@ -0,0 +1,14 @@ +#!/bin/sh + +config_dir=`uci -q get whoogle.@whoogle[0].config_path` + +data_dir=`docker inspect --format '{{.Mounts}}' whoogle | 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 whoogle.@whoogle[0].config_path="$data_dir" + commit whoogle +EOF +fi + +exit 0 diff --git a/root/usr/libexec/apps/whoogle/whoogle.sh b/root/usr/libexec/apps/whoogle/whoogle.sh new file mode 100644 index 0000000..180a3bb --- /dev/null +++ b/root/usr/libexec/apps/whoogle/whoogle.sh @@ -0,0 +1,138 @@ +#!/bin/sh + +ACTION=${1} +shift 1 + +get_image() { + IMAGE_NAME="benbusby/whoogle-search" +} + +do_install_detail() { + local config=`uci get whoogle.@whoogle[0].config_path 2>/dev/null` + local port=`uci get whoogle.@whoogle[0].port 2>/dev/null` + local IMAGE_NAME=`uci get whoogle.@whoogle[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=5000 + [ -z "$IMAGE_NAME" ] && IMAGE_NAME=benbusby/whoogle-search + + + # Create Docker Compose file with custom variables + + # Create Docker Compose file with custom variables +touch docker-compose.yml +cat > docker-compose.yml < + #- WHOOGLE_PASS= + # Proxy configuration, uncomment to enable + #- WHOOGLE_PROXY_USER= + #- WHOOGLE_PROXY_PASS= + #- WHOOGLE_PROXY_TYPE= + # Site alternative configurations, uncomment to enable + # Note: If not set, the feature will still be available + # with default values. + #- WHOOGLE_ALT_TW=farside.link/nitter + #- WHOOGLE_ALT_YT=farside.link/invidious + #- WHOOGLE_ALT_IG=farside.link/bibliogram/u + #- WHOOGLE_ALT_RD=farside.link/libreddit + #- WHOOGLE_ALT_MD=farside.link/scribe + #- WHOOGLE_ALT_TL=farside.link/lingva + #- WHOOGLE_ALT_IMG=farside.link/rimgo + #- WHOOGLE_ALT_WIKI=farside.link/wikiless + #- WHOOGLE_ALT_IMDB=farside.link/libremdb + #- WHOOGLE_ALT_QUORA=farside.link/quetre + #env_file: # Alternatively, load variables from whoogle.env + #- whoogle.env + ports: + - ${port}:5000 + labels: + plugsy.name: "Whoogle" + plugsy.category: "Home" + plugsy.icon: "@styled-icons/boxicons-logos/Google" + plugsy.link: "http://${LAN_IP}:${port}" +EOF + + docker-compose up -d + + # Add a new list option to the "shortcutmenu" configuration file + uci add shortcutmenu lists + uci set shortcutmenu.@lists[-1].webname="$IMAGE_NAME" + uci set shortcutmenu.@lists[-1].weburl="$LAN_IP:$port" + uci set shortcutmenu.@lists[-1].webpath="/" + uci commit shortcutmenu + +} + +usage() { + echo "usage: $0 sub-command" + echo "where sub-command is one of:" + echo " install Install whoogle" + echo " upgrade Upgrade whoogle" + echo " rm/start/stop/restart Remove/Start/Stop/Restart whoogle" + echo " status whoogle status" + echo " port whoogle port" +} + +case ${ACTION} in + "install") + get_image + do_install_detail + ;; + "upgrade") + get_image + do_install_detail + ;; + "rm") + docker rm -f whoogle + ;; + "start" | "stop" | "restart") + docker ${ACTION} whoogle + ;; + "status") + docker ps --all -f 'name=whoogle' --format '{{.State}}' + ;; + "port") + docker ps --all -f 'name=whoogle' --format '{{.Ports}}' | grep -om1 '0.0.0.0:[0-9]*' | sed 's/0.0.0.0://' + ;; + *) + usage + exit 1 + ;; +esac diff --git a/root/usr/share/rpcd/acl.d/luci-app-whoogle.json b/root/usr/share/rpcd/acl.d/luci-app-whoogle.json new file mode 100644 index 0000000..8344caa --- /dev/null +++ b/root/usr/share/rpcd/acl.d/luci-app-whoogle.json @@ -0,0 +1,11 @@ +{ + "luci-app-whoogle": { + "description": "Grant UCI access for luci-app-whoogle", + "read": { + "uci": [ "whoogle" ] + }, + "write": { + "uci": [ "whoogle" ] + } + } +}