packages feed

dnscache-0.1.0: MassDns.hs

-- |
-- Module:     Main
-- Copyright:  (c) 2010 Ertugrul Soeylemez
-- License:    BSD3
-- Maintainer: Ertugrul Soeylemez <es@ertes.de>
-- Stability:  experimental

module Main where

import Network.DnsCache
import System.Environment
import System.IO
import Text.Printf


printEntry :: String -> String -> [String] -> IO ()
printEntry _ _ [] = return ()
printEntry d t es = printf "%s %s %s\n" d t (unwords es)


printDns :: Int -> MassType -> [String] -> IO ()
printDns numThreads mtype domains =
    seq mtype . withDnsCache numThreads 300 $ \dns ->
        massLookupReport dns mtype domains $ \res -> do
            let dom = massDomain res
            printEntry dom "A"    $ map show (massA res)
            printEntry dom "AAAA" $ map show (massAAAA res)
            printEntry dom "MX"   $ massMX res


putHelp :: IO ()
putHelp = do
    progName <- getProgName
    hPrintf stderr "Usage: %s NUMTHREADS TYPE [DOMAINS]\n\n" progName
    hPutStrLn stderr "If no domains are specified, domain list is read from stdin."
    hPutStrLn stderr "TYPE can be one of 'A', 'AAAA', 'MX' and 'all'."


toMassType :: String -> MassType
toMassType "A" = MassA
toMassType "AAAA" = MassAAAA
toMassType "MX" = MassMX
toMassType "all" = MassAll
toMassType _ = error "Unknown resource type."


main :: IO ()
main = do
    args <- getArgs
    case args of
      ["-h"]             -> putHelp
      ["--help"]         -> putHelp
      [ntStr,typeStr]    -> fmap lines getContents >>=
                            printDns (read ntStr) (toMassType typeStr)
      ntStr:typeStr:doms -> printDns (read ntStr) (toMassType typeStr) doms
      _                  -> putHelp