X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=ExampleDNSServer.hs;h=9fb8ee6e7ca3765a23b23e173483c2de1ee0a0fc;hb=248b1c63284bbe00550bf2402ee6a9da6997143e;hp=f590caab054b7d58240b9ae1c0e9d208682c42fc;hpb=d24a461f09bd10e3fe148e3b6b86c8e861b09a43;p=haskell-dns.git diff --git a/ExampleDNSServer.hs b/ExampleDNSServer.hs index f590caa..9fb8ee6 100644 --- a/ExampleDNSServer.hs +++ b/ExampleDNSServer.hs @@ -1,45 +1,74 @@ 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 main :: IO () -main = runNamed cnf zoneFor +main = runNamed cnf (return . findZone) where cnf :: Config cnf = Config { cnfServerAddress = SockAddrInet 9090 iNADDR_ANY + , cnfAllowTransfer = True } - zoneFor :: DomainName -> Maybe Zone - zoneFor name + findZone :: DomainName -> Maybe Zone + findZone name | name `isInZone` zone = Just zone | otherwise = Nothing zone :: Zone zone = Zone { - zoneName = mkDN "cielonegro.org." - , zoneResponders = [ wrapResponder' $ - 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" - ] - , zoneIsAuthoritative = True + 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 } - wrapResponder' :: Responder A IN () -> SomeResponder - wrapResponder' = wrapResponder + 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