Merge pull request #331 from netbox-community/develop

Develop
This commit is contained in:
Tobias Genannt 2020-09-01 11:05:25 +02:00 committed by GitHub
commit 00022e7d79
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 36 additions and 18 deletions

1
.gitignore vendored
View File

@ -2,3 +2,4 @@
.netbox .netbox
.initializers .initializers
docker-compose.override.yml docker-compose.override.yml
*.pem

View File

@ -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: 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]. [Learn more about that in our wiki][netbox-docker-ldap].
New images are built and published automatically every ~24h. New images are built and published automatically every ~24h.

View File

@ -1 +1 @@
0.24.1 0.25.0

View File

@ -150,6 +150,10 @@ LOGGING = {}
# are permitted to access most data in NetBox (excluding secrets) but not make any changes. # 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' 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. # 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' MAINTENANCE_MODE = os.environ.get('MAINTENANCE_MODE', 'False').lower() == 'true'

View File

@ -29,7 +29,6 @@ http {
proxy_pass http://netbox:8001; proxy_pass http://netbox:8001;
proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Real-IP $remote_addr; 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"'; add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
} }
} }

View File

@ -12,7 +12,7 @@ for username, user_details in users.items():
if not User.objects.filter(username=username): if not User.objects.filter(username=username):
user = User.objects.create_user( user = User.objects.create_user(
username = username, 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) print("👤 Created user",username)

View File

@ -1,5 +1,4 @@
from dcim.models import Interface from virtualization.models import VirtualMachine, VMInterface
from virtualization.models import VirtualMachine
from extras.models import CustomField, CustomFieldValue from extras.models import CustomField, CustomFieldValue
from startup_script_utils import load_yaml from startup_script_utils import load_yaml
import sys import sys
@ -22,7 +21,7 @@ for params in interfaces:
params[assoc] = model.objects.get(**query) 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 created:
if custom_fields is not None: if custom_fields is not None:

View File

@ -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 extras.models import CustomField, CustomFieldValue
from dcim.models import Device, Interface
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 netaddr import IPNetwork
from startup_script_utils import load_yaml 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') ip_addresses = load_yaml('/opt/netbox/initializers/ip_addresses.yml')
@ -16,9 +18,12 @@ if ip_addresses is None:
optional_assocs = { optional_assocs = {
'tenant': (Tenant, 'name'), 'tenant': (Tenant, 'name'),
'vrf': (VRF, '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: for params in ip_addresses:
vm = params.pop('virtual_machine', None) vm = params.pop('virtual_machine', None)
device = params.pop('device', None) device = params.pop('device', None)
@ -35,10 +40,14 @@ for params in ip_addresses:
if assoc == 'interface': if assoc == 'interface':
if vm: if vm:
vm_id = VirtualMachine.objects.get(name=vm).id 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: elif device:
dev_id = Device.objects.get(name=device).id 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: else:
query = { field: params.pop(assoc) } query = { field: params.pop(assoc) }
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)

View File

@ -11,7 +11,13 @@ def filename(f):
with scandir(dirname(abspath(__file__))) as it: with scandir(dirname(abspath(__file__))) as it:
for f in sorted(it, key = filename): 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 continue
print(f"▶️ Running the startup script {f.path}") print(f"▶️ Running the startup script {f.path}")