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):
"""
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)

View File

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