Browse Source

Introduced FreeRADIUSClientsRenderer

Jeremy Stretch 9 years ago
parent
commit
8d99502916
2 changed files with 30 additions and 1 deletions
  1. 26 1
      netbox/extras/api/renderers.py
  2. 4 0
      netbox/secrets/api/views.py

+ 26 - 1
netbox/extras/api/renderers.py

@@ -33,7 +33,7 @@ class BINDZoneRenderer(renderers.BaseRenderer):
 
 
 class FlatJSONRenderer(renderers.BaseRenderer):
 class FlatJSONRenderer(renderers.BaseRenderer):
     """
     """
-    Flattens a nested JSON reponse.
+    Flattens a nested JSON response.
     """
     """
     format = 'json_flat'
     format = 'json_flat'
     media_type = 'application/json'
     media_type = 'application/json'
@@ -49,3 +49,28 @@ class FlatJSONRenderer(renderers.BaseRenderer):
                     yield key, val
                     yield key, val
 
 
         return json.dumps([dict(flatten(i)) for i in data])
         return json.dumps([dict(flatten(i)) for i in data])
+
+
+class FreeRADIUSClientsRenderer(renderers.BaseRenderer):
+    """
+    Generate a FreeRADIUS clients.conf file from a list of Secrets.
+    """
+    media_type = 'text/plain'
+    format = 'freeradius'
+
+    CLIENT_TEMPLATE = """client {name} {{
+    ipaddr = {ip}
+    secret = {secret}
+}}"""
+
+    def render(self, data, media_type=None, renderer_context=None):
+        clients = []
+        for secret in data:
+            if secret['device']['primary_ip'] and secret['plaintext']:
+                client = self.CLIENT_TEMPLATE.format(
+                    name=secret['device']['name'],
+                    ip=secret['device']['primary_ip']['address'].split('/')[0],
+                    secret=secret['plaintext']
+                )
+                clients.append(client)
+        return '\n'.join(clients)

+ 4 - 0
netbox/secrets/api/views.py

@@ -6,8 +6,10 @@ from rest_framework import generics
 from rest_framework import status
 from rest_framework import status
 from rest_framework.permissions import IsAuthenticated, BasePermission
 from rest_framework.permissions import IsAuthenticated, BasePermission
 from rest_framework.response import Response
 from rest_framework.response import Response
+from rest_framework.settings import api_settings
 from rest_framework.views import APIView
 from rest_framework.views import APIView
 
 
+from extras.api.renderers import FreeRADIUSClientsRenderer
 from secrets.filters import SecretFilter
 from secrets.filters import SecretFilter
 from secrets.models import Secret, SecretRole, UserKey
 from secrets.models import Secret, SecretRole, UserKey
 from .serializers import SecretRoleSerializer, SecretSerializer
 from .serializers import SecretRoleSerializer, SecretSerializer
@@ -47,6 +49,7 @@ class SecretListView(generics.GenericAPIView):
     serializer_class = SecretSerializer
     serializer_class = SecretSerializer
     filter_class = SecretFilter
     filter_class = SecretFilter
     permission_classes = [SecretViewPermission]
     permission_classes = [SecretViewPermission]
+    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES + [FreeRADIUSClientsRenderer]
 
 
     def get(self, request, private_key=None, *args, **kwargs):
     def get(self, request, private_key=None, *args, **kwargs):
         queryset = self.filter_queryset(self.get_queryset())
         queryset = self.filter_queryset(self.get_queryset())
@@ -90,6 +93,7 @@ class SecretDetailView(generics.GenericAPIView):
     queryset = Secret.objects.select_related('device', 'role')
     queryset = Secret.objects.select_related('device', 'role')
     serializer_class = SecretSerializer
     serializer_class = SecretSerializer
     permission_classes = [SecretViewPermission]
     permission_classes = [SecretViewPermission]
+    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES + [FreeRADIUSClientsRenderer]
 
 
     def get(self, request, pk, private_key=None, *args, **kwargs):
     def get(self, request, pk, private_key=None, *args, **kwargs):
         secret = get_object_or_404(Secret, pk=pk)
         secret = get_object_or_404(Secret, pk=pk)