]> gitweb @ CieloNegro.org - haskell-dns.git/blob - ExampleDNSServer.hs
AAAA support
[haskell-dns.git] / ExampleDNSServer.hs
1 import           Network.DNS.Message
2 import           Network.DNS.Named
3 import           Network.DNS.Named.Config
4 import           Network.DNS.Named.Zone
5 import           Network.Socket.IsString ()
6
7 main :: IO ()
8 main = runNamed cnf (return . findZone)
9     where
10       cnf :: Config
11       cnf = Config {
12               cnfServerPort    = "9090"
13             , cnfAllowTransfer = True
14             }
15
16       findZone :: DomainName -> Maybe Zone
17       findZone name
18           | name `isInZone` zone = Just zone
19           | otherwise            = Nothing
20
21       zone :: Zone
22       zone = Zone {
23                zoneName = "cielonegro.org."
24              , zoneSOA  = Just SOAFields {
25                             soaMasterNameServer   = "ns.cielonegro.org."
26                           , soaResponsibleMailbox = "root.ns.cielonegro.org."
27                           , soaSerialNumber       = 2008022148
28                           , soaRefreshInterval    = 3600
29                           , soaRetryInterval      = 900
30                           , soaExpirationLimit    = 3600000
31                           , soaMinimumTTL         = 3600
32                           }
33              , zoneRecordNames = return [ "ns.cielonegro.org."
34                                         , "www.cielonegro.org."
35                                         , "git.cielonegro.org."
36                                         ]
37              , zoneResponder   = return . responder
38              }
39
40       responder :: DomainName -> [SomeRR]
41       responder name
42           | name == "ns.cielonegro.org."
43               = [ wrapRecord ResourceRecord {
44                                    rrName  = name
45                                  , rrType  = A
46                                  , rrClass = IN
47                                  , rrTTL   = 9600
48                                  , rrData  = "127.0.0.1"
49                                  }
50                 , wrapRecord ResourceRecord {
51                                    rrName  = name
52                                  , rrType  = AAAA
53                                  , rrClass = IN
54                                  , rrTTL   = 9600
55                                  , rrData  = "::1"
56                                  }
57                 ]
58           | name == "www.cielonegro.org."
59               = [ wrapRecord ResourceRecord {
60                                    rrName  = name
61                                  , rrType  = A
62                                  , rrClass = IN
63                                  , rrTTL   = 9600
64                                  , rrData  = "127.0.0.2"
65                                  }
66                 , wrapRecord ResourceRecord {
67                                    rrName  = name
68                                  , rrType  = AAAA
69                                  , rrClass = IN
70                                  , rrTTL   = 9600
71                                  , rrData  = "fe80::216:cbff:fe39:56a4"
72                                  }
73                 ]
74           | name == "git.cielonegro.org."
75               = [ wrapRecord ResourceRecord {
76                                    rrName  = name
77                                  , rrType  = CNAME
78                                  , rrClass = IN
79                                  , rrTTL   = 9600
80                                  , rrData  = "www.cielonegro.org."
81                                  }
82                 ]
83           | otherwise
84               = [] -- This means NXDOMAIN.
85