2012-09-21 20:23:25 +00:00
|
|
|
{- git-annex command
|
|
|
|
-
|
2015-01-21 16:50:09 +00:00
|
|
|
- Copyright 2012 Joey Hess <id@joeyh.name>
|
2012-09-21 20:23:25 +00:00
|
|
|
-
|
2019-03-13 19:48:14 +00:00
|
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
2012-09-21 20:23:25 +00:00
|
|
|
-}
|
|
|
|
|
|
|
|
module Command.TransferInfo where
|
|
|
|
|
|
|
|
import Command
|
|
|
|
import Annex.Content
|
2016-08-03 16:37:12 +00:00
|
|
|
import Types.Transfer
|
2012-09-21 20:23:25 +00:00
|
|
|
import Logs.Transfer
|
2014-01-26 20:32:55 +00:00
|
|
|
import qualified CmdLine.GitAnnexShell.Fields as Fields
|
2013-03-28 21:03:04 +00:00
|
|
|
import Utility.Metered
|
2016-12-09 17:34:00 +00:00
|
|
|
import Utility.SimpleProtocol
|
2012-09-21 20:23:25 +00:00
|
|
|
|
2015-07-08 16:33:27 +00:00
|
|
|
cmd :: Command
|
2015-07-08 19:08:02 +00:00
|
|
|
cmd = noCommit $
|
|
|
|
command "transferinfo" SectionPlumbing
|
|
|
|
"updates sender on number of bytes of content received"
|
|
|
|
paramKey (withParams seek)
|
2012-09-21 20:23:25 +00:00
|
|
|
|
2015-07-08 16:33:27 +00:00
|
|
|
seek :: CmdParams -> CommandSeek
|
2018-10-01 18:12:06 +00:00
|
|
|
seek = withWords (commandAction . start)
|
2012-09-21 20:23:25 +00:00
|
|
|
|
|
|
|
{- Security:
|
|
|
|
-
|
|
|
|
- The transfer info file contains the user-supplied key, but
|
|
|
|
- the built-in guards prevent slashes in it from showing up in the filename.
|
|
|
|
- It also contains the UUID of the remote. But slashes are also filtered
|
|
|
|
- out of that when generating the filename.
|
|
|
|
-
|
|
|
|
- Checks that the key being transferred is inAnnex, to prevent
|
|
|
|
- malicious spamming of bogus keys. Does not check that a transfer
|
|
|
|
- of the key is actually in progress, because this could be started
|
|
|
|
- concurrently with sendkey, and win the race.
|
|
|
|
-}
|
2012-09-22 03:25:06 +00:00
|
|
|
start :: [String] -> CommandStart
|
|
|
|
start (k:[]) = do
|
2019-01-14 17:17:47 +00:00
|
|
|
case deserializeKey k of
|
2012-09-22 03:25:06 +00:00
|
|
|
Nothing -> error "bad key"
|
|
|
|
(Just key) -> whenM (inAnnex key) $ do
|
2017-03-10 17:12:24 +00:00
|
|
|
afile <- AssociatedFile <$> Fields.getField Fields.associatedFile
|
2012-09-22 03:25:06 +00:00
|
|
|
u <- maybe (error "missing remoteuuid") toUUID
|
|
|
|
<$> Fields.getField Fields.remoteUUID
|
|
|
|
let t = Transfer
|
|
|
|
{ transferDirection = Upload
|
|
|
|
, transferUUID = u
|
|
|
|
, transferKey = key
|
|
|
|
}
|
2017-03-10 17:12:24 +00:00
|
|
|
tinfo <- liftIO $ startTransferInfo afile
|
2018-03-14 22:55:27 +00:00
|
|
|
(update, tfile, createtfile, _) <- mkProgressUpdater t tinfo
|
|
|
|
createtfile
|
2012-09-22 03:25:06 +00:00
|
|
|
liftIO $ mapM_ void
|
|
|
|
[ tryIO $ forever $ do
|
2013-03-28 21:03:04 +00:00
|
|
|
bytes <- readUpdate
|
|
|
|
maybe (error "transferinfo protocol error")
|
|
|
|
(update . toBytesProcessed) bytes
|
2012-09-22 03:25:06 +00:00
|
|
|
, tryIO $ removeFile tfile
|
|
|
|
, exitSuccess
|
|
|
|
]
|
|
|
|
stop
|
2016-11-16 01:29:54 +00:00
|
|
|
start _ = giveup "wrong number of parameters"
|
2013-03-28 21:03:04 +00:00
|
|
|
|
|
|
|
readUpdate :: IO (Maybe Integer)
|
2016-12-09 17:34:00 +00:00
|
|
|
readUpdate = maybe Nothing readish <$> getProtocolLine stdin
|