support enabling IA repositories
This commit is contained in:
parent
2810807ca5
commit
8284b310a7
4 changed files with 64 additions and 11 deletions
|
@ -156,11 +156,17 @@ postAddGlacierR = glacierConfigurator $ do
|
||||||
setStandardGroup (Remote.uuid r) SmallArchiveGroup
|
setStandardGroup (Remote.uuid r) SmallArchiveGroup
|
||||||
|
|
||||||
getEnableS3R :: UUID -> Handler RepHtml
|
getEnableS3R :: UUID -> Handler RepHtml
|
||||||
getEnableS3R = postEnableS3R
|
getEnableS3R uuid = do
|
||||||
|
m <- liftAnnex readRemoteLog
|
||||||
|
let host = fromMaybe "" $ M.lookup "host" $
|
||||||
|
fromJust $ M.lookup uuid m
|
||||||
|
if S3.isIAHost host
|
||||||
|
then redirect $ EnableIAR uuid
|
||||||
|
else postEnableS3R uuid
|
||||||
|
|
||||||
postEnableS3R :: UUID -> Handler RepHtml
|
postEnableS3R :: UUID -> Handler RepHtml
|
||||||
#ifdef WITH_S3
|
#ifdef WITH_S3
|
||||||
postEnableS3R = awsConfigurator . enableAWSRemote S3.remote
|
postEnableS3R uuid = awsConfigurator $ enableAWSRemote S3.remote uuid
|
||||||
#else
|
#else
|
||||||
postEnableS3R _ = error "S3 not supported by this build"
|
postEnableS3R _ = error "S3 not supported by this build"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -17,11 +17,11 @@ import qualified Remote.S3 as S3
|
||||||
import qualified Remote
|
import qualified Remote
|
||||||
import Types.StandardGroups
|
import Types.StandardGroups
|
||||||
import Logs.PreferredContent
|
import Logs.PreferredContent
|
||||||
|
import Logs.Remote
|
||||||
|
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Data.Map as M
|
import qualified Data.Map as M
|
||||||
import Data.Char
|
import Data.Char
|
||||||
import Network.Socket (HostName)
|
|
||||||
import Network.URI
|
import Network.URI
|
||||||
|
|
||||||
iaConfigurator :: Widget -> Handler RepHtml
|
iaConfigurator :: Widget -> Handler RepHtml
|
||||||
|
@ -83,6 +83,11 @@ iaInputAForm = IAInput
|
||||||
mediatypes :: [(Text, MediaType)]
|
mediatypes :: [(Text, MediaType)]
|
||||||
mediatypes = map (\t -> (T.pack $ showMediaType t, t)) [minBound..]
|
mediatypes = map (\t -> (T.pack $ showMediaType t, t)) [minBound..]
|
||||||
|
|
||||||
|
iaCredsAForm :: AForm WebApp WebApp AWS.AWSCreds
|
||||||
|
iaCredsAForm = AWS.AWSCreds
|
||||||
|
<$> accessKeyIDFieldWithHelp
|
||||||
|
<*> AWS.secretAccessKeyField
|
||||||
|
|
||||||
accessKeyIDFieldWithHelp :: AForm WebApp WebApp Text
|
accessKeyIDFieldWithHelp :: AForm WebApp WebApp Text
|
||||||
accessKeyIDFieldWithHelp = AWS.accessKeyIDField help
|
accessKeyIDFieldWithHelp = AWS.accessKeyIDField help
|
||||||
where
|
where
|
||||||
|
@ -106,7 +111,7 @@ postAddIAR = iaConfigurator $ do
|
||||||
M.fromList $ catMaybes
|
M.fromList $ catMaybes
|
||||||
[ Just $ configureEncryption NoEncryption
|
[ Just $ configureEncryption NoEncryption
|
||||||
, Just ("type", "S3")
|
, Just ("type", "S3")
|
||||||
, Just ("host", iaHost)
|
, Just ("host", S3.iaHost)
|
||||||
, Just ("bucket", escapeHeader name)
|
, Just ("bucket", escapeHeader name)
|
||||||
, Just ("x-archive-meta-title", escapeHeader $ T.unpack $ itemDescription input)
|
, Just ("x-archive-meta-title", escapeHeader $ T.unpack $ itemDescription input)
|
||||||
, if mediaType input == MediaOmitted
|
, if mediaType input == MediaOmitted
|
||||||
|
@ -129,20 +134,32 @@ getEnableIAR = postEnableIAR
|
||||||
|
|
||||||
postEnableIAR :: UUID -> Handler RepHtml
|
postEnableIAR :: UUID -> Handler RepHtml
|
||||||
#ifdef WITH_S3
|
#ifdef WITH_S3
|
||||||
postEnableIAR = iaConfigurator . AWS.enableAWSRemote S3.remote
|
postEnableIAR = iaConfigurator . enableIARemote
|
||||||
#else
|
#else
|
||||||
postEnableIAR _ = error "S3 not supported by this build"
|
postEnableIAR _ = error "S3 not supported by this build"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
enableIARemote :: UUID -> Widget
|
||||||
|
enableIARemote uuid = do
|
||||||
|
((result, form), enctype) <- lift $
|
||||||
|
runFormPost $ renderBootstrap iaCredsAForm
|
||||||
|
case result of
|
||||||
|
FormSuccess creds -> lift $ do
|
||||||
|
m <- liftAnnex readRemoteLog
|
||||||
|
let name = fromJust $ M.lookup "name" $
|
||||||
|
fromJust $ M.lookup uuid m
|
||||||
|
AWS.makeAWSRemote S3.remote creds name (const noop) M.empty
|
||||||
|
_ -> do
|
||||||
|
description <- liftAnnex $
|
||||||
|
T.pack <$> Remote.prettyUUID uuid
|
||||||
|
$(widgetFile "configurators/enableia")
|
||||||
|
|
||||||
{- Convert a description into a bucket name, which will also be
|
{- Convert a description into a bucket name, which will also be
|
||||||
- used as the repository name.
|
- used as the repository name.
|
||||||
- IA seems to need only lower case, and no spaces. -}
|
- IA seems to need only lower case, and no spaces. -}
|
||||||
escapeBucket :: String -> String
|
escapeBucket :: String -> String
|
||||||
escapeBucket = map toLower . replace " " "-"
|
escapeBucket = map toLower . replace " " ""
|
||||||
|
|
||||||
{- IA S3 API likes headers to be URI escaped, escaping spaces looks ugly. -}
|
{- IA S3 API likes headers to be URI escaped, escaping spaces looks ugly. -}
|
||||||
escapeHeader :: String -> String
|
escapeHeader :: String -> String
|
||||||
escapeHeader = escapeURIString (\c -> isUnescapedInURI c && c /= ' ')
|
escapeHeader = escapeURIString (\c -> isUnescapedInURI c && c /= ' ')
|
||||||
|
|
||||||
iaHost :: HostName
|
|
||||||
iaHost = "s3.us.archive.org"
|
|
||||||
|
|
12
Remote/S3.hs
12
Remote/S3.hs
|
@ -5,7 +5,7 @@
|
||||||
- Licensed under the GNU GPL version 3 or higher.
|
- Licensed under the GNU GPL version 3 or higher.
|
||||||
-}
|
-}
|
||||||
|
|
||||||
module Remote.S3 (remote) where
|
module Remote.S3 (remote, iaHost, isIAHost) where
|
||||||
|
|
||||||
import Network.AWS.AWSConnection
|
import Network.AWS.AWSConnection
|
||||||
import Network.AWS.S3Object
|
import Network.AWS.S3Object
|
||||||
|
@ -15,6 +15,7 @@ import qualified Data.Text as T
|
||||||
import qualified Data.ByteString.Lazy.Char8 as L
|
import qualified Data.ByteString.Lazy.Char8 as L
|
||||||
import qualified Data.Map as M
|
import qualified Data.Map as M
|
||||||
import Data.Char
|
import Data.Char
|
||||||
|
import Network.Socket (HostName)
|
||||||
|
|
||||||
import Common.Annex
|
import Common.Annex
|
||||||
import Types.Remote
|
import Types.Remote
|
||||||
|
@ -81,7 +82,7 @@ s3Setup u c = handlehost $ M.lookup "host" c
|
||||||
|
|
||||||
handlehost Nothing = defaulthost
|
handlehost Nothing = defaulthost
|
||||||
handlehost (Just h)
|
handlehost (Just h)
|
||||||
| ".archive.org" `isSuffixOf` map toLower h = archiveorg
|
| isIAHost h = archiveorg
|
||||||
| otherwise = defaulthost
|
| otherwise = defaulthost
|
||||||
|
|
||||||
use fullconfig = do
|
use fullconfig = do
|
||||||
|
@ -270,3 +271,10 @@ s3Connection c u = go =<< getRemoteCredPairFor "S3" c (AWS.creds u)
|
||||||
case reads s of
|
case reads s of
|
||||||
[(p, _)] -> p
|
[(p, _)] -> p
|
||||||
_ -> error $ "bad S3 port value: " ++ s
|
_ -> error $ "bad S3 port value: " ++ s
|
||||||
|
|
||||||
|
{- Hostname to use for archive.org S3. -}
|
||||||
|
iaHost :: HostName
|
||||||
|
iaHost = "s3.us.archive.org"
|
||||||
|
|
||||||
|
isIAHost :: HostName -> Bool
|
||||||
|
isIAHost h = ".archive.org" `isSuffixOf` map toLower h
|
||||||
|
|
22
templates/configurators/enableia.hamlet
Normal file
22
templates/configurators/enableia.hamlet
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
<div .span9 .hero-unit>
|
||||||
|
<h2>
|
||||||
|
Enabling #{description}
|
||||||
|
<p>
|
||||||
|
To use this Internet Archive repository, you need an Access Key ID, and a #
|
||||||
|
Secret Access Key. These access keys will be stored in a file that #
|
||||||
|
only you can access.
|
||||||
|
<p>
|
||||||
|
<form method="post" .form-horizontal enctype=#{enctype}>
|
||||||
|
<fieldset>
|
||||||
|
^{form}
|
||||||
|
^{webAppFormAuthToken}
|
||||||
|
<div .form-actions>
|
||||||
|
<button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">
|
||||||
|
Enable Internet Archive repository
|
||||||
|
<div .modal .fade #workingmodal>
|
||||||
|
<div .modal-header>
|
||||||
|
<h3>
|
||||||
|
Enabling repository ...
|
||||||
|
<div .modal-body>
|
||||||
|
<p>
|
||||||
|
Enabling this Internet Archive repository. This could take a minute.
|
Loading…
Add table
Add a link
Reference in a new issue