#!/usr/bin/env bash # SPDX-License-Identifier: AGPL-3.0-or-later # shellcheck source=utils/lib.sh source "$(dirname "${BASH_SOURCE[0]}")/lib.sh" # shellcheck source=utils/lib_go.sh source "${REPO_ROOT}/utils/lib_go.sh" # shellcheck source=utils/lib_install.sh source "${REPO_ROOT}/utils/lib_install.sh" # ---------------------------------------------------------------------------- # config # ---------------------------------------------------------------------------- MORTY_LISTEN="${MORTY_LISTEN:-127.0.0.1:3000}" PUBLIC_URL_PATH_MORTY="${PUBLIC_URL_PATH_MORTY:-/morty/}" PUBLIC_URL_MORTY="${PUBLIC_URL_MORTY:-$(echo "$PUBLIC_URL" | sed -e's,^\(.*://[^/]*\).*,\1,g')${PUBLIC_URL_PATH_MORTY}}" # shellcheck disable=SC2034 MORTY_TIMEOUT=5 SERVICE_NAME="morty" SERVICE_USER="${SERVICE_USER:-${SERVICE_NAME}}" SERVICE_HOME_BASE="${SERVICE_HOME_BASE:-/usr/local}" SERVICE_HOME="${SERVICE_HOME_BASE}/${SERVICE_USER}" SERVICE_SYSTEMD_UNIT="${SYSTEMD_UNITS}/${SERVICE_NAME}.service" # shellcheck disable=SC2034 SERVICE_GROUP="${SERVICE_USER}" # shellcheck disable=SC2034 SERVICE_ENV_DEBUG=false GO_ENV="${SERVICE_HOME}/.go_env" GO_VERSION="go1.17.2" # shellcheck disable=SC2034 CONFIG_FILES=() # Apache Settings APACHE_MORTY_SITE="morty.conf" NGINX_MORTY_SITE="morty.conf" # ---------------------------------------------------------------------------- usage() { # ---------------------------------------------------------------------------- # shellcheck disable=SC1117 cat < "$(go_version)" ]]; then warn_msg "golang ($(go_version)) needs to be $GO_VERSION at least" warn_msg "you need to reinstall $SERVICE_USER --> $0 reinstall all" else info_msg "golang $(go_version) is installed (min needed is: $GO_VERSION)" fi } go_version(){ go.version "${SERVICE_USER}" } remove_all() { rst_title "De-Install $SERVICE_NAME (service)" rst_para "\ It goes without saying that this script can only be used to remove installations that were installed with this script." if systemd_remove_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}"; then drop_service_account "${SERVICE_USER}" fi } assert_user() { rst_title "user $SERVICE_USER" section echo tee_stderr 1 <> ~/.profile EOF } morty_is_installed() { [[ -f $SERVICE_HOME/go-apps/bin/morty ]] } install_morty() { rst_title "Install morty in user's ~/go-apps" section echo go.install github.com/asciimoo/morty@latest "${SERVICE_USER}" } update_morty() { rst_title "Update morty" section echo go.install github.com/asciimoo/morty@latest "${SERVICE_USER}" } set_service_env_debug() { # usage: set_service_env_debug [false|true] # shellcheck disable=SC2034 local SERVICE_ENV_DEBUG="${1:-false}" if systemd_remove_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}"; then systemd_install_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}" fi } inspect_service() { rst_title "service status & log" cat < ${PUBLIC_URL_MORTY}" info_msg "morty URL --> http://${MORTY_LISTEN}" fi local _debug_on if ask_yn "Enable morty debug mode (needs reinstall of systemd service)?"; then enable_debug _debug_on=1 else systemctl --no-pager -l status "${SERVICE_NAME}" fi echo # shellcheck disable=SC2059 printf "// use ${_BCyan}CTRL-C${_creset} to stop monitoring the log" read -r -s -n1 -t 5 echo while true; do trap break 2 journalctl -f -u "${SERVICE_NAME}" done if [[ $_debug_on == 1 ]]; then FORCE_SELECTION=Y disable_debug fi return 0 } enable_debug() { warn_msg "Do not enable debug in production environments!!" info_msg "Enabling debug option needs to reinstall systemd service!" set_service_env_debug true } disable_debug() { info_msg "Disabling debug option needs to reinstall systemd service!" set_service_env_debug false } set_new_key() { rst_title "Set morty key" echo MORTY_KEY="$(head -c 32 /dev/urandom | base64)" info_msg "morty key: '${MORTY_KEY}'" warn_msg "this will need to reinstall services .." MSG="${_Green}press any [${_BCyan}KEY${_Green}] to continue // stop with [${_BCyan}CTRL-C${_creset}]" wait_key systemd_install_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}" "${REPO_ROOT}/utils/searx.sh" option result-proxy "${PUBLIC_URL_MORTY}" "${MORTY_KEY}" "${REPO_ROOT}/utils/searx.sh" option image-proxy-on } install_apache_site() { rst_title "Install Apache site $APACHE_MORTY_SITE" rst_para "\ This installs a reverse proxy (ProxyPass) into apache site (${APACHE_MORTY_SITE})" ! apache_is_installed && err_msg "Apache is not installed." if ! ask_yn "Do you really want to continue?" Yn; then return else install_apache fi apache_install_site "${APACHE_MORTY_SITE}" info_msg "testing public url .." if ! service_is_available "${PUBLIC_URL_MORTY}"; then err_msg "Public service at ${PUBLIC_URL_MORTY} is not available!" fi } remove_apache_site() { rst_title "Remove Apache site $APACHE_MORTY_SITE" rst_para "\ This removes apache site ${APACHE_MORTY_SITE}." ! apache_is_installed && err_msg "Apache is not installed." if ! ask_yn "Do you really want to continue?" Yn; then return fi apache_remove_site "$APACHE_MORTY_SITE" } install_nginx_site() { rst_title "Install nginx site $NGINX_MORTY_SITE" rst_para "\ This installs a reverse proxy (ProxyPass) into nginx site (${NGINX_MORTY_SITE})" ! nginx_is_installed && err_msg "nginx is not installed." if ! ask_yn "Do you really want to continue?" Yn; then return else install_nginx fi "${REPO_ROOT}/utils/searx.sh" install uwsgi # shellcheck disable=SC2034 SEARX_SRC=$("${REPO_ROOT}/utils/searx.sh" --getenv SEARX_SRC) # shellcheck disable=SC2034 SEARXNG_URL_PATH=$("${REPO_ROOT}/utils/searx.sh" --getenv SEARXNG_URL_PATH) nginx_install_app "${NGINX_MORTY_SITE}" info_msg "testing public url .." if ! service_is_available "${PUBLIC_URL_MORTY}"; then err_msg "Public service at ${PUBLIC_URL_MORTY} is not available!" fi } remove_nginx_site() { rst_title "Remove nginx site $NGINX_MORTY_SITE" rst_para "\ This removes nginx site ${NGINX_MORTY_SITE}." ! nginx_is_installed && err_msg "nginx is not installed." if ! ask_yn "Do you really want to continue?" Yn; then return fi nginx_remove_site "$NGINX_MORTY_SITE" } rst-doc() { eval "echo \"$(< "${REPO_ROOT}/docs/build-templates/morty.rst")\"" echo -e "\n.. START install systemd unit" cat <