2017-04-19 09:48:21 -05:00
#!/bin/bash
2021-02-04 14:48:08 -06:00
# Runs on every start of the NetBox Docker container
2019-12-23 10:53:19 -06:00
# Stop when an error occures
2017-04-19 09:48:21 -05:00
set -e
2019-12-23 10:53:19 -06:00
2021-02-04 14:48:08 -06:00
# Allows NetBox to be run as non-root users
2019-11-26 05:09:26 -06:00
umask 002
2017-04-19 09:48:21 -05:00
2020-11-10 08:23:07 -06:00
# Load correct Python3 env
2021-02-08 05:04:22 -06:00
# shellcheck disable=SC1091
2020-11-10 08:23:07 -06:00
source /opt/netbox/venv/bin/activate
2019-12-23 10:53:19 -06:00
# Try to connect to the DB
DB_WAIT_TIMEOUT = ${ DB_WAIT_TIMEOUT -3 }
MAX_DB_WAIT_TIME = ${ MAX_DB_WAIT_TIME -30 }
CUR_DB_WAIT_TIME = 0
2021-09-02 09:35:39 -05:00
while [ " ${ CUR_DB_WAIT_TIME } " -lt " ${ MAX_DB_WAIT_TIME } " ] ; do
# Read and truncate connection error tracebacks to last line by default
exec { psfd} < <( ./manage.py showmigrations 2>& 1)
read -rd '' DB_ERR <& $psfd || :
exec { psfd} <& -
wait $! && break
if [ -n " $DB_WAIT_DEBUG " ] ; then
echo " $DB_ERR "
else
readarray -tn 0 DB_ERR_LINES <<< " $DB_ERR "
echo " ${ DB_ERR_LINES [@] : -1 } "
echo "[ Use DB_WAIT_DEBUG=1 in netbox.env to print full traceback for errors here ]"
fi
2019-12-23 10:53:19 -06:00
echo " ⏳ Waiting on DB... ( ${ CUR_DB_WAIT_TIME } s / ${ MAX_DB_WAIT_TIME } s) "
sleep " ${ DB_WAIT_TIMEOUT } "
2021-02-08 05:16:04 -06:00
CUR_DB_WAIT_TIME = $(( CUR_DB_WAIT_TIME + DB_WAIT_TIMEOUT))
2017-04-19 09:48:21 -05:00
done
2019-12-23 10:53:19 -06:00
if [ " ${ CUR_DB_WAIT_TIME } " -ge " ${ MAX_DB_WAIT_TIME } " ] ; then
echo " ❌ Waited ${ MAX_DB_WAIT_TIME } s or more for the DB to become ready. "
exit 1
fi
2021-05-05 04:31:32 -05:00
# Check if update is needed
if ! ./manage.py migrate --check >/dev/null 2>& 1; then
echo "⚙️ Applying database migrations"
./manage.py migrate --no-input
echo "⚙️ Running trace_paths"
./manage.py trace_paths --no-input
echo "⚙️ Removing stale content types"
./manage.py remove_stale_contenttypes --no-input
echo "⚙️ Removing expired user sessions"
./manage.py clearsessions
2023-02-23 01:37:53 -06:00
echo "⚙️ Building search index (lazy)"
./manage.py reindex --lazy
2021-05-05 04:31:32 -05:00
fi
2017-04-19 09:48:21 -05:00
2019-12-23 10:53:19 -06:00
# Create Superuser if required
2019-10-12 07:45:55 -05:00
if [ " $SKIP_SUPERUSER " = = "true" ] ; then
2019-10-13 07:03:22 -05:00
echo "↩️ Skip creating the superuser"
2019-10-12 07:45:55 -05:00
else
if [ -z ${ SUPERUSER_NAME +x } ] ; then
SUPERUSER_NAME = 'admin'
2017-12-13 08:50:30 -06:00
fi
2019-10-12 07:45:55 -05:00
if [ -z ${ SUPERUSER_EMAIL +x } ] ; then
SUPERUSER_EMAIL = 'admin@example.com'
fi
2020-05-13 07:44:41 -05:00
if [ -f "/run/secrets/superuser_password" ] ; then
2021-02-08 05:16:04 -06:00
SUPERUSER_PASSWORD = " $( </run/secrets/superuser_password) "
2020-05-13 07:44:41 -05:00
elif [ -z ${ SUPERUSER_PASSWORD +x } ] ; then
SUPERUSER_PASSWORD = 'admin'
2019-10-12 07:45:55 -05:00
fi
2020-05-13 07:44:41 -05:00
if [ -f "/run/secrets/superuser_api_token" ] ; then
2021-02-08 05:16:04 -06:00
SUPERUSER_API_TOKEN = " $( </run/secrets/superuser_api_token) "
2020-05-13 07:44:41 -05:00
elif [ -z ${ SUPERUSER_API_TOKEN +x } ] ; then
SUPERUSER_API_TOKEN = '0123456789abcdef0123456789abcdef01234567'
2017-12-13 08:50:30 -06:00
fi
2017-04-21 06:43:44 -05:00
2021-02-08 05:16:04 -06:00
./manage.py shell --interface python <<END
2017-04-21 06:43:44 -05:00
from django.contrib.auth.models import User
2017-11-29 08:08:55 -06:00
from users.models import Token
2017-04-21 06:43:44 -05:00
if not User.objects.filter( username = '${SUPERUSER_NAME}' ) :
2017-11-29 08:08:55 -06:00
u = User.objects.create_superuser( '${SUPERUSER_NAME}' , '${SUPERUSER_EMAIL}' , '${SUPERUSER_PASSWORD}' )
Token.objects.create( user = u, key = '${SUPERUSER_API_TOKEN}' )
2017-04-21 06:43:44 -05:00
END
2017-04-19 09:48:21 -05:00
2019-10-12 07:45:55 -05:00
echo " 💡 Superuser Username: ${ SUPERUSER_NAME } , E-Mail: ${ SUPERUSER_EMAIL } "
fi
2023-03-15 01:45:15 -05:00
./manage.py shell --interface python <<END
from users.models import Token
Catch DoesNotExist preventing startup
Fixes failing startup because of python error:
```
Traceback (most recent call last):
File "/opt/netbox/netbox/./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/opt/netbox/venv/lib/python3.10/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
utility.execute()
File "/opt/netbox/venv/lib/python3.10/site-packages/django/core/management/__init__.py", line 440, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/opt/netbox/venv/lib/python3.10/site-packages/django/core/management/base.py", line 402, in run_from_argv
self.execute(*args, **cmd_options)
File "/opt/netbox/venv/lib/python3.10/site-packages/django/core/management/base.py", line 448, in execute
output = self.handle(*args, **options)
File "/opt/netbox/venv/lib/python3.10/site-packages/django/core/management/commands/shell.py", line 127, in handle
exec(sys.stdin.read(), globals())
File "<string>", line 2, in <module>
File "/opt/netbox/venv/lib/python3.10/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/opt/netbox/venv/lib/python3.10/site-packages/django/db/models/query.py", line 650, in get
raise self.model.DoesNotExist(
users.models.Token.DoesNotExist: Token matching query does not exist.
```
2023-03-15 15:53:59 -05:00
try:
old_default_token = Token.objects.get( key = "0123456789abcdef0123456789abcdef01234567" )
if old_default_token:
2024-01-19 02:12:56 -06:00
print( "⚠️ Warning: You have the old default admin API token in your database. This token is widely known; please remove it. Log in as your superuser and check API Tokens in your user menu." )
Catch DoesNotExist preventing startup
Fixes failing startup because of python error:
```
Traceback (most recent call last):
File "/opt/netbox/netbox/./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/opt/netbox/venv/lib/python3.10/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
utility.execute()
File "/opt/netbox/venv/lib/python3.10/site-packages/django/core/management/__init__.py", line 440, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/opt/netbox/venv/lib/python3.10/site-packages/django/core/management/base.py", line 402, in run_from_argv
self.execute(*args, **cmd_options)
File "/opt/netbox/venv/lib/python3.10/site-packages/django/core/management/base.py", line 448, in execute
output = self.handle(*args, **options)
File "/opt/netbox/venv/lib/python3.10/site-packages/django/core/management/commands/shell.py", line 127, in handle
exec(sys.stdin.read(), globals())
File "<string>", line 2, in <module>
File "/opt/netbox/venv/lib/python3.10/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/opt/netbox/venv/lib/python3.10/site-packages/django/db/models/query.py", line 650, in get
raise self.model.DoesNotExist(
users.models.Token.DoesNotExist: Token matching query does not exist.
```
2023-03-15 15:53:59 -05:00
except Token.DoesNotExist:
pass
2023-03-15 01:45:15 -05:00
END
2017-11-29 08:08:55 -06:00
echo "✅ Initialisation is done."
2017-08-30 04:09:56 -05:00
2019-12-23 10:53:19 -06:00
# Launch whatever is passed by docker
2018-02-16 03:25:26 -06:00
# (i.e. the RUN instruction in the Dockerfile)
2021-04-15 11:18:00 -05:00
exec " $@ "