mirror of
https://github.com/commercialhaskell/stackage-server.git
synced 2026-01-12 04:08:29 +01:00
148 lines
4.2 KiB
Haskell
148 lines
4.2 KiB
Haskell
module Stackage.Database.Cron
|
|
( stackageServerCron
|
|
, loadFromS3
|
|
, getHoogleDB
|
|
) where
|
|
|
|
import ClassyPrelude.Conduit
|
|
import Stackage.Database
|
|
import Network.HTTP.Client
|
|
import Network.HTTP.Client.Conduit (bodyReaderSource)
|
|
import Filesystem (rename)
|
|
import Web.PathPieces (toPathPiece)
|
|
import Filesystem (isFile)
|
|
import Network.HTTP.Types (status200)
|
|
|
|
filename' :: Text
|
|
filename' = concat
|
|
[ "stackage-database-"
|
|
, tshow currentSchema
|
|
, ".sqlite3"
|
|
]
|
|
|
|
keyName :: Text
|
|
keyName = "stackage-database/" ++ filename'
|
|
|
|
url :: Text
|
|
url = "https://s3.amazonaws.com/haddock.stackage.org/" ++ keyName
|
|
|
|
-- | Provides an action to be used to refresh the file from S3.
|
|
loadFromS3 :: IO (StackageDatabase, Manager -> IO ())
|
|
loadFromS3 = do
|
|
let fp = fpFromText filename'
|
|
fptmp = fp <.> "tmp"
|
|
req <- parseUrl $ unpack url
|
|
let download man = withResponse req man $ \res -> do
|
|
runResourceT
|
|
$ bodyReaderSource (responseBody res)
|
|
$$ sinkFile fptmp
|
|
rename fptmp fp
|
|
db <- openStackageDatabase fp
|
|
return (db, download)
|
|
|
|
stackageServerCron :: IO ()
|
|
stackageServerCron = error "FIXME: stackageServerCron not implemented"
|
|
|
|
|
|
hoogleKey :: SnapName -> Text
|
|
hoogleKey name = concat
|
|
[ "hoogle/"
|
|
, toPathPiece name
|
|
, "/"
|
|
, VERSION_hoogle
|
|
, ".hoo"
|
|
]
|
|
|
|
hoogleUrl :: SnapName -> Text
|
|
hoogleUrl n = "https://s3.amazonaws.com/haddock.stackage.org/" ++ hoogleKey n
|
|
|
|
getHoogleDB :: Manager -> SnapName -> IO (Maybe FilePath)
|
|
getHoogleDB man name = do
|
|
let fp = fpFromText $ hoogleKey name
|
|
fptmp = fp <.> "tmp"
|
|
exists <- isFile fp
|
|
if exists
|
|
then return $ Just fp
|
|
else do
|
|
req' <- parseUrl $ unpack $ hoogleUrl name
|
|
let req = req' { checkStatus = \_ _ _ -> Nothing }
|
|
withResponse req man $ \res -> if responseStatus res == status200
|
|
then do
|
|
runResourceT $ bodyReaderSource (responseBody res)
|
|
$$ sinkFile fptmp
|
|
rename fptmp fp
|
|
return $ Just fp
|
|
else do
|
|
mapM brRead res >>= print
|
|
return Nothing
|
|
|
|
{-
|
|
createStackageDatabase dbfile
|
|
|
|
import Data.Streaming.Network (bindPortTCP)
|
|
|
|
data CabalLoaderEnv = CabalLoaderEnv
|
|
{ cleSettings :: !(AppConfig DefaultEnv Extra)
|
|
, cleManager :: !Manager
|
|
}
|
|
|
|
instance HasHackageRoot CabalLoaderEnv where
|
|
getHackageRoot = hackageRoot . appExtra . cleSettings
|
|
instance HasHttpManager CabalLoaderEnv where
|
|
getHttpManager = cleManager
|
|
|
|
cabalLoaderMain :: IO ()
|
|
cabalLoaderMain = do
|
|
-- Hacky approach instead of PID files
|
|
void $ catchIO (bindPortTCP 17834 "127.0.0.1") $ \_ ->
|
|
error $ "cabal loader process already running, exiting"
|
|
|
|
error "cabalLoaderMain"
|
|
{- FIXME
|
|
conf <- fromArgs parseExtra
|
|
dbconf <- getDbConf conf
|
|
pool <- Database.Persist.createPoolConfig dbconf
|
|
manager <- newManager
|
|
bs <- loadBlobStore manager conf
|
|
hSetBuffering stdout LineBuffering
|
|
env <- getEnvironment
|
|
let forceUpdate = lookup "STACKAGE_FORCE_UPDATE" env == Just "1"
|
|
flip runLoggingT logFunc $ appLoadCabalFiles
|
|
True -- update database?
|
|
forceUpdate
|
|
CabalLoaderEnv
|
|
{ cleSettings = conf
|
|
, cleBlobStore = bs
|
|
, cleManager = manager
|
|
}
|
|
dbconf
|
|
pool
|
|
|
|
let foundation = App
|
|
{ settings = conf
|
|
, getStatic = error "getStatic"
|
|
, connPool = pool
|
|
, httpManager = manager
|
|
, persistConfig = dbconf
|
|
, appLogger = error "appLogger"
|
|
, genIO = error "genIO"
|
|
, blobStore = bs
|
|
, haddockRootDir = error "haddockRootDir"
|
|
, appDocUnpacker = error "appDocUnpacker"
|
|
, widgetCache = error "widgetCache"
|
|
, websiteContent = error "websiteContent"
|
|
}
|
|
createHoogleDatabases
|
|
bs
|
|
(flip (Database.Persist.runPool dbconf) pool)
|
|
putStrLn
|
|
(yesodRender foundation (appRoot conf))
|
|
where
|
|
logFunc loc src level str
|
|
| level > LevelDebug = S.hPutStr stdout $ fromLogStr $ defaultLogStr loc src level str
|
|
| otherwise = return ()
|
|
-}
|
|
|
|
|
|
-}
|