[DNSOP] DNS JSON (RFC 8427) schema

Tom Pusateri <pusateri@bangj.com> Mon, 10 September 2018 22:20 UTC

Return-Path: <pusateri@bangj.com>
X-Original-To: dnsop@ietfa.amsl.com
Delivered-To: dnsop@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id E0CE2130FD6 for <dnsop@ietfa.amsl.com>; Mon, 10 Sep 2018 15:20:42 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.901
X-Spam-Level:
X-Spam-Status: No, score=-1.901 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id q4Y0-2H8AaFn for <dnsop@ietfa.amsl.com>; Mon, 10 Sep 2018 15:20:36 -0700 (PDT)
Received: from oj.bangj.com (amt0.gin.ntt.net [129.250.11.170]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 3F3E9131069 for <dnsop@ietf.org>; Mon, 10 Sep 2018 15:20:36 -0700 (PDT)
Received: from [172.16.10.126] (unknown [107.13.224.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by oj.bangj.com (Postfix) with ESMTPSA id 2CDE12D08; Mon, 10 Sep 2018 18:15:15 -0400 (EDT)
From: Tom Pusateri <pusateri@bangj.com>
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Mime-Version: 1.0 (Mac OS X Mail 11.5 \(3445.9.1\))
Message-Id: <711477EE-2E79-460B-8778-C3FF36B408D1@bangj.com>
Date: Mon, 10 Sep 2018 18:20:34 -0400
Cc: Paul Hoffman <paul.hoffman@icann.org>
To: dnsop WG <dnsop@ietf.org>
X-Mailer: Apple Mail (2.3445.9.1)
Archived-At: <https://mailarchive.ietf.org/arch/msg/dnsop/1YGR-iVk2xWmYETwm2qN7TA67SU>
Subject: [DNSOP] DNS JSON (RFC 8427) schema
X-BeenThere: dnsop@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: IETF DNSOP WG mailing list <dnsop.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/dnsop>, <mailto:dnsop-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/dnsop/>
List-Post: <mailto:dnsop@ietf.org>
List-Help: <mailto:dnsop-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/dnsop>, <mailto:dnsop-request@ietf.org?subject=subscribe>
X-List-Received-Date: Mon, 10 Sep 2018 22:20:43 -0000

DNSOP/Paul:

	I am working on an application that will have DNS filters or translators in the config file. My current design uses Paul Hoffman's RFC 8427 JSON DNS format to allow the filters to make packet alterations. As an example, think about an older printer service with SRV/TXT records that do not support AirPrint. However, with a few tweaks, the TXT record could be changed to make it compatible with AirPrint devices. Therefore, I want to validate the output of the filter before accepting it since anyone could add these types of filters to the config file.

There is work in the IETF for JSON schemas (https://tools.ietf.org/html/draft-handrews-json-schema-validation-01) and (http://json-schema.org) and I have started creating a schema for the RFC 8427 JSON DNS definitions.

It will be something similar to what is below (but more complete). Before I go to all the trouble of getting this exactly right, I wanted to make sure no one else had already done this. I will publish it when I finish for others to use.

If anyone has already generated a JSON schema for RFC 8427, please contact me.

If you are interested in this and want to help, please contact me.

Thanks,
Tom



  1 {
  2   "definitions": {},
  3   "$schema": "http://json-schema.org/draft-07/schema#",
  4   "$id": "http://dnsdisco.com/rfc8427.json",
  5   "type": "object",
  6   "title": “RFC 8427 Schema",
 11   "properties": {
 12     "queryMessage": {
 13       "$id": "#/properties/queryMessage",
 14       "type": "object",
 15       "title": "The Querymessage Schema",
 16       "required": [
 17         "ID",
 18         "QR",
 19         "Opcode",
 20         "AA",
 21         "TC",
 22         "RD",
 23         "RA",
 24         "AD",
 25         "CD",
 26         "RCODE",
 27         "QDCOUNT",
 28         "ANCOUNT",
 29         "NSCOUNT",
 30         "ARCOUNT",
 31         "QNAME",
 32         "QTYPE",
 33         "QCLASS"
 34       ],
 35       "properties": {
 36         "ID": {
 37           "$id": "#/properties/queryMessage/properties/ID",
 38           "type": "integer",
 39           "title": "The Id Schema",
 40           "default": 0,
 41           "examples": [
 42             32784
 43           ]
 44         },
 45         "QR": {
 46           "$id": "#/properties/queryMessage/properties/QR",
 47           "type": "integer",
 48           "title": "The Qr Schema",
 49           "default": 0,
 50           "examples": [
 51             0
 52           ]
 53         },
 54         "Opcode": {
 55           "$id": "#/properties/queryMessage/properties/Opcode",
 56           "type": "integer",
 57           "title": "The Opcode Schema",
 58           "default": 0,
 59           "examples": [
 60             0
 61           ]
 62         },
 63         "AA": {
 64           "$id": "#/properties/queryMessage/properties/AA",
 65           "type": "integer",
 66           "title": "The Aa Schema",
 67           "default": 0,
 68           "examples": [
 69             0
 70           ]
 71         },
 72         "TC": {
 73           "$id": "#/properties/queryMessage/properties/TC",
 74           "type": "integer",
 75           "title": "The Tc Schema",
 76           "default": 0,
 77           "examples": [
 78             0
 79           ]
 80         },
 81         "RD": {
 82           "$id": "#/properties/queryMessage/properties/RD",
 83           "type": "integer",
 84           "title": "The Rd Schema",
 85           "default": 0,
 86           "examples": [
 87             0
 88           ]
 89         },
 90         "RA": {
 91           "$id": "#/properties/queryMessage/properties/RA",
 92           "type": "integer",
 93           "title": "The Ra Schema",
 94           "default": 0,
 95           "examples": [
 96             0
 97           ]
 98         },
 99         "AD": {
100           "$id": "#/properties/queryMessage/properties/AD",
101           "type": "integer",
102           "title": "The Ad Schema",
103           "default": 0,
104           "examples": [
105             0
106           ]
107         },
108         "CD": {
109           "$id": "#/properties/queryMessage/properties/CD",
110           "type": "integer",
111           "title": "The Cd Schema",
112           "default": 0,
113           "examples": [
114             0
115           ]
116         },
117         "RCODE": {
118           "$id": "#/properties/queryMessage/properties/RCODE",
119           "type": "integer",
120           "title": "The Rcode Schema",
121           "default": 0,
122           "examples": [
123             0
124           ]
125         },
126         "QDCOUNT": {
127           "$id": "#/properties/queryMessage/properties/QDCOUNT",
128           "type": "integer",
129           "title": "The Qdcount Schema",
130           "default": 0,
131           "examples": [
132             1
133           ]
134         },
135         "ANCOUNT": {
136           "$id": "#/properties/queryMessage/properties/ANCOUNT",
137           "type": "integer",
138           "title": "The Ancount Schema",
139           "default": 0,
140           "examples": [
141             0
142           ]
143         },
144         "NSCOUNT": {
145           "$id": "#/properties/queryMessage/properties/NSCOUNT",
146           "type": "integer",
147           "title": "The Nscount Schema",
148           "default": 0,
149           "examples": [
150             0
151           ]
152         },
153         "ARCOUNT": {
154           "$id": "#/properties/queryMessage/properties/ARCOUNT",
155           "type": "integer",
156           "title": "The Arcount Schema",
157           "default": 0,
158           "examples": [
159             0
160           ]
161         },
162         "QNAME": {
163           "$id": "#/properties/queryMessage/properties/QNAME",
164           "type": "string",
165           "title": "The Qname Schema",
166           "default": "",
167           "examples": [
168             "example.com."
169           ],
170           "pattern": "^(.*)$"
171         },
172         "QTYPE": {
173           "$id": "#/properties/queryMessage/properties/QTYPE",
174           "type": "integer",
175           "title": "The Qtype Schema",
176           "default": 0,
177           "examples": [
178             1
179           ]
180         },
181         "QCLASS": {
182           "$id": "#/properties/queryMessage/properties/QCLASS",
183           "type": "integer",
184           "title": "The Qclass Schema",
185           "default": 0,
186           "examples": [
187             1
188           ]
189         }
190       }
191     },
192     "responseMessage": {
193       "$id": "#/properties/responseMessage",
194       "type": "object",
195       "title": "The Responsemessage Schema",
196       "required": [
197         "ID",
198         "QR",
199         "AA",
200         "RCODE",
201         "QDCOUNT",
202         "ANCOUNT",
203         "NSCOUNT",
204         "ARCOUNT",
207       ],
208       "properties": {
209         "ID": {
210           "$id": "#/properties/responseMessage/properties/ID",
211           "type": "integer",
212           "title": "The Id Schema",
213           "default": 0,
214           "examples": [
215             32784
216           ]
217         },
218         "QR": {
219           "$id": "#/properties/responseMessage/properties/QR",
220           "type": "integer",
221           "title": "The Qr Schema",
222           "default": 0,
223           "examples": [
224             1
225           ]
226         },
227         "AA": {
228           "$id": "#/properties/responseMessage/properties/AA",
229           "type": "integer",
230           "title": "The Aa Schema",
231           "default": 0,
232           "examples": [
233             1
234           ]
235         },
236         "RCODE": {
237           "$id": "#/properties/responseMessage/properties/RCODE",
238           "type": "integer",
239           "title": "The Rcode Schema",
240           "default": 0,
241           "examples": [
242             0
243           ]
244         },
245         "QDCOUNT": {
246           "$id": "#/properties/responseMessage/properties/QDCOUNT",
247           "type": "integer",
248           "title": "The Qdcount Schema",
249           "default": 0,
250           "examples": [
251             1
252           ]
253         },
254         "ANCOUNT": {
255           "$id": "#/properties/responseMessage/properties/ANCOUNT",
256           "type": "integer",
257           "title": "The Ancount Schema",
258           "default": 0,
259           "examples": [
260             1
261           ]
262         },
263         "NSCOUNT": {
264           "$id": "#/properties/responseMessage/properties/NSCOUNT",
265           "type": "integer",
266           "title": "The Nscount Schema",
267           "default": 0,
268           "examples": [
269             1
270           ]
271         },
272         "ARCOUNT": {
273           "$id": "#/properties/responseMessage/properties/ARCOUNT",
274           "type": "integer",
275           "title": "The Arcount Schema",
276           "default": 0,
277           "examples": [
278             0
279           ]
280         },
281         "answerRRs": {
282           "$id": "#/properties/responseMessage/properties/answerRRs",
283           "type": "array",
284           "title": "The Answerrrs Schema",
285           "items": {
286             "$id": "#/properties/responseMessage/properties/answerRRs/items",
287             "type": "object",
288             "title": "The Items Schema",
289             "required": [
290               "NAME",
291               "TYPE",
292               "CLASS",
293               "TTL",
294               "RDATAHEX"
295             ],
296             "properties": {
297               "NAME": {
298                 "$id": "#/properties/responseMessage/properties/answerRRs/items/properties/NAME",
299                 "type": "string",
300                 "title": "The Name Schema",
301                 "default": "",
302                 "examples": [
303                   "example.com."
304                 ],
305                 "pattern": "^(.*)$"
306               },
307               "TYPE": {
308                 "$id": "#/properties/responseMessage/properties/answerRRs/items/properties/TYPE",
309                 "type": "integer",
310                 "title": "The Type Schema",
311                 "default": 0,
312                 "examples": [
313                   1
314                 ]
315               },
316               "CLASS": {
317                 "$id": "#/properties/responseMessage/properties/answerRRs/items/properties/CLASS",
318                 "type": "integer",
319                 "title": "The Class Schema",
320                 "default": 0,
321                 "examples": [
322                   1
323                 ]
324               },
325               "TTL": {
326                 "$id": "#/properties/responseMessage/properties/answerRRs/items/properties/TTL",
327                 "type": "integer",
328                 "title": "The Ttl Schema",
329                 "default": 0,
330                 "examples": [
331                   3600
332                 ]
333               },
334               "RDATAHEX": {
335                 "$id": "#/properties/responseMessage/properties/answerRRs/items/properties/RDATAHEX",
336                 "type": "string",
337                 "title": "The Rdatahex Schema",
338                 "default": "",
339                 "examples": [
340                   "C0000201"
341                 ],
342                 "pattern": "^(.*)$"
343               }
344             }
345           }
346         },
347         "authorityRRs": {
348           "$id": "#/properties/responseMessage/properties/authorityRRs",
349           "type": "array",
350           "title": "The Authorityrrs Schema",
351           "items": {
352             "$id": "#/properties/responseMessage/properties/authorityRRs/items",
353             "type": "object",
354             "title": "The Items Schema",
355             "required": [
356               "NAME",
357               "TYPE",
358               "CLASS",
359               "TTL",
360               "RDATAHEX"
361             ],
362             "properties": {
363               "NAME": {
364                 "$id": "#/properties/responseMessage/properties/authorityRRs/items/properties/NAME",
365                 "type": "string",
366                 "title": "The Name Schema",
367                 "default": "",
368                 "examples": [
369                   "ns.example.com."
370                 ],
371                 "pattern": "^(.*)$"
372               },
373               "TYPE": {
374                 "$id": "#/properties/responseMessage/properties/authorityRRs/items/properties/TYPE",
375                 "type": "integer",
376                 "title": "The Type Schema",
377                 "default": 0,
378                 "examples": [
379                   1
380                 ]
381               },
382               "CLASS": {
383                 "$id": "#/properties/responseMessage/properties/authorityRRs/items/properties/CLASS",
384                 "type": "integer",
385                 "title": "The Class Schema",
386                 "default": 0,
387                 "examples": [
388                   1
389                 ]
390               },
391               "TTL": {
392                 "$id": "#/properties/responseMessage/properties/authorityRRs/items/properties/TTL",
393                 "type": "integer",
394                 "title": "The Ttl Schema",
395                 "default": 0,
396                 "examples": [
397                   28800
398                 ]
399               },
400               "RDATAHEX": {
401                 "$id": "#/properties/responseMessage/properties/authorityRRs/items/properties/RDATAHEX",
402                 "type": "string",
403                 "title": "The Rdatahex Schema",
404                 "default": "",
405                 "examples": [
406                   "CB007181"
407                 ],
408                 "pattern": "^(.*)$"
409               }
410             }
411           }
412         }
413       }
414     }
415   }
416 }