#!/usr/bin/env bash # SPDX-License-Identifier: AGPL-3.0-or-later # shellcheck disable=SC2001 # 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 # ---------------------------------------------------------------------------- PUBLIC_HOST="${PUBLIC_HOST:-$(echo "$PUBLIC_URL" | sed -e 's/[^/]*\/\/\([^@]*@\)\?\([^:/]*\).*/\2/')}" FILTRON_URL_PATH="${FILTRON_URL_PATH:-$(echo "${PUBLIC_URL}" \ | sed -e 's,^.*://[^/]*\(/.*\),\1,g')}" [[ "${FILTRON_URL_PATH}" == "${PUBLIC_URL}" ]] && FILTRON_URL_PATH=/ FILTRON_ETC="/etc/filtron" FILTRON_RULES="$FILTRON_ETC/rules.json" FILTRON_RULES_TEMPLATE="${FILTRON_RULES_TEMPLATE:-${REPO_ROOT}/utils/templates/etc/filtron/rules.json}" FILTRON_API="${FILTRON_API:-127.0.0.1:4005}" FILTRON_LISTEN="${FILTRON_LISTEN:-127.0.0.1:4004}" # The filtron target is the SearXNG installation, listenning on server.port at # server.bind_address. The default of FILTRON_TARGET is taken from the YAML # configuration, do not change this value without reinstalling the entire # SearXNG suite including filtron & morty. FILTRON_TARGET="${SEARXNG_BIND_ADDRESS}:${SEARXNG_PORT}" SERVICE_NAME="filtron" 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_GROUP="${SERVICE_USER}" GO_ENV="${SERVICE_HOME}/.go_env" GO_VERSION="go1.17.2" APACHE_FILTRON_SITE="searxng.conf" NGINX_FILTRON_SITE="searxng.conf" # shellcheck disable=SC2034 CONFIG_FILES=( "${FILTRON_RULES}" "${SERVICE_SYSTEMD_UNIT}" ) # ---------------------------------------------------------------------------- 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 if [ -f "${APACHE_SITES_AVAILABLE}/searx.conf" ]; then warn_msg "old searx.conf apache site exists" fi if [ -f "${NGINX_APPS_AVAILABLE}/searx.conf" ]; then warn_msg "old searx.conf nginx site exists" 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 return 42 fi drop_service_account "${SERVICE_USER}" rm -r "$FILTRON_ETC" 2>&1 | prefix_stdout if service_is_available "${PUBLIC_URL}"; then MSG="** Don't forget to remove your public site! (${PUBLIC_URL}) **" wait_key 10 fi } assert_user() { rst_title "user $SERVICE_USER" section echo tee_stderr 1 <> ~/.profile EOF } filtron_is_installed() { [[ -f $SERVICE_HOME/go-apps/bin/filtron ]] } install_filtron() { rst_title "Install filtron in user's ~/go-apps" section echo go.install github.com/searxng/filtron@latest "${SERVICE_USER}" } update_filtron() { rst_title "Update filtron" section echo go.install github.com/searxng/filtron@latest "${SERVICE_USER}" } install_rules() { rst_title "Install filtron rules" echo if [[ ! -f "${FILTRON_RULES}" ]]; then info_msg "install rules ${FILTRON_RULES_TEMPLATE}" info_msg " --> ${FILTRON_RULES}" mkdir -p "$(dirname "${FILTRON_RULES}")" cp "${FILTRON_RULES_TEMPLATE}" "${FILTRON_RULES}" return fi if cmp --silent "${FILTRON_RULES}" "${FILTRON_RULES_TEMPLATE}"; then info_msg "${FILTRON_RULES} is up to date with" info_msg "${FILTRON_RULES_TEMPLATE}" return fi rst_para "Diff between origin's rules file (+) and current (-):" echo "${FILTRON_RULES}" "${FILTRON_RULES_TEMPLATE}" $DIFF_CMD "${FILTRON_RULES}" "${FILTRON_RULES_TEMPLATE}" local action choose_one action "What should happen to the rules file? " \ "keep configuration unchanged" \ "use origin rules" \ "start interactive shell" case $action in "keep configuration unchanged") info_msg "leave rules file unchanged" ;; "use origin rules") backup_file "${FILTRON_RULES}" info_msg "install origin rules" cp "${FILTRON_RULES_TEMPLATE}" "${FILTRON_RULES}" ;; "start interactive shell") backup_file "${FILTRON_RULES}" echo -e "// exit with [${_BCyan}CTRL-D${_creset}]" sudo -H -i rst_para 'Diff between new rules file (-) and current (+):' echo $DIFF_CMD "${FILTRON_RULES_TEMPLATE}" "${FILTRON_RULES}" wait_key ;; esac } inspect_service() { rst_title "service status & log" cat < ${PUBLIC_URL}" info_msg "internal URL --> http://${FILTRON_LISTEN}" fi local _debug_on if ask_yn "Enable filtron debug mode?"; then enable_debug _debug_on=1 fi echo systemctl --no-pager -l status "${SERVICE_NAME}" echo info_msg "public URL --> ${PUBLIC_URL}" # 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 disable_debug fi return 0 } enable_debug() { info_msg "try to enable debug mode ..." python <