dockercook-0.4.3.0: src/lib/Cook/Util.hs
module Cook.Util where
import Cook.Types
import Control.Monad
import Control.Monad.Trans
import Control.Retry
import Data.List (intercalate)
import System.Exit
import System.IO
import System.Log.Formatter
import System.Log.Handler hiding (setLevel)
import System.Log.Handler.Simple
import System.Log.Logger
import System.Process (system, rawSystem, readProcessWithExitCode)
import qualified Crypto.Hash.SHA1 as SHA1
import qualified Data.ByteString as BS
quickHash :: [BS.ByteString] -> SHA1
quickHash bsList =
SHA1 $ SHA1.finalize (SHA1.updates SHA1.init bsList)
concatHash :: [SHA1] -> SHA1
concatHash sha1List = quickHash $ map unSha1 sha1List
initLoggingFramework :: Priority -> IO ()
initLoggingFramework prio =
do myStreamHandler <- streamHandler stdout prio
let myStreamHandler' = setFormatter myStreamHandler (simpleLogFormatter "[$prio $time $loggername] $msg")
root <- getRootLogger
saveGlobalLogger (setLevel DEBUG $ setHandlers [myStreamHandler'] root)
logInfo :: MonadIO m => String -> m ()
logInfo = liftIO . infoM "cook"
logDebug :: MonadIO m => String -> m ()
logDebug = liftIO . debugM "cook"
logWarn :: MonadIO m => String -> m ()
logWarn = liftIO . warningM "cook"
logError :: MonadIO m => String -> m ()
logError = liftIO . errorM "cook"
readProcessWithExitCode' :: String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode' cmd args procIn =
do logDebug ("$ " ++ cmd ++ " " ++ intercalate " " args)
readProcessWithExitCode cmd args procIn
systemStream :: Maybe FilePath -> String -> (BS.ByteString -> IO ()) -> IO ExitCode
systemStream mDir cmd _onOutput =
let realCmd =
case mDir of
Just dir -> "(cd " ++ dir ++ "; " ++ cmd ++ ")"
Nothing -> cmd
in do logDebug ("$ " ++ realCmd)
system realCmd
compressFilesInDir :: Bool -> FilePath -> FilePath -> [FilePath] -> IO ()
compressFilesInDir shouldRetry tarName dirFp files =
do ecTar <-
retrying (constantDelay microsec <> limitRetries 5) checkRetry sysAction
unless (ecTar == ExitSuccess) $
fail ("Error creating tar:\n" ++ tarCmd ++ " " ++ unwords tarArgs)
where
microsec =
12 * 1000 * 1000
checkRetry _ ec =
return (shouldRetry && ec /= ExitSuccess)
sysAction =
rawSystem tarCmd tarArgs
tarCmd =
"/usr/bin/env"
tarArgs =
["tar", "cjf", tarName, "-C", dirFp] ++ files