]> gitweb @ CieloNegro.org - haskell-dns.git/blobdiff - ExampleDNSServer.hs
AAAA support
[haskell-dns.git] / ExampleDNSServer.hs
index 9e1b4cd9393f846c304d641394c9206741880f94..75b261aa9effb9349a6f4e7d9a0f75fd557b5803 100644 (file)
@@ -1,15 +1,85 @@
 import           Network.DNS.Message
 import           Network.DNS.Named
 import           Network.DNS.Named.Config
-import           Network.Socket
+import           Network.DNS.Named.Zone
+import           Network.Socket.IsString ()
 
 main :: IO ()
-main = runNamed cnf zoneFor
+main = runNamed cnf (return . findZone)
     where
       cnf :: Config
       cnf = Config {
-              cnfServerAddress = SockAddrInet 9090 iNADDR_ANY
+              cnfServerPort    = "9090"
+            , cnfAllowTransfer = True
             }
 
-      zoneFor :: DomainName -> Maybe Zone
-      zoneFor = const Nothing -- FIXME
\ No newline at end of file
+      findZone :: DomainName -> Maybe Zone
+      findZone name
+          | name `isInZone` zone = Just zone
+          | otherwise            = Nothing
+
+      zone :: Zone
+      zone = 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
+             }
+
+      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.
+