Introduced FreeRADIUSClientsRenderer

This commit is contained in:
Jeremy Stretch 2016-03-22 14:56:26 -04:00
parent eec3ce375c
commit 8d99502916
2 changed files with 30 additions and 1 deletions

View File

@ -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)

View File

@ -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)