Skip to content

Commit fd55ec2

Browse files
authored
Merge pull request #497 from ryanmerolle/startup-scripts-2.10+
user, group, & permissions fix
2 parents 73b07a7 + 8678ad9 commit fd55ec2

File tree

8 files changed

+127
-80
lines changed

8 files changed

+127
-80
lines changed

initializers/groups.yml

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,9 @@
1-
## To list all permissions, run:
2-
##
3-
## docker-compose run --rm --entrypoint /bin/bash netbox
4-
## $ ./manage.py migrate
5-
## $ ./manage.py shell
6-
## > from django.contrib.auth.models import Permission
7-
## > print('\n'.join([p.codename for p in Permission.objects.all()]))
8-
##
9-
## Permission lists support wildcards. See the examples below.
10-
##
11-
## Examples:
12-
131
# applications:
142
# users:
15-
# - technical_user
3+
# - technical_user
164
# readers:
175
# users:
18-
# - reader
6+
# - reader
197
# writers:
208
# users:
21-
# - writer
22-
# permissions:
23-
# - delete_device
24-
# - delete_virtualmachine
25-
# - add_*
26-
# - change_*
27-
# vm_managers:
28-
# permissions:
29-
# - '*_virtualmachine'
30-
# device_managers:
31-
# permissions:
32-
# - '*device*'
33-
# creators:
34-
# permissions:
35-
# - add_*
9+
# - writer

initializers/object_permissions.yml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# all.ro:
2+
# actions:
3+
# - view
4+
# description: 'Read Only for All Objects'
5+
# enabled: true
6+
# groups:
7+
# - applications
8+
# - readers
9+
# object_types: all
10+
# users:
11+
# - jdoe
12+
# all.rw:
13+
# actions:
14+
# - add
15+
# - change
16+
# - delete
17+
# - view
18+
# description: 'Read/Write for All Objects'
19+
# enabled: true
20+
# groups:
21+
# - writers
22+
# object_types: all
23+
# network_team.rw:
24+
# actions:
25+
# - add
26+
# - change
27+
# - delete
28+
# - view
29+
# description: "Network Team Permissions"
30+
# enabled: true
31+
# object_types:
32+
# circuits:
33+
# - circuit
34+
# - circuittermination
35+
# - circuittype
36+
# - provider
37+
# dcim: all
38+
# ipam:
39+
# - aggregate
40+
# - ipaddress
41+
# - prefix
42+
# - rir
43+
# - role
44+
# - routetarget
45+
# - service
46+
# - vlan
47+
# - vlangroup
48+
# - vrf

initializers/users.yml

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,14 @@
1-
## To list all permissions, run:
2-
##
3-
## docker-compose run --rm --entrypoint /bin/bash netbox
4-
## $ ./manage.py migrate
5-
## $ ./manage.py shell
6-
## > from django.contrib.auth.models import Permission
7-
## > print('\n'.join([p.codename for p in Permission.objects.all()]))
8-
##
9-
## Permission lists support wildcards. See the examples below.
10-
##
11-
## Examples:
12-
131
# technical_user:
142
# api_token: 0123456789technicaluser789abcdef01234567 # must be looooong!
153
# reader:
164
# password: reader
175
# writer:
186
# password: writer
19-
# permissions:
20-
# - delete_device
21-
# - delete_virtualmachine
22-
# - add_*
23-
# - change_*
7+
# jdoe:
8+
# first_name: John
9+
# last_name: Doe
10+
# api_token: 0123456789jdoe789abcdef01234567jdoe
11+
# is_active: True
12+
# is_superuser: False
13+
# is_staff: False
14+
# email: john.doe@example.com

startup_scripts/000_users.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import sys
22

33
from django.contrib.auth.models import User
4-
from startup_script_utils import load_yaml, set_permissions
4+
from startup_script_utils import load_yaml
55
from users.models import Token
66

77
users = load_yaml("/opt/netbox/initializers/users.yml")
@@ -19,6 +19,3 @@
1919

2020
if user_details.get("api_token", 0):
2121
Token.objects.create(user=user, key=user_details["api_token"])
22-
23-
yaml_permissions = user_details.get("permissions", [])
24-
set_permissions(user.user_permissions, yaml_permissions)

startup_scripts/010_groups.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
import sys
22

3-
from django.contrib.auth.models import Group, User
4-
from startup_script_utils import load_yaml, set_permissions
3+
from startup_script_utils import load_yaml
4+
from users.models import AdminGroup, AdminUser
55

66
groups = load_yaml("/opt/netbox/initializers/groups.yml")
77
if groups is None:
88
sys.exit()
99

1010
for groupname, group_details in groups.items():
11-
group, created = Group.objects.get_or_create(name=groupname)
11+
group, created = AdminGroup.objects.get_or_create(name=groupname)
1212

1313
if created:
1414
print("👥 Created group", groupname)
1515

1616
for username in group_details.get("users", []):
17-
user = User.objects.get(username=username)
17+
user = AdminUser.objects.get(username=username)
1818

1919
if user:
20-
user.groups.add(group)
20+
group.user_set.add(user)
21+
print(" 👤 Assigned user %s to group %s" % (username, AdminGroup.name))
2122

22-
yaml_permissions = group_details.get("permissions", [])
23-
set_permissions(group.permissions, yaml_permissions)
23+
group.save()
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import sys
2+
3+
from django.contrib.contenttypes.models import ContentType
4+
from startup_script_utils import load_yaml
5+
from users.models import AdminGroup, AdminUser, ObjectPermission
6+
7+
object_permissions = load_yaml("/opt/netbox/initializers/object_permissions.yml")
8+
9+
if object_permissions is None:
10+
sys.exit()
11+
12+
13+
for permission_name, permission_details in object_permissions.items():
14+
15+
object_permission, created = ObjectPermission.objects.get_or_create(
16+
name=permission_name,
17+
description=permission_details["description"],
18+
enabled=permission_details["enabled"],
19+
actions=permission_details["actions"],
20+
)
21+
22+
if permission_details.get("object_types", 0):
23+
object_types = permission_details["object_types"]
24+
25+
if object_types == "all":
26+
object_permission.object_types.set(ContentType.objects.all())
27+
28+
else:
29+
for app_label, models in object_types.items():
30+
if models == "all":
31+
app_models = ContentType.objects.filter(app_label=app_label)
32+
33+
for app_model in app_models:
34+
object_permission.object_types.add(app_model.id)
35+
else:
36+
# There is
37+
for model in models:
38+
object_permission.object_types.add(
39+
ContentType.objects.get(app_label=app_label, model=model)
40+
)
41+
42+
print("🔓 Created object permission", object_permission.name)
43+
44+
if permission_details.get("groups", 0):
45+
for groupname in permission_details["groups"]:
46+
group = AdminGroup.objects.filter(name=groupname).first()
47+
48+
if group:
49+
object_permission.groups.add(group)
50+
print(" 👥 Assigned group %s object permission of %s" % (groupname, groupname))
51+
52+
if permission_details.get("users", 0):
53+
for username in permission_details["users"]:
54+
user = AdminUser.objects.filter(username=username).first()
55+
56+
if user:
57+
object_permission.users.add(user)
58+
print(" 👤 Assigned user %s object permission of %s" % (username, groupname))
59+
60+
object_permission.save()
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
from .custom_fields import pop_custom_fields, set_custom_fields_values
22
from .load_yaml import load_yaml
3-
from .permissions import set_permissions

startup_scripts/startup_script_utils/permissions.py

Lines changed: 0 additions & 22 deletions
This file was deleted.

0 commit comments

Comments
 (0)