~ubuntu-branches/debian/sid/lexicon/sid

« back to all changes in this revision

Viewing changes to lexicon/providers/dnspod.py

  • Committer: Package Import Robot
  • Author(s): Ana Custura
  • Date: 2018-03-02 22:36:08 UTC
  • Revision ID: package-import@ubuntu.com-20180302223608-4e2sghral3uifgq7
Tags: upstream-2.1.21
Import upstream version 2.1.21

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
from __future__ import absolute_import
 
3
from __future__ import print_function
 
4
 
 
5
import logging
 
6
 
 
7
import requests
 
8
 
 
9
from .base import Provider as BaseProvider
 
10
 
 
11
logger = logging.getLogger(__name__)
 
12
 
 
13
 
 
14
def ProviderParser(subparser):
 
15
    subparser.add_argument("--auth-username", help="specify api id used to authenticate")
 
16
    subparser.add_argument("--auth-token", help="specify token used authenticate to DNS provider")
 
17
 
 
18
class Provider(BaseProvider):
 
19
 
 
20
    def __init__(self, options, engine_overrides=None):
 
21
        super(Provider, self).__init__(options, engine_overrides)
 
22
        self.domain_id = None
 
23
        self.api_endpoint = self.engine_overrides.get('api_endpoint', 'https://dnsapi.cn')
 
24
 
 
25
    def authenticate(self):
 
26
 
 
27
        payload = self._post('/Domain.Info', {'domain':self.options['domain']})
 
28
 
 
29
        if payload['status']['code'] != '1':
 
30
            raise Exception(payload['status']['message'])
 
31
 
 
32
        self.domain_id = payload['domain']['id']
 
33
 
 
34
 
 
35
    # Create record. If record already exists with the same content, do nothing'
 
36
    def create_record(self, type, name, content):
 
37
        record = {
 
38
            'domain_id': self.domain_id,
 
39
            'sub_domain': self._relative_name(name),
 
40
            'record_type': type,
 
41
            'record_line': '默认',
 
42
            'value': content
 
43
        }
 
44
        if self.options.get('ttl'):
 
45
            record['ttl'] = self.options.get('ttl')
 
46
 
 
47
        payload = self._post('/Record.Create', record)
 
48
 
 
49
        if payload['status']['code'] not in ['1', '31']:
 
50
            raise Exception(payload['status']['message'])
 
51
 
 
52
        logger.debug('create_record: %s', payload['status']['code'] == '1')
 
53
        return payload['status']['code'] == '1'
 
54
 
 
55
    # List all records. Return an empty list if no records found
 
56
    # type, name and content are used to filter records.
 
57
    # If possible filter during the query, otherwise filter after response is received.
 
58
    def list_records(self, type=None, name=None, content=None):
 
59
        filter = {}
 
60
 
 
61
        payload = self._post('/Record.List', {'domain':self.options['domain']})
 
62
        logger.debug('payload: %s', payload)
 
63
        records = []
 
64
        for record in payload['records']:
 
65
            processed_record = {
 
66
                'type': record['type'],
 
67
                'name': self._full_name(record['name']),
 
68
                'ttl': record['ttl'],
 
69
                'content': record['value'],
 
70
                #this id is useless unless your doing record linking. Lets return the original record identifier.
 
71
                'id': record['id'] #
 
72
            }
 
73
            records.append(processed_record)
 
74
 
 
75
        if type:
 
76
            records = [record for record in records if record['type'] == type]
 
77
        if name:
 
78
            records = [record for record in records if record['name'] == self._full_name(name)]
 
79
        if content:
 
80
            records = [record for record in records if record['content'] == content]
 
81
 
 
82
        logger.debug('list_records: %s', records)
 
83
        return records
 
84
 
 
85
    # Create or update a record.
 
86
    def update_record(self, identifier, type=None, name=None, content=None):
 
87
 
 
88
        data = {
 
89
            'domain_id': self.domain_id,
 
90
            'record_id': identifier,
 
91
            'sub_domain': self._relative_name(name),
 
92
            'record_type': type,
 
93
            'record_line': '默认',
 
94
            'value': content
 
95
        }
 
96
        if self.options.get('ttl'):
 
97
            data['ttl'] = self.options.get('ttl')
 
98
        logger.debug('data: %s', data)
 
99
        payload = self._post('/Record.Modify', data)
 
100
        logger.debug('payload: %s', payload)
 
101
        if payload['status']['code'] != '1':
 
102
            raise Exception(payload['status']['message'])
 
103
 
 
104
        logger.debug('update_record: %s', True)
 
105
        return True
 
106
 
 
107
    # Delete an existing record.
 
108
    # If record does not exist, do nothing.
 
109
    def delete_record(self, identifier=None, type=None, name=None, content=None):
 
110
        if not identifier:
 
111
            records = self.list_records(type, name, content)
 
112
            logger.debug('records: %s', records)
 
113
            if len(records) == 1:
 
114
                identifier = records[0]['id']
 
115
            else:
 
116
                raise Exception('Record identifier could not be found.')
 
117
        payload = self._post('/Record.Remove', {'domain_id': self.domain_id, 'record_id': identifier})
 
118
 
 
119
        if payload['status']['code'] != '1':
 
120
            raise Exception(payload['status']['message'])
 
121
 
 
122
        # is always True at this point, if a non 200 response is returned an error is raised.
 
123
        logger.debug('delete_record: %s', True)
 
124
        return True
 
125
 
 
126
 
 
127
    # Helpers
 
128
    def _request(self, action='GET',  url='/', data=None, query_params=None):
 
129
        if data is None:
 
130
            data = {}
 
131
        data['login_token'] = self.options['auth_username'] + ',' + self.options['auth_token']
 
132
        data['format'] = 'json'
 
133
        if query_params is None:
 
134
            query_params = {}
 
135
        default_headers = {}
 
136
        default_auth = None
 
137
        r = requests.request(action, self.api_endpoint + url, params=query_params,
 
138
                             data=data,
 
139
                             headers=default_headers,
 
140
                             auth=default_auth)
 
141
        r.raise_for_status()  # if the request fails for any reason, throw an error.
 
142
        return r.json()