Browse Source

utils/searx.sh & filtron.sh: misc changes from first tests (WIP)

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
Markus Heiser 5 years ago
parent
commit
924bf65517
6 changed files with 285 additions and 101 deletions
  1. 1 0
      .gitignore
  2. 8 0
      utils/dot_config
  3. 114 41
      utils/filtron.sh
  4. 87 16
      utils/lib.sh
  5. 72 44
      utils/searx.sh
  6. 3 0
      utils/templates/etc/apache2/sites-available/searx.conf:filtron

+ 1 - 0
.gitignore

@@ -25,3 +25,4 @@ dist/
 local/
 local/
 gh-pages/
 gh-pages/
 searx.egg-info/
 searx.egg-info/
+.config

+ 8 - 0
utils/dot_config

@@ -0,0 +1,8 @@
+# -*- coding: utf-8; mode: sh -*-
+# SPDX-License-Identifier: AGPL-3.0-or-later
+#
+# Set environment used by ./utils scripts like filtron.sh or searx.sh
+#
+
+# Public URL of the searx instance
+PUBLIC_URL="${PUBLIC_URL:-https://$(uname -n)/searx}"

+ 114 - 41
utils/filtron.sh

@@ -5,6 +5,7 @@
 
 
 # shellcheck source=utils/lib.sh
 # shellcheck source=utils/lib.sh
 source "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
 source "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
+source_dot_config
 
 
 # ----------------------------------------------------------------------------
 # ----------------------------------------------------------------------------
 # config
 # config
@@ -30,7 +31,9 @@ GO_ENV="${SERVICE_HOME}/.go_env"
 GO_PKG_URL="https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz"
 GO_PKG_URL="https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz"
 GO_TAR=$(basename "$GO_PKG_URL")
 GO_TAR=$(basename "$GO_PKG_URL")
 
 
-APACHE_SITE="searx.conf"
+# Apache Settings
+
+APACHE_FILTRON_SITE="searx.conf"
 
 
 # shellcheck disable=SC2034
 # shellcheck disable=SC2034
 CONFIG_FILES=(
 CONFIG_FILES=(
@@ -53,22 +56,32 @@ usage:
   $(basename "$0") remove     [all]
   $(basename "$0") remove     [all]
   $(basename "$0") activate   [service]
   $(basename "$0") activate   [service]
   $(basename "$0") deactivate [service]
   $(basename "$0") deactivate [service]
-  $(basename "$0") show       [service]
+  $(basename "$0") inspect    [service]
+  $(basename "$0") apache     [install|remove]
+
 
 
 shell
 shell
   start interactive shell from user ${SERVICE_USER}
   start interactive shell from user ${SERVICE_USER}
-install / remove all
-  complete setup of filtron service
+install / remove
+  all:        complete setup of filtron service
+  user:       add/remove service user '$SERVICE_USER' at $SERVICE_HOME
 update filtron
 update filtron
   Update filtron installation of user ${SERVICE_USER}
   Update filtron installation of user ${SERVICE_USER}
-activate
+activate service
   activate and start service daemon (systemd unit)
   activate and start service daemon (systemd unit)
 deactivate service
 deactivate service
   stop and deactivate service daemon (systemd unit)
   stop and deactivate service daemon (systemd unit)
-install user
-  add service user '$SERVICE_USER' at $SERVICE_HOME
-show service
+inspect service
   show service status and log
   show service status and log
+apache
+  install: apache site with a reverse proxy (ProxyPass)
+  remove:  apache site ${APACHE_FILTRON_SITE}
+
+If needed change the environment variable PUBLIC_URL of your WEB service in the
+${DOT_CONFIG#"$REPO_ROOT/"} file:
+
+  PUBLIC_URL : ${PUBLIC_URL}
+
 EOF
 EOF
     [ ! -z ${1+x} ] &&  echo -e "$1"
     [ ! -z ${1+x} ] &&  echo -e "$1"
 }
 }
@@ -76,6 +89,10 @@ EOF
 main() {
 main() {
     rst_title "$SERVICE_NAME" part
     rst_title "$SERVICE_NAME" part
 
 
+    required_commands \
+        dpkg apt-get install git wget curl \
+        || exit
+
     local _usage="ERROR: unknown or missing $1 command $2"
     local _usage="ERROR: unknown or missing $1 command $2"
 
 
     case $1 in
     case $1 in
@@ -86,11 +103,11 @@ main() {
             sudo_or_exit
             sudo_or_exit
             interactive_shell
             interactive_shell
             ;;
             ;;
-        show)
+        inspect)
             case $2 in
             case $2 in
                 service)
                 service)
                     sudo_or_exit
                     sudo_or_exit
-                    show_service
+                    inspect_service
                     ;;
                     ;;
                 *) usage "$_usage"; exit 42;;
                 *) usage "$_usage"; exit 42;;
             esac ;;
             esac ;;
@@ -126,6 +143,14 @@ main() {
                 service)  deactivate_service ;;
                 service)  deactivate_service ;;
                 *) usage "$_usage"; exit 42;;
                 *) usage "$_usage"; exit 42;;
             esac ;;
             esac ;;
+        apache)
+            sudo_or_exit
+            case $2 in
+                install) install_apache_site ;;
+                remove) remove_apache_site ;;
+                *) usage "$_usage"; exit 42;;
+            esac ;;
+
         *) usage "ERROR: unknown or missing command $1"; exit 42;;
         *) usage "ERROR: unknown or missing command $1"; exit 42;;
     esac
     esac
 }
 }
@@ -140,14 +165,29 @@ install_all() {
     wait_key
     wait_key
     install_service
     install_service
     wait_key
     wait_key
+    echo
+    if ! service_is_available "http://${FILTRON_LISTEN}" ; then
+        err_msg "Filtron does not listening on: http://${FILTRON_LISTEN}"
+    fi
     if apache_is_installed; then
     if apache_is_installed; then
-        install_apache_site
-        wait_key
+        info_msg "Apache is installed on this host."
+        if ask_yn "Do you want to install a reverse proxy (ProxyPass)" Yn; then
+            install_apache_site
+        fi
+    fi
+    if ask_yn "Do you want to inspect the installation?" Yn; then
+        inspect_service
     fi
     fi
+
 }
 }
 
 
 remove_all() {
 remove_all() {
     rst_title "De-Install $SERVICE_NAME (service)"
     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."
+
     remove_service
     remove_service
     wait_key
     wait_key
     remove_user
     remove_user
@@ -155,18 +195,6 @@ remove_all() {
     wait_key
     wait_key
 }
 }
 
 
-filtron_is_available() {
-    curl --insecure "http://${FILTRON_LISTEN}" &>/dev/null
-}
-
-api_is_available() {
-    curl --insecure "http://${FILTRON_API}" &>/dev/null
-}
-
-target_is_available() {
-    curl --insecure "http://${FILTRON_TARGET}" &>/dev/null
-}
-
 install_service() {
 install_service() {
     rst_title "Install System-D Unit ${SERVICE_NAME}.service" section
     rst_title "Install System-D Unit ${SERVICE_NAME}.service" section
     echo
     echo
@@ -191,7 +219,7 @@ systemctl enable $SERVICE_NAME.service
 systemctl restart $SERVICE_NAME.service
 systemctl restart $SERVICE_NAME.service
 EOF
 EOF
     tee_stderr <<EOF | bash 2>&1
     tee_stderr <<EOF | bash 2>&1
-systemctl status $SERVICE_NAME.service
+systemctl status --no-pager $SERVICE_NAME.service
 EOF
 EOF
 }
 }
 
 
@@ -265,9 +293,8 @@ mkdir -p \$HOME/local
 rm -rf \$HOME/local/go
 rm -rf \$HOME/local/go
 tar -C \$HOME/local -xzf ${CACHE}/${GO_TAR}
 tar -C \$HOME/local -xzf ${CACHE}/${GO_TAR}
 EOF
 EOF
-    echo
     sudo -i -u "$SERVICE_USER" <<EOF | prefix_stdout
     sudo -i -u "$SERVICE_USER" <<EOF | prefix_stdout
-! which go >/dev/null &&  echo "Go Installation not found in PATH!?!"
+! which go >/dev/null &&  echo "ERROR - Go Installation not found in PATH!?!"
 which go >/dev/null &&  go version && echo "congratulations -- Go installation OK :)"
 which go >/dev/null &&  go version && echo "congratulations -- Go installation OK :)"
 EOF
 EOF
 }
 }
@@ -293,9 +320,20 @@ go get -v -u github.com/asciimoo/filtron
 EOF
 EOF
 }
 }
 
 
-show_service() {
+inspect_service() {
+
     rst_title "service status & log"
     rst_title "service status & log"
-    echo
+
+    cat <<EOF
+
+sourced ${DOT_CONFIG#"$REPO_ROOT/"} :
+
+  PUBLIC_URL          : ${PUBLIC_URL}
+  FILTRON_API         : ${FILTRON_API}
+  FILTRON_LISTEN      : ${FILTRON_LISTEN}
+  FILTRON_TARGET      : ${FILTRON_TARGET}
+
+EOF
 
 
     apache_is_installed && info_msg "Apache is installed."
     apache_is_installed && info_msg "Apache is installed."
 
 
@@ -314,20 +352,21 @@ show_service() {
     else
     else
         err_msg "~$SERVICE_USER: filtron app is not installed!"
         err_msg "~$SERVICE_USER: filtron app is not installed!"
     fi
     fi
-    if api_is_available; then
-        info_msg "API available at: http://${FILTRON_API}"
-    else
+
+    if ! service_is_available "http://${FILTRON_API}"; then
         err_msg "API not available at: http://${FILTRON_API}"
         err_msg "API not available at: http://${FILTRON_API}"
     fi
     fi
-    if filtron_is_available; then
-        info_msg "Filtron listening on: http://${FILTRON_LISTEN}"
-    else
+
+    if ! service_is_available "http://${FILTRON_LISTEN}" ; then
         err_msg "Filtron does not listening on: http://${FILTRON_LISTEN}"
         err_msg "Filtron does not listening on: http://${FILTRON_LISTEN}"
     fi
     fi
-    if target_is_available; then
+
+    if ! service_is_available ""http://${FILTRON_TARGET}"" ; then
         info_msg "Filtron's target is available at: http://${FILTRON_TARGET}"
         info_msg "Filtron's target is available at: http://${FILTRON_TARGET}"
-    else
-        err_msg "Filtron's target is not available at:  http://${FILTRON_TARGET}"
+    fi
+
+    if ! service_is_available "${PUBLIC_URL}"; then
+        err_msg "Public service at ${PUBLIC_URL} is not available!"
     fi
     fi
 
 
     wait_key
     wait_key
@@ -344,10 +383,44 @@ show_service() {
 }
 }
 
 
 install_apache_site() {
 install_apache_site() {
-    rst_title "Install Apache site $APACHE_SITE" section
+
+    rst_title "Install Apache site $APACHE_FILTRON_SITE"
+
+    rst_para "\
+This installs a reverse proxy (ProxyPass) into apache site (${APACHE_FILTRON_SITE})"
+
+    ! apache_is_installed && err_msg "Apache is not installed."
+
+    if ! ask_yn "Do you really want to continue?"; then
+        return
+    fi
+
+    a2enmod proxy
+    a2enmod proxy_http
+
     echo
     echo
-    err_msg "not yet implemented (${APACHE_SITE})"; return 42
-    # apache_install_site "${APACHE_SITE}"
+    apache_install_site --variant=filtron "${APACHE_FILTRON_SITE}"
+
+    info_msg "testing public url .."
+    if ! service_is_available "${PUBLIC_URL}"; then
+        err_msg "Public service at ${PUBLIC_URL} is not available!"
+    fi
+}
+
+remove_apache_site() {
+
+    rst_title "Remove Apache site $APACHE_FILTRON_SITE"
+
+    rst_para "\
+This removes apache site ${APACHE_FILTRON_SITE}."
+
+    ! apache_is_installed && err_msg "Apache is not installed."
+
+    if ! ask_yn "Do you really want to continue?"; then
+        return
+    fi
+
+    apache_remove_site "$APACHE_FILTRON_SITE"
 }
 }
 
 
 # ----------------------------------------------------------------------------
 # ----------------------------------------------------------------------------

+ 87 - 16
utils/lib.sh

@@ -1,6 +1,7 @@
 #!/usr/bin/env bash
 #!/usr/bin/env bash
 # -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*-
 # -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*-
-# shellcheck disable=SC2059,SC1117,SC2162,SC2004
+# SPDX-License-Identifier: AGPL-3.0-or-later
+# shellcheck disable=SC2059,SC1117
 
 
 ADMIN_NAME="${ADMIN_NAME:-$(git config user.name)}"
 ADMIN_NAME="${ADMIN_NAME:-$(git config user.name)}"
 ADMIN_NAME="${ADMIN_NAME:-$USER}"
 ADMIN_NAME="${ADMIN_NAME:-$USER}"
@@ -35,6 +36,20 @@ if [[ -z ${DIFF_CMD} ]]; then
     fi
     fi
 fi
 fi
 
 
+DOT_CONFIG="${DOT_CONFIG:-${REPO_ROOT}/.config}"
+
+source_dot_config() {
+    if [[ ! -e "$DOT_CONFIG" ]]; then
+        info_msg "installing $DOT_CONFIG"
+        cp "$(dirname "${BASH_SOURCE[0]}")/dot_config" "$DOT_CONFIG"
+        if [[ ! -z ${SUDO_USER} ]]; then
+            chown "${SUDO_USER}:${SUDO_USER}" "$DOT_CONFIG"
+        fi
+    fi
+    # shellcheck disable=SC1090
+    source "${REPO_ROOT}/.config"
+}
+
 sudo_or_exit() {
 sudo_or_exit() {
     # usage: sudo_or_exit
     # usage: sudo_or_exit
 
 
@@ -44,6 +59,22 @@ sudo_or_exit() {
     fi
     fi
 }
 }
 
 
+required_commands() {
+
+    # usage:  requires_commands [cmd1 ...]
+
+    local exit_val=0
+    while [ ! -z "$1" ]; do
+
+        if ! command -v "$1" &>/dev/null; then
+            err_msg "missing command $1"
+            exit_val=42
+        fi
+        shift
+    done
+    return $exit_val
+}
+
 rst_title() {
 rst_title() {
     # usage: rst_title <header-text> [part|chapter|section]
     # usage: rst_title <header-text> [part|chapter|section]
 
 
@@ -81,7 +112,7 @@ info_msg() { echo -e "INFO:  $*"; }
 
 
 clean_stdin() {
 clean_stdin() {
     if [[ $(uname -s) != 'Darwin' ]]; then
     if [[ $(uname -s) != 'Darwin' ]]; then
-        while read -n1 -t 0.1; do : ; done
+        while read -r -n1 -t 0.1; do : ; done
     fi
     fi
 }
 }
 
 
@@ -93,7 +124,7 @@ wait_key(){
     [[ ! -z $FORCE_TIMEOUT ]] && _t=$FORCE_TIMEOUT
     [[ ! -z $FORCE_TIMEOUT ]] && _t=$FORCE_TIMEOUT
     [[ ! -z $_t ]] && _t="-t $_t"
     [[ ! -z $_t ]] && _t="-t $_t"
     # shellcheck disable=SC2086
     # shellcheck disable=SC2086
-    read -s -n1 $_t -p "** press any [KEY] to continue **"
+    read -r -s -n1 $_t -p "** press any [KEY] to continue **"
     echo
     echo
     clean_stdin
     clean_stdin
 }
 }
@@ -124,7 +155,7 @@ ask_yn() {
         clean_stdin
         clean_stdin
         printf "$1 ${choice} "
         printf "$1 ${choice} "
         # shellcheck disable=SC2086
         # shellcheck disable=SC2086
-        read -n1 $_t
+        read -r -n1 $_t
         if [[ -z $REPLY ]]; then
         if [[ -z $REPLY ]]; then
             printf "$default\n"; break
             printf "$default\n"; break
         elif [[ $REPLY =~ ^[Yy]$ ]]; then
         elif [[ $REPLY =~ ^[Yy]$ ]]; then
@@ -156,7 +187,7 @@ tee_stderr () {
     local _t="0";
     local _t="0";
     if [[ ! -z $1 ]] ; then _t="$1"; fi
     if [[ ! -z $1 ]] ; then _t="$1"; fi
 
 
-    (while read line; do
+    (while read -r line; do
          # shellcheck disable=SC2086
          # shellcheck disable=SC2086
          sleep $_t
          sleep $_t
          echo -e "$line" >&2
          echo -e "$line" >&2
@@ -171,6 +202,7 @@ prefix_stdout () {
 
 
     if [[ ! -z $1 ]] ; then prefix="$1"; fi
     if [[ ! -z $1 ]] ; then prefix="$1"; fi
 
 
+    # shellcheck disable=SC2162
     (while IFS= read line; do
     (while IFS= read line; do
         echo -e "${prefix}$line"
         echo -e "${prefix}$line"
     done)
     done)
@@ -214,7 +246,7 @@ cache_download() {
         else
         else
             wget --progress=bar -O "${CACHE}/$2" "$1" ; exit_value=$?
             wget --progress=bar -O "${CACHE}/$2" "$1" ; exit_value=$?
         fi
         fi
-        if $exit_value; then
+        if [[ $exit_value = 0 ]]; then
             err_msg "failed to download: $1"
             err_msg "failed to download: $1"
         fi
         fi
     fi
     fi
@@ -238,7 +270,7 @@ choose_one() {
 
 
     list=("$@")
     list=("$@")
     echo -e "Menu::"
     echo -e "Menu::"
-    for ((i=1; i<= $(($max -1)); i++)); do
+    for ((i=1; i<= $((max -1)); i++)); do
         if [[ "$i" == "$default" ]]; then
         if [[ "$i" == "$default" ]]; then
             echo -e "  $i.) ${list[$i]} [default]"
             echo -e "  $i.) ${list[$i]} [default]"
         else
         else
@@ -249,15 +281,15 @@ choose_one() {
         clean_stdin
         clean_stdin
         printf "$1 [$default] "
         printf "$1 [$default] "
 
 
-        if (( 10 > $max )); then
+        if (( 10 > max )); then
             # shellcheck disable=SC2086
             # shellcheck disable=SC2086
-            read -n1 $_t
+            read -r -n1 $_t
         else
         else
             # shellcheck disable=SC2086,SC2229
             # shellcheck disable=SC2086,SC2229
-            read $_t
+            read -r $_t
         fi
         fi
         # selection fits
         # selection fits
-        [[ $REPLY =~ ^-?[0-9]+$ ]] && (( $REPLY > 0 )) && (( $REPLY < $max )) && break
+        [[ $REPLY =~ ^-?[0-9]+$ ]] && (( REPLY > 0 )) && (( REPLY < max )) && break
 
 
         # take default
         # take default
         [[ -z $REPLY ]] && REPLY=$default && break
         [[ -z $REPLY ]] && REPLY=$default && break
@@ -386,6 +418,28 @@ install_template() {
     done
     done
 }
 }
 
 
+
+service_is_available() {
+
+    # usage:  service_is_available <URL>
+
+    local URL="$1"
+    if [[ -z $URL ]]; then
+        err_msg "service_is_available: missing arguments"
+        return 42
+    fi
+
+    http_code=$(curl -H 'Cache-Control: no-cache' \
+         --silent -o /dev/null --head --write-out '%{http_code}' --insecure \
+         "${URL}")
+    exit_val=$?
+    if [[ $exit_val = 0 ]]; then
+        info_msg "got $http_code from ${URL}"
+    fi
+    return $exit_val
+}
+
+
 # Apache
 # Apache
 # ------
 # ------
 
 
@@ -430,18 +484,32 @@ apache_install_site() {
                      root root 644
                      root root 644
 
 
     apache_enable_site "${pos_args[1]}"
     apache_enable_site "${pos_args[1]}"
-    apache_reload
     info_msg "installed apache site: ${pos_args[1]}"
     info_msg "installed apache site: ${pos_args[1]}"
 }
 }
 
 
+apache_remove_site() {
+
+    # usage:  apache_remove_site <mysite.conf>
+
+    info_msg "remove apache site: $1"
+    apache_dissable_site "$1"
+    rm -f "${APACHE_SITES_AVAILABE}/$1"
+}
+
 apache_enable_site() {
 apache_enable_site() {
-    info_msg "enable apache site $1 .."
+
+    # usage:  apache_enable_site <mysite.conf>
+
+    info_msg "enable apache site: $1"
     sudo -H a2ensite -q "$1"
     sudo -H a2ensite -q "$1"
     apache_reload
     apache_reload
 }
 }
 
 
 apache_dissable_site() {
 apache_dissable_site() {
-    info_msg "disable apache site $1 .."
+
+    # usage:  apache_disable_site <mysite.conf>
+
+    info_msg "disable apache site: $1"
     sudo -H a2dissite -q "$1"
     sudo -H a2dissite -q "$1"
     apache_reload
     apache_reload
 }
 }
@@ -456,7 +524,7 @@ uWSGI_restart() {
     # usage:  uWSGI_restart()
     # usage:  uWSGI_restart()
 
 
     info_msg "restart uWSGI service"
     info_msg "restart uWSGI service"
-    sudo -H systemctl restart uwsgi
+    systemctl restart uwsgi
 }
 }
 
 
 uWSGI_app_available() {
 uWSGI_app_available() {
@@ -498,10 +566,10 @@ uWSGI_remove_app() {
     # usage:  uWSGI_remove_app <myapp.ini>
     # usage:  uWSGI_remove_app <myapp.ini>
 
 
     local CONF="$1"
     local CONF="$1"
+    info_msg "remove uWSGI app: ${CONF}"
     uWSGI_disable_app "${CONF}"
     uWSGI_disable_app "${CONF}"
     uWSGI_restart
     uWSGI_restart
     rm -f "${uWSGI_SETUP}/apps-available/${CONF}"
     rm -f "${uWSGI_SETUP}/apps-available/${CONF}"
-    info_msg "removed uWSGI app: ${CONF}"
 }
 }
 
 
 uWSGI_app_enabled() {
 uWSGI_app_enabled() {
@@ -542,6 +610,9 @@ uWSGI_disable_app() {
         return 42
         return 42
     fi
     fi
     rm -f "${uWSGI_SETUP}/apps-enabled/${CONF}"
     rm -f "${uWSGI_SETUP}/apps-enabled/${CONF}"
+    # FIXME: restart uwsgi service won't stop wsgi forked processes of user searx.
+    # I had to kill them manually here ...
+    pkill -f "${uWSGI_SETUP}/apps-enabled/${CONF}" -9
     info_msg "disabled uWSGI app: ${CONF} (restart uWSGI required)"
     info_msg "disabled uWSGI app: ${CONF} (restart uWSGI required)"
 }
 }
 
 

+ 72 - 44
utils/searx.sh

@@ -1,19 +1,20 @@
 #!/usr/bin/env bash
 #!/usr/bin/env bash
 # -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*-
 # -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*-
 # SPDX-License-Identifier: AGPL-3.0-or-later
 # SPDX-License-Identifier: AGPL-3.0-or-later
-# shellcheck disable=SC2119
+# shellcheck disable=SC2001
 
 
 # shellcheck source=utils/lib.sh
 # shellcheck source=utils/lib.sh
 source "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
 source "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
+source_dot_config
 
 
 # ----------------------------------------------------------------------------
 # ----------------------------------------------------------------------------
 # config
 # config
 # ----------------------------------------------------------------------------
 # ----------------------------------------------------------------------------
 
 
-SEARX_PUBLIC_URL="${SEARX_PUBLIC_URL:-https://$(uname -n)/searx}"
-SEARX_URL_PATH="${SEARX_URL_PATH:-$(echo "$SEARX_PUBLIC_URL" \
-| sed -e 's,^.*://[^/]*\(/.*\),\1,g') }"
-SEARX_INSTANCE_NAME="${SEARX_INSTANCE_NAME:-searx@$(echo "$SEARX_PUBLIC_URL" \
+SEARX_URL_PATH="${SEARX_URL_PATH:-$(echo "${PUBLIC_URL}" \
+| sed -e 's,^.*://[^/]*\(/.*\),\1,g')}"
+[[ "${SEARX_URL_PATH}" == "${PUBLIC_URL}" ]] && SEARX_URL_PATH=/
+SEARX_INSTANCE_NAME="${SEARX_INSTANCE_NAME:-searx@$(echo "$PUBLIC_URL" \
 | sed -e 's,^.*://\([^\:/]*\).*,\1,g') }"
 | sed -e 's,^.*://\([^\:/]*\).*,\1,g') }"
 
 
 SERVICE_USER="searx"
 SERVICE_USER="searx"
@@ -42,10 +43,10 @@ SEARX_APT_PACKAGES="\
 # Apache Settings
 # Apache Settings
 
 
 APACHE_APT_PACKAGES="\
 APACHE_APT_PACKAGES="\
-  apache2 libapache2-mod-uwsgi \
+  libapache2-mod-uwsgi \
 "
 "
 
 
-SEARX_APACHE_SITE="searx.conf"
+APACHE_SEARX_SITE="searx.conf"
 
 
 # shellcheck disable=SC2034
 # shellcheck disable=SC2034
 CONFIG_FILES=(
 CONFIG_FILES=(
@@ -74,6 +75,7 @@ usage:
   $(basename "$0") deactivate [service]
   $(basename "$0") deactivate [service]
   $(basename "$0") inspect    [service]
   $(basename "$0") inspect    [service]
   $(basename "$0") option     [debug-on|debug-off]
   $(basename "$0") option     [debug-on|debug-off]
+  $(basename "$0") apache     [install|remove]
 
 
 shell
 shell
   start interactive shell from user ${SERVICE_USER}
   start interactive shell from user ${SERVICE_USER}
@@ -82,23 +84,25 @@ install / remove
   user:       add/remove service user '$SERVICE_USER' at $SERVICE_HOME
   user:       add/remove service user '$SERVICE_USER' at $SERVICE_HOME
   searx-src:  clone $SEARX_GIT_URL
   searx-src:  clone $SEARX_GIT_URL
   pyenv:      create/remove virtualenv (python) in $SEARX_PYENV
   pyenv:      create/remove virtualenv (python) in $SEARX_PYENV
-  apache:     install apache site for searx-uwsgi app
 update searx
 update searx
   Update searx installation of user ${SERVICE_USER}
   Update searx installation of user ${SERVICE_USER}
-activate
+activate service
   activate and start service daemon (systemd unit)
   activate and start service daemon (systemd unit)
 deactivate service
 deactivate service
   stop and deactivate service daemon (systemd unit)
   stop and deactivate service daemon (systemd unit)
 inspect service
 inspect service
   run some small tests and inspect service's status and log
   run some small tests and inspect service's status and log
 option
 option
-  set one of te available options
+  set one of the available options
+apache
+  install: apache site with the searx uwsgi app
+  remove:  apache site ${APACHE_FILTRON_SITE}
 
 
-Use environment SEARX_PUBLIC_URL to set public URL of your WEB-Server:
+If needed change the environment variable PUBLIC_URL of your WEB service in the
+${DOT_CONFIG#"$REPO_ROOT/"} file:
 
 
-  SEARX_PUBLIC_URL    :  ${SEARX_PUBLIC_URL}
-  SEARX_URL_PATH      :  ${SEARX_URL_PATH}
-  SEARX_INSTANCE_NAME :  ${SEARX_INSTANCE_NAME}
+  PUBLIC_URL          : ${PUBLIC_URL}
+  SEARX_INSTANCE_NAME : ${SEARX_INSTANCE_NAME}
 
 
 EOF
 EOF
     [ ! -z ${1+x} ] &&  echo -e "$1"
     [ ! -z ${1+x} ] &&  echo -e "$1"
@@ -107,6 +111,10 @@ EOF
 main() {
 main() {
     rst_title "$SEARX_INSTANCE_NAME" part
     rst_title "$SEARX_INSTANCE_NAME" part
 
 
+    required_commands \
+        dpkg systemctl apt-get install git wget curl \
+        || exit
+
     local _usage="ERROR: unknown or missing $1 command $2"
     local _usage="ERROR: unknown or missing $1 command $2"
 
 
     case $1 in
     case $1 in
@@ -132,7 +140,6 @@ main() {
                 user) assert_user ;;
                 user) assert_user ;;
                 pyenv) create_pyenv ;;
                 pyenv) create_pyenv ;;
                 searx-src) clone_searx ;;
                 searx-src) clone_searx ;;
-                apache) install_apache_site ;;
                 *) usage "$_usage"; exit 42;;
                 *) usage "$_usage"; exit 42;;
             esac ;;
             esac ;;
         update)
         update)
@@ -154,13 +161,13 @@ main() {
             sudo_or_exit
             sudo_or_exit
             case $2 in
             case $2 in
                 service)
                 service)
-                    activate_service; uWSGI_restart ;;
+                    activate_service ;;
                 *) usage "$_usage"; exit 42;;
                 *) usage "$_usage"; exit 42;;
             esac ;;
             esac ;;
         deactivate)
         deactivate)
             sudo_or_exit
             sudo_or_exit
             case $2 in
             case $2 in
-                service)  deactivate_service; uWSGI_restart ;;
+                service)  deactivate_service ;;
                 *) usage "$_usage"; exit 42;;
                 *) usage "$_usage"; exit 42;;
             esac ;;
             esac ;;
         option)
         option)
@@ -170,6 +177,14 @@ main() {
                 debug-off)  echo; disable_debug ;;
                 debug-off)  echo; disable_debug ;;
                 *) usage "$_usage"; exit 42;;
                 *) usage "$_usage"; exit 42;;
             esac ;;
             esac ;;
+        apache)
+            sudo_or_exit
+            case $2 in
+                install) install_apache_site ;;
+                remove) remove_apache_site ;;
+                *) usage "$_usage"; exit 42;;
+            esac ;;
+
         *) usage "ERROR: unknown or missing command $1"; exit 42;;
         *) usage "ERROR: unknown or missing command $1"; exit 42;;
     esac
     esac
 }
 }
@@ -191,9 +206,7 @@ install_all() {
     test_local_searx
     test_local_searx
     wait_key
     wait_key
     install_searx_uwsgi
     install_searx_uwsgi
-    if service_is_available "http://$SEARX_INTERNAL_URL" &>/dev/null; then
-        info_msg "URL http://$SEARX_INTERNAL_URL is available."
-    else
+    if ! service_is_available "http://$SEARX_INTERNAL_URL"; then
         err_msg "URL http://$SEARX_INTERNAL_URL not available, check searx & uwsgi setup!"
         err_msg "URL http://$SEARX_INTERNAL_URL not available, check searx & uwsgi setup!"
     fi
     fi
     if ask_yn "Do you want to inspect the installation?" Yn; then
     if ask_yn "Do you want to inspect the installation?" Yn; then
@@ -418,12 +431,14 @@ activate_service() {
     rst_title "Activate $SEARX_INSTANCE_NAME (service)" section
     rst_title "Activate $SEARX_INSTANCE_NAME (service)" section
     echo
     echo
     uWSGI_enable_app "$SEARX_UWSGI_APP"
     uWSGI_enable_app "$SEARX_UWSGI_APP"
+    uWSGI_restart
 }
 }
 
 
 deactivate_service() {
 deactivate_service() {
     rst_title "De-Activate $SEARX_INSTANCE_NAME (service)" section
     rst_title "De-Activate $SEARX_INSTANCE_NAME (service)" section
     echo
     echo
     uWSGI_disable_app "$SEARX_UWSGI_APP"
     uWSGI_disable_app "$SEARX_UWSGI_APP"
+    uWSGI_restart
 }
 }
 
 
 interactive_shell() {
 interactive_shell() {
@@ -438,12 +453,6 @@ git --no-pager diff
 EOF
 EOF
 }
 }
 
 
-service_is_available() {
-    curl -H 'Cache-Control: no-cache' -o /dev/null \
-         --silent --head --write-out '%{http_code}' --insecure \
-         "${1?missing URL argument}"
-}
-
 enable_debug() {
 enable_debug() {
     info_msg "try to enable debug mode ..."
     info_msg "try to enable debug mode ..."
     tee_stderr 0.1 <<EOF | sudo -H -u "${SERVICE_USER}" -i 2>&1 |  prefix_stdout "$_service_prefix"
     tee_stderr 0.1 <<EOF | sudo -H -u "${SERVICE_USER}" -i 2>&1 |  prefix_stdout "$_service_prefix"
@@ -464,7 +473,16 @@ EOF
 
 
 inspect_service() {
 inspect_service() {
     rst_title "service status & log"
     rst_title "service status & log"
-    echo
+    cat <<EOF
+
+sourced ${DOT_CONFIG#"$REPO_ROOT/"} :
+
+  PUBLIC_URL          : ${PUBLIC_URL}
+  SEARX_URL_PATH      : ${SEARX_URL_PATH}
+  SEARX_INSTANCE_NAME : ${SEARX_INSTANCE_NAME}
+  SEARX_INTERNAL_URL  : ${SEARX_INTERNAL_URL}
+
+EOF
 
 
     apache_is_installed && info_msg "Apache is installed."
     apache_is_installed && info_msg "Apache is installed."
 
 
@@ -475,15 +493,15 @@ inspect_service() {
     fi
     fi
 
 
     if pyenv_is_available; then
     if pyenv_is_available; then
-        info_msg "${SEARX_PYENV}/bin/activate is available."
+        info_msg "~$SERVICE_USER: python environment is available."
     else
     else
-        err_msg "${SEARX_PYENV}/bin/activate not available!"
+        err_msg "~$SERVICE_USER: python environment is not available!"
     fi
     fi
 
 
     if clone_is_available; then
     if clone_is_available; then
-        info_msg "Searx software is installed."
+        info_msg "~$SERVICE_USER: Searx software is installed."
     else
     else
-        err_msg "Missing searx software!"
+        err_msg "~$SERVICE_USER: Missing searx software!"
     fi
     fi
 
 
     if uWSGI_app_enabled "$SEARX_UWSGI_APP"; then
     if uWSGI_app_enabled "$SEARX_UWSGI_APP"; then
@@ -495,16 +513,12 @@ inspect_service() {
     uWSGI_app_available "$SEARX_UWSGI_APP" \
     uWSGI_app_available "$SEARX_UWSGI_APP" \
         || err_msg "uWSGI app $SEARX_UWSGI_APP not available!"
         || err_msg "uWSGI app $SEARX_UWSGI_APP not available!"
 
 
-    if service_is_available "http://$SEARX_INTERNAL_URL" &>/dev/null; then
-        info_msg "uWSGI app (service) at http://$SEARX_INTERNAL_URL is available"
-    else
+    if ! service_is_available "http://$SEARX_INTERNAL_URL"; then
         err_msg "uWSGI app (service) at http://$SEARX_INTERNAL_URL is not available!"
         err_msg "uWSGI app (service) at http://$SEARX_INTERNAL_URL is not available!"
     fi
     fi
 
 
-    if service_is_available "${SEARX_PUBLIC_URL}" &>/dev/null; then
-        info_msg "Public service at ${SEARX_PUBLIC_URL} is available"
-    else
-        err_msg "Public service at ${SEARX_PUBLIC_URL} is not available!"
+    if ! service_is_available "${PUBLIC_URL}"; then
+        err_msg "Public service at ${PUBLIC_URL} is not available!"
     fi
     fi
 
 
     local _debug_on
     local _debug_on
@@ -530,7 +544,7 @@ inspect_service() {
 }
 }
 
 
 install_apache_site() {
 install_apache_site() {
-    rst_title "Install Apache site $SEARX_APACHE_SITE"
+    rst_title "Install Apache site $APACHE_SEARX_SITE"
 
 
     rst_para "\
     rst_para "\
 This installs the searx uwsgi app as apache site.  If your server ist public to
 This installs the searx uwsgi app as apache site.  If your server ist public to
@@ -547,13 +561,27 @@ excessively bot queries."
     a2enmod uwsgi
     a2enmod uwsgi
 
 
     echo
     echo
-    apache_install_site --variant=uwsgi "${SEARX_APACHE_SITE}"
+    apache_install_site --variant=uwsgi "${APACHE_SEARX_SITE}"
 
 
-    if service_is_available "${SEARX_PUBLIC_URL}" &>/dev/null; then
-        info_msg "Public service at ${SEARX_PUBLIC_URL} is available"
-    else
-        err_msg "Public service at ${SEARX_PUBLIC_URL} is not available!"
+    if ! service_is_available "${PUBLIC_URL}"; then
+        err_msg "Public service at ${PUBLIC_URL} is not available!"
+    fi
+}
+
+remove_apache_site() {
+
+    rst_title "Remove Apache site ${APACHE_SEARX_SITE}"
+
+    rst_para "\
+This removes apache site ${APACHE_SEARX_SITE}."
+
+    ! apache_is_installed && err_msg "Apache is not installed."
+
+    if ! ask_yn "Do you really want to continue?"; then
+        return
     fi
     fi
+
+    apache_remove_site "${APACHE_SEARX_SITE}"
 }
 }
 
 
 # ----------------------------------------------------------------------------
 # ----------------------------------------------------------------------------

+ 3 - 0
utils/templates/etc/apache2/sites-available/searx.conf:filtron

@@ -0,0 +1,3 @@
+# -*- coding: utf-8; mode: apache -*-
+
+ProxyPass "/searx" "http://127.0.0.1:4004/"