42 lines
1.3 KiB
Racket
42 lines
1.3 KiB
Racket
|
#lang racket
|
||
|
|
||
|
(require net/url)
|
||
|
|
||
|
(define records
|
||
|
(map (lambda (r) (string-split r "\t"))
|
||
|
(string-split (port->string
|
||
|
(get-pure-port
|
||
|
(string->url "http://www.internic.net/domain/root.zone")))
|
||
|
"\n")))
|
||
|
|
||
|
(define (split-host-str s)
|
||
|
(map string->bytes/utf-8 (string-split s ".")))
|
||
|
|
||
|
(define (split-ip-str s)
|
||
|
(list->vector (map string->number (string-split s "."))))
|
||
|
|
||
|
(pretty-write
|
||
|
`(list
|
||
|
,@(filter values
|
||
|
(for/list [(r records)]
|
||
|
(match r
|
||
|
[(list "."
|
||
|
""
|
||
|
""
|
||
|
ttl-str
|
||
|
"IN"
|
||
|
"NS"
|
||
|
(regexp #px"^(.+)\\.$" (list _ host-str)))
|
||
|
`(NS/ttl '()
|
||
|
',(split-host-str host-str)
|
||
|
,(string->number ttl-str))]
|
||
|
[(list (regexp #px"^([^.]+\\.root-servers\\.net)\\.$" (list _ host-str))
|
||
|
ttl-str
|
||
|
"IN"
|
||
|
"A"
|
||
|
ip-str)
|
||
|
`(A/ttl ',(split-host-str host-str)
|
||
|
',(split-ip-str ip-str)
|
||
|
,(string->number ttl-str))]
|
||
|
[_ #f])))))
|