support using haskell-dns for SRV lookups
This library should be easier to install than ADNS, so I've made it be used by default.
This commit is contained in:
		
					parent
					
						
							
								64e1d7b579
							
						
					
				
			
			
				commit
				
					
						9173c66e40
					
				
			
		
					 4 changed files with 44 additions and 16 deletions
				
			
		
							
								
								
									
										4
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -6,7 +6,7 @@ BASEFLAGS=-Wall -outputdir $(GIT_ANNEX_TMP_BUILD_DIR) -IUtility
 | 
			
		|||
# you can turn off some of these features.
 | 
			
		||||
#
 | 
			
		||||
# If you're using an old version of yesod, enable -DWITH_OLD_YESOD
 | 
			
		||||
FEATURES?=$(GIT_ANNEX_LOCAL_FEATURES) -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_XMPP
 | 
			
		||||
FEATURES?=$(GIT_ANNEX_LOCAL_FEATURES) -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_XMPP -DWITH_DNS
 | 
			
		||||
 | 
			
		||||
bins=git-annex
 | 
			
		||||
mans=git-annex.1 git-annex-shell.1
 | 
			
		||||
| 
						 | 
				
			
			@ -142,7 +142,7 @@ sdist: clean $(mans)
 | 
			
		|||
hackage: sdist
 | 
			
		||||
	@cabal upload dist/*.tar.gz
 | 
			
		||||
 | 
			
		||||
THIRDPARTY_BINS=git curl lsof xargs rsync uuid wget gpg host \
 | 
			
		||||
THIRDPARTY_BINS=git curl lsof xargs rsync uuid wget gpg \
 | 
			
		||||
	sha1sum sha224sum sha256sum sha384sum sha512sum
 | 
			
		||||
 | 
			
		||||
LINUXSTANDALONE_DEST=$(GIT_ANNEX_TMP_BUILD_DIR)/git-annex.linux
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
{- SRV record lookup
 | 
			
		||||
 -
 | 
			
		||||
 - Uses either the ADNS Haskell library, or if it's not installed,
 | 
			
		||||
 - the host command.
 | 
			
		||||
 - Uses either the ADNS Haskell library, or the standalone Haskell DNS
 | 
			
		||||
 - package, or the host command.
 | 
			
		||||
 -
 | 
			
		||||
 - Copyright 2012 Joey Hess <joey@kitenet.net>
 | 
			
		||||
 -
 | 
			
		||||
| 
						 | 
				
			
			@ -30,6 +30,12 @@ import Data.Maybe
 | 
			
		|||
#ifdef WITH_ADNS
 | 
			
		||||
import ADNS.Resolver
 | 
			
		||||
import Data.Either
 | 
			
		||||
#else
 | 
			
		||||
#ifdef WITH_DNS
 | 
			
		||||
import qualified Network.DNS.Lookup as DNS
 | 
			
		||||
import Network.DNS.Resolver
 | 
			
		||||
import qualified Data.ByteString.UTF8 as B8
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
newtype SRV = SRV String
 | 
			
		||||
| 
						 | 
				
			
			@ -37,6 +43,8 @@ newtype SRV = SRV String
 | 
			
		|||
 | 
			
		||||
type HostPort = (HostName, PortID)
 | 
			
		||||
 | 
			
		||||
type PriorityWeight = (Int, Int) -- sort by priority first, then weight
 | 
			
		||||
 | 
			
		||||
mkSRV :: String -> String -> HostName -> SRV
 | 
			
		||||
mkSRV transport protocol host = SRV $ concat
 | 
			
		||||
	["_", protocol, "._", transport, ".", host]
 | 
			
		||||
| 
						 | 
				
			
			@ -49,13 +57,27 @@ mkSRVTcp = mkSRV "tcp"
 | 
			
		|||
 - On error, returns an empty list. -}
 | 
			
		||||
lookupSRV :: SRV -> IO [HostPort]
 | 
			
		||||
#ifdef WITH_ADNS
 | 
			
		||||
lookupSRV srv = initResolver [] $ \resolver -> do
 | 
			
		||||
lookupSRV (SRV srv) = initResolver [] $ \resolver -> do
 | 
			
		||||
	r <- catchDefaultIO (Right []) $
 | 
			
		||||
		resolveSRV resolver srv
 | 
			
		||||
	return $ either (\_ -> []) id r
 | 
			
		||||
#else
 | 
			
		||||
#ifdef WITH_DNS
 | 
			
		||||
lookupSRV (SRV srv) = do
 | 
			
		||||
	seed <- makeResolvSeed defaultResolvConf
 | 
			
		||||
	print srv
 | 
			
		||||
	r <- withResolver seed $ flip DNS.lookupSRV $ B8.fromString srv
 | 
			
		||||
	print r
 | 
			
		||||
	return $ maybe [] (orderHosts . map tohosts) r
 | 
			
		||||
	where
 | 
			
		||||
		tohosts (priority, weight, port, hostname) =
 | 
			
		||||
			( (priority, weight)
 | 
			
		||||
			, (B8.toString hostname, PortNumber $ fromIntegral port)
 | 
			
		||||
			)
 | 
			
		||||
#else
 | 
			
		||||
lookupSRV = lookupSRVHost
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
lookupSRVHost :: SRV -> IO [HostPort]
 | 
			
		||||
lookupSRVHost (SRV srv)
 | 
			
		||||
| 
						 | 
				
			
			@ -66,17 +88,22 @@ lookupSRVHost (SRV srv)
 | 
			
		|||
	| otherwise = return []
 | 
			
		||||
 | 
			
		||||
parseSrvHost :: String -> [HostPort]
 | 
			
		||||
parseSrvHost = map snd . reverse . sortBy cost . catMaybes . map parse . lines
 | 
			
		||||
parseSrvHost = orderHosts . catMaybes . map parse . lines
 | 
			
		||||
	where
 | 
			
		||||
		cost = compare `on` fst
 | 
			
		||||
		parse l = case words l of
 | 
			
		||||
			[_, _, _, _, priority, weight, sport, hostname] -> do
 | 
			
		||||
				let v = readish sport :: Maybe Int
 | 
			
		||||
			[_, _, _, _, spriority, sweight, sport, hostname] -> do
 | 
			
		||||
				let v = 
 | 
			
		||||
					( readish sport :: Maybe Int
 | 
			
		||||
					, readish spriority :: Maybe Int
 | 
			
		||||
					, readish sweight :: Maybe Int
 | 
			
		||||
					)
 | 
			
		||||
				case v of
 | 
			
		||||
					Nothing -> Nothing
 | 
			
		||||
					Just port -> Just
 | 
			
		||||
					(Just port, Just priority, Just weight) -> Just
 | 
			
		||||
						( (priority, weight)
 | 
			
		||||
						, (hostname, PortNumber $ fromIntegral port)
 | 
			
		||||
						)
 | 
			
		||||
					_ -> Nothing
 | 
			
		||||
			_ -> Nothing
 | 
			
		||||
 | 
			
		||||
orderHosts :: [(PriorityWeight, HostPort)] -> [HostPort]
 | 
			
		||||
orderHosts = map snd . sortBy (compare `on` fst)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,6 +43,7 @@ quite a lot.
 | 
			
		|||
  * [network-multicast](http://hackage.haskell.org/package/network-multicast)
 | 
			
		||||
  * [network-info](http://hackage.haskell.org/package/network-info)
 | 
			
		||||
  * [network-protocol-xmpp](http://hackage.haskell.org/package/network-protocol-xmpp)
 | 
			
		||||
  * [dns](http://hackage.haskell.org/package/dns)
 | 
			
		||||
* Shell commands
 | 
			
		||||
  * [git](http://git-scm.com/)
 | 
			
		||||
  * [uuid](http://www.ossp.org/pkg/lib/uuid/)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,8 +46,8 @@ Flag Pairing
 | 
			
		|||
Flag XMPP
 | 
			
		||||
  Description: Enable notifications using XMPP
 | 
			
		||||
 | 
			
		||||
Flag Adns
 | 
			
		||||
  Description: Enable the ADNS library for DNS lookup
 | 
			
		||||
Flag DNS
 | 
			
		||||
  Description: Enable the haskell DNS library for DNS lookup
 | 
			
		||||
 | 
			
		||||
Executable git-annex
 | 
			
		||||
  Main-Is: git-annex.hs
 | 
			
		||||
| 
						 | 
				
			
			@ -101,9 +101,9 @@ Executable git-annex
 | 
			
		|||
    Build-Depends: network-protocol-xmpp, gnutls (>= 0.1.4)
 | 
			
		||||
    CPP-Options: -DWITH_XMPP
 | 
			
		||||
 | 
			
		||||
  if flag(XMPP) && flag(Assistant) && flag(Adns)
 | 
			
		||||
    Build-Depends: hsdns
 | 
			
		||||
    CPP-Options: -DWITH_ADNS
 | 
			
		||||
  if flag(XMPP) && flag(Assistant) && flag(DNS)
 | 
			
		||||
    Build-Depends: dns
 | 
			
		||||
    CPP-Options: -DWITH_DNS
 | 
			
		||||
 | 
			
		||||
Test-Suite test
 | 
			
		||||
  Type: exitcode-stdio-1.0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue