4 import Control.Concurrent.ParallelIO.Global (
7 import qualified Data.ByteString.Char8 as BS (
11 import Data.List ((\\))
12 import Data.String.Utils (join)
16 FileOrNumericHost(RCHostName),
17 ResolvConf(resolvInfo),
22 import CommandLine (Args(..), get_args)
29 report :: (Domain, Maybe [Domain]) -> IO ()
31 putStrLn $ "Domain " ++ (show d) ++ " not delegated."
32 report (d, Just leftovers) =
35 else putStrLn $ "Domain " ++
37 " delegates somewhere else: " ++
38 (join " " (map show leftovers))
40 clean :: [Domain] -- ^ List of delegates, @ds@
43 clean _ p@(_, Nothing) = p
44 clean delgts (d, Just targets) =
45 (d, Just $ targets \\ delgts)
54 input <- BS.getContents
56 -- Split the input on any whitespace characters.
57 let raw_domains = BS.words input
59 -- Convert these to ByteStrings.
60 let raw_delegates = map BS.pack (delegates cfg)
62 -- Normalize the given names and delegates
63 let nrml_domains = map normalize raw_domains
64 let nrml_delegates = map normalize raw_delegates
66 let rc = case (server cfg) of
67 Nothing -> defaultResolvConf
68 Just s -> defaultResolvConf { resolvInfo = RCHostName s }
70 rs <- makeResolvSeed rc
72 let lookup_function = case cfg of
76 _ <- withResolver rs $ \resolver -> do
77 -- Bad stuff happens if we try to run these lookups in parallel
78 -- instead of the reports.
79 records <- mapM (lookup_function resolver) nrml_domains
80 let cleaned_records = map (clean nrml_delegates) records
81 parallel (map report cleaned_records)