Updates to settings.py

- Create secret_key.txt if it does not exist
- Copy default settings file if it does not exist
This commit is contained in:
Oliver Walters 2021-04-02 00:06:17 +11:00
parent be41be3981
commit 8d3b9e2ca4
2 changed files with 35 additions and 28 deletions

View File

@ -13,6 +13,9 @@ database setup in this file.
import logging import logging
import os import os
import random
import string
import shutil
import sys import sys
import tempfile import tempfile
from datetime import datetime from datetime import datetime
@ -55,8 +58,10 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
cfg_filename = os.path.join(BASE_DIR, 'config.yaml') cfg_filename = os.path.join(BASE_DIR, 'config.yaml')
if not os.path.exists(cfg_filename): if not os.path.exists(cfg_filename):
print("Error: config.yaml not found") print("InvenTree configuration file 'config.yaml' not found - creating default file")
sys.exit(-1)
cfg_template = os.path.join(BASE_DIR, "config_template.yaml")
shutil.copyfile(cfg_template, cfg_filename)
with open(cfg_filename, 'r') as cfg: with open(cfg_filename, 'r') as cfg:
CONFIG = yaml.safe_load(cfg) CONFIG = yaml.safe_load(cfg)
@ -99,6 +104,17 @@ LOGGING = {
# Get a logger instance for this setup file # Get a logger instance for this setup file
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
"""
Specify a secret key to be used by django.
Following options are tested, in descending order of preference:
A) Check for environment variable INVENTREE_SECRET_KEY => Use raw key data
B) Check for environment variable INVENTREE_SECRET_KEY_FILE => Load key data from file
C) Look for default key file "secret_key.txt"
d) Create "secret_key.txt" if it does not exist
"""
if os.getenv("INVENTREE_SECRET_KEY"): if os.getenv("INVENTREE_SECRET_KEY"):
# Secret key passed in directly # Secret key passed in directly
SECRET_KEY = os.getenv("INVENTREE_SECRET_KEY").strip() SECRET_KEY = os.getenv("INVENTREE_SECRET_KEY").strip()
@ -111,11 +127,20 @@ else:
if os.path.isfile(key_file): if os.path.isfile(key_file):
logger.info("SECRET_KEY loaded by INVENTREE_SECRET_KEY_FILE") logger.info("SECRET_KEY loaded by INVENTREE_SECRET_KEY_FILE")
else: else:
logger.error(f"Secret key file {key_file} not found") logger.error(f"Secret key file '{key_file}'' not found")
exit(-1) exit(-1)
else: else:
# default secret key location # default secret key location
key_file = os.path.join(BASE_DIR, "secret_key.txt") key_file = os.path.join(BASE_DIR, "secret_key.txt")
if not os.path.exists(key_file):
logger.info("Creating key file 'secret_key.txt'")
# Create a random key file
with open(key_file, 'w') as f:
options = string.digits + string.ascii_letters + string.punctuation
key = ''.join([random.choice(options) for i in range(50)])
f.write(key)
logger.info(f"SECRET_KEY loaded from {key_file}") logger.info(f"SECRET_KEY loaded from {key_file}")
try: try:
SECRET_KEY = open(key_file, "r").read().strip() SECRET_KEY = open(key_file, "r").read().strip()

View File

@ -3,11 +3,10 @@
from invoke import task from invoke import task
from shutil import copyfile from shutil import copyfile
import random
import string
import os import os
import sys import sys
def apps(): def apps():
""" """
Returns a list of installed apps Returns a list of installed apps
@ -27,6 +26,7 @@ def apps():
'users', 'users',
] ]
def localDir(): def localDir():
""" """
Returns the directory of *THIS* file. Returns the directory of *THIS* file.
@ -35,6 +35,7 @@ def localDir():
""" """
return os.path.dirname(os.path.abspath(__file__)) return os.path.dirname(os.path.abspath(__file__))
def managePyDir(): def managePyDir():
""" """
Returns the directory of the manage.py file Returns the directory of the manage.py file
@ -42,6 +43,7 @@ def managePyDir():
return os.path.join(localDir(), 'InvenTree') return os.path.join(localDir(), 'InvenTree')
def managePyPath(): def managePyPath():
""" """
Return the path of the manage.py file Return the path of the manage.py file
@ -49,6 +51,7 @@ def managePyPath():
return os.path.join(managePyDir(), 'manage.py') return os.path.join(managePyDir(), 'manage.py')
def manage(c, cmd, pty=False): def manage(c, cmd, pty=False):
""" """
Runs a given command against django's "manage.py" script. Runs a given command against django's "manage.py" script.
@ -63,32 +66,11 @@ def manage(c, cmd, pty=False):
cmd=cmd cmd=cmd
), pty=pty) ), pty=pty)
@task(help={'length': 'Length of secret key (default=50)'})
def key(c, length=50, force=False):
"""
Generates a SECRET_KEY file which InvenTree uses for generating security hashes
"""
SECRET_KEY_FILE = os.path.join(localDir(), 'InvenTree', 'secret_key.txt') @task
# If a SECRET_KEY file does not exist, generate a new one!
if force or not os.path.exists(SECRET_KEY_FILE):
print("Generating SECRET_KEY file - " + SECRET_KEY_FILE)
with open(SECRET_KEY_FILE, 'w') as key_file:
options = string.digits + string.ascii_letters + string.punctuation
key = ''.join([random.choice(options) for i in range(length)])
key_file.write(key)
else:
print("SECRET_KEY file already exists - skipping")
@task(post=[key])
def install(c): def install(c):
""" """
Installs required python packages, and runs initial setup functions. Installs required python packages
""" """
# Install required Python packages with PIP # Install required Python packages with PIP