12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- import json
- from rest_framework import renderers
- # IP address family designations
- AF = {
- 4: 'A',
- 6: 'AAAA',
- }
- class BINDZoneRenderer(renderers.BaseRenderer):
- """
- Generate a BIND zone file from a list of DNS records.
- Required fields: `name`, `primary_ip`
- """
- media_type = 'text/plain'
- format = 'bind-zone'
- def render(self, data, media_type=None, renderer_context=None):
- records = []
- for record in data:
- if record.get('name') and record.get('primary_ip'):
- try:
- records.append("{} IN {} {}".format(
- record['name'],
- AF[record['primary_ip']['family']],
- record['primary_ip']['address'].split('/')[0],
- ))
- except KeyError:
- pass
- return '\n'.join(records)
- class FlatJSONRenderer(renderers.BaseRenderer):
- """
- Flattens a nested JSON response.
- """
- format = 'json_flat'
- media_type = 'application/json'
- def render(self, data, media_type=None, renderer_context=None):
- def flatten(entry):
- for key, val in entry.iteritems():
- if isinstance(val, dict):
- for child_key, child_val in flatten(val):
- yield "{}_{}".format(key, child_key), child_val
- else:
- 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)
|