From 8d9950291643f4c5d2e5fd4f48280e9f1ec7241d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 22 Mar 2016 14:56:26 -0400 Subject: [PATCH] Introduced FreeRADIUSClientsRenderer --- netbox/extras/api/renderers.py | 27 ++++++++++++++++++++++++++- netbox/secrets/api/views.py | 4 ++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/netbox/extras/api/renderers.py b/netbox/extras/api/renderers.py index e557928bd..52c265477 100644 --- a/netbox/extras/api/renderers.py +++ b/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) diff --git a/netbox/secrets/api/views.py b/netbox/secrets/api/views.py index b75ef9f4a..2633bc25a 100644 --- a/netbox/secrets/api/views.py +++ b/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)