utils/searx.sh & filtron.sh: misc changes from first tests (WIP)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
This commit is contained in:
		
							parent
							
								
									971a8264b2
								
							
						
					
					
						commit
						924bf65517
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -25,3 +25,4 @@ dist/ | |||||||
| local/ | local/ | ||||||
| gh-pages/ | gh-pages/ | ||||||
| searx.egg-info/ | searx.egg-info/ | ||||||
|  | .config | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								utils/dot_config
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								utils/dot_config
									
									
									
									
									
										Normal file
									
								
							| @ -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}" | ||||||
							
								
								
									
										157
									
								
								utils/filtron.sh
									
									
									
									
									
								
							
							
						
						
									
										157
									
								
								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 | install / remove | ||||||
|   complete setup of filtron service |   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 | inspect service | ||||||
|   add service user '$SERVICE_USER' at $SERVICE_HOME |  | ||||||
| show 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 | ||||||
|     if apache_is_installed; then |     echo | ||||||
|         install_apache_site |     if ! service_is_available "http://${FILTRON_LISTEN}" ; then | ||||||
|         wait_key |         err_msg "Filtron does not listening on: http://${FILTRON_LISTEN}" | ||||||
|     fi |     fi | ||||||
|  |     if apache_is_installed; then | ||||||
|  |         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 | ||||||
|  | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 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}" |     if ! service_is_available "http://${FILTRON_API}"; then | ||||||
|     else |  | ||||||
|         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}" |     if ! service_is_available "http://${FILTRON_LISTEN}" ; then | ||||||
|     else |  | ||||||
|         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 |     fi | ||||||
|         err_msg "Filtron's target is not available at:  http://${FILTRON_TARGET}" | 
 | ||||||
|  |     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 --variant=filtron "${APACHE_FILTRON_SITE}" | ||||||
|     # apache_install_site "${APACHE_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" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| # ---------------------------------------------------------------------------- | # ---------------------------------------------------------------------------- | ||||||
|  | |||||||
							
								
								
									
										103
									
								
								utils/lib.sh
									
									
									
									
									
								
							
							
						
						
									
										103
									
								
								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)" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										114
									
								
								utils/searx.sh
									
									
									
									
									
								
							
							
						
						
									
										114
									
								
								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 "${PUBLIC_URL}" \ | ||||||
| SEARX_URL_PATH="${SEARX_URL_PATH:-$(echo "$SEARX_PUBLIC_URL" \ | | sed -e 's,^.*://[^/]*\(/.*\),\1,g')}" | ||||||
| | sed -e 's,^.*://[^/]*\(/.*\),\1,g') }" | [[ "${SEARX_URL_PATH}" == "${PUBLIC_URL}" ]] && SEARX_URL_PATH=/ | ||||||
| SEARX_INSTANCE_NAME="${SEARX_INSTANCE_NAME:-searx@$(echo "$SEARX_PUBLIC_URL" \ | 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,22 +84,24 @@ 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} |   PUBLIC_URL          : ${PUBLIC_URL} | ||||||
|   SEARX_URL_PATH      :  ${SEARX_URL_PATH} |  | ||||||
|   SEARX_INSTANCE_NAME : ${SEARX_INSTANCE_NAME} |   SEARX_INSTANCE_NAME : ${SEARX_INSTANCE_NAME} | ||||||
| 
 | 
 | ||||||
| EOF | EOF | ||||||
| @ -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 |     if ! service_is_available "http://$SEARX_INTERNAL_URL"; then | ||||||
|         info_msg "URL http://$SEARX_INTERNAL_URL is available." |  | ||||||
|     else |  | ||||||
|         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 |     if ! service_is_available "http://$SEARX_INTERNAL_URL"; then | ||||||
|         info_msg "uWSGI app (service) at http://$SEARX_INTERNAL_URL is available" |  | ||||||
|     else |  | ||||||
|         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 |     if ! service_is_available "${PUBLIC_URL}"; then | ||||||
|         info_msg "Public service at ${SEARX_PUBLIC_URL} is available" |         err_msg "Public service at ${PUBLIC_URL} is not available!" | ||||||
|     else |  | ||||||
|         err_msg "Public service at ${SEARX_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,15 +561,29 @@ 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 |     if ! service_is_available "${PUBLIC_URL}"; then | ||||||
|         info_msg "Public service at ${SEARX_PUBLIC_URL} is available" |         err_msg "Public service at ${PUBLIC_URL} is not available!" | ||||||
|     else |  | ||||||
|         err_msg "Public service at ${SEARX_PUBLIC_URL} is not available!" |  | ||||||
|     fi |     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 | ||||||
|  | 
 | ||||||
|  |     apache_remove_site "${APACHE_SEARX_SITE}" | ||||||
|  | } | ||||||
|  | 
 | ||||||
| # ---------------------------------------------------------------------------- | # ---------------------------------------------------------------------------- | ||||||
| main "$@" | main "$@" | ||||||
| # ---------------------------------------------------------------------------- | # ---------------------------------------------------------------------------- | ||||||
|  | |||||||
| @ -0,0 +1,3 @@ | |||||||
|  | # -*- coding: utf-8; mode: apache -*- | ||||||
|  | 
 | ||||||
|  | ProxyPass "/searx" "http://127.0.0.1:4004/" | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user