1 |
How to run Clojure script? I have this code in "clojure" that compare given IP to a list of CIDR's in a file and look for a match. |
2 |
I have installed "dev-lang/clojure" but don't have any experience with it. |
3 |
|
4 |
--------code-------- |
5 |
(ns htaccess.core) |
6 |
|
7 |
(defn parse-ip [s] |
8 |
(let [v (clojure.string/split s #"/")] |
9 |
(flatten |
10 |
(if (< (count v) 2) |
11 |
[(clojure.string/split (get v 0) #"\.") "32"] |
12 |
[(clojure.string/split (get v 0) #"\.") (get v 1)])))) |
13 |
|
14 |
(defn convert-str-to-binary-str [s] |
15 |
(clojure.string/replace (format "%0$8s" (java.lang.Integer/toBinaryString (java.lang.Integer/parseUnsignedInt (clojure.string/trim s)))) " " "0")) |
16 |
|
17 |
(defn convert-mask-to-binary-str [s] |
18 |
(let [m (java.lang.Integer/parseUnsignedInt (clojure.string/trim s)) |
19 |
m (if (< 32 m) 32 m) |
20 |
l0 (repeatedly m (fn [] 1)) |
21 |
l1 (repeatedly (- 32 m) (fn [] 0)) |
22 |
v (apply str (flatten [l0 l1]))] |
23 |
v)) |
24 |
|
25 |
(defn binary-string-to-int [s] (java.lang.Integer/parseUnsignedInt (clojure.string/trim s) 2)) |
26 |
|
27 |
(defn masked? [p m] |
28 |
(let [s0 p |
29 |
s1 m |
30 |
p0 (parse-ip s0) |
31 |
p1 (parse-ip s1) |
32 |
v0 (apply str (map convert-str-to-binary-str (take 4 p0))) |
33 |
v1 (apply str (map convert-str-to-binary-str (take 4 p1))) |
34 |
m (convert-mask-to-binary-str (last p1)) |
35 |
im (binary-string-to-int m) |
36 |
iv0 (binary-string-to-int v0) |
37 |
iv1 (binary-string-to-int v1)] |
38 |
(= (bit-and im iv0) (bit-and im iv1)))) |
39 |
|
40 |
(defn get-mask-data [s] |
41 |
(map (fn [s] (clojure.string/replace s "Require not ip " "")) |
42 |
(filter (fn [s] (clojure.string/includes? s "Require not ip ")) |
43 |
(with-open [rdr (clojure.java.io/reader s)] |
44 |
(doall (line-seq rdr)))))) |
45 |
|
46 |
(defn return-matching-blocks [p f] (filter (fn [a] (masked? p a)) (get-mask-data f))) |
47 |
---- end code ---------------- |