Patch DNS Record

Script cloudflare Verified

by hugo697 ยท 11/16/2023

The script

Submitted by hugo697 Typescript (fetch-only)
Verified 383 days ago
1
type Cloudflare = {
2
  token: string;
3
  email: string;
4
  key: string;
5
};
6
/**
7
 * Patch DNS Record
8
 *
9
 */
10
export async function main(
11
  auth: Cloudflare,
12
  identifier: string,
13
  zone_identifier: string,
14
  body:
15
    | ({
16
        content?: string;
17
        name?: string;
18
        proxied?: boolean;
19
        type?: "A";
20
        [k: string]: unknown;
21
      } & {
22
        comment?: string;
23
        created_on?: string;
24
        id?: string;
25
        locked?: boolean;
26
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
27
        modified_on?: string;
28
        proxiable?: boolean;
29
        tags?: string[];
30
        ttl?: (number | 1) & number;
31
        zone_id?: string;
32
        zone_name?: string;
33
        [k: string]: unknown;
34
      })
35
    | ({
36
        content?: string;
37
        name?: string;
38
        proxied?: boolean;
39
        type?: "AAAA";
40
        [k: string]: unknown;
41
      } & {
42
        comment?: string;
43
        created_on?: string;
44
        id?: string;
45
        locked?: boolean;
46
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
47
        modified_on?: string;
48
        proxiable?: boolean;
49
        tags?: string[];
50
        ttl?: (number | 1) & number;
51
        zone_id?: string;
52
        zone_name?: string;
53
        [k: string]: unknown;
54
      })
55
    | ({
56
        content?: string;
57
        data?: {
58
          flags?: number;
59
          tag?: string;
60
          value?: string;
61
          [k: string]: unknown;
62
        };
63
        name?: string;
64
        type?: "CAA";
65
        [k: string]: unknown;
66
      } & {
67
        comment?: string;
68
        created_on?: string;
69
        id?: string;
70
        locked?: boolean;
71
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
72
        modified_on?: string;
73
        proxiable?: boolean;
74
        tags?: string[];
75
        ttl?: (number | 1) & number;
76
        zone_id?: string;
77
        zone_name?: string;
78
        [k: string]: unknown;
79
      })
80
    | ({
81
        content?: string;
82
        data?: {
83
          algorithm?: number;
84
          certificate?: string;
85
          key_tag?: number;
86
          type?: number;
87
          [k: string]: unknown;
88
        };
89
        name?: string;
90
        type?: "CERT";
91
        [k: string]: unknown;
92
      } & {
93
        comment?: string;
94
        created_on?: string;
95
        id?: string;
96
        locked?: boolean;
97
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
98
        modified_on?: string;
99
        proxiable?: boolean;
100
        tags?: string[];
101
        ttl?: (number | 1) & number;
102
        zone_id?: string;
103
        zone_name?: string;
104
        [k: string]: unknown;
105
      })
106
    | ({
107
        content?: { [k: string]: unknown };
108
        name?: string;
109
        proxied?: boolean;
110
        type?: "CNAME";
111
        [k: string]: unknown;
112
      } & {
113
        comment?: string;
114
        created_on?: string;
115
        id?: string;
116
        locked?: boolean;
117
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
118
        modified_on?: string;
119
        proxiable?: boolean;
120
        tags?: string[];
121
        ttl?: (number | 1) & number;
122
        zone_id?: string;
123
        zone_name?: string;
124
        [k: string]: unknown;
125
      })
126
    | ({
127
        content?: string;
128
        data?: {
129
          algorithm?: number;
130
          flags?: number;
131
          protocol?: number;
132
          public_key?: string;
133
          [k: string]: unknown;
134
        };
135
        name?: string;
136
        type?: "DNSKEY";
137
        [k: string]: unknown;
138
      } & {
139
        comment?: string;
140
        created_on?: string;
141
        id?: string;
142
        locked?: boolean;
143
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
144
        modified_on?: string;
145
        proxiable?: boolean;
146
        tags?: string[];
147
        ttl?: (number | 1) & number;
148
        zone_id?: string;
149
        zone_name?: string;
150
        [k: string]: unknown;
151
      })
152
    | ({
153
        content?: string;
154
        data?: {
155
          algorithm?: number;
156
          digest?: string;
157
          digest_type?: number;
158
          key_tag?: number;
159
          [k: string]: unknown;
160
        };
161
        name?: string;
162
        type?: "DS";
163
        [k: string]: unknown;
164
      } & {
165
        comment?: string;
166
        created_on?: string;
167
        id?: string;
168
        locked?: boolean;
169
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
170
        modified_on?: string;
171
        proxiable?: boolean;
172
        tags?: string[];
173
        ttl?: (number | 1) & number;
174
        zone_id?: string;
175
        zone_name?: string;
176
        [k: string]: unknown;
177
      })
178
    | ({
179
        content?: string;
180
        data?: {
181
          priority?: number;
182
          target?: string;
183
          value?: string;
184
          [k: string]: unknown;
185
        };
186
        name?: string;
187
        type?: "HTTPS";
188
        [k: string]: unknown;
189
      } & {
190
        comment?: string;
191
        created_on?: string;
192
        id?: string;
193
        locked?: boolean;
194
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
195
        modified_on?: string;
196
        proxiable?: boolean;
197
        tags?: string[];
198
        ttl?: (number | 1) & number;
199
        zone_id?: string;
200
        zone_name?: string;
201
        [k: string]: unknown;
202
      })
203
    | ({
204
        content?: string;
205
        data?: {
206
          altitude?: number;
207
          lat_degrees?: number;
208
          lat_direction?: "N" | "S";
209
          lat_minutes?: number;
210
          lat_seconds?: number;
211
          long_degrees?: number;
212
          long_direction?: "E" | "W";
213
          long_minutes?: number;
214
          long_seconds?: number;
215
          precision_horz?: number;
216
          precision_vert?: number;
217
          size?: number;
218
          [k: string]: unknown;
219
        };
220
        name?: string;
221
        type?: "LOC";
222
        [k: string]: unknown;
223
      } & {
224
        comment?: string;
225
        created_on?: string;
226
        id?: string;
227
        locked?: boolean;
228
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
229
        modified_on?: string;
230
        proxiable?: boolean;
231
        tags?: string[];
232
        ttl?: (number | 1) & number;
233
        zone_id?: string;
234
        zone_name?: string;
235
        [k: string]: unknown;
236
      })
237
    | ({
238
        content?: string;
239
        name?: string;
240
        priority?: number;
241
        type?: "MX";
242
        [k: string]: unknown;
243
      } & {
244
        comment?: string;
245
        created_on?: string;
246
        id?: string;
247
        locked?: boolean;
248
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
249
        modified_on?: string;
250
        proxiable?: boolean;
251
        tags?: string[];
252
        ttl?: (number | 1) & number;
253
        zone_id?: string;
254
        zone_name?: string;
255
        [k: string]: unknown;
256
      })
257
    | ({
258
        content?: string;
259
        data?: {
260
          flags?: string;
261
          order?: number;
262
          preference?: number;
263
          regex?: string;
264
          replacement?: string;
265
          service?: string;
266
          [k: string]: unknown;
267
        };
268
        name?: string;
269
        type?: "NAPTR";
270
        [k: string]: unknown;
271
      } & {
272
        comment?: string;
273
        created_on?: string;
274
        id?: string;
275
        locked?: boolean;
276
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
277
        modified_on?: string;
278
        proxiable?: boolean;
279
        tags?: string[];
280
        ttl?: (number | 1) & number;
281
        zone_id?: string;
282
        zone_name?: string;
283
        [k: string]: unknown;
284
      })
285
    | ({
286
        content?: { [k: string]: unknown };
287
        name?: string;
288
        type?: "NS";
289
        [k: string]: unknown;
290
      } & {
291
        comment?: string;
292
        created_on?: string;
293
        id?: string;
294
        locked?: boolean;
295
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
296
        modified_on?: string;
297
        proxiable?: boolean;
298
        tags?: string[];
299
        ttl?: (number | 1) & number;
300
        zone_id?: string;
301
        zone_name?: string;
302
        [k: string]: unknown;
303
      })
304
    | ({
305
        content?: string;
306
        name?: string;
307
        type?: "PTR";
308
        [k: string]: unknown;
309
      } & {
310
        comment?: string;
311
        created_on?: string;
312
        id?: string;
313
        locked?: boolean;
314
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
315
        modified_on?: string;
316
        proxiable?: boolean;
317
        tags?: string[];
318
        ttl?: (number | 1) & number;
319
        zone_id?: string;
320
        zone_name?: string;
321
        [k: string]: unknown;
322
      })
323
    | ({
324
        content?: string;
325
        data?: {
326
          certificate?: string;
327
          matching_type?: number;
328
          selector?: number;
329
          usage?: number;
330
          [k: string]: unknown;
331
        };
332
        name?: string;
333
        type?: "SMIMEA";
334
        [k: string]: unknown;
335
      } & {
336
        comment?: string;
337
        created_on?: string;
338
        id?: string;
339
        locked?: boolean;
340
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
341
        modified_on?: string;
342
        proxiable?: boolean;
343
        tags?: string[];
344
        ttl?: (number | 1) & number;
345
        zone_id?: string;
346
        zone_name?: string;
347
        [k: string]: unknown;
348
      })
349
    | ({
350
        content?: string;
351
        data?: {
352
          name?: string;
353
          port?: number;
354
          priority?: number;
355
          proto?: string;
356
          service?: string;
357
          target?: string;
358
          weight?: number;
359
          [k: string]: unknown;
360
        };
361
        name?: string;
362
        type?: "SRV";
363
        [k: string]: unknown;
364
      } & {
365
        comment?: string;
366
        created_on?: string;
367
        id?: string;
368
        locked?: boolean;
369
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
370
        modified_on?: string;
371
        proxiable?: boolean;
372
        tags?: string[];
373
        ttl?: (number | 1) & number;
374
        zone_id?: string;
375
        zone_name?: string;
376
        [k: string]: unknown;
377
      })
378
    | ({
379
        content?: string;
380
        data?: {
381
          algorithm?: number;
382
          fingerprint?: string;
383
          type?: number;
384
          [k: string]: unknown;
385
        };
386
        name?: string;
387
        type?: "SSHFP";
388
        [k: string]: unknown;
389
      } & {
390
        comment?: string;
391
        created_on?: string;
392
        id?: string;
393
        locked?: boolean;
394
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
395
        modified_on?: string;
396
        proxiable?: boolean;
397
        tags?: string[];
398
        ttl?: (number | 1) & number;
399
        zone_id?: string;
400
        zone_name?: string;
401
        [k: string]: unknown;
402
      })
403
    | ({
404
        content?: string;
405
        data?: {
406
          priority?: number;
407
          target?: string;
408
          value?: string;
409
          [k: string]: unknown;
410
        };
411
        name?: string;
412
        type?: "SVCB";
413
        [k: string]: unknown;
414
      } & {
415
        comment?: string;
416
        created_on?: string;
417
        id?: string;
418
        locked?: boolean;
419
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
420
        modified_on?: string;
421
        proxiable?: boolean;
422
        tags?: string[];
423
        ttl?: (number | 1) & number;
424
        zone_id?: string;
425
        zone_name?: string;
426
        [k: string]: unknown;
427
      })
428
    | ({
429
        content?: string;
430
        data?: {
431
          certificate?: string;
432
          matching_type?: number;
433
          selector?: number;
434
          usage?: number;
435
          [k: string]: unknown;
436
        };
437
        name?: string;
438
        type?: "TLSA";
439
        [k: string]: unknown;
440
      } & {
441
        comment?: string;
442
        created_on?: string;
443
        id?: string;
444
        locked?: boolean;
445
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
446
        modified_on?: string;
447
        proxiable?: boolean;
448
        tags?: string[];
449
        ttl?: (number | 1) & number;
450
        zone_id?: string;
451
        zone_name?: string;
452
        [k: string]: unknown;
453
      })
454
    | ({
455
        content?: string;
456
        name?: string;
457
        type?: "TXT";
458
        [k: string]: unknown;
459
      } & {
460
        comment?: string;
461
        created_on?: string;
462
        id?: string;
463
        locked?: boolean;
464
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
465
        modified_on?: string;
466
        proxiable?: boolean;
467
        tags?: string[];
468
        ttl?: (number | 1) & number;
469
        zone_id?: string;
470
        zone_name?: string;
471
        [k: string]: unknown;
472
      })
473
    | ({
474
        content?: string;
475
        data?: { content?: string; weight?: number; [k: string]: unknown };
476
        name?: string;
477
        priority?: number;
478
        type?: "URI";
479
        [k: string]: unknown;
480
      } & {
481
        comment?: string;
482
        created_on?: string;
483
        id?: string;
484
        locked?: boolean;
485
        meta?: { auto_added?: boolean; source?: string; [k: string]: unknown };
486
        modified_on?: string;
487
        proxiable?: boolean;
488
        tags?: string[];
489
        ttl?: (number | 1) & number;
490
        zone_id?: string;
491
        zone_name?: string;
492
        [k: string]: unknown;
493
      })
494
) {
495
  const url = new URL(
496
    `https://api.cloudflare.com/client/v4/zones/${zone_identifier}/dns_records/${identifier}`
497
  );
498

499
  const response = await fetch(url, {
500
    method: "PATCH",
501
    headers: {
502
      "X-AUTH-EMAIL": auth.email,
503
      "X-AUTH-KEY": auth.key,
504
      "Content-Type": "application/json",
505
      Authorization: "Bearer " + auth.token,
506
    },
507
    body: JSON.stringify(body),
508
  });
509
  if (!response.ok) {
510
    const text = await response.text();
511
    throw new Error(`${response.status} ${text}`);
512
  }
513
  return await response.json();
514
}
515