X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=ExampleDNSServer.hs;h=1aae098bc93e93dcaa1dc582deb164fba202bc2a;hb=f3ad40fd6916408dde9b9e6237b41828d90c1e34;hp=b366e14e1a9dc5d5b07b2ee57ced84ead301e358;hpb=68e58e5c4aaf0279f041c251e73e4aaccf616286;p=haskell-dns.git diff --git a/ExampleDNSServer.hs b/ExampleDNSServer.hs index b366e14..1aae098 100644 --- a/ExampleDNSServer.hs +++ b/ExampleDNSServer.hs @@ -1,45 +1,83 @@ +import Network.DNS.DomainMap (DomainMap) import Network.DNS.Message import Network.DNS.Named import Network.DNS.Named.Config -import Network.DNS.Named.Responder import Network.DNS.Named.Zone -import Network.Socket -import System.IO.Unsafe +import Network.Socket.IsString () main :: IO () -main = runNamed cnf zoneFor +main = runNamed cnf zones where cnf :: Config cnf = Config { - cnfServerAddress = SockAddrInet 9090 iNADDR_ANY + cnfServerPort = "9090" + , cnfAllowTransfer = True } - zoneFor :: DomainName -> Maybe Zone - zoneFor name - | name `isInZone` zone = Just zone - | otherwise = Nothing + zones :: DomainMap Zone + zones = fromZones + [ Zone { + zoneName = "cielonegro.org." + , zoneSOA = Just SOAFields { + soaMasterNameServer = "ns.cielonegro.org." + , soaResponsibleMailbox = "root.ns.cielonegro.org." + , soaSerialNumber = 2008022148 + , soaRefreshInterval = 3600 + , soaRetryInterval = 900 + , soaExpirationLimit = 3600000 + , soaMinimumTTL = 3600 + } + , zoneRecordNames = return [ "ns.cielonegro.org." + , "www.cielonegro.org." + , "git.cielonegro.org." + ] + , zoneResponder = return . responder + } + ] - zone :: Zone - zone = Zone { - zoneName = mkDN "cielonegro.org." - , zoneResponders = [ wrapResponder responderA - ] - , zoneIsAuthoritative = True - } + responder :: DomainName -> [SomeRR] + responder name + | name == "ns.cielonegro.org." + = [ wrapRecord ResourceRecord { + rrName = name + , rrType = A + , rrClass = IN + , rrTTL = 9600 + , rrData = "127.0.0.1" + } + , wrapRecord ResourceRecord { + rrName = name + , rrType = AAAA + , rrClass = IN + , rrTTL = 9600 + , rrData = "::1" + } + ] + | name == "www.cielonegro.org." + = [ wrapRecord ResourceRecord { + rrName = name + , rrType = A + , rrClass = IN + , rrTTL = 9600 + , rrData = "127.0.0.2" + } + , wrapRecord ResourceRecord { + rrName = name + , rrType = AAAA + , rrClass = IN + , rrTTL = 9600 + , rrData = "fe80::216:cbff:fe39:56a4" + } + ] + | name == "git.cielonegro.org." + = [ wrapRecord ResourceRecord { + rrName = name + , rrType = CNAME + , rrClass = IN + , rrTTL = 9600 + , rrData = "www.cielonegro.org." + } + ] + | otherwise + = [] -- This means NXDOMAIN. - responderA :: Responder A IN () - responderA = do name <- getQueryName - if name == mkDN "ns.cielonegro.org." then - respond ResourceRecord { - rrName = name - , rrType = A - , rrClass = IN - , rrTTL = 9600 - , rrData = inetAddr "127.0.0.1" - } - else - fail "FIXME: we want to throw NameError but we can't for now" - - -inetAddr :: String -> HostAddress -inetAddr = unsafePerformIO . inet_addr