| dependencies
 | (this space intentionally left almost blank) | ||||||
| (ns inet.address
  (:require
    [inet.address.core :as address-core]
    [inet.address.six :as address-six]
    [potemkin :refer [import-vars]])) | |||||||
| (import-vars [address-core ;; static all-by-name by-address by-name localhost loopback ;; behaviour address canonical-hostname host-address hostname any-local-address? link-local-address? loopback-address? mc-global? mc-link-local? mc-node-local? mc-org-local? mc-site-local? multicast-address? reachable? site-local-address? ;; constructor create]) | |||||||
| (import-vars [address-six ;; behaviour scoped-interface scope-id ipv4-compatible-address?]) | |||||||
| (ns inet.address.four
  (:require
    [inet.address.core :as ipnet-core]
    [potemkin :refer [import-vars]])
  (:import
    (java.net Inet4Address))) | |||||||
| Static Methods ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| Given the name of a host, returns an Clojure vector of its IP address objects, based on the configured name service on the system. | (defn all-by-name
  [host]
  (->> host
       (Inet4Address/getAllByName)
       (into []))) | ||||||
| Returns an  In the arity-1 case, an object is given a vector of octets representing a 'raw' IP address. In the arity-2 case, an object is given based on the provided host name and a 'raw' IP address.   Note: expected type of  | (defn by-address
  ([addr]
    (Inet4Address/getByAddress (byte-array addr)))
  ([host addr]
    (Inet4Address/getByAddress host (byte-array addr)))) | ||||||
| Determines the IP address of a host, given the host's name. | (defn by-name [host] (Inet4Address/getByName host)) | ||||||
| Returns the address of the local host. | (defn localhost [] (Inet4Address/getLocalHost)) | ||||||
| Returns the loopback address. | (defn loopback [] (Inet4Address/getLoopbackAddress)) | ||||||
| Implementation ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| (extend Inet4Address ipnet-core/Address ipnet-core/behaviour) | |||||||
| Aliases ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| (import-vars [ipnet-core ;; behaviour address canonical-hostname host-address hostname any-local-address? link-local-address? loopback-address? mc-global? mc-link-local? mc-node-local? mc-org-local? mc-site-local? multicast-address? reachable? site-local-address?]) | |||||||
| (ns inet.address.core
  (:import
    (java.net InetAddress))) | |||||||
| Static Methods ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| Given the name of a host, returns an Clojure vector of its IP address objects, based on the configured name service on the system. | (defn all-by-name
  [host]
  (->> host
       (InetAddress/getAllByName)
       (into []))) | ||||||
| Returns an  In the arity-1 case, an object is given a vector of octets representing a 'raw' IP address. In the arity-2 case, an object is given based on the provided host name and a 'raw' IP address.   Note: expected type of  | (defn by-address
  ([addr]
    (InetAddress/getByAddress (byte-array addr)))
  ([host addr]
    (InetAddress/getByAddress host (byte-array addr)))) | ||||||
| Determines the IP address of a host, given the host's name. | (defn by-name [host] (InetAddress/getByName host)) | ||||||
| Returns the address of the local host. | (defn localhost [] (InetAddress/getLocalHost)) | ||||||
| Returns the loopback address. | (defn loopback [] (InetAddress/getLoopbackAddress)) | ||||||
| Protocol ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| (defprotocol Address
  (address [this]
    "Returns the raw IP address of this InetAddress object as a Clojure
    vector.")
  (canonical-hostname [this]
    "Gets the fully qualified domain name for this IP address.")
  (host-address [this]
    "Returns the IP address string in textual presentation.")
  (hostname [this]
    "Gets the host name for this IP address.")
  (any-local-address? [this]
    "Utility routine to check if the InetAddress in a wildcard address.")
  (link-local-address? [this]
    "Utility routine to check if the InetAddress is an link local address.")
  (loopback-address? [this]
    "Utility routine to check if the InetAddress is a loopback address.")
  (mc-global? [this]
    "Utility routine to check if the multicast address has global scope.")
  (mc-link-local? [this]
    "Utility routine to check if the multicast address has link scope.")
  (mc-node-local? [this]
    "Utility routine to check if the multicast address has node scope.")
  (mc-org-local? [this]
    "Utility routine to check if the multicast address has organization
    scope.")
  (mc-site-local? [this]
    "Utility routine to check if the multicast address has site scope.")
  (multicast-address? [this]
    "Utility routine to check if the InetAddress is an IP multicast address.")
  (reachable? [this timeout] [this net-iface ttl timeout]
    "Test whether that address is reachable. The units of `timeout` is
    milliseconds.")
  (site-local-address? [this]
    "Utility routine to check if the InetAddress is a site local address.")) | |||||||
| Implementation ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| (def behaviour
  {:address (fn [this] (into [] (.getAddress this)))
   :canonical-hostname (fn [this] (.getCanonicalHostName this))
   :host-address (fn [this] (.getHostAddress this))
   :hostname (fn [this] (.getHostName this))
   :any-local-address? (fn [this] (.isAnyLocalAddress this))
   :link-local-address? (fn [this] (.isLinkLocalAddress this))
   :loopback-address? (fn [this] (.isLoopbackAddress this))
   :mc-global? (fn [this] (.isMCGlobal this))
   :mc-link-local? (fn [this] (.isMCLinkLocal this))
   :mc-node-local? (fn [this] (.isMCNodeLocal this))
   :mc-org-local? (fn [this] (.isMCOrgLocal this))
   :mc-site-local? (fn [this] (.isMCSiteLocal this))
   :multicast-address? (fn [this] (.isMulticastAddress this))
   :reachable? (fn ([this timeout]
                    (.isReachable this timeout))
                   ([this net-iface ttl timeout]
                    (.isReachable this net-iface ttl timeout)))
   :site-local-address? (fn [this] (.isSiteLocalAddress this))}) | |||||||
| (extend InetAddress Address behaviour) | |||||||
| Constructors ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| (def create #'by-address) | |||||||
| (ns inet.address.six
  (:require
    [inet.address.core :as ipnet-core]
    [potemkin :refer [import-vars]])
  (:import
    (java.net Inet6Address))) | |||||||
| Static Methods ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| Given the name of a host, returns an Clojure vector of its IP address objects, based on the configured name service on the system. | (defn all-by-name
  [host]
  (->> host
       (Inet6Address/getAllByName)
       (into []))) | ||||||
| Returns an    This creates an  
 | (defn by-address [host addr scope-or-nif] (Inet6Address/getByAddress host (byte-array addr) scope-or-nif)) | ||||||
| Determines the IP address of a host, given the host's name. | (defn by-name [host] (Inet6Address/getByName host)) | ||||||
| Returns the address of the local host. | (defn localhost [] (Inet6Address/getLocalHost)) | ||||||
| Returns the loopback address. | (defn loopback [] (Inet6Address/getLoopbackAddress)) | ||||||
| Protocol ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| (defprotocol IPV6Address
  (scoped-interface [this]
    "Returns the scoped interface, if this instance was created with with a
    scoped interface.")
  (scope-id [this]
    "Returns the numeric scopeId, if this instance is associated with an
    interface.")
  (ipv4-compatible-address? [this]
    "Utility routine to check if the InetAddress is an IPv4 compatible IPv6
    address.")) | |||||||
| Implementation ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| (def behaviour
  (merge
    ipnet-core/behaviour
    {:scoped-interface (fn [this] (.getScopedInterface this))
     :scope-id (fn [this] (.getScopeId this))
     :ipv4-compatible-address? (fn [this] (.isIPv4CompatibleAddress this))})) | |||||||
| (extend Inet6Address IPV6Address behaviour) (extend Inet6Address ipnet-core/Address behaviour) | |||||||
| Constructors ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| (def create #'by-address) | |||||||
| Aliases ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| (import-vars [ipnet-core ;; behaviour address canonical-hostname host-address hostname any-local-address? link-local-address? loopback-address? mc-global? mc-link-local? mc-node-local? mc-org-local? mc-site-local? multicast-address? reachable? site-local-address?]) | |||||||
| (ns inet.interface
  (:refer-clojure :exclude [index name])
  (:import
    (java.net NetworkInterface))) | |||||||
| Static Methods ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| Get a network interface given its index. | (defn by-index [idx] (NetworkInterface/getByIndex idx)) | ||||||
| Convenience method to search for a network interface that has the specified Internet Protocol (IP) address bound to it. | (defn by-inet-address [addr] (NetworkInterface/getByInetAddress addr)) | ||||||
| Searches for the network interface with the specified name. | (defn by-name [iface-name] (NetworkInterface/getByName iface-name)) | ||||||
| Returns all the interfaces on this machine. | (defn network-interfaces
  []
  (-> (NetworkInterface/getNetworkInterfaces)
      (enumeration-seq)
      (vec))) | ||||||
| Protocol ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| (defprotocol NetInterface
  (display-name [this]
    "Get the display name of this network interface.")
  (hardware-address [this]
    "Returns the hardware address (usually MAC) of the interface if it has
    one and if it can be accessed given the current privileges.")
  (index [this]
    "Returns the index of this network interface.")
  (inet-addresses [this]
    "Convenience method to return an Enumeration with all or a subset of the
    InetAddresses bound to this network interface.")
  (interface-addresses [this]
    "Get a List of all or a subset of the InterfaceAddresses of this network
    interface.")
  (mtu [this]
    "Returns the Maximum Transmission Unit (MTU) of this interface.")
  (name [this]
    "Get the name of this network interface.")
  (parent [this]
    "Returns the parent NetworkInterface of this interface if this is a
    subinterface, or null if it is a physical (non virtual) interface or has
    no parent.")
  (sub-interfaces [this]
    "Get an Enumeration with all the subinterfaces (also known as virtual
    interfaces) attached to this network interface.")
  (loopback? [this]
    "Returns whether a network interface is a loopback interface.")
  (point-to-point? [this]
    "Returns whether a network interface is a point to point interface.")
  (up? [this]
    "Returns whether a network interface is up and running.")
  (virtual? [this]
    "Returns whether this interface is a virtual interface (also called
    subinterface).")
  (supports-multicast? [this]
    "Returns whether a network interface supports multicasting or not.")) | |||||||
| Implementation ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||
| (def behaviour
  {:display-name (fn [this] (.getDisplayName this))
   :hardware-address (fn [this] (->> (.getHardwareAddress this)
                                     (map #(format "%02x" %))
                                     (vec)))
   :index (fn [this] (.getIndex this))
   :inet-addresses (fn [this] (-> (.getInetAddresses this)
                                  (enumeration-seq)
                                  (vec)))
   :interface-addresses (fn [this] (.getInterfaceAddresses this))
   :mtu (fn [this] (.getMTU this))
   :name (fn [this] (.getName this))
   :parent (fn [this] (.getParent this))
   :sub-interfaces (fn [this] (-> (.getSubInterfaces this)
                                  (enumeration-seq)
                                  (vec)))
   :loopback? (fn [this] (.isLoopback this))
   :point-to-point? (fn [this] (.isPointToPoint this))
   :up? (fn [this] (.isUp this))
   :virtual? (fn [this] (.isVirtual this))
   :supports-multicast? (fn [this] (.supportsMulticast this))}) | |||||||
| (extend NetworkInterface NetInterface behaviour) | |||||||
| Constructors ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||||