| 
									
										
										
										
											2021-06-29 19:01:07 +02:00
										 |  |  | #!/usr/bin/env bash
 | 
					
						
							|  |  |  | # SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # https://github.com/koalaman/shellcheck/issues/356#issuecomment-853515285 | 
					
						
							|  |  |  | # shellcheck source=utils/lib.sh | 
					
						
							|  |  |  | . /dev/null | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Initialize installation procedures: | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # - Modified source_dot_config function that | 
					
						
							|  |  |  | #   - loads .config.sh from an existing installation (at SEARX_SRC). | 
					
						
							|  |  |  | #   - initialize **SEARX_SRC_INIT_FILES** | 
					
						
							|  |  |  | # - functions like: | 
					
						
							|  |  |  | #   - install_log_searx_instance() | 
					
						
							|  |  |  | #   - install_searx_get_state() | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # usage: | 
					
						
							|  |  |  | #   source lib_install.sh | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # **Installation scripts** | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # The utils/lib_install.sh is sourced by the installations scripts: | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # - utils/searx.sh | 
					
						
							|  |  |  | # - utils/morty.sh | 
					
						
							|  |  |  | # - utils/filtron.sh | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # If '${SEARX_SRC}/.config.sh' exists, the modified source_dot_config() function | 
					
						
							|  |  |  | # loads this configuration (instead of './.config.sh'). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # **SEARX_SRC_INIT_FILES** | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Array of file names to sync into a installation at $SEARX_SRC.  The file names | 
					
						
							|  |  |  | # are relative to the $REPO_ROOT.  Set by function init_SEARX_SRC_INIT_FILES(). | 
					
						
							|  |  |  | # Most often theses are files like: | 
					
						
							|  |  |  | # - .config.sh | 
					
						
							|  |  |  | # - searx/settings.yml | 
					
						
							|  |  |  | # - utils/brand.env | 
					
						
							|  |  |  | # - ... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SEARX_SRC_INIT_FILES=() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | eval orig_"$(declare -f source_dot_config)" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | source_dot_config() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Modified source_dot_config function that | 
					
						
							|  |  |  |     # - loads .config.sh from an existing installation (at SEARX_SRC). | 
					
						
							|  |  |  |     # - initialize SEARX_SRC_INIT_FILES | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if [ -z "$eval_SEARX_SRC" ]; then | 
					
						
							|  |  |  |         export eval_SEARX_SRC='true' | 
					
						
							|  |  |  |         SEARX_SRC=$("${REPO_ROOT}/utils/searx.sh" --getenv SEARX_SRC) | 
					
						
							| 
									
										
										
										
											2021-06-29 20:08:10 +02:00
										 |  |  |         SEARX_PYENV=$("${REPO_ROOT}/utils/searx.sh" --getenv SEARX_PYENV) | 
					
						
							| 
									
										
										
										
											2021-10-02 17:18:05 +02:00
										 |  |  |         SEARXNG_SETTINGS_PATH=$("${REPO_ROOT}/utils/searx.sh" --getenv SEARXNG_SETTINGS_PATH) | 
					
						
							| 
									
										
										
										
											2021-06-29 19:01:07 +02:00
										 |  |  |         if [ ! -r "${SEARX_SRC}" ]; then | 
					
						
							| 
									
										
										
										
											2021-07-12 16:51:36 +02:00
										 |  |  |             info_msg "not yet cloned: ${SEARX_SRC}" | 
					
						
							| 
									
										
										
										
											2021-06-29 19:01:07 +02:00
										 |  |  |             orig_source_dot_config | 
					
						
							|  |  |  |             return 0 | 
					
						
							|  |  |  |         fi | 
					
						
							| 
									
										
										
										
											2021-07-12 16:51:36 +02:00
										 |  |  |         info_msg "using instance at: ${SEARX_SRC}" | 
					
						
							| 
									
										
										
										
											2021-06-29 19:01:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # set and log DOT_CONFIG | 
					
						
							|  |  |  |         if [ -r "${SEARX_SRC}/.config.sh" ]; then | 
					
						
							| 
									
										
										
										
											2021-07-12 16:51:36 +02:00
										 |  |  |             info_msg "switching to ${SEARX_SRC}/.config.sh" | 
					
						
							| 
									
										
										
										
											2021-06-29 19:01:07 +02:00
										 |  |  |             DOT_CONFIG="${SEARX_SRC}/.config.sh" | 
					
						
							|  |  |  |         else | 
					
						
							| 
									
										
										
										
											2021-07-12 16:51:36 +02:00
										 |  |  |             info_msg "using local config: ${DOT_CONFIG}" | 
					
						
							| 
									
										
										
										
											2021-06-29 19:01:07 +02:00
										 |  |  |         fi | 
					
						
							|  |  |  |         init_SEARX_SRC_INIT_FILES | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | init_SEARX_SRC_INIT_FILES(){ | 
					
						
							|  |  |  |     # init environment SEARX_SRC_INIT_FILES | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Monitor modified files in the working-tree from the local repository, only | 
					
						
							|  |  |  |     # if the local file differs to the corresponding file in the instance.  Most | 
					
						
							|  |  |  |     # often theses are files like: | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     #  - .config.sh | 
					
						
							|  |  |  |     #  - searx/settings.yml | 
					
						
							|  |  |  |     #  - utils/brand.env | 
					
						
							|  |  |  |     #  - ... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # keep list empty if there is no installation | 
					
						
							|  |  |  |     SEARX_SRC_INIT_FILES=() | 
					
						
							|  |  |  |     if [ ! -r "$SEARX_SRC" ]; then | 
					
						
							|  |  |  |         return 0 | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     local fname | 
					
						
							|  |  |  |     local msg="" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Monitor local modified files from the repository, only if the local file | 
					
						
							|  |  |  |     # differs to the corresponding file in the instance | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while IFS= read -r fname; do | 
					
						
							|  |  |  |         if [ -z "$fname" ]; then | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         fi | 
					
						
							|  |  |  |         if [ -r "${SEARX_SRC}/${fname}" ]; then | 
					
						
							|  |  |  |             # diff  "${REPO_ROOT}/${fname}" "${SEARX_SRC}/${fname}" | 
					
						
							|  |  |  |             if ! cmp --silent "${REPO_ROOT}/${fname}" "${SEARX_SRC}/${fname}"; then | 
					
						
							|  |  |  |                 SEARX_SRC_INIT_FILES+=("${fname}") | 
					
						
							| 
									
										
										
										
											2021-07-12 16:51:36 +02:00
										 |  |  |                 info_msg "local clone (workingtree), modified file: ./$fname" | 
					
						
							| 
									
										
										
										
											2021-06-29 19:01:07 +02:00
										 |  |  |                 msg="to update use:  sudo -H ./utils/searx.sh install init-src" | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  |         fi | 
					
						
							|  |  |  |     done <<< "$(git diff --name-only)" | 
					
						
							| 
									
										
										
										
											2021-07-12 16:51:36 +02:00
										 |  |  |     [ -n "$msg" ] &&  info_msg "$msg" | 
					
						
							| 
									
										
										
										
											2021-06-29 19:01:07 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | install_log_searx_instance() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     echo -e "---- SearXNG instance setup ${_BBlue}(status: $(install_searx_get_state))${_creset}" | 
					
						
							| 
									
										
										
										
											2021-10-02 17:18:05 +02:00
										 |  |  |     echo -e "  SEARXNG_SETTINGS_PATH : ${_BBlue}${SEARXNG_SETTINGS_PATH}${_creset}" | 
					
						
							| 
									
										
										
										
											2021-06-29 20:08:10 +02:00
										 |  |  |     echo -e "  SSEARX_PYENV        : ${_BBlue}${SEARX_PYENV}${_creset}" | 
					
						
							| 
									
										
										
										
											2021-06-29 19:01:07 +02:00
										 |  |  |     echo -e "  SEARX_SRC           : ${_BBlue}${SEARX_SRC:-none}${_creset}" | 
					
						
							|  |  |  |     echo -e "  SEARX_URL           : ${_BBlue}${SEARX_URL:-none}${_creset}" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if in_container; then | 
					
						
							|  |  |  |         # searx is listening on 127.0.0.1 and not available from outside container | 
					
						
							|  |  |  |         # in containers the service is listening on 0.0.0.0 (see lxc-searx.env) | 
					
						
							|  |  |  |         echo -e "---- container setup" | 
					
						
							|  |  |  |         echo -e "  ${_BBlack}HINT:${_creset} searx only listen on loopback device" \
 | 
					
						
							|  |  |  |              "${_BBlack}inside${_creset} the container." | 
					
						
							|  |  |  |         for ip in $(global_IPs) ; do | 
					
						
							|  |  |  |             if [[ $ip =~ .*:.* ]]; then | 
					
						
							|  |  |  |                 echo "  container (IPv6): [${ip#*|}]" | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 # IPv4: | 
					
						
							|  |  |  |                 echo "  container (IPv4): ${ip#*|}" | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  |         done | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | install_searx_get_state(){ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # usage: install_searx_get_state | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # Prompts a string indicating the status of the installation procedure | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # missing-searx-clone: | 
					
						
							|  |  |  |     #    There is no clone at ${SEARX_SRC} | 
					
						
							|  |  |  |     # missing-searx-pyenv: | 
					
						
							|  |  |  |     #    There is no pyenv in ${SEARX_PYENV} | 
					
						
							|  |  |  |     # installer-modified: | 
					
						
							|  |  |  |     #    There are files modified locally in the installer (clone), | 
					
						
							|  |  |  |     #    see ${SEARX_SRC_INIT_FILES} description. | 
					
						
							|  |  |  |     # python-installed: | 
					
						
							|  |  |  |     #    Scripts can be executed in instance's environment | 
					
						
							|  |  |  |     #    - user:  ${SERVICE_USER} | 
					
						
							|  |  |  |     #    - pyenv: ${SEARX_PYENV} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 10:56:50 +02:00
										 |  |  |     if [ -f /etc/searx/settings.yml ]; then | 
					
						
							|  |  |  |         err_msg "settings.yml in /etc/searx/ is deprecated, move file to folder /etc/searxng/" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-29 19:01:07 +02:00
										 |  |  |     if ! [ -r "${SEARX_SRC}" ]; then | 
					
						
							|  |  |  |         echo "missing-searx-clone" | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |     if ! [ -f "${SEARX_PYENV}/bin/activate" ]; then | 
					
						
							|  |  |  |         echo "missing-searx-pyenv" | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     fi | 
					
						
							| 
									
										
										
										
											2021-10-02 17:18:05 +02:00
										 |  |  |     if ! [ -r "${SEARXNG_SETTINGS_PATH}" ]; then | 
					
						
							| 
									
										
										
										
											2021-06-29 19:01:07 +02:00
										 |  |  |         echo "missing-settings" | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |     if ! [ ${#SEARX_SRC_INIT_FILES[*]} -eq 0 ]; then | 
					
						
							|  |  |  |         echo "installer-modified" | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |     echo "python-installed" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Initialization of the installation procedure | 
					
						
							|  |  |  | # -------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # shellcheck source=utils/brand.env | 
					
						
							|  |  |  | source "${REPO_ROOT}/utils/brand.env" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-29 20:08:10 +02:00
										 |  |  | # SEARX_URL aka PUBLIC_URL: the public URL of the instance (e.g. | 
					
						
							|  |  |  | # "https://example.org/searx").  The value is taken from environment $SEARX_URL | 
					
						
							|  |  |  | # in ./utils/brand.env.  This variable is a empty string if server.base_url in | 
					
						
							|  |  |  | # the settings.yml is set to 'false'. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SEARX_URL="${SEARX_URL:-http://$(uname -n)}" | 
					
						
							|  |  |  | if in_container; then | 
					
						
							|  |  |  |     # hint: Linux containers do not have DNS entries, lets use IPs | 
					
						
							|  |  |  |     SEARX_URL="http://$(primary_ip)" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | PUBLIC_URL="${SEARX_URL}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-29 19:01:07 +02:00
										 |  |  | source_dot_config | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # shellcheck source=utils/lxc-searx.env | 
					
						
							|  |  |  | source "${REPO_ROOT}/utils/lxc-searx.env" | 
					
						
							|  |  |  | in_container && lxc_set_suite_env |