]> gitweb.michael.orlitzky.com - hath.git/blobdiff - src/Main.hs
Add a test for the Cidr 'enumerate' function.
[hath.git] / src / Main.hs
index 12511b61463b6d04a721434cbb7e7d8b09db15e8..5b034ba5119bf336721c334a3c1fe69f1518fd83 100644 (file)
@@ -1,32 +1,41 @@
+module Main
+where
+
+import Control.Concurrent.ParallelIO.Global (
+  parallel,
+  stopGlobalPool )
 import Control.Monad (unless, when)
 import Control.Monad (unless, when)
+import qualified Data.ByteString.Char8 as BS (intercalate, pack, unpack)
 import Data.List ((\\), intercalate)
 import Data.Maybe (catMaybes, isNothing)
 import Data.String.Utils (splitWs)
 import System.Exit (ExitCode(..), exitSuccess, exitWith)
 import System.IO (stderr, hPutStrLn)
 
 import Data.List ((\\), intercalate)
 import Data.Maybe (catMaybes, isNothing)
 import Data.String.Utils (splitWs)
 import System.Exit (ExitCode(..), exitSuccess, exitWith)
 import System.IO (stderr, hPutStrLn)
 
-import Cidr (Cidr(..),
-             cidr_from_string,
-             combine_all,
-             max_octet1,
-             max_octet2,
-             max_octet3,
-             max_octet4,
-             min_octet1,
-             min_octet2,
-             min_octet3,
-             min_octet4 )
-
-import CommandLine (help_set,
-                    help_text,
-                    input_function,
-                    Mode(..),
-                    parse_errors,
-                    parse_mode)
-
-import ExitCodes
-import Octet
-    
+import Cidr (
+  Cidr(..),
+  cidr_from_string,
+  combine_all,
+  enumerate,
+  max_octet1,
+  max_octet2,
+  max_octet3,
+  max_octet4,
+  min_octet1,
+  min_octet2,
+  min_octet3,
+  min_octet4 )
+import CommandLine (
+  help_set,
+  help_text,
+  input_function,
+  Mode(..),
+  parse_errors,
+  parse_mode )
+import DNS (Domain, lookup_ptrs)
+import ExitCodes ( exit_args_parse_failed, exit_invalid_cidr )
+import Octet ()
+
 
 -- | A regular expression that matches a non-address character.
 non_addr_char :: String
 
 -- | A regular expression that matches a non-address character.
 non_addr_char :: String
@@ -57,14 +66,14 @@ cidr_to_regex cidr =
       range2 = numeric_range min2 max2
       range3 = numeric_range min3 max3
       range4 = numeric_range min4 max4
       range2 = numeric_range min2 max2
       range3 = numeric_range min3 max3
       range4 = numeric_range min4 max4
-      min1   = octet_to_int (min_octet1 cidr)
-      min2   = octet_to_int (min_octet2 cidr)
-      min3   = octet_to_int (min_octet3 cidr)
-      min4   = octet_to_int (min_octet4 cidr)
-      max1   = octet_to_int (max_octet1 cidr)
-      max2   = octet_to_int (max_octet2 cidr)
-      max3   = octet_to_int (max_octet3 cidr)
-      max4   = octet_to_int (max_octet4 cidr)
+      min1   = fromEnum (min_octet1 cidr)
+      min2   = fromEnum (min_octet2 cidr)
+      min3   = fromEnum (min_octet3 cidr)
+      min4   = fromEnum (min_octet4 cidr)
+      max1   = fromEnum (max_octet1 cidr)
+      max2   = fromEnum (max_octet2 cidr)
+      max3   = fromEnum (max_octet3 cidr)
+      max4   = fromEnum (max_octet4 cidr)
 
 
 
 
 
 
@@ -122,20 +131,42 @@ main = do
     Regex -> do
       let regexes = map cidr_to_regex valid_cidrs
       putStrLn $ alternate regexes
     Regex -> do
       let regexes = map cidr_to_regex valid_cidrs
       putStrLn $ alternate regexes
-    Reduce -> do
-      _ <- mapM print (combine_all valid_cidrs)
-      return ()
-    Dupe -> do
-       _ <- mapM print dupes
-       return ()
+    Reduce ->
+      mapM_ print (combine_all valid_cidrs)
+    Dupe ->
+       mapM_ print dupes
        where
          dupes = valid_cidrs \\ (combine_all valid_cidrs)
     Diff -> do
        where
          dupes = valid_cidrs \\ (combine_all valid_cidrs)
     Diff -> do
-       _ <- mapM putStrLn deletions
-       _ <- mapM putStrLn additions
-       return ()
+       mapM_ putStrLn deletions
+       mapM_ putStrLn additions
        where
          dupes = valid_cidrs \\ (combine_all valid_cidrs)
          deletions = map (\s -> '-' : (show s)) dupes
          newcidrs = (combine_all valid_cidrs) \\ valid_cidrs
          additions = map (\s -> '+' : (show s)) newcidrs
        where
          dupes = valid_cidrs \\ (combine_all valid_cidrs)
          deletions = map (\s -> '-' : (show s)) dupes
          newcidrs = (combine_all valid_cidrs) \\ valid_cidrs
          additions = map (\s -> '+' : (show s)) newcidrs
+    List -> do
+      let combined_cidrs = combine_all valid_cidrs
+      let addrs = concatMap enumerate combined_cidrs
+      mapM_ print addrs
+    Reverse -> do
+      let combined_cidrs = combine_all valid_cidrs
+      let addrs = concatMap enumerate combined_cidrs
+      let addr_bytestrings = map (BS.pack . show) addrs
+      ptrs <- lookup_ptrs addr_bytestrings
+      let pairs = zip addr_bytestrings ptrs
+      _ <- parallel (map (putStrLn . show_pair) pairs)
+      return ()
+
+  stopGlobalPool
+
+  where
+    show_pair :: (Domain, Maybe [Domain]) -> String
+    show_pair (s, mds) =
+      (BS.unpack s) ++ ": " ++ results
+      where
+        space = BS.pack " "
+        results =
+          case mds of
+            Nothing -> ""
+            Just ds -> BS.unpack $ BS.intercalate space ds