blob: beb682f82cfc8d3226e11dc38540e73f20042ec2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
{-|
Upper level DNS lookup functions.
-}
module Network.DNS.Lookup (
lookupA, lookupAAAA
, lookupMX, lookupAviaMX, lookupAAAAviaMX
, lookupTXT
) where
import Control.Applicative
import qualified Data.ByteString.Lazy.Char8 as L
import Data.IP
import Data.Maybe
import Network.DNS.Resolver as DNS
import Network.DNS.Types
----------------------------------------------------------------
{-|
Resolving 'IPv4' by 'A'.
-}
lookupA :: Resolver -> Domain -> IO (Maybe [IPv4])
lookupA rlv dom = toV4 <$> DNS.lookup rlv dom A
where
toV4 = maybe Nothing (Just . map unTag)
unTag (RD_A x) = x
unTag _ = error "lookupA"
{-|
Resolving 'IPv6' by 'AAAA'.
-}
lookupAAAA :: Resolver -> Domain -> IO (Maybe [IPv6])
lookupAAAA rlv dom = toV6 <$> DNS.lookup rlv dom AAAA
where
toV6 = maybe Nothing (Just . map unTag)
unTag (RD_AAAA x) = x
unTag _ = error "lookupAAAA"
----------------------------------------------------------------
{-|
Resolving 'Domain' and its preference by 'MX'.
-}
lookupMX :: Resolver -> Domain -> IO (Maybe [(Domain,Int)])
lookupMX rlv dom = toMX <$> DNS.lookup rlv dom MX
where
toMX = maybe Nothing (Just . map unTag)
unTag (RD_MX pr dm) = (dm,pr)
unTag _ = error "lookupMX"
{-|
Resolving 'IPv4' by 'A' via 'MX'.
-}
lookupAviaMX :: Resolver -> Domain -> IO (Maybe [IPv4])
lookupAviaMX rlv dom = lookupXviaMX rlv dom (lookupA rlv)
{-|
Resolving 'IPv6' by 'AAAA' via 'MX'.
-}
lookupAAAAviaMX :: Resolver -> Domain -> IO (Maybe [IPv6])
lookupAAAAviaMX rlv dom = lookupXviaMX rlv dom (lookupAAAA rlv)
lookupXviaMX :: Resolver -> Domain -> (Domain -> IO (Maybe [a])) -> IO (Maybe [a])
lookupXviaMX rlv dom func = do
mdps <- lookupMX rlv dom
maybe (return Nothing) lookup' mdps
where
lookup' dps = do
as <- catMaybes <$> mapM (func . fst) dps
case as of
[] -> return Nothing
ass -> return $ Just (concat ass)
----------------------------------------------------------------
{-|
Resolving 'String' by 'TXT'.
-}
lookupTXT :: Resolver -> Domain -> IO (Maybe [L.ByteString])
lookupTXT rlv dom = toTXT <$> DNS.lookup rlv dom TXT
where
toTXT = maybe Nothing (Just . map unTag)
unTag (RD_TXT x) = x
unTag _ = error "lookupTXT"
|