* added dns-check-nameservers
* fixed alists in send-receive-message-tcp * fixed and added documentation
This commit is contained in:
parent
c42a467ce5
commit
6f52781aa6
|
@ -149,6 +149,14 @@ accept. \var{Nameserver} is either a \ipaddr or a dotted IP string.
|
|||
resolve these FQDNs.
|
||||
\end{desc}
|
||||
|
||||
\defun{dns-check-nameservers} {[nameserver list]} {\undefined}
|
||||
\begin{desc}
|
||||
\ex{dns-check-namservers} checks if the given nameservers are reachable.
|
||||
If no argument is given, the nameservers in \texttt{/etc/resolv.conf}
|
||||
are checked. Information about the status of the nameservers is printed
|
||||
to the current output port.
|
||||
\end{desc}
|
||||
|
||||
\section{Low-level Interface}
|
||||
|
||||
This section describes a set of data structures and procedures which
|
||||
|
|
|
@ -30,17 +30,25 @@
|
|||
; if it is a domainname, its ip is looked up on a nameserver listed in
|
||||
; /etc/resolv.conf.
|
||||
;
|
||||
; (dns-find-nameserver) --> <ip-address32>
|
||||
; this parses the /etc/resolv.conf file and returns the first found
|
||||
; nameserver in address32 format.
|
||||
; (dns-find-nameserver-list) --> <ip-string list>
|
||||
; this parses the /etc/resolv.conf file and returns the found
|
||||
; nameserver in a list of dotted strings.
|
||||
;
|
||||
; (dns-find-nameserver) --> <ip-string>
|
||||
; this parses the /etc/resolv.conf file and returns the first found
|
||||
; nameserver in dotted string notation.
|
||||
;
|
||||
; (dns-check-namservers [nameserver list]) --> undefined
|
||||
; checks if the given nameservers are reachable. If no argument is given,
|
||||
; the nameservers in /etc/resolv.conf are checked.
|
||||
;
|
||||
;
|
||||
; (dns-lookup-name <name> [nameserver]) --> <ip-address32>
|
||||
; (dns-lookup-ip <ip-string | ip-address32> [nameserver]) --> <name>
|
||||
; (dns-lookup-nameserver <name> [nameserver])
|
||||
; (dns-lookup-name <name> [nameserver list] [use-cache?]) --> <ip-address32>
|
||||
; (dns-lookup-ip <ip-string | ip-address32> [nameserver list] [use-cache?])
|
||||
; --> <name>
|
||||
; (dns-lookup-nameserver <name> [nameserver list] [use-cache?])
|
||||
; --> <list of ip-address32s of authoritative nameservers>
|
||||
; (dns-lookup-mail-exchanger <name> [nameserver])
|
||||
; (dns-lookup-mail-exchanger <name> [nameserver list] [use-cache?])
|
||||
; --> <list of names of mail-exchangers>
|
||||
;
|
||||
; dns-lookup-name, dns-lookup-ip, dns-lookup-nameserver and
|
||||
|
@ -57,7 +65,7 @@
|
|||
; /etc/resolv.conf.
|
||||
;
|
||||
;
|
||||
; (dns-lookup <name | ip-string | ip-address32> <type> [nameserver])
|
||||
; (dns-lookup <name | ip-string | ip-address32> <type> [nameserver list])
|
||||
; --> <dns-message>
|
||||
; (show-dns-message <dns-message) --> the whole message, human readable
|
||||
;
|
||||
|
@ -780,9 +788,7 @@
|
|||
;; here: via TCP
|
||||
(define (send-receive-message-tcp nameservers query)
|
||||
(receive (reply hit-ns other-nss)
|
||||
(let ((sockets (filter
|
||||
socket?
|
||||
(map
|
||||
(let ((sockets (map
|
||||
(lambda (nameserver)
|
||||
(let ((sock (create-socket protocol-family/internet
|
||||
socket-type/stream))
|
||||
|
@ -797,8 +803,18 @@
|
|||
(lambda ()
|
||||
(connect-socket-no-wait sock addr)
|
||||
sock))))))
|
||||
nameservers))))
|
||||
(let* ((ws (map socket:outport sockets))
|
||||
nameservers)))
|
||||
(let* ((nameservers
|
||||
(let loop ((sockets sockets)
|
||||
(nss nameservers))
|
||||
(cond
|
||||
((or (null? sockets) (null? nss)) '())
|
||||
((socket? (car sockets))
|
||||
(cons (car nss) (loop (cdr sockets) (cdr nss))))
|
||||
(else (loop (cdr sockets) (cdr nss))))))
|
||||
|
||||
(sockets (filter socket? sockets))
|
||||
(ws (map socket:outport sockets))
|
||||
(wport-nameserver-alist (map cons ws nameservers))
|
||||
(wport-socket-alist (map cons ws sockets)))
|
||||
(dynamic-wind
|
||||
|
@ -1240,6 +1256,99 @@
|
|||
(dns-error 'no-nameservers)
|
||||
(car ns))))
|
||||
|
||||
;; checks if the nameservers are working, prints a summary
|
||||
(define (dns-check-nameservers . args)
|
||||
(let* ((print-summary
|
||||
(lambda (working-channels non-working-channels)
|
||||
(for-each (lambda (channel)
|
||||
(display "FAIL: ")(display channel)
|
||||
(display " - host not reachable.")(newline))
|
||||
non-working-channels)
|
||||
(for-each (lambda (channel)
|
||||
(display "PASS: ")(display channel)
|
||||
(display " - connection established.")(newline))
|
||||
working-channels)
|
||||
(if (null? working-channels)
|
||||
(begin (display "ERROR: no working nameserver found.")(newline)))))
|
||||
|
||||
(nameservers (if (null? args)
|
||||
(dns-find-nameserver-list)
|
||||
(car args)))
|
||||
(sockets (map
|
||||
(lambda (nameserver)
|
||||
(let ((sock (create-socket protocol-family/internet
|
||||
socket-type/stream))
|
||||
(addr (internet-address->socket-address
|
||||
(ip-string->address32 nameserver) 53)))
|
||||
(call-with-current-continuation
|
||||
(lambda (k)
|
||||
(with-handler (lambda (cond more)
|
||||
(display "FAIL: ")
|
||||
(display nameserver)
|
||||
(display " - no DNS Service available.")
|
||||
(newline)
|
||||
(k #f))
|
||||
(lambda ()
|
||||
(connect-socket-no-wait sock addr)
|
||||
sock))))))
|
||||
nameservers)))
|
||||
|
||||
(let* ((nameservers
|
||||
(let loop ((sockets sockets)
|
||||
(nss nameservers))
|
||||
(cond
|
||||
((or (null? sockets) (null? nss)) '())
|
||||
((socket? (car sockets))
|
||||
(cons (car nss) (loop (cdr sockets) (cdr nss))))
|
||||
(else (loop (cdr sockets) (cdr nss))))))
|
||||
|
||||
(sockets (filter socket? sockets))
|
||||
(ws (map socket:outport sockets))
|
||||
(wport-nameserver-alist (map cons ws nameservers))
|
||||
(wport-socket-alist (map cons ws sockets)))
|
||||
(dynamic-wind
|
||||
(lambda ()
|
||||
'nothing-to-be-done-before)
|
||||
(lambda ()
|
||||
(let loop-port-channels ((working-channels '())
|
||||
(non-working-channels '())
|
||||
(tried-channels '())
|
||||
(number-tries 1))
|
||||
(letrec ((delete-list
|
||||
(lambda (elems list)
|
||||
(cond
|
||||
((null? elems) list)
|
||||
((null? list) '())
|
||||
(else (delete-list (cdr elems) (delete (car elems) list))))))
|
||||
(ready (delete-list tried-channels
|
||||
(apply select-port-channels *timeout* ws))))
|
||||
|
||||
(if (or (>= number-tries *max-tries*))
|
||||
(print-summary working-channels
|
||||
(delete-list working-channels
|
||||
(delete-list non-working-channels
|
||||
nameservers)))
|
||||
(let loop-ready-channels ((working-channels working-channels)
|
||||
(non-working-channels non-working-channels)
|
||||
(ready-channels ready))
|
||||
(if (null? ready-channels)
|
||||
(loop-port-channels working-channels
|
||||
non-working-channels
|
||||
(append tried-channels ready)
|
||||
(+ number-tries 1))
|
||||
(let* ((w (car ready-channels))
|
||||
(hit-ns (cdr (assoc w wport-nameserver-alist)))
|
||||
(sock (cdr (assoc w wport-socket-alist))))
|
||||
(if (connect-socket-successful? sock)
|
||||
(loop-ready-channels (append working-channels (list hit-ns))
|
||||
non-working-channels (cdr ready-channels))
|
||||
(loop-ready-channels working-channels
|
||||
(append non-working-channels
|
||||
(list hit-ns))
|
||||
(cdr ready-channels))))))))))
|
||||
(lambda ()
|
||||
(for-each close-socket sockets))))))
|
||||
|
||||
|
||||
;; computes the nameservers argument of the lookup functions.
|
||||
;; if a nameserver-name is given and not a nameserver-ip
|
||||
|
|
|
@ -155,6 +155,7 @@
|
|||
ip-string->address32 ; converts a ip-string in an address32
|
||||
dns-find-nameserver ; returns a nameserver
|
||||
dns-find-nameserver-list ; returns a list of nameservers
|
||||
dns-check-nameservers ; checks for working nameservers
|
||||
socket-address->fqdn
|
||||
host-fqdn
|
||||
system-fqdn))
|
||||
|
|
Loading…
Reference in New Issue