summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorJeff Bradberry <jeff.bradberry@gmail.com>2024-05-06 18:03:17 +0200
committerJeff Bradberry <jeff.bradberry@gmail.com>2024-06-10 22:36:22 +0200
commit20504042c98a53016d6ec9727ba14bbf74073afb (patch)
tree814f2fee5a8d53d4076759cfbfca0d4eb767f0cf /tools
parentCheck for a broken ContentType -> model and log and skip (diff)
downloadawx-20504042c98a53016d6ec9727ba14bbf74073afb.tar.xz
awx-20504042c98a53016d6ec9727ba14bbf74073afb.zip
Graph out only the parent/child chains from a given Role
Doing the entire graph is too much on any system with real amounts of Roles.
Diffstat (limited to 'tools')
-rw-r--r--tools/scripts/ig-hotfix/role_chain.py40
1 files changed, 36 insertions, 4 deletions
diff --git a/tools/scripts/ig-hotfix/role_chain.py b/tools/scripts/ig-hotfix/role_chain.py
index e64f47dfc6..01171ca534 100644
--- a/tools/scripts/ig-hotfix/role_chain.py
+++ b/tools/scripts/ig-hotfix/role_chain.py
@@ -1,4 +1,5 @@
from collections import defaultdict
+import os
import sys
from django.contrib.contenttypes.models import ContentType
@@ -7,16 +8,47 @@ from awx.main.fields import ImplicitRoleField
from awx.main.models.rbac import Role
+role_id = int(os.environ.get('role'))
+role = Role.objects.get(id=role_id)
+
+all_roles = {role,}
+graph = defaultdict(set)
+
+
+# Role parents
+new_parents = {role,}
+while new_parents:
+ old_parents = new_parents
+ new_parents = set()
+ for r in old_parents:
+ new_parents |= (set(r.parents.all()) - all_roles)
+ for p in r.parents.all():
+ graph[p.id].add(r.id)
+ all_roles |= new_parents
+
+# Role children
+new_children = {role,}
+while new_children:
+ old_children = new_children
+ new_children = set()
+ for r in old_children:
+ new_children |= (set(r.children.all()) - all_roles)
+ for c in r.children.all():
+ graph[r.id].add(c.id)
+ all_roles |= new_children
+
+
print("digraph G {")
-for r in Role.objects.order_by('id'):
+for r in sorted(all_roles, key=lambda x: x.id):
if r.content_type is None:
print(f' {r.id} [shape=box,label="id={r.id}\lsingleton={r.singleton_name}\l"]')
else:
print(f' {r.id} [shape=box,label="id={r.id}\lct={r.content_type}\lobject_id={r.object_id}\lrole_field={r.role_field}\l"]')
-for r in Role.objects.order_by('id'):
- for p in r.parents.all():
- print(f" {p.id} -> {r.id}")
+print()
+for p_id, children in sorted(graph.items()):
+ for c_id in children:
+ print(f" {p_id} -> {c_id}")
print("}")