utils/searx.sh: add script to install isolated searx service

First version which serves searx over uwsgi at http://127.0.0.1:8888

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
This commit is contained in:
Markus Heiser 2020-01-20 16:55:05 +01:00
parent 89df9d9141
commit 9b5a7f7559
3 changed files with 160 additions and 47 deletions

View File

@ -373,66 +373,84 @@ uWSGI_restart() {
sudo -H systemctl restart uwsgi sudo -H systemctl restart uwsgi
} }
uWSGI_app_available() {
# usage: uWSGI_app_available <myapp.ini>
local CONF="$1"
if [[ -z $CONF ]]; then
err_msg "uWSGI_app_available: missing arguments"
return 42
fi
[[ -f "${uWSGI_SETUP}/apps-available/${CONF}" ]]
}
uWSGI_install_app() { uWSGI_install_app() {
# usage: uWSGI_install_app [--no-eval] /etc/uwsgi/apps-available/myapp.ini # usage: uWSGI_install_app [--no-eval] <myapp.ini>
local no_eval="" local no_eval=""
local CONF="" local CONF="$1"
if [[ "$1" == "--no-eval" ]]; then if [[ "$1" == "--no-eval" ]]; then
no_eval=$1; shift no_eval=$1; shift
fi fi
CONF=$1
# shellcheck disable=SC2086 # shellcheck disable=SC2086
install_template $no_eval "${CONF}" root root 644 install_template $no_eval "${uWSGI_SETUP}/apps-available/${CONF}" root root 644
uWSGI_enable_app "$(basename "${CONF}")" uWSGI_enable_app "${CONF}"
uWSGI_restart uWSGI_restart
info_msg "installed uWSGI app: $(basename "${CONF}")" info_msg "installed uWSGI app: ${CONF}"
} }
uWSGI_remove_app() { uWSGI_remove_app() {
# usage: uWSGI_remove_app <path.ini> # usage: uWSGI_remove_app <myapp.ini>
local CONF=$1 local CONF="$1"
uWSGI_disable_app "$(basename "${CONF}")" uWSGI_disable_app "${CONF}"
uWSGI_restart uWSGI_restart
rm -f "$CONF" rm -f "${uWSGI_SETUP}/apps-available/${CONF}"
info_msg "removed uWSGI app: $(basename "${CONF}")" info_msg "removed uWSGI app: ${CONF}"
}
uWSGI_app_enabled() {
# usage: uWSGI_app_enabled <myapp.ini>
local CONF="$1"
if [[ -z $CONF ]]; then
err_msg "uWSGI_app_enabled: missing arguments"
return 42
fi
[[ -f "${uWSGI_SETUP}/apps-enabled/${CONF}" ]]
} }
# shellcheck disable=SC2164 # shellcheck disable=SC2164
uWSGI_enable_app() { uWSGI_enable_app() {
# usage: uWSGI_enable_app <path.ini> # usage: uWSGI_enable_app <myapp.ini>
local CONF=$1 local CONF="$1"
if [[ -z $CONF ]]; then if [[ -z $CONF ]]; then
err_msg "uWSGI_enable_app missing arguments" err_msg "uWSGI_enable_app: missing arguments"
return 42 return 42
fi fi
pushd "${uWSGI_SETUP}/apps-enabled" >/dev/null pushd "${uWSGI_SETUP}/apps-enabled" >/dev/null
rm -f "$(basename "${CONF}")" rm -f "$CONF"
# shellcheck disable=SC2226 # shellcheck disable=SC2226
ln -s "../apps-available/$(basename "${CONF}")" ln -s "../apps-available/${CONF}"
info_msg "enabled uWSGI app: $(basename "${CONF}") (restart uWSGI required)" info_msg "enabled uWSGI app: ${CONF} (restart uWSGI required)"
popd >/dev/null popd >/dev/null
} }
uWSGI_disable_app() { uWSGI_disable_app() {
# usage: uWSGI_disable_app <path.ini> # usage: uWSGI_disable_app <myapp.ini>
local CONF=$1 local CONF="$1"
if [[ -z $CONF ]]; then if [[ -z $CONF ]]; then
err_msg "uWSGI_enable_app missing arguments" err_msg "uWSGI_enable_app: missing arguments"
return 42 return 42
fi fi
rm -f "${uWSGI_SETUP}/apps-enabled/${CONF}"
rm -f "${uWSGI_SETUP}/apps-enabled/$CONF" info_msg "disabled uWSGI app: ${CONF} (restart uWSGI required)"
info_msg "disabled uWSGI app: $(basename "${CONF}") (restart uWSGI required)"
} }
# distro's package manager # distro's package manager

View File

@ -32,11 +32,11 @@ SEARX_PYENV="${SERVICE_HOME}/searx-pyenv"
SEARX_SRC="${SERVICE_HOME}/searx-src" SEARX_SRC="${SERVICE_HOME}/searx-src"
SEARX_SETTINGS="${SEARX_SRC}/searx/settings.yml" SEARX_SETTINGS="${SEARX_SRC}/searx/settings.yml"
SEARX_INSTANCE_NAME="${SEARX_INSTANCE_NAME:-searx@$(uname -n)}" SEARX_INSTANCE_NAME="${SEARX_INSTANCE_NAME:-searx@$(uname -n)}"
SEARX_UWSGI_APP="${uWSGI_SETUP}/apps-available/searx.ini" SEARX_UWSGI_APP="searx.ini"
# shellcheck disable=SC2034 # shellcheck disable=SC2034
CONFIG_FILES=( CONFIG_FILES=(
"${SEARX_UWSGI_APP}" "${uWSGI_SETUP}/apps-available/${SEARX_UWSGI_APP}"
) )
# shellcheck disable=SC2034 # shellcheck disable=SC2034
@ -45,7 +45,7 @@ CONFIG_BACKUP_ENCRYPTED=(
) )
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
usage(){ usage() {
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
# shellcheck disable=SC1117 # shellcheck disable=SC1117
@ -60,6 +60,7 @@ usage:
$(basename "$0") activate [service] $(basename "$0") activate [service]
$(basename "$0") deactivate [service] $(basename "$0") deactivate [service]
$(basename "$0") show [service] $(basename "$0") show [service]
$(basename "$0") option [debug-on|debug-off]
shell shell
start interactive shell from user ${SERVICE_USER} start interactive shell from user ${SERVICE_USER}
@ -75,12 +76,14 @@ activate
deactivate service deactivate service
stop and deactivate service daemon (systemd unit) stop and deactivate service daemon (systemd unit)
show service show service
show service status and log run some small tests and show service's status and log
option
set one of te available options
EOF EOF
[ ! -z ${1+x} ] && echo -e "$1" [ ! -z ${1+x} ] && echo -e "$1"
} }
main(){ main() {
rst_title "$SERVICE_NAME" part rst_title "$SERVICE_NAME" part
local _usage="ERROR: unknown or missing $1 command $2" local _usage="ERROR: unknown or missing $1 command $2"
@ -128,13 +131,21 @@ main(){
activate) activate)
sudo_or_exit sudo_or_exit
case $2 in case $2 in
service) activate_service ;; service)
activate_service; uWSGI_restart ;;
*) 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 ;; service) deactivate_service; uWSGI_restart ;;
*) usage "$_usage"; exit 42;;
esac ;;
option)
sudo_or_exit
case $2 in
debug-on) echo; enable_debug ;;
debug-off) echo; disable_debug ;;
*) usage "$_usage"; exit 42;; *) usage "$_usage"; exit 42;;
esac ;; esac ;;
*) usage "ERROR: unknown or missing command $1"; exit 42;; *) usage "ERROR: unknown or missing command $1"; exit 42;;
@ -158,6 +169,11 @@ install_all() {
test_local_searx test_local_searx
wait_key wait_key
install_searx_uwsgi install_searx_uwsgi
if service_is_available; then
info_msg "URL http://$SEARX_URL is available."
else
err_msg "URL http://$SEARX_URL not available, check searx & uwsgi setup!"
fi
wait_key wait_key
# ToDo ... # ToDo ...
@ -224,6 +240,10 @@ remove_all() {
remove_user remove_user
} }
user_is_available() {
sudo -i -u "$SERVICE_USER" echo \$HOME &>/dev/null
}
assert_user() { assert_user() {
rst_title "user $SERVICE_USER" section rst_title "user $SERVICE_USER" section
echo echo
@ -247,8 +267,12 @@ remove_user() {
fi fi
} }
clone_is_available() {
[[ -f "$SEARX_SETTINGS" ]]
}
# shellcheck disable=SC2164 # shellcheck disable=SC2164
clone_searx(){ clone_searx() {
rst_title "Clone searx sources" section rst_title "Clone searx sources" section
echo echo
SERVICE_HOME="$(sudo -i -u "$SERVICE_USER" echo \$HOME 2>/dev/null)" SERVICE_HOME="$(sudo -i -u "$SERVICE_USER" echo \$HOME 2>/dev/null)"
@ -280,7 +304,11 @@ remove_searx() {
fi fi
} }
create_pyenv(){ pyenv_is_available() {
[[ -f "${SEARX_PYENV}/bin/activate" ]]
}
create_pyenv() {
rst_title "Create virtualenv (python)" section rst_title "Create virtualenv (python)" section
echo echo
if [[ ! -f "${SEARX_SRC}/manage.sh" ]]; then if [[ ! -f "${SEARX_SRC}/manage.sh" ]]; then
@ -305,7 +333,7 @@ ${SEARX_SRC}/manage.sh update_packages
EOF EOF
} }
remove_pyenv(){ remove_pyenv() {
rst_title "Remove virtualenv (python)" section rst_title "Remove virtualenv (python)" section
if ! ask_yn "Do you really want to drop ${SEARX_PYENV} ?"; then if ! ask_yn "Do you really want to drop ${SEARX_PYENV} ?"; then
return return
@ -318,7 +346,7 @@ EOF
rm -rf "${SEARX_PYENV}" rm -rf "${SEARX_PYENV}"
} }
configure_searx(){ configure_searx() {
rst_title "Configure searx" section rst_title "Configure searx" section
rst_para "Setup searx config located at $SEARX_SETTINGS" rst_para "Setup searx config located at $SEARX_SETTINGS"
echo echo
@ -329,7 +357,7 @@ sed -i -e "s/{instance_name}/${SEARX_INSTANCE_NAME}/g" "$SEARX_SETTINGS"
EOF EOF
} }
test_local_searx(){ test_local_searx() {
rst_title "Testing searx instance localy" section rst_title "Testing searx instance localy" section
echo echo
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"
@ -337,7 +365,7 @@ cd ${SEARX_SRC}
sed -i -e "s/debug : False/debug : True/g" "$SEARX_SETTINGS" sed -i -e "s/debug : False/debug : True/g" "$SEARX_SETTINGS"
timeout 5 python3 searx/webapp.py & timeout 5 python3 searx/webapp.py &
sleep 1 sleep 1
curl --location --verbose --head --insecure http://127.0.0.1:8888/ curl --location --verbose --head --insecure $SEARX_URL
sed -i -e "s/debug : True/debug : False/g" "$SEARX_SETTINGS" sed -i -e "s/debug : True/debug : False/g" "$SEARX_SETTINGS"
EOF EOF
} }
@ -354,39 +382,106 @@ remove_searx_uwsgi() {
uWSGI_remove_app "$SEARX_UWSGI_APP" uWSGI_remove_app "$SEARX_UWSGI_APP"
} }
activate_service () { activate_service() {
rst_title "Activate $SERVICE_NAME (service)" section rst_title "Activate $SERVICE_NAME (service)" section
echo
uWSGI_enable_app "$SEARX_UWSGI_APP" uWSGI_enable_app "$SEARX_UWSGI_APP"
} }
deactivate_service () { deactivate_service() {
rst_title "De-Activate $SERVICE_NAME (service)" section rst_title "De-Activate $SERVICE_NAME (service)" section
echo
uWSGI_disable_app "$SEARX_UWSGI_APP" uWSGI_disable_app "$SEARX_UWSGI_APP"
} }
interactive_shell(){ interactive_shell() {
echo "// exit with CTRL-D" echo "// exit with CTRL-D"
sudo -H -u "${SERVICE_USER}" -i sudo -H -u "${SERVICE_USER}" -i
} }
git_diff(){ git_diff() {
sudo -H -u "${SERVICE_USER}" -i <<EOF sudo -H -u "${SERVICE_USER}" -i <<EOF
cd ${SEARX_REPO_FOLDER} cd ${SEARX_REPO_FOLDER}
git --no-pager diff git --no-pager diff
EOF EOF
} }
show_service () { service_is_available() {
curl --insecure "http://$SEARX_URL" &>/dev/null
}
enable_debug() {
info_msg "try to enable debug mode ..."
tee_stderr 0.1 <<EOF | sudo -H -u "${SERVICE_USER}" -i 2>&1 | prefix_stdout "$_service_prefix"
cd ${SEARX_SRC}
sed -i -e "s/debug : False/debug : True/g" "$SEARX_SETTINGS"
EOF
uWSGI_restart
}
disable_debug() {
info_msg "try to disable debug mode ..."
tee_stderr 0.1 <<EOF | sudo -H -u "${SERVICE_USER}" -i 2>&1 | prefix_stdout "$_service_prefix"
cd ${SEARX_SRC}
sed -i -e "s/debug : True/debug : False/g" "$SEARX_SETTINGS"
EOF
uWSGI_restart
}
show_service() {
rst_title "service status & log" rst_title "service status & log"
echo echo
systemctl status uwsgi.service
if user_is_available; then
info_msg "service account $SERVICE_USER available."
else
err_msg "service account $SERVICE_USER not available!"
fi
if service_is_available; then
info_msg "URL http://$SEARX_URL is available."
else
err_msg "URL http://$SEARX_URL not available!"
fi
if pyenv_is_available; then
info_msg "${SEARX_PYENV}/bin/activate is available."
else
err_msg "${SEARX_PYENV}/bin/activate not available!"
fi
if clone_is_available; then
info_msg "Searx software is installed."
else
err_msg "Missing searx software!"
fi
uWSGI_app_available "$SEARX_UWSGI_APP" \
|| err_msg "uWSGI app $SEARX_UWSGI_APP not available!"
if uWSGI_app_enabled "$SEARX_UWSGI_APP"; then
info_msg "uWSGI app $SEARX_UWSGI_APP is enabled."
else
err_msg "uWSGI app $SEARX_UWSGI_APP not enabled!"
fi
local _debug_on
if ask_yn "Enable searx debug mode?"; then
enable_debug
_debug_on=1
fi
wait_key
echo echo
read -r -s -n1 -t 5 -p "// use CTRL-C to stop monitoring the log" systemctl status uwsgi.service
read -r -s -n1 -t 2 -p "// use CTRL-C to stop monitoring the log"
echo echo
while true; do while true; do
trap break 2 trap break 2
journalctl -f -u uwsgi.service #journalctl -f -u uwsgi.service
tail -f /var/log/uwsgi/app/searx.log
done done
if [[ $_debug_on == 1 ]]; then
disable_debug
fi
return 0 return 0
} }

View File

@ -10,7 +10,7 @@ uid = ${SERVICE_USER}
gid = ${SERVICE_GROUP} gid = ${SERVICE_GROUP}
# chdir to specified directory before apps loading # chdir to specified directory before apps loading
chdir = ${SEARX_SRC} chdir = ${SEARX_SRC}/searx
# disable logging for privacy # disable logging for privacy
disable-logging = true disable-logging = true
@ -28,7 +28,7 @@ master = true
lazy-apps = true lazy-apps = true
# load uWSGI plugins # load uWSGI plugins
plugin = python3 plugin = python3,http
# By default the Python plugin does not initialize the GIL. This means your # By default the Python plugin does not initialize the GIL. This means your
# app-generated threads will not run. If you need threads, remember to enable # app-generated threads will not run. If you need threads, remember to enable
@ -50,7 +50,7 @@ module = searx.webapp
virtualenv = ${SEARX_PYENV} virtualenv = ${SEARX_PYENV}
# add directory (or glob) to pythonpath # add directory (or glob) to pythonpath
pythonpath = ${SERVICE_HOME} pythonpath = ${SEARX_SRC}
# plugin http # plugin http