renderers.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import json
  2. from rest_framework import renderers
  3. # IP address family designations
  4. AF = {
  5. 4: 'A',
  6. 6: 'AAAA',
  7. }
  8. class BINDZoneRenderer(renderers.BaseRenderer):
  9. """
  10. Generate a BIND zone file from a list of DNS records.
  11. Required fields: `name`, `primary_ip`
  12. """
  13. media_type = 'text/plain'
  14. format = 'bind-zone'
  15. def render(self, data, media_type=None, renderer_context=None):
  16. records = []
  17. for record in data:
  18. if record.get('name') and record.get('primary_ip'):
  19. try:
  20. records.append("{} IN {} {}".format(
  21. record['name'],
  22. AF[record['primary_ip']['family']],
  23. record['primary_ip']['address'].split('/')[0],
  24. ))
  25. except KeyError:
  26. pass
  27. return '\n'.join(records)
  28. class FlatJSONRenderer(renderers.BaseRenderer):
  29. """
  30. Flattens a nested JSON response.
  31. """
  32. format = 'json_flat'
  33. media_type = 'application/json'
  34. def render(self, data, media_type=None, renderer_context=None):
  35. def flatten(entry):
  36. for key, val in entry.iteritems():
  37. if isinstance(val, dict):
  38. for child_key, child_val in flatten(val):
  39. yield "{}_{}".format(key, child_key), child_val
  40. else:
  41. yield key, val
  42. return json.dumps([dict(flatten(i)) for i in data])
  43. class FreeRADIUSClientsRenderer(renderers.BaseRenderer):
  44. """
  45. Generate a FreeRADIUS clients.conf file from a list of Secrets.
  46. """
  47. media_type = 'text/plain'
  48. format = 'freeradius'
  49. CLIENT_TEMPLATE = """client {name} {{
  50. ipaddr = {ip}
  51. secret = {secret}
  52. }}"""
  53. def render(self, data, media_type=None, renderer_context=None):
  54. clients = []
  55. for secret in data:
  56. if secret['device']['primary_ip'] and secret['plaintext']:
  57. client = self.CLIENT_TEMPLATE.format(
  58. name=secret['device']['name'],
  59. ip=secret['device']['primary_ip']['address'].split('/')[0],
  60. secret=secret['plaintext']
  61. )
  62. clients.append(client)
  63. return '\n'.join(clients)