clojure-adventure added by certainty on Wed May 22 09:12:45 2013

(ns policyj.rbl
  (use [clojure.string :only (split join)])
  (import java.net.InetAddress java.net.Inet4Address java.net.Inet6Address))

(defn- dns-resolvable? [domain]
  "Tries to resolve the domain passed to the function and returns true if it
   can resolve it and false otherwise"
  (try
    (not (empty? (InetAddress/getAllByName domain)))
    (catch Exception exn false)))

(defn- reverse-dotted-quad [ip]
  "127.0.0.1 -> 1.0.0.127"
  (join "." (reverse (split ip #"\."))))

(defn- rbl-domain [ip service]
  "[127.0.0.1 rbl.test.org] -> 1.0.0.127.rbl.test.org"
  (join "." (list (reverse-dotted-quad ip) service)))

(def rbl-check [ip services]
  "Performs an rbl check of the ip on the given services.
   It returns the first service on which it resolved or nil if non resolved
  "
  (first (filter #(dns-resolvable? (rbl-domain ip %))) services))