@@ -4,43 +4,40 @@ import (
4
4
"context"
5
5
"crypto/tls"
6
6
"encoding/json"
7
- "errors"
8
7
"fmt"
9
8
"github.com/libdns/libdns"
10
9
"io"
11
10
"log"
12
11
"net/http"
13
12
"net/url"
13
+ "runtime"
14
14
"strconv"
15
15
"strings"
16
16
)
17
17
18
18
func (p * Provider ) getZoneRecords (ctx context.Context , zone string ) ([]libdns.Record , error ) {
19
+ callerSkipDepth := 2
20
+
19
21
reqURL , err := url .Parse (p .ServerURL )
20
22
if err != nil {
21
- fmt .Printf ("failed to parse server url: %v\n " , err )
23
+ fmt .Printf ("[%s] failed to parse server url: %v\n " , p . caller ( callerSkipDepth ) , err )
22
24
return nil , err
23
25
}
24
26
25
- rootZone , err := p .findRoot (ctx , zone )
26
- if err != nil {
27
- rootZone = zone
28
- }
29
-
30
27
reqURL .Path = "/CMD_API_DNS_CONTROL"
31
28
32
29
queryString := make (url.Values )
33
30
queryString .Set ("json" , "yes" )
34
31
queryString .Set ("full_mx_records" , "yes" )
35
32
queryString .Set ("allow_dns_underscore" , "yes" )
36
33
queryString .Set ("ttl" , "yes" )
37
- queryString .Set ("domain" , rootZone )
34
+ queryString .Set ("domain" , zone )
38
35
39
36
reqURL .RawQuery = queryString .Encode ()
40
37
41
38
req , err := http .NewRequestWithContext (ctx , http .MethodGet , reqURL .String (), nil )
42
39
if err != nil {
43
- fmt .Printf ("failed to build new request: %v\n " , err )
40
+ fmt .Printf ("[%s] failed to build new request: %v\n " , p . caller ( callerSkipDepth ) , err )
44
41
return nil , err
45
42
}
46
43
@@ -55,35 +52,35 @@ func (p *Provider) getZoneRecords(ctx context.Context, zone string) ([]libdns.Re
55
52
56
53
resp , err := client .Do (req )
57
54
if err != nil {
58
- fmt .Printf ("failed to execute request: %v\n " , err )
55
+ fmt .Printf ("[%s] failed to execute request: %v\n " , p . caller ( callerSkipDepth ) , err )
59
56
return nil , err
60
57
}
61
58
defer func (Body io.ReadCloser ) {
62
59
err := Body .Close ()
63
60
if err != nil {
64
- fmt .Printf ("failed to close body: %v\n " , err )
61
+ fmt .Printf ("[%s] failed to close body: %v\n " , p . caller ( callerSkipDepth ) , err )
65
62
}
66
63
}(resp .Body )
67
64
68
65
if resp .StatusCode != http .StatusOK {
69
- fmt .Printf ("api response error, status code: %v\n " , resp .StatusCode )
66
+ fmt .Printf ("[%s] api response error, status code: %v\n " , p . caller ( callerSkipDepth ) , resp .StatusCode )
70
67
return nil , err
71
68
}
72
69
73
70
var respData daZone
74
71
err = json .NewDecoder (resp .Body ).Decode (& respData )
75
72
if err != nil {
76
- fmt .Printf ("failed to json decode response: %v\n " , err )
73
+ fmt .Printf ("[%s] failed to json decode response: %v\n " , p . caller ( callerSkipDepth ) , err )
77
74
return nil , err
78
75
}
79
76
80
77
recs := make ([]libdns.Record , 0 , len (respData .Records ))
81
78
for i := range respData .Records {
82
79
libDnsRecord , err := respData .Records [i ].libdnsRecord (zone )
83
80
if err != nil {
84
- switch {
85
- case errors . Is ( err , ErrUnsupported ) :
86
- fmt .Printf ("unsupported record conversion of type %v: %v\n " , libDnsRecord .Type , libDnsRecord .Name )
81
+ switch err {
82
+ case ErrUnsupported :
83
+ fmt .Printf ("[%s] unsupported record conversion of type %v: %v\n " , p . caller ( callerSkipDepth ) , libDnsRecord .Type , libDnsRecord .Name )
87
84
continue
88
85
default :
89
86
return nil , err
@@ -101,23 +98,18 @@ func (p *Provider) appendZoneRecord(ctx context.Context, zone string, record lib
101
98
102
99
reqURL , err := url .Parse (p .ServerURL )
103
100
if err != nil {
104
- fmt .Printf ("failed to parse server url: %v\n " , err )
101
+ fmt .Printf ("[%s] failed to parse server url: %v\n " , p . caller ( 2 ) , err )
105
102
return libdns.Record {}, err
106
103
}
107
104
108
- rootZone , err := p .findRoot (ctx , zone )
109
- if err != nil {
110
- rootZone = zone
111
- }
112
-
113
105
reqURL .Path = "/CMD_API_DNS_CONTROL"
114
106
115
107
queryString := make (url.Values )
116
108
queryString .Set ("action" , "add" )
117
109
queryString .Set ("json" , "yes" )
118
110
queryString .Set ("full_mx_records" , "yes" )
119
111
queryString .Set ("allow_dns_underscore" , "yes" )
120
- queryString .Set ("domain" , rootZone )
112
+ queryString .Set ("domain" , zone )
121
113
queryString .Set ("type" , record .Type )
122
114
queryString .Set ("name" , record .Name )
123
115
queryString .Set ("value" , record .Value )
@@ -128,7 +120,7 @@ func (p *Provider) appendZoneRecord(ctx context.Context, zone string, record lib
128
120
129
121
reqURL .RawQuery = queryString .Encode ()
130
122
131
- err = p .executeJsonRequest (ctx , http .MethodGet , reqURL .String ())
123
+ err = p .executeRequest (ctx , http .MethodGet , reqURL .String ())
132
124
if err != nil {
133
125
return libdns.Record {}, err
134
126
}
@@ -144,21 +136,16 @@ func (p *Provider) setZoneRecord(ctx context.Context, zone string, record libdns
144
136
145
137
reqURL , err := url .Parse (p .ServerURL )
146
138
if err != nil {
147
- fmt .Printf ("failed to parse server url: %v\n " , err )
139
+ fmt .Printf ("[%s] failed to parse server url: %v\n " , p . caller ( 2 ) , err )
148
140
return libdns.Record {}, err
149
141
}
150
142
151
- rootZone , err := p .findRoot (ctx , zone )
152
- if err != nil {
153
- rootZone = zone
154
- }
155
-
156
143
reqURL .Path = "/CMD_API_DNS_CONTROL"
157
144
158
145
queryString := make (url.Values )
159
146
queryString .Set ("action" , "edit" )
160
147
queryString .Set ("json" , "yes" )
161
- queryString .Set ("domain" , rootZone )
148
+ queryString .Set ("domain" , zone )
162
149
queryString .Set ("type" , record .Type )
163
150
queryString .Set ("name" , record .Name )
164
151
queryString .Set ("value" , record .Value )
@@ -186,7 +173,7 @@ func (p *Provider) setZoneRecord(ctx context.Context, zone string, record libdns
186
173
187
174
reqURL .RawQuery = queryString .Encode ()
188
175
189
- err = p .executeJsonRequest (ctx , http .MethodGet , reqURL .String ())
176
+ err = p .executeRequest (ctx , http .MethodGet , reqURL .String ())
190
177
if err != nil {
191
178
return libdns.Record {}, err
192
179
}
@@ -202,114 +189,38 @@ func (p *Provider) deleteZoneRecord(ctx context.Context, zone string, record lib
202
189
203
190
reqURL , err := url .Parse (p .ServerURL )
204
191
if err != nil {
205
- fmt .Printf ("failed to parse server url: %v\n " , err )
192
+ fmt .Printf ("[%s] failed to parse server url: %v\n " , p . caller ( 2 ) , err )
206
193
return libdns.Record {}, err
207
194
}
208
195
209
- rootZone , err := p .findRoot (ctx , zone )
210
- if err != nil {
211
- rootZone = zone
212
- }
213
-
214
196
reqURL .Path = "/CMD_API_DNS_CONTROL"
215
197
216
198
queryString := make (url.Values )
217
199
queryString .Set ("action" , "select" )
218
200
queryString .Set ("json" , "yes" )
219
- queryString .Set ("domain" , rootZone )
201
+ queryString .Set ("domain" , zone )
220
202
221
203
editKey := fmt .Sprintf ("%vrecs0" , strings .ToLower (record .Type ))
222
204
editValue := fmt .Sprintf ("name=%v&value=%v" , record .Name , record .Value )
223
205
queryString .Set (editKey , editValue )
224
206
225
207
reqURL .RawQuery = queryString .Encode ()
226
208
227
- err = p .executeJsonRequest (ctx , http .MethodGet , reqURL .String ())
209
+ err = p .executeRequest (ctx , http .MethodGet , reqURL .String ())
228
210
if err != nil {
229
211
return libdns.Record {}, err
230
212
}
231
213
232
214
return record , nil
233
215
}
234
216
235
- func (p * Provider ) findRoot (ctx context.Context , zone string ) (string , error ) {
236
- reqURL , err := url .Parse (p .ServerURL )
237
- if err != nil {
238
- fmt .Printf ("failed to parse server url: %v\n " , err )
239
- return "" , err
240
- }
241
-
242
- reqURL .Path = "/CMD_API_SHOW_DOMAINS"
243
-
244
- resp , err := p .executeQueryRequest (ctx , http .MethodGet , reqURL .String ())
245
- if err != nil {
246
- return "" , err
247
- }
248
-
249
- zoneParts := strings .Split (zone , "." )
250
-
251
- // Limit to 100 rounds
252
- for i := 0 ; i < 100 ; i ++ {
253
- for _ , value := range resp {
254
- if value == strings .Join (zoneParts , "." ) {
255
- return value , nil
256
- }
257
- }
258
-
259
- zoneParts = zoneParts [1 :]
260
- }
261
-
262
- return "" , errors .New ("root zone not found" )
263
- }
264
-
265
- func (p * Provider ) executeJsonRequest (ctx context.Context , method , requestUrl string ) error {
266
- resp , err := p .doRequest (ctx , method , requestUrl )
267
- if err != nil {
268
- return err
269
- }
270
-
271
- var respData daResponse
272
- err = json .Unmarshal (resp , & respData )
273
- if err != nil {
274
- fmt .Printf ("failed to json decode response: %v\n " , err )
275
- return err
276
- }
277
-
278
- if len (respData .Error ) > 0 {
279
- trimmedResult := strings .Split (respData .Result , "\n " )[0 ]
280
- fmt .Printf ("api response error: %v: %v\n " , respData .Error , trimmedResult )
281
- return fmt .Errorf ("api response error: %v: %v\n " , respData .Error , trimmedResult )
282
- }
283
-
284
- return nil
285
- }
286
-
287
- func (p * Provider ) executeQueryRequest (ctx context.Context , method , requestUrl string ) ([]string , error ) {
288
- resp , err := p .doRequest (ctx , method , requestUrl )
289
- if err != nil {
290
- return nil , err
291
- }
292
-
293
- params , err := url .ParseQuery (string (resp ))
294
- if err != nil {
295
- return nil , err
296
- }
297
-
298
- var domains []string
299
- for _ , param := range params {
300
- for _ , domain := range param {
301
- domains = append (domains , domain )
302
- }
303
- }
304
-
305
- return domains , nil
306
- }
217
+ func (p * Provider ) executeRequest (ctx context.Context , method , url string ) error {
218
+ callerSkipDepth := 3
307
219
308
- func (p * Provider ) doRequest (ctx context.Context , method , url string ) ([]byte , error ) {
309
220
req , err := http .NewRequestWithContext (ctx , method , url , nil )
310
221
if err != nil {
311
- fmt .Printf ("failed to build new request: %v\n " , err )
312
- return nil , err
222
+ fmt .Printf ("[%s] failed to build new request: %v\n " , p . caller ( callerSkipDepth ) , err )
223
+ return err
313
224
}
314
225
315
226
req .SetBasicAuth (p .User , p .LoginKey )
@@ -323,32 +234,48 @@ func (p *Provider) doRequest(ctx context.Context, method, url string) ([]byte, e
323
234
324
235
resp , err := client .Do (req )
325
236
if err != nil {
326
- fmt .Printf ("failed to execute request: %v\n " , err )
327
- return nil , err
237
+ fmt .Printf ("[%s] failed to execute request: %v\n " , p . caller ( callerSkipDepth ) , err )
238
+ return err
328
239
}
329
240
defer func (Body io.ReadCloser ) {
330
241
err := Body .Close ()
331
242
if err != nil {
332
- fmt .Printf ("failed to close body: %v\n " , err )
243
+ fmt .Printf ("[%s] failed to close body: %v\n " , p . caller ( callerSkipDepth ) , err )
333
244
}
334
245
}(resp .Body )
335
246
247
+ var respData daResponse
248
+ err = json .NewDecoder (resp .Body ).Decode (& respData )
249
+ if err != nil {
250
+ fmt .Printf ("[%s] failed to json decode response: %v\n " , p .caller (callerSkipDepth ), err )
251
+ return err
252
+ }
253
+
254
+ if len (respData .Error ) > 0 {
255
+ trimmedResult := strings .Split (respData .Result , "\n " )[0 ]
256
+ fmt .Printf ("[%s] api response error: %v: %v\n " , p .caller (callerSkipDepth ), respData .Error , trimmedResult )
257
+ return fmt .Errorf ("[%s] api response error: %v: %v\n " , p .caller (callerSkipDepth ), respData .Error , trimmedResult )
258
+ }
259
+
336
260
if resp .StatusCode != http .StatusOK {
337
261
bodyBytes , err := io .ReadAll (resp .Body )
338
262
if err != nil {
339
- fmt .Printf ("failed to read response body: %v\n " , err )
340
- return nil , err
263
+ fmt .Printf ("[%s] failed to read response body: %v\n " , p . caller ( callerSkipDepth ) , err )
264
+ return err
341
265
}
342
266
bodyString := string (bodyBytes )
343
267
log .Println (bodyString )
344
268
345
- return nil , err
269
+ return err
346
270
}
347
271
348
- bodyBytes , err := io .ReadAll (resp .Body )
349
- if err != nil {
350
- return nil , err
351
- }
272
+ return nil
273
+ }
352
274
353
- return bodyBytes , nil
275
+ func (p * Provider ) caller (skip int ) string {
276
+ pc := make ([]uintptr , 15 )
277
+ n := runtime .Callers (skip , pc )
278
+ frames := runtime .CallersFrames (pc [:n ])
279
+ frame , _ := frames .Next ()
280
+ return frame .Function
354
281
}
0 commit comments