module System.Log.FastLogger.File where
import Control.Monad (unless, when)
import System.Directory (doesFileExist, doesDirectoryExist, getPermissions, writable, renameFile)
import System.FilePath (takeDirectory)
data FileLogSpec = FileLogSpec {
log_file :: FilePath
, log_file_size :: Integer
, log_backup_number :: Int
}
check :: FileLogSpec -> IO ()
check spec = do
dirExist <- doesDirectoryExist dir
unless dirExist $ fail $ dir ++ " does not exist or is not a directory."
dirPerm <- getPermissions dir
unless (writable dirPerm) $ fail $ dir ++ " is not writable."
exist <- doesFileExist file
when exist $ do
perm <- getPermissions file
unless (writable perm) $ fail $ file ++ " is not writable."
where
file = log_file spec
dir = takeDirectory file
rotate :: FileLogSpec -> IO ()
rotate spec = mapM_ move srcdsts
where
path = log_file spec
n = log_backup_number spec
dsts' = reverse . ("":) . map (('.':). show) $ [0..n1]
dsts = map (path++) dsts'
srcs = tail dsts
srcdsts = zip srcs dsts
move (src,dst) = do
exist <- doesFileExist src
when exist $ renameFile src dst