From 89be7f2699d916ab5dc369dd794c53905c706b38 Mon Sep 17 00:00:00 2001 From: Matthias Mair Date: Mon, 9 Sep 2024 12:17:13 +0200 Subject: [PATCH] [0.16.x] Packager: easier to parse debug messages (#8083) (#8096) * Packager: easier to parse debug messages (#8083) * Add new version to logging * Add easier to search logging * shorten appended string * make migrations that run on fresh installs easier to read (cherry picked from commit 3d9db2543db181f263db69746a91a7877ff00f9e) # Conflicts: # contrib/packager.io/functions.sh # contrib/packager.io/preinstall.sh * Update contributing.md --- contrib/packager.io/functions.sh | 143 ++++++++++-------- contrib/packager.io/postinstall.sh | 8 +- contrib/packager.io/preinstall.sh | 13 +- docs/docs/develop/contributing.md | 2 +- .../migrations/0026_auto_20240422_1301.py | 4 +- .../migrations/0011_auto_20240523_1640.py | 2 +- 6 files changed, 99 insertions(+), 73 deletions(-) diff --git a/contrib/packager.io/functions.sh b/contrib/packager.io/functions.sh index 29c9d53ff4..ff962172cf 100755 --- a/contrib/packager.io/functions.sh +++ b/contrib/packager.io/functions.sh @@ -13,6 +13,7 @@ function detect_docker() { else DOCKER="no" fi + echo "# POI04| Running in docker: ${DOCKER}" } function detect_initcmd() { @@ -30,6 +31,7 @@ function detect_initcmd() { if [ "${DOCKER}" == "yes" ]; then INIT_CMD="initctl" fi + echo "# POI05| Using init command: ${INIT_CMD}" } function detect_ip() { @@ -37,36 +39,36 @@ function detect_ip() { if [ "${SETUP_NO_CALLS}" == "true" ]; then # Use local IP address - echo "# Getting the IP address of the first local IP address" + echo "# POI06| Getting the IP address of the first local IP address" export INVENTREE_IP=$(hostname -I | awk '{print $1}') else # Use web service to get the IP address - echo "# Getting the IP address of the server via web service" + echo "# POI06| Getting the IP address of the server via web service" export INVENTREE_IP=$(curl -s https://checkip.amazonaws.com) fi - echo "IP address is ${INVENTREE_IP}" + echo "# POI06| IP address is ${INVENTREE_IP}" } function detect_python() { # Detect if there is already a python version installed in /opt/inventree/env/lib if test -f "${APP_HOME}/env/bin/python"; then - echo "# Python environment already present" + echo "# POI07| Python environment already present" # Extract earliest python version initialised from /opt/inventree/env/lib SETUP_PYTHON=$(ls -1 ${APP_HOME}/env/bin/python* | sort | head -n 1) - echo "# Found earlier used version: ${SETUP_PYTHON}" + echo "# POI07| Found earlier used version: ${SETUP_PYTHON}" else - echo "# No python environment found - using environment variable: ${SETUP_PYTHON}" + echo "# POI07| No python environment found - using environment variable: ${SETUP_PYTHON}" fi # Try to detect a python between 3.9 and 3.12 in reverse order if [ -z "$(which ${SETUP_PYTHON})" ]; then - echo "# Trying to detecting python3.${PYTHON_FROM} to python3.${PYTHON_TO} - using newest version" + echo "# POI07| Trying to detecting python3.${PYTHON_FROM} to python3.${PYTHON_TO} - using newest version" for i in $(seq $PYTHON_TO -1 $PYTHON_FROM); do - echo "# Checking for python3.${i}" + echo "# POI07| Checking for python3.${i}" if [ -n "$(which python3.${i})" ]; then SETUP_PYTHON="python3.${i}" - echo "# Found python3.${i} installed - using for setup ${SETUP_PYTHON}" + echo "# POI07| Found python3.${i} installed - using for setup ${SETUP_PYTHON}" break fi done @@ -75,12 +77,14 @@ function detect_python() { # Ensure python can be executed - abort if not if [ -z "$(which ${SETUP_PYTHON})" ]; then echo "${On_Red}" - echo "# Python ${SETUP_PYTHON} not found - aborting!" - echo "# Please ensure python can be executed with the command '$SETUP_PYTHON' by the current user '$USER'." - echo "# If you are using a different python version, please set the environment variable SETUP_PYTHON to the correct command - eg. 'python3.10'." + echo "# POI07| Python ${SETUP_PYTHON} not found - aborting!" + echo "# POI07| Please ensure python can be executed with the command '$SETUP_PYTHON' by the current user '$USER'." + echo "# POI07| If you are using a different python version, please set the environment variable SETUP_PYTHON to the correct command - eg. 'python3.10'." echo "${Color_Off}" exit 1 fi + + echo "# POI07| Using python command: ${SETUP_PYTHON}" } function get_env() { @@ -95,7 +99,7 @@ function get_env() { done if [ -n "${SETUP_DEBUG}" ]; then - echo "Done getting env $envname: ${!envname}" + echo "# POI02| Done getting env $envname: ${!envname}" fi } @@ -103,7 +107,7 @@ function detect_local_env() { # Get all possible envs for the install if [ -n "${SETUP_DEBUG}" ]; then - echo "# Printing local envs - before #++#" + echo "# POI02| Printing local envs - before #++#" printenv fi @@ -113,7 +117,7 @@ function detect_local_env() { done if [ -n "${SETUP_DEBUG}" ]; then - echo "# Printing local envs - after #++#" + echo "# POI02| Printing local envs - after #++#" printenv fi } @@ -121,15 +125,17 @@ function detect_local_env() { function detect_envs() { # Detect all envs that should be passed to setup commands - echo "# Setting base environment variables" + echo "# POI03| Setting base environment variables" export INVENTREE_CONFIG_FILE=${INVENTREE_CONFIG_FILE:-${CONF_DIR}/config.yaml} if test -f "${INVENTREE_CONFIG_FILE}"; then - echo "# Using existing config file: ${INVENTREE_CONFIG_FILE}" + echo "# POI03| Using existing config file: ${INVENTREE_CONFIG_FILE}" # Install parser + echo "# POI03| Installing requirements" pip install --require-hashes -r ${APP_HOME}/contrib/dev_reqs/requirements.txt -q + echo "# POI03| Installed requirements" # Load config export INVENTREE_CONF_DATA=$(cat ${INVENTREE_CONFIG_FILE} | jc --yaml) @@ -149,10 +155,10 @@ function detect_envs() { export INVENTREE_DB_HOST=$(jq -r '.[].database.HOST' <<< ${INVENTREE_CONF_DATA}) export INVENTREE_DB_PORT=$(jq -r '.[].database.PORT' <<< ${INVENTREE_CONF_DATA}) else - echo "# No config file found: ${INVENTREE_CONFIG_FILE}, using envs or defaults" + echo "# POI03| No config file found: ${INVENTREE_CONFIG_FILE}, using envs or defaults" if [ -n "${SETUP_DEBUG}" ]; then - echo "# Print current envs" + echo "# POI03| Print current envs" printenv | grep INVENTREE_ printenv | grep SETUP_ fi @@ -175,43 +181,43 @@ function detect_envs() { fi # For debugging pass out the envs - echo "# Collected environment variables:" - echo "# INVENTREE_MEDIA_ROOT=${INVENTREE_MEDIA_ROOT}" - echo "# INVENTREE_STATIC_ROOT=${INVENTREE_STATIC_ROOT}" - echo "# INVENTREE_BACKUP_DIR=${INVENTREE_BACKUP_DIR}" - echo "# INVENTREE_PLUGINS_ENABLED=${INVENTREE_PLUGINS_ENABLED}" - echo "# INVENTREE_PLUGIN_FILE=${INVENTREE_PLUGIN_FILE}" - echo "# INVENTREE_SECRET_KEY_FILE=${INVENTREE_SECRET_KEY_FILE}" - echo "# INVENTREE_DB_ENGINE=${INVENTREE_DB_ENGINE}" - echo "# INVENTREE_DB_NAME=${INVENTREE_DB_NAME}" - echo "# INVENTREE_DB_USER=${INVENTREE_DB_USER}" + echo "# POI03| Collected environment variables:" + echo "# POI03| INVENTREE_MEDIA_ROOT=${INVENTREE_MEDIA_ROOT}" + echo "# POI03| INVENTREE_STATIC_ROOT=${INVENTREE_STATIC_ROOT}" + echo "# POI03| INVENTREE_BACKUP_DIR=${INVENTREE_BACKUP_DIR}" + echo "# POI03| INVENTREE_PLUGINS_ENABLED=${INVENTREE_PLUGINS_ENABLED}" + echo "# POI03| INVENTREE_PLUGIN_FILE=${INVENTREE_PLUGIN_FILE}" + echo "# POI03| INVENTREE_SECRET_KEY_FILE=${INVENTREE_SECRET_KEY_FILE}" + echo "# POI03| INVENTREE_DB_ENGINE=${INVENTREE_DB_ENGINE}" + echo "# POI03| INVENTREE_DB_NAME=${INVENTREE_DB_NAME}" + echo "# POI03| INVENTREE_DB_USER=${INVENTREE_DB_USER}" if [ -n "${SETUP_DEBUG}" ]; then - echo "# INVENTREE_DB_PASSWORD=${INVENTREE_DB_PASSWORD}" + echo "# POI03| INVENTREE_DB_PASSWORD=${INVENTREE_DB_PASSWORD}" fi - echo "# INVENTREE_DB_HOST=${INVENTREE_DB_HOST}" - echo "# INVENTREE_DB_PORT=${INVENTREE_DB_PORT}" + echo "# POI03| INVENTREE_DB_HOST=${INVENTREE_DB_HOST}" + echo "# POI03| INVENTREE_DB_PORT=${INVENTREE_DB_PORT}" } function create_initscripts() { # Make sure python env exists if test -f "${APP_HOME}/env"; then - echo "# python environment already present - skipping" + echo "# POI09| python environment already present - skipping" else - echo "# Setting up python environment" + echo "# POI09| Setting up python environment" sudo -u ${APP_USER} --preserve-env=$SETUP_ENVS bash -c "cd ${APP_HOME} && ${SETUP_PYTHON} -m venv env" sudo -u ${APP_USER} --preserve-env=$SETUP_ENVS bash -c "cd ${APP_HOME} && env/bin/pip install invoke wheel" # Check INSTALLER_EXTRA exists and load it if test -f "${APP_HOME}/INSTALLER_EXTRA"; then - echo "# Loading extra packages from INSTALLER_EXTRA" + echo "# POI09| Loading extra packages from INSTALLER_EXTRA" source ${APP_HOME}/INSTALLER_EXTRA fi if [ -n "${SETUP_EXTRA_PIP}" ]; then - echo "# Installing extra pip packages" + echo "# POI09| Installing extra pip packages" if [ -n "${SETUP_DEBUG}" ]; then - echo "# Extra pip packages: ${SETUP_EXTRA_PIP}" + echo "# POI09| Extra pip packages: ${SETUP_EXTRA_PIP}" fi sudo -u ${APP_USER} --preserve-env=$SETUP_ENVS bash -c "cd ${APP_HOME} && env/bin/pip install ${SETUP_EXTRA_PIP}" # Write extra packages to INSTALLER_EXTRA @@ -221,41 +227,45 @@ function create_initscripts() { # Unlink default config if it exists if test -f "/etc/nginx/sites-enabled/default"; then - echo "# Unlinking default nginx config\n# Old file still in /etc/nginx/sites-available/default" + echo "# POI09| Unlinking default nginx config\n# POI09| Old file still in /etc/nginx/sites-available/default" sudo unlink /etc/nginx/sites-enabled/default + echo "# POI09| Unlinked default nginx config" fi # Create InvenTree specific nginx config - echo "# Stopping nginx" + echo "# POI09| Stopping nginx" ${INIT_CMD} stop nginx - echo "# Setting up nginx to ${SETUP_NGINX_FILE}" + echo "# POI09| Stopped nginx" + echo "# POI09| Setting up nginx to ${SETUP_NGINX_FILE}" # Always use the latest nginx config; important if new headers are added / needed for security cp ${APP_HOME}/contrib/packager.io/nginx.prod.conf ${SETUP_NGINX_FILE} sed -i s/inventree-server:8000/localhost:6000/g ${SETUP_NGINX_FILE} sed -i s=var/www=opt/inventree/data=g ${SETUP_NGINX_FILE} # Start nginx - echo "# Starting nginx" + echo "# POI09| Starting nginx" ${INIT_CMD} start nginx + echo "# POI09| Started nginx" - echo "# (Re)creating init scripts" + echo "# POI09| (Re)creating init scripts" # This resets scale parameters to a known state inventree scale web="1" worker="1" - echo "# Enabling InvenTree on boot" + echo "# POI09| Enabling InvenTree on boot" ${INIT_CMD} enable inventree + echo "# POI09| Enabled InvenTree on boot" } function create_admin() { # Create data for admin users - stop with setting SETUP_ADMIN_NOCREATION to true if [ "${SETUP_ADMIN_NOCREATION}" == "true" ]; then - echo "# Admin creation is disabled - skipping" + echo "# POI10| Admin creation is disabled - skipping" return fi if test -f "${SETUP_ADMIN_PASSWORD_FILE}"; then - echo "# Admin data already exists - skipping" + echo "# POI10| Admin data already exists - skipping" else - echo "# Creating admin user data" + echo "# POI10| Creating admin user data" # Static admin data export INVENTREE_ADMIN_USER=${INVENTREE_ADMIN_USER:-admin} @@ -270,13 +280,15 @@ function create_admin() { } function start_inventree() { - echo "# Starting InvenTree" + echo "# POI15| Starting InvenTree" ${INIT_CMD} start inventree + echo "# POI15| Started InvenTree" } function stop_inventree() { - echo "# Stopping InvenTree" + echo "# POI11| Stopping InvenTree" ${INIT_CMD} stop inventree + echo "# POI11| Stopped InvenTree" } function update_or_install() { @@ -285,23 +297,23 @@ function update_or_install() { chown ${APP_USER}:${APP_GROUP} ${APP_HOME} -R # Run update as app user - echo "# Updating InvenTree" + echo "# POI12| Updating InvenTree" sudo -u ${APP_USER} --preserve-env=$SETUP_ENVS bash -c "cd ${APP_HOME} && pip install wheel" - sudo -u ${APP_USER} --preserve-env=$SETUP_ENVS bash -c "cd ${APP_HOME} && invoke update | sed -e 's/^/# inv update| /;'" + sudo -u ${APP_USER} --preserve-env=$SETUP_ENVS bash -c "cd ${APP_HOME} && invoke update | sed -e 's/^/# POI12| u | /;'" # Make sure permissions are correct again - echo "# Set permissions for data dir and media: ${DATA_DIR}" + echo "# POI12| Set permissions for data dir and media: ${DATA_DIR}" chown ${APP_USER}:${APP_GROUP} ${DATA_DIR} -R chown ${APP_USER}:${APP_GROUP} ${CONF_DIR} -R } function set_env() { - echo "# Setting up InvenTree config values" + echo "# POI13| Setting up InvenTree config values" inventree config:set INVENTREE_CONFIG_FILE=${INVENTREE_CONFIG_FILE} # Changing the config file - echo "# Writing the settings to the config file ${INVENTREE_CONFIG_FILE}" + echo "# POI13| Writing the settings to the config file ${INVENTREE_CONFIG_FILE}" # Media Root sed -i s=#media_root:\ \'/home/inventree/data/media\'=media_root:\ \'${INVENTREE_MEDIA_ROOT}\'=g ${INVENTREE_CONFIG_FILE} # Static Root @@ -332,23 +344,28 @@ function set_env() { # Fixing the permissions chown ${APP_USER}:${APP_GROUP} ${DATA_DIR} ${INVENTREE_CONFIG_FILE} + + echo "# POI13| Done setting up InvenTree config values" } function set_site() { # Ensure IP is known if [ -z "${INVENTREE_IP}" ]; then - echo "# No IP address found - skipping" + echo "# POI14| No IP address found - skipping" return fi # Check if INVENTREE_SITE_URL in inventree config if [ -z "$(inventree config:get INVENTREE_SITE_URL)" ]; then - echo "# Setting up InvenTree site URL" + echo "# POI14| Setting up InvenTree site URL" inventree config:set INVENTREE_SITE_URL=http://${INVENTREE_IP} + else + echo "# POI14| Site URL already set - skipping" fi } function final_message() { + echo "# POI16| Printing Final message" echo -e "####################################################################################" echo -e "This InvenTree install uses nginx, the settings for the webserver can be found in" echo -e "${SETUP_NGINX_FILE}" @@ -362,10 +379,12 @@ function final_message() { function update_checks() { - echo "# Running upgrade" + echo "# POI08| Running upgrade" local old_version=$1 local old_version_rev=$(echo ${old_version} | cut -d'-' -f1 | cut -d'.' -f2) - echo "# Old version is: ${old_version} - release: ${old_version_rev}" + local new_version=$(dpkg-query --show --showformat='${Version}' inventree) + local new_version_rev=$(echo ${new_version} | cut -d'-' -f1 | cut -d'.' -f2) + echo "# POI08| Old version is: ${old_version} | ${old_version_rev} - updating to ${new_version} | ${old_version_rev}" local ABORT=false function check_config_value() { @@ -378,25 +397,25 @@ function update_checks() { value=$(jq -r ".[].${config_key}" <<< ${INVENTREE_CONF_DATA}) fi if [ -z "${value}" ] || [ "$value" == "null" ]; then - echo "# No setting for ${name} found - please set it manually either in ${INVENTREE_CONFIG_FILE} under '${config_key}' or with 'inventree config:set ${env_key}=value'" + echo "# POI08| No setting for ${name} found - please set it manually either in ${INVENTREE_CONFIG_FILE} under '${config_key}' or with 'inventree config:set ${env_key}=value'" ABORT=true else - echo "# Found setting for ${name} - ${value}" + echo "# POI08| Found setting for ${name} - ${value}" fi } # Custom checks if old version is below 0.8.0 if [ "${old_version_rev}" -lt "9" ]; then - echo "# Old version is below 0.9.0 - You might be missing some configs" + echo "# POI08| Old version is below 0.9.0 - You might be missing some configs" # Check for BACKUP_DIR and SITE_URL in INVENTREE_CONF_DATA and config check_config_value "INVENTREE_SITE_URL" "site_url" "site URL" check_config_value "INVENTREE_BACKUP_DIR" "backup_dir" "backup dir" if [ "${ABORT}" = true ]; then - echo "# Aborting - please set the missing values and run the update again" + echo "# POI08| Aborting - please set the missing values and run the update again" exit 1 fi - echo "# All checks passed - continuing with the update" + echo "# POI08| All checks passed - continuing with the update" fi } diff --git a/contrib/packager.io/postinstall.sh b/contrib/packager.io/postinstall.sh index e9d2cbb9f9..4e5734fb5a 100755 --- a/contrib/packager.io/postinstall.sh +++ b/contrib/packager.io/postinstall.sh @@ -3,12 +3,15 @@ # packager.io postinstall script # +echo "# POI01| Running postinstall script - start - $(date)" exec > >(tee ${APP_HOME}/log/setup_$(date +"%F_%H_%M_%S").log) 2>&1 PATH=${APP_HOME}/env/bin:${APP_HOME}/:/sbin:/bin:/usr/sbin:/usr/bin: # import functions +echo "# POI01| Importing functions" . ${APP_HOME}/contrib/packager.io/functions.sh +echo "# POI01| Functions imported" # Envs that should be passed to setup commands export SETUP_ENVS=PATH,APP_HOME,INVENTREE_MEDIA_ROOT,INVENTREE_STATIC_ROOT,INVENTREE_BACKUP_DIR,INVENTREE_SITE_URL,INVENTREE_PLUGINS_ENABLED,INVENTREE_PLUGIN_FILE,INVENTREE_CONFIG_FILE,INVENTREE_SECRET_KEY_FILE,INVENTREE_DB_ENGINE,INVENTREE_DB_NAME,INVENTREE_DB_USER,INVENTREE_DB_PASSWORD,INVENTREE_DB_HOST,INVENTREE_DB_PORT,INVENTREE_ADMIN_USER,INVENTREE_ADMIN_EMAIL,INVENTREE_ADMIN_PASSWORD,SETUP_NGINX_FILE,SETUP_ADMIN_PASSWORD_FILE,SETUP_NO_CALLS,SETUP_DEBUG,SETUP_EXTRA_PIP,SETUP_PYTHON,SETUP_ADMIN_NOCREATION @@ -37,9 +40,9 @@ detect_ip detect_python # Check if we are updating and need to alert -echo "# Checking if update checks are needed" +echo "# POI08| Checking if update checks are needed" if [ -z "$2" ]; then - echo "# Normal install - no need for checks" + echo "# POI08| Normal install - no need for checks" else update_checks $2 fi @@ -60,3 +63,4 @@ start_inventree # show info final_message +echo "# POI17| Running postinstall script - done - $(date)" diff --git a/contrib/packager.io/preinstall.sh b/contrib/packager.io/preinstall.sh index 5306184b09..f15fb49e06 100755 --- a/contrib/packager.io/preinstall.sh +++ b/contrib/packager.io/preinstall.sh @@ -2,6 +2,7 @@ # # packager.io preinstall/preremove script # +echo "# PRI01| Running preinstall script - start - $(date)" PATH=${APP_HOME}/env/bin:${APP_HOME}/:/sbin:/bin:/usr/sbin:/usr/bin: # Envs that should be passed to setup commands @@ -9,12 +10,14 @@ export SETUP_ENVS=PATH,APP_HOME,INVENTREE_MEDIA_ROOT,INVENTREE_STATIC_ROOT,INVEN if test -f "${APP_HOME}/env/bin/pip"; then # Check if clear-generated is available - if sudo -u ${APP_USER} --preserve-env=$SETUP_ENVS bash -c "cd ${APP_HOME} && invoke clear-generated --help" > /dev/null 2>&1; then - echo "# Clearing precompiled files" - sudo -u ${APP_USER} --preserve-env=$SETUP_ENVS bash -c "cd ${APP_HOME} && invoke clear-generated" + if sudo -u ${APP_USER} --preserve-env=$SETUP_ENVS bash -c "cd ${APP_HOME} && invoke int.clear-generated --help" > /dev/null 2>&1; then + echo "# PRI02| Clearing precompiled files" + sudo -u ${APP_USER} --preserve-env=$SETUP_ENVS bash -c "cd ${APP_HOME} && invoke int.clear-generated" else - echo "# Clearing precompiled files - skipping" + echo "# PRI02| Clearing precompiled files - skipping" fi else - echo "# No python environment found - skipping" + echo "# PRI02| No python environment found - skipping" fi + +echo "# PRI03| Running preinstall script - done - $(date)" diff --git a/docs/docs/develop/contributing.md b/docs/docs/develop/contributing.md index 931d8111fe..fde8f909c7 100644 --- a/docs/docs/develop/contributing.md +++ b/docs/docs/develop/contributing.md @@ -52,7 +52,7 @@ invoke setup-dev ## Branches and Versioning -InvenTree roughly follow the [GitLab flow](https://docs.gitlab.com/ee/topics/gitlab_flow.html) branching style, to allow simple management of multiple tagged releases, short-lived branches, and development on the main branch. +InvenTree roughly follow the [GitLab flow](https://about.gitlab.com/topics/version-control/what-are-gitlab-flow-best-practices/) branching style, to allow simple management of multiple tagged releases, short-lived branches, and development on the main branch. There are nominally 5 active branches: - `master` - The main development branch diff --git a/src/backend/InvenTree/report/migrations/0026_auto_20240422_1301.py b/src/backend/InvenTree/report/migrations/0026_auto_20240422_1301.py index 0e04b915db..5a37adf331 100644 --- a/src/backend/InvenTree/report/migrations/0026_auto_20240422_1301.py +++ b/src/backend/InvenTree/report/migrations/0026_auto_20240422_1301.py @@ -2,9 +2,9 @@ import os -from django.db import connection, migrations from django.core.files.base import ContentFile from django.core.files.storage import default_storage +from django.db import connection, migrations import InvenTree.ready @@ -48,7 +48,7 @@ def convert_legacy_labels(table_name, model_name, template_model): except Exception: # Table likely does not exist if not InvenTree.ready.isInTestMode(): - print(f"Legacy label table {table_name} not found - skipping migration") + print(f"\nLegacy label table {table_name} not found - skipping migration") return 0 rows = cursor.fetchall() diff --git a/src/backend/InvenTree/users/migrations/0011_auto_20240523_1640.py b/src/backend/InvenTree/users/migrations/0011_auto_20240523_1640.py index 31d606fab2..6dd75904a9 100644 --- a/src/backend/InvenTree/users/migrations/0011_auto_20240523_1640.py +++ b/src/backend/InvenTree/users/migrations/0011_auto_20240523_1640.py @@ -16,7 +16,7 @@ def clear_sessions(apps, schema_editor): # pragma: no cover try: engine = import_module(settings.SESSION_ENGINE) engine.SessionStore.clear_expired() - print('Cleared all user sessions to deal with GHSA-2crp-q9pc-457j') + print('\nCleared all user sessions to deal with GHSA-2crp-q9pc-457j') except Exception: # Database may not be ready yet, so this does not matter anyhow pass