2014-12-08 19:14:24 -04:00
|
|
|
{- Web remote.
|
2011-07-01 15:24:07 -04:00
|
|
|
-
|
2015-01-21 12:50:09 -04:00
|
|
|
- Copyright 2011 Joey Hess <id@joeyh.name>
|
2011-07-01 15:24:07 -04:00
|
|
|
-
|
|
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
|
|
-}
|
|
|
|
|
2013-09-09 02:16:22 -04:00
|
|
|
{-# LANGUAGE CPP #-}
|
|
|
|
|
2011-10-15 16:36:56 -04:00
|
|
|
module Remote.Web (remote) where
|
2011-07-01 15:24:07 -04:00
|
|
|
|
2011-10-05 16:02:51 -04:00
|
|
|
import Common.Annex
|
2011-07-01 15:24:07 -04:00
|
|
|
import Types.Remote
|
|
|
|
import qualified Git
|
2011-12-13 15:05:07 -04:00
|
|
|
import qualified Git.Construct
|
2012-01-02 14:20:20 -04:00
|
|
|
import Annex.Content
|
2013-03-13 16:16:01 -04:00
|
|
|
import Config.Cost
|
2011-10-15 16:25:51 -04:00
|
|
|
import Logs.Web
|
2014-12-17 13:57:52 -04:00
|
|
|
import Annex.UUID
|
2012-02-10 19:17:41 -04:00
|
|
|
import Types.Key
|
2013-03-28 17:03:04 -04:00
|
|
|
import Utility.Metered
|
2013-09-28 14:35:21 -04:00
|
|
|
import qualified Annex.Url as Url
|
2013-09-09 02:16:22 -04:00
|
|
|
#ifdef WITH_QUVI
|
2013-08-22 18:25:21 -04:00
|
|
|
import Annex.Quvi
|
|
|
|
import qualified Utility.Quvi as Quvi
|
2013-09-09 02:16:22 -04:00
|
|
|
#endif
|
2011-07-01 15:24:07 -04:00
|
|
|
|
2011-12-31 04:11:39 -04:00
|
|
|
remote :: RemoteType
|
2011-07-01 15:24:07 -04:00
|
|
|
remote = RemoteType {
|
|
|
|
typename = "web",
|
|
|
|
enumerate = list,
|
|
|
|
generate = gen,
|
|
|
|
setup = error "not supported"
|
|
|
|
}
|
|
|
|
|
|
|
|
-- There is only one web remote, and it always exists.
|
|
|
|
-- (If the web should cease to exist, remove this module and redistribute
|
|
|
|
-- a new release to the survivors by carrier pigeon.)
|
|
|
|
list :: Annex [Git.Repo]
|
2011-12-14 15:30:14 -04:00
|
|
|
list = do
|
2015-02-12 15:33:05 -04:00
|
|
|
r <- liftIO $ Git.Construct.remoteNamed "web" (pure Git.Construct.fromUnknown)
|
2011-12-14 15:30:14 -04:00
|
|
|
return [r]
|
2011-07-01 15:24:07 -04:00
|
|
|
|
2013-09-12 15:54:35 -04:00
|
|
|
gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote)
|
2013-11-02 19:54:59 -04:00
|
|
|
gen r _ c gc =
|
2014-12-16 15:26:13 -04:00
|
|
|
return $ Just Remote
|
|
|
|
{ uuid = webUUID
|
|
|
|
, cost = expensiveRemoteCost
|
|
|
|
, name = Git.repoDescribe r
|
|
|
|
, storeKey = uploadKey
|
|
|
|
, retrieveKeyFile = downloadKey
|
|
|
|
, retrieveKeyFileCheap = downloadKeyCheap
|
|
|
|
, removeKey = dropKey
|
|
|
|
, checkPresent = checkKey
|
|
|
|
, checkPresentCheap = False
|
|
|
|
, whereisKey = Just getWebUrls
|
|
|
|
, remoteFsck = Nothing
|
|
|
|
, repairRepo = Nothing
|
|
|
|
, config = c
|
|
|
|
, gitconfig = gc
|
|
|
|
, localpath = Nothing
|
|
|
|
, repo = r
|
|
|
|
, readonly = True
|
|
|
|
, availability = GloballyAvailable
|
|
|
|
, remotetype = remote
|
|
|
|
, mkUnavailable = return Nothing
|
|
|
|
, getInfo = return []
|
|
|
|
, claimUrl = Nothing -- implicitly claims all urls
|
|
|
|
, checkUrl = Nothing
|
|
|
|
}
|
2011-07-01 15:24:07 -04:00
|
|
|
|
2013-04-11 17:15:45 -04:00
|
|
|
downloadKey :: Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool
|
2014-12-08 19:14:24 -04:00
|
|
|
downloadKey key _file dest _p = get =<< getWebUrls key
|
2012-11-11 00:51:07 -04:00
|
|
|
where
|
|
|
|
get [] = do
|
|
|
|
warning "no known url"
|
|
|
|
return False
|
|
|
|
get urls = do
|
|
|
|
showOutput -- make way for download progress bar
|
2013-08-22 18:25:21 -04:00
|
|
|
untilTrue urls $ \u -> do
|
|
|
|
let (u', downloader) = getDownloader u
|
|
|
|
case downloader of
|
2013-09-09 02:16:22 -04:00
|
|
|
QuviDownloader -> do
|
|
|
|
#ifdef WITH_QUVI
|
|
|
|
flip downloadUrl dest
|
|
|
|
=<< withQuviOptions Quvi.queryLinks [Quvi.httponly, Quvi.quiet] u'
|
|
|
|
#else
|
|
|
|
warning "quvi support needed for this url"
|
|
|
|
return False
|
|
|
|
#endif
|
2014-12-08 19:14:24 -04:00
|
|
|
_ -> downloadUrl [u'] dest
|
2011-07-01 15:24:07 -04:00
|
|
|
|
2012-01-20 13:23:11 -04:00
|
|
|
downloadKeyCheap :: Key -> FilePath -> Annex Bool
|
|
|
|
downloadKeyCheap _ _ = return False
|
|
|
|
|
2012-09-21 14:50:14 -04:00
|
|
|
uploadKey :: Key -> AssociatedFile -> MeterUpdate -> Annex Bool
|
2012-09-19 16:08:37 -04:00
|
|
|
uploadKey _ _ _ = do
|
2011-07-01 15:24:07 -04:00
|
|
|
warning "upload to web not supported"
|
|
|
|
return False
|
|
|
|
|
2011-07-01 17:15:46 -04:00
|
|
|
dropKey :: Key -> Annex Bool
|
2012-11-29 17:01:07 -04:00
|
|
|
dropKey k = do
|
2014-12-08 19:14:24 -04:00
|
|
|
mapM_ (setUrlMissing webUUID k) =<< getWebUrls k
|
2012-11-29 17:01:07 -04:00
|
|
|
return True
|
2011-07-01 15:24:07 -04:00
|
|
|
|
2014-08-06 13:45:19 -04:00
|
|
|
checkKey :: Key -> Annex Bool
|
2011-07-01 17:15:46 -04:00
|
|
|
checkKey key = do
|
2014-12-08 19:14:24 -04:00
|
|
|
us <- getWebUrls key
|
2011-07-01 15:24:07 -04:00
|
|
|
if null us
|
2014-08-06 13:45:19 -04:00
|
|
|
then return False
|
|
|
|
else either error return =<< checkKey' key us
|
2013-09-09 02:16:22 -04:00
|
|
|
checkKey' :: Key -> [URLString] -> Annex (Either String Bool)
|
|
|
|
checkKey' key us = firsthit us (Right False) $ \u -> do
|
2013-08-22 18:25:21 -04:00
|
|
|
let (u', downloader) = getDownloader u
|
|
|
|
showAction $ "checking " ++ u'
|
|
|
|
case downloader of
|
|
|
|
QuviDownloader ->
|
2013-09-09 02:16:22 -04:00
|
|
|
#ifdef WITH_QUVI
|
|
|
|
Right <$> withQuviOptions Quvi.check [Quvi.httponly, Quvi.quiet] u'
|
|
|
|
#else
|
|
|
|
return $ Left "quvi support needed for this url"
|
|
|
|
#endif
|
2014-12-08 19:14:24 -04:00
|
|
|
_ -> do
|
2014-02-24 22:00:25 -04:00
|
|
|
Url.withUrlOptions $ catchMsgIO .
|
|
|
|
Url.checkBoth u' (keySize key)
|
2013-09-09 02:16:22 -04:00
|
|
|
where
|
2014-10-09 14:53:13 -04:00
|
|
|
firsthit [] miss _ = return miss
|
2013-09-09 02:16:22 -04:00
|
|
|
firsthit (u:rest) _ a = do
|
|
|
|
r <- a u
|
|
|
|
case r of
|
|
|
|
Right _ -> return r
|
|
|
|
Left _ -> firsthit rest r a
|
2014-12-08 19:14:24 -04:00
|
|
|
|
|
|
|
getWebUrls :: Key -> Annex [URLString]
|
|
|
|
getWebUrls key = filter supported <$> getUrls key
|
|
|
|
where
|
|
|
|
supported u = snd (getDownloader u)
|
|
|
|
`elem` [WebDownloader, QuviDownloader]
|