{- Web remote. - - Copyright 2011 Joey Hess - - Licensed under the GNU GPL version 3 or higher. -} {-# LANGUAGE CPP #-} module Remote.Web (remote) where import Common.Annex import Types.Remote import qualified Git import qualified Git.Construct import Annex.Content import Config.Cost import Logs.Web import Annex.UUID import Types.Key import Utility.Metered import qualified Annex.Url as Url #ifdef WITH_QUVI import Annex.Quvi import qualified Utility.Quvi as Quvi #endif remote :: RemoteType 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] list = do r <- liftIO $ Git.Construct.remoteNamed "web" (pure Git.Construct.fromUnknown) return [r] gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) gen r _ c gc = 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 } downloadKey :: Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool downloadKey key _file dest _p = get =<< getWebUrls key where get [] = do warning "no known url" return False get urls = do showOutput -- make way for download progress bar untilTrue urls $ \u -> do let (u', downloader) = getDownloader u case downloader of 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 _ -> downloadUrl [u'] dest downloadKeyCheap :: Key -> FilePath -> Annex Bool downloadKeyCheap _ _ = return False uploadKey :: Key -> AssociatedFile -> MeterUpdate -> Annex Bool uploadKey _ _ _ = do warning "upload to web not supported" return False dropKey :: Key -> Annex Bool dropKey k = do mapM_ (setUrlMissing webUUID k) =<< getWebUrls k return True checkKey :: Key -> Annex Bool checkKey key = do us <- getWebUrls key if null us then return False else either error return =<< checkKey' key us checkKey' :: Key -> [URLString] -> Annex (Either String Bool) checkKey' key us = firsthit us (Right False) $ \u -> do let (u', downloader) = getDownloader u showAction $ "checking " ++ u' case downloader of QuviDownloader -> #ifdef WITH_QUVI Right <$> withQuviOptions Quvi.check [Quvi.httponly, Quvi.quiet] u' #else return $ Left "quvi support needed for this url" #endif _ -> do Url.withUrlOptions $ catchMsgIO . Url.checkBoth u' (keySize key) where firsthit [] miss _ = return miss firsthit (u:rest) _ a = do r <- a u case r of Right _ -> return r Left _ -> firsthit rest r a getWebUrls :: Key -> Annex [URLString] getWebUrls key = filter supported <$> getUrls key where supported u = snd (getDownloader u) `elem` [WebDownloader, QuviDownloader]