]> gitweb @ CieloNegro.org - haskell-dns.git/blob - ExampleDNSServer.hs
DomainMap: totally untested yet
[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
6 import           System.IO.Unsafe
7
8 main :: IO ()
9 main = runNamed cnf (return . findZone)
10     where
11       cnf :: Config
12       cnf = Config {
13               cnfServerAddress = SockAddrInet 9090 iNADDR_ANY
14             , cnfAllowTransfer = True
15             }
16
17       findZone :: DomainName -> Maybe Zone
18       findZone name
19           | name `isInZone` zone = Just zone
20           | otherwise            = Nothing
21
22       zone :: Zone
23       zone = Zone {
24                zoneName = mkDN "cielonegro.org."
25              , zoneSOA  = Just SOAFields {
26                             soaMasterNameServer   = mkDN "ns.cielonegro.org."
27                           , soaResponsibleMailbox = mkDN "root.ns.cielonegro.org."
28                           , soaSerialNumber       = 2008022148
29                           , soaRefreshInterval    = 3600
30                           , soaRetryInterval      = 900
31                           , soaExpirationLimit    = 3600000
32                           , soaMinimumTTL         = 3600
33                           }
34              , zoneRecordNames = return [ mkDN "ns.cielonegro.org."
35                                         , mkDN "www.cielonegro.org."
36                                         , mkDN "git.cielonegro.org."
37                                         ]
38              , zoneResponder   = return . responder
39              }
40
41       responder :: DomainName -> [SomeRR]
42       responder name
43           | name == mkDN "ns.cielonegro.org."
44               = [ wrapRecord ResourceRecord {
45                                    rrName  = name
46                                  , rrType  = A
47                                  , rrClass = IN
48                                  , rrTTL   = 9600
49                                  , rrData  = inetAddr "127.0.0.1"
50                                  }
51                 ]
52           | name == mkDN "www.cielonegro.org."
53               = [ wrapRecord ResourceRecord {
54                                    rrName  = name
55                                  , rrType  = A
56                                  , rrClass = IN
57                                  , rrTTL   = 9600
58                                  , rrData  = inetAddr "127.0.0.2"
59                                  }
60                 ]
61           | name == mkDN "git.cielonegro.org."
62               = [ wrapRecord ResourceRecord {
63                                    rrName  = name
64                                  , rrType  = CNAME
65                                  , rrClass = IN
66                                  , rrTTL   = 9600
67                                  , rrData  = mkDN "www.cielonegro.org."
68                                  }
69                 ]
70           | otherwise
71               = [] -- This means NXDOMAIN.
72
73
74 inetAddr :: String -> HostAddress
75 inetAddr = unsafePerformIO . inet_addr