X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FMain.hs;h=26d54d143ab9cd82672198e358b2ec4501860fb5;hb=9dcb70651417b7e91ccea3186b409befac2e6f71;hp=45705be673f087d76d8e64ea61f16c086ac98632;hpb=a2fe46950a637e64fb5056fce091bf398b983a79;p=hath.git diff --git a/src/Main.hs b/src/Main.hs index 45705be..26d54d1 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -1,18 +1,16 @@ module Main where -import Control.Concurrent.ParallelIO.Global ( stopGlobalPool ) import Control.Monad (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(..), exitWith) +import System.Exit (ExitCode( ExitFailure ), exitWith) import System.IO (stderr, hPutStrLn) import Text.Read (readMaybe) import Cidr ( - Cidr(..), + Cidr(), combine_all, enumerate, max_octet1, @@ -24,12 +22,12 @@ import Cidr ( min_octet3, min_octet4 ) import CommandLine (Args(..), get_args) -import DNS (Domain, PTRResult, lookup_ptrs) import ExitCodes ( exit_invalid_cidr ) import Octet () -- | A regular expression that matches a non-address character. +-- non_addr_char :: String non_addr_char = "[^\\.0-9]" @@ -37,6 +35,7 @@ non_addr_char = "[^\\.0-9]" -- | Add non_addr_chars on either side of the given String. This -- prevents (for example) the regex '127.0.0.1' from matching -- '127.0.0.100'. +-- add_barriers :: String -> String add_barriers x = non_addr_char ++ x ++ non_addr_char @@ -49,9 +48,10 @@ add_barriers x = non_addr_char ++ x ++ non_addr_char -- 3. Generate a regex matching every value between those min and -- max values. -- 4. Join the regexes from step 3 with regexes matching periods. --- 5. Stick an address boundary on either side of the result. +-- 5. Stick an address boundary on either side of the result if +-- use_barriers is True. -- -cidr_to_regex :: Bool -> Cidr.Cidr -> String +cidr_to_regex :: Bool -> Cidr -> String cidr_to_regex use_barriers cidr = let f = if use_barriers then add_barriers else id in f (intercalate "\\." [range1, range2, range3, range4]) @@ -73,15 +73,22 @@ cidr_to_regex use_barriers cidr = -- | Take a list of Strings, and return a regular expression matching -- any of them. +-- alternate :: [String] -> String alternate terms = "(" ++ (intercalate "|" terms) ++ ")" -- | Take two Ints as parameters, and return a regex matching any -- integer between them (inclusive). +-- +-- IMPORTANT: we match from max to min so that if e.g. the last +-- octet is '255', we want '255' to match before '2' in the regex +-- (255|254|...|3|2|1) which does not happen if we use +-- (1|2|3|...|254|255). +-- numeric_range :: Int -> Int -> String numeric_range x y = - alternate (map show [lower..upper]) + alternate (map show $ reverse [lower..upper]) where lower = minimum [x,y] upper = maximum [x,y] @@ -95,14 +102,16 @@ main = do input <- getContents let cidr_strings = splitWs input - let cidrs = map readMaybe cidr_strings + let cidrs = map readMaybe cidr_strings :: [Maybe Cidr] when (any isNothing cidrs) $ do hPutStrLn stderr "ERROR: not valid CIDR notation:" -- Output the bad lines, safely. let pairs = zip cidr_strings cidrs - let print_pair (x, Nothing) = hPutStrLn stderr (" * " ++ x) + + let print_pair :: (String, Maybe Cidr) -> IO () + print_pair (x, Nothing) = hPutStrLn stderr (" * " ++ x) print_pair (_, _) = return () mapM_ print_pair pairs @@ -134,23 +143,3 @@ main = do let combined_cidrs = combine_all valid_cidrs let addrs = concatMap enumerate combined_cidrs mapM_ print addrs - Reversed{} -> 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 - mapM_ (putStrLn . show_pair) pairs - - stopGlobalPool - - where - show_pair :: (Domain, PTRResult) -> String - show_pair (s, eds) = - (BS.unpack s) ++ ": " ++ results - where - space = BS.pack " " - results = - case eds of - Left err -> "ERROR (" ++ (show err) ++ ")" - Right ds -> BS.unpack $ BS.intercalate space ds