{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE DoAndIfThenElse #-} module Cook.Clean (cookClean) where import Cook.State.Manager import Cook.State.Model import Cook.Types import Cook.Util import Data.Time.Clock import System.Exit import System.Process import qualified Data.Text as T cookClean :: FilePath -> Int -> IO () cookClean stateDir daysToKeep = do stateManager <- createStateManager stateDir now <- getCurrentTime let cleanUpPred imageMeta = now `diffUTCTime` (dbDockerImageLastUsed imageMeta) > (fromIntegral $ daysToKeep * 24 * 60 * 60) dockerRm (DockerImage imageName) = do logInfo $ "Deleting image " ++ show imageName (ec, _, stdErr) <- readProcessWithExitCode "docker" ["rmi", T.unpack imageName] "" if (ec /= ExitSuccess) then do logInfo $ "Error: " ++ stdErr return False else return True _ <- garbageCollectImages stateManager cleanUpPred dockerRm return ()