diff --git a/.gitignore b/.gitignore index 97aa1b3f4..3389e7ac6 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .netbox .initializers docker-compose.override.yml +*.pem diff --git a/README.md b/README.md index 375eb3622..25c128606 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Before opening an issue on Github, please join the [Network To Code][ntc-slack] Then there is currently one extra tags for each of the above tags: -* `-ldap`: Contains additional dependencies and configurations for connecting Netbox to an LDAP directroy. +* `-ldap`: Contains additional dependencies and configurations for connecting Netbox to an LDAP directory. [Learn more about that in our wiki][netbox-docker-ldap]. New images are built and published automatically every ~24h. diff --git a/VERSION b/VERSION index 48b91fd89..d21d277be 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.24.1 +0.25.0 diff --git a/configuration/configuration.py b/configuration/configuration.py index 84bb6ae1d..404b6a08f 100644 --- a/configuration/configuration.py +++ b/configuration/configuration.py @@ -150,6 +150,10 @@ def read_secret(secret_name): # are permitted to access most data in NetBox (excluding secrets) but not make any changes. LOGIN_REQUIRED = os.environ.get('LOGIN_REQUIRED', 'False').lower() == 'true' +# The length of time (in seconds) for which a user will remain logged into the web UI before being prompted to +# re-authenticate. (Default: 1209600 [14 days]) +LOGIN_TIMEOUT = os.environ.get('LOGIN_TIMEOUT', None) + # Setting this to True will display a "maintenance mode" banner at the top of every page. MAINTENANCE_MODE = os.environ.get('MAINTENANCE_MODE', 'False').lower() == 'true' diff --git a/docker/nginx.conf b/docker/nginx.conf index 3b78a9f91..edbd92723 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -29,7 +29,6 @@ http { proxy_pass http://netbox:8001; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-Proto $scheme; add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"'; } } diff --git a/startup_scripts/000_users.py b/startup_scripts/000_users.py index 660542431..a801d85d6 100644 --- a/startup_scripts/000_users.py +++ b/startup_scripts/000_users.py @@ -12,7 +12,7 @@ if not User.objects.filter(username=username): user = User.objects.create_user( username = username, - password = user_details.get('password', 0) or User.objects.make_random_password) + password = user_details.get('password', 0) or User.objects.make_random_password()) print("👤 Created user",username) diff --git a/startup_scripts/240_virtualization_interfaces.py b/startup_scripts/240_virtualization_interfaces.py index e5d75f760..f04f30b5b 100644 --- a/startup_scripts/240_virtualization_interfaces.py +++ b/startup_scripts/240_virtualization_interfaces.py @@ -1,5 +1,4 @@ -from dcim.models import Interface -from virtualization.models import VirtualMachine +from virtualization.models import VirtualMachine, VMInterface from extras.models import CustomField, CustomFieldValue from startup_script_utils import load_yaml import sys @@ -22,7 +21,7 @@ params[assoc] = model.objects.get(**query) - interface, created = Interface.objects.get_or_create(**params) + interface, created = VMInterface.objects.get_or_create(**params) if created: if custom_fields is not None: diff --git a/startup_scripts/260_ip_addresses.py b/startup_scripts/260_ip_addresses.py index 96ec4b082..7d164fd19 100644 --- a/startup_scripts/260_ip_addresses.py +++ b/startup_scripts/260_ip_addresses.py @@ -1,12 +1,14 @@ -from ipam.models import IPAddress, VRF +import sys + from dcim.models import Device, Interface -from virtualization.models import VirtualMachine -from tenancy.models import Tenant +from django.contrib.contenttypes.models import ContentType +from django.db.models import Q from extras.models import CustomField, CustomFieldValue - +from ipam.models import VRF, IPAddress from netaddr import IPNetwork from startup_script_utils import load_yaml -import sys +from tenancy.models import Tenant +from virtualization.models import VirtualMachine, VMInterface ip_addresses = load_yaml('/opt/netbox/initializers/ip_addresses.yml') @@ -16,9 +18,12 @@ optional_assocs = { 'tenant': (Tenant, 'name'), 'vrf': (VRF, 'name'), - 'interface': (Interface, 'name') + 'interface': (None, None) } +vm_interface_ct = ContentType.objects.filter(Q(app_label='virtualization', model='vminterface')).first() +interface_ct = ContentType.objects.filter(Q(app_label='dcim', model='interface')).first() + for params in ip_addresses: vm = params.pop('virtual_machine', None) device = params.pop('device', None) @@ -35,13 +40,17 @@ if assoc == 'interface': if vm: vm_id = VirtualMachine.objects.get(name=vm).id - query = { field: params.pop(assoc), "virtual_machine_id": vm_id } + query = { 'name': params.pop(assoc), "virtual_machine_id": vm_id } + params['assigned_object_type'] = vm_interface_ct + params['assigned_object_id'] = VMInterface.objects.get(**query).id elif device: dev_id = Device.objects.get(name=device).id - query = { field: params.pop(assoc), "device_id": dev_id } + query = { 'name': params.pop(assoc), "device_id": dev_id } + params['assigned_object_type'] = interface_ct + params['assigned_object_id'] = Interface.objects.get(**query).id else: query = { field: params.pop(assoc) } - params[assoc] = model.objects.get(**query) + params[assoc] = model.objects.get(**query) ip_address, created = IPAddress.objects.get_or_create(**params) diff --git a/startup_scripts/__main__.py b/startup_scripts/__main__.py index 343ca9565..c41bba68b 100644 --- a/startup_scripts/__main__.py +++ b/startup_scripts/__main__.py @@ -11,7 +11,13 @@ def filename(f): with scandir(dirname(abspath(__file__))) as it: for f in sorted(it, key = filename): - if f.name.startswith('__') or not f.is_file(): + if not f.is_file(): + continue + + if f.name.startswith('__'): + continue + + if not f.name.endswith('.py'): continue print(f"▶️ Running the startup script {f.path}")