X-Git-Url: http://gitweb.michael.orlitzky.com/?p=hath.git;a=blobdiff_plain;f=src%2FMain.hs;h=d8c760080df39c9cf2d0a29021b2271ea970adb4;hp=12511b61463b6d04a721434cbb7e7d8b09db15e8;hb=942b8ef3bc5830ca0defa62342d55550aea59934;hpb=81f6f0ca67347de6b3e3f57b5b50bb543cc7c146 diff --git a/src/Main.hs b/src/Main.hs index 12511b6..d8c7600 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -1,4 +1,8 @@ +import Control.Concurrent.ParallelIO.Global ( + parallel, + stopGlobalPool ) 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) @@ -8,6 +12,7 @@ import System.IO (stderr, hPutStrLn) import Cidr (Cidr(..), cidr_from_string, combine_all, + enumerate, max_octet1, max_octet2, max_octet3, @@ -24,9 +29,10 @@ import CommandLine (help_set, parse_errors, parse_mode) +import DNS (Domain, lookup_ptrs) import ExitCodes import Octet - + -- | A regular expression that matches a non-address character. non_addr_char :: String @@ -122,20 +128,42 @@ main = do 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 - _ <- 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 + 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