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):
     """
-    Flattens a nested JSON reponse.
+    Flattens a nested JSON response.
     """
     format = 'json_flat'
     media_type = 'application/json'
@@ -49,3 +49,28 @@ class FlatJSONRenderer(renderers.BaseRenderer):
                     yield key, val
 
         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.permissions import IsAuthenticated, BasePermission
 from rest_framework.response import Response
+from rest_framework.settings import api_settings
 from rest_framework.views import APIView
 
+from extras.api.renderers import FreeRADIUSClientsRenderer
 from secrets.filters import SecretFilter
 from secrets.models import Secret, SecretRole, UserKey
 from .serializers import SecretRoleSerializer, SecretSerializer
@@ -47,6 +49,7 @@ class SecretListView(generics.GenericAPIView):
     serializer_class = SecretSerializer
     filter_class = SecretFilter
     permission_classes = [SecretViewPermission]
+    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES + [FreeRADIUSClientsRenderer]
 
     def get(self, request, private_key=None, *args, **kwargs):
         queryset = self.filter_queryset(self.get_queryset())
@@ -90,6 +93,7 @@ class SecretDetailView(generics.GenericAPIView):
     queryset = Secret.objects.select_related('device', 'role')
     serializer_class = SecretSerializer
     permission_classes = [SecretViewPermission]
+    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES + [FreeRADIUSClientsRenderer]
 
     def get(self, request, pk, private_key=None, *args, **kwargs):
         secret = get_object_or_404(Secret, pk=pk)