import Network.DNS.Message import Network.DNS.Named import Network.DNS.Named.Config import Network.DNS.Named.Zone import Network.Socket import System.IO.Unsafe main :: IO () main = runNamed cnf (return . findZone) where cnf :: Config cnf = Config { cnfServerAddress = SockAddrInet 9090 iNADDR_ANY , cnfAllowTransfer = True } findZone :: DomainName -> Maybe Zone findZone name | name `isInZone` zone = Just zone | otherwise = Nothing zone :: Zone zone = Zone { zoneName = mkDN "cielonegro.org." , zoneSOA = Just SOAFields { soaMasterNameServer = mkDN "ns.cielonegro.org." , soaResponsibleMailbox = mkDN "root.ns.cielonegro.org." , soaSerialNumber = 2008022148 , soaRefreshInterval = 3600 , soaRetryInterval = 900 , soaExpirationLimit = 3600000 , soaMinimumTTL = 3600 } , zoneRecordNames = return [ mkDN "ns.cielonegro.org." , mkDN "www.cielonegro.org." , mkDN "git.cielonegro.org." ] , zoneResponder = return . responder } responder :: DomainName -> [SomeRR] responder name | name == mkDN "ns.cielonegro.org." = [ wrapRecord ResourceRecord { rrName = name , rrType = A , rrClass = IN , rrTTL = 9600 , rrData = inetAddr "127.0.0.1" } ] | name == mkDN "www.cielonegro.org." = [ wrapRecord ResourceRecord { rrName = name , rrType = A , rrClass = IN , rrTTL = 9600 , rrData = inetAddr "127.0.0.2" } ] | name == mkDN "git.cielonegro.org." = [ wrapRecord ResourceRecord { rrName = name , rrType = CNAME , rrClass = IN , rrTTL = 9600 , rrData = mkDN "www.cielonegro.org." } ] | otherwise = [] -- This means NXDOMAIN. inetAddr :: String -> HostAddress inetAddr = unsafePerformIO . inet_addr