]> gitweb @ CieloNegro.org - haskell-dns.git/blob - ExampleDNSServer.hs
Farewell to the Sanity.hs
[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             }
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 = mkDN "cielonegro.org."
24              , zoneSOA  = Just SOAFields {
25                             soaMasterNameServer   = mkDN "ns.cielonegro.org."
26                           , soaResponsibleMailbox = mkDN "root.ns.cielonegro.org."
27                           , soaSerialNumber       = 2008022148
28                           , soaRefreshInterval    = 3600
29                           , soaRetryInterval      = 900
30                           , soaExpirationLimit    = 3600000
31                           , soaMinimumTTL         = 3600
32                           }
33              , zoneRecordNames = return [ mkDN "cielonegro.org."
34                                         , 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