You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

pdnsapi.py 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import json
  4. import requests
  5. class PdnsApi:
  6. http_auth_user = None
  7. http_auth_pass = None
  8. api_key = None
  9. api_pass = None
  10. base_url = None
  11. def set_api_key(self, api_key):
  12. self.api_key = api_key
  13. def set_base_url(self, base_url):
  14. self.base_url = base_url
  15. def set_api_pass(self, api_pass):
  16. self.api_pass = api_pass
  17. def set_http_auth_user(self, http_auth_user):
  18. self.http_auth_user = http_auth_user
  19. def set_http_auth_pass(self, http_auth_pass):
  20. self.http_auth_pass = http_auth_pass
  21. def _query(self, uri, method, kwargs=None):
  22. headers = {
  23. 'X-API-Key': self.api_key,
  24. 'Accept': 'application/json',
  25. 'Content-Type': 'application/json'
  26. }
  27. data = json.dumps(kwargs)
  28. if method == "GET":
  29. request = requests.get(self.base_url + uri, headers=headers, auth=(self.http_auth_user, self.http_auth_pass))
  30. elif method == "POST":
  31. request = requests.post(self.base_url + uri, headers=headers, auth=(self.http_auth_user, self.http_auth_pass), data=data)
  32. elif method == "PUT":
  33. request = requests.put(self.base_url + uri, headers=headers, auth=(self.http_auth_user, self.http_auth_pass), data=data)
  34. elif method == "PATCH":
  35. request = requests.patch(self.base_url + uri, headers=headers, auth=(self.http_auth_user, self.http_auth_pass), data=data)
  36. elif method == "DELETE":
  37. request = requests.delete(self.base_url + uri, headers=headers, auth=(self.http_auth_user, self.http_auth_pass))
  38. else:
  39. raise ValueError("Invalid method '%s'" % method)
  40. return None if request.status_code == 204 else request.json()
  41. def list_zones(self):
  42. return self._query("/servers/localhost/zones", "GET")
  43. def get_zone(self, zone_name):
  44. return self._query("/servers/localhost/zones/%s" % zone_name, "GET")
  45. def update_zone(self, zone_name, data):
  46. return self._query("/servers/localhost/zones/%s" % zone_name, "PUT", data)
  47. def replace_record(self, zone_name, name, type, ttl, content, disabled, set_ptr):
  48. return self._query("/servers/localhost/zones/%s" % zone_name, "PATCH", {"rrsets": [
  49. {
  50. "name": name,
  51. "type": type,
  52. "ttl": ttl,
  53. "changetype": "REPLACE",
  54. "records": [
  55. {
  56. "content": content,
  57. "disabled": disabled,
  58. "set-prt": set_ptr
  59. }
  60. ]
  61. }
  62. ]})
  63. def delete_record(self, zone_name, name, type, ttl, content, disabled, set_ptr):
  64. return self._query("/servers/localhost/zones/%s" % zone_name, "PATCH", {"rrsets": [
  65. {
  66. "name": name,
  67. "type": type,
  68. "ttl": ttl,
  69. "changetype": "DELETE",
  70. "records": [
  71. {
  72. "content": content,
  73. "disabled": disabled,
  74. "set-prt": set_ptr
  75. }
  76. ]
  77. }
  78. ]})
  79. def notify_zone(self, zone_name):
  80. return self._query("/servers/localhost/zones/%s/notify" % zone_name, "PUT")
  81. def flush_zone_cache(self, zone_name):
  82. return self._query("/servers/localhost/cache/flush?domain=%s" % zone_name, "PUT")