haskdeep 0.2.0.0 → 0.2.0.1
raw patch · 8 files changed
+82/−90 lines, 8 filesdep +conduit-combinatorsdep +conduit-extradep +directorydep −attoparsec-conduitdep −filesystem-conduitdep −old-localedep ~attoparsecdep ~bytestringdep ~cereal
Dependencies added: conduit-combinators, conduit-extra, directory, filepath, resourcet, transformers, unix-compat
Dependencies removed: attoparsec-conduit, filesystem-conduit, old-locale, system-fileio, system-filepath
Dependency ranges changed: attoparsec, bytestring, cereal, conduit, containers, crypto-api, cryptohash, optparse-applicative, regex-tdfa, text, time
Files
- CHANGELOG.md +4/−0
- LICENSE +1/−1
- haskdeep.cabal +20/−18
- src/HaskDeep/Computation.hs +19/−20
- src/HaskDeep/Configuration.hs +3/−4
- src/HaskDeep/KnownHash/Reader.hs +5/−5
- src/HaskDeep/KnownHash/Writer.hs +8/−10
- src/Options.hs +22/−32
CHANGELOG.md view
@@ -1,3 +1,7 @@+## Version 0.2.0.1 (01 Jun 2015)++- Updated package dependencies+ ## Version 0.2.0.0 (15 Sep 2013) - Added option -v for version information
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2013 Mauro Taraborelli+Copyright (c) 2015 Mauro Taraborelli All rights reserved.
haskdeep.cabal view
@@ -1,10 +1,10 @@ name: haskdeep-version: 0.2.0.0+version: 0.2.0.1 cabal-version: >=1.8 build-type: Simple license: BSD3 license-file: LICENSE-copyright: © 2013 Mauro Taraborelli+copyright: © 2015 Mauro Taraborelli author: Mauro Taraborelli maintainer: maurotaraborelli@gmail.com stability: experimental@@ -70,27 +70,29 @@ HaskDeep.KnownHash.Reader HaskDeep.KnownHash.Writer build-depends:- attoparsec ==0.10.*- , attoparsec-conduit ==1.0.*+ attoparsec ==0.13.* , base ==4.* , base16-bytestring ==0.1.*- , bytestring ==0.9.*- , cereal ==0.3.*- , conduit ==1.0.*- , containers ==0.4.*- , cryptohash ==0.10.*+ , bytestring ==0.10.*+ , cereal ==0.4.*+ , conduit ==1.2.*+ , conduit-combinators ==1.0.*+ , conduit-extra ==1.1.*+ , containers ==0.5.*+ , cryptohash ==0.11.* , cryptohash-cryptoapi ==0.1.*- , crypto-api ==0.12.*+ , crypto-api ==0.13.* , crypto-conduit ==0.5.*- , filesystem-conduit ==1.0.*- , old-locale ==1.0.*- , optparse-applicative ==0.5.*- , system-fileio ==0.3.*- , system-filepath ==0.4.*- , text ==0.11.*- , time ==1.4.*- , regex-tdfa ==1.1.*+ , directory ==1.2.*+ , filepath ==1.4.*+ , optparse-applicative ==0.11.*+ , resourcet ==1.1.*+ , text ==1.2.*+ , time ==1.5.*+ , transformers ==0.3.*+ , regex-tdfa ==1.2.* , regex-tdfa-text ==1.0.*+ , unix-compat ==0.4.* ghc-options: -Wall source-repository head
src/HaskDeep/Computation.hs view
@@ -22,20 +22,20 @@ where import Control.Monad (liftM)-import Data.Maybe (fromJust)+import Control.Monad.IO.Class (liftIO)+import Control.Monad.Trans.Resource (ResourceT, runResourceT) import Prelude hiding (FilePath) import Crypto.Classes (Hash) import qualified Crypto.Conduit as CC import Data.Conduit (($$))-import qualified Data.Conduit as C-import qualified Data.Conduit.Filesystem as CF-import qualified Data.Conduit.List as CL+import qualified Data.Conduit.Combinators as CCB+import qualified Data.Conduit.Binary as CB import qualified Data.Text as T import Data.Time (UTCTime)-import qualified Filesystem as FS-import Filesystem.Path.CurrentOS (FilePath)-import qualified Filesystem.Path.CurrentOS as FSC+import qualified System.Directory as D+import System.FilePath (FilePath, makeRelative)+import qualified System.PosixCompat.Files as PF import Text.Regex.TDFA ((=~)) import Text.Regex.TDFA.Text () @@ -48,7 +48,7 @@ compute :: Hash ctx a => HaskDeepConfiguration -> ComputationMode a -> IO HashSet-compute conf cm = CF.traverse False root $$ CL.foldM insert_hash empty_with_symbol+compute conf cm = runResourceT $ CCB.sourceDirectoryDeep False root $$ CCB.foldM insert_hash empty_with_symbol where root = rootDirectory conf regex = excludeRegex conf@@ -56,21 +56,20 @@ mod_upto = includeModUpTo conf empty_with_symbol = HS.setSymbol (symbol cm) HS.empty - insert_hash :: HashSet -> FilePath -> IO HashSet- insert_hash hs fp = do let fpt = fpToText $ relativize root fp- fmt <- FS.getModified fp- if (excRegex fpt regex) || (excMod fmt mod_from mod_upto)+ insert_hash :: HashSet -> FilePath -> ResourceT IO HashSet+ insert_hash hs fp = do let fpt = T.pack $ makeRelative root fp+ fmt <- liftIO $ D.getModificationTime fp+ if excRegex fpt regex || excMod fmt mod_from mod_upto then return hs- else do s <- FS.getSize fp- h <- liftM (runComputation cm) $ C.runResourceT- $ CF.sourceFile fp $$ CC.sinkHash+ else do s <- liftIO $ getFileSize fp+ h <- liftM (runComputation cm) $ runResourceT+ $ CB.sourceFile fp $$ CC.sinkHash return $ HS.insert (HashInfo fpt s h) hs -relativize :: FilePath -> FilePath -> FilePath-relativize root fp = fromJust $ FSC.stripPrefix root fp--fpToText :: FilePath -> T.Text-fpToText = either id id . FSC.toText+getFileSize :: FilePath -> IO Integer+getFileSize path = do+ stat <- PF.getFileStatus path+ return (toInteger $ PF.fileSize stat) excRegex :: T.Text -> Maybe T.Text -> Bool excRegex fpt (Just rule) = fpt =~ rule
src/HaskDeep/Configuration.hs view
@@ -24,8 +24,7 @@ import Data.Text (Text) import Data.Time (UTCTime)-import Filesystem.Path (FilePath)-import qualified Filesystem.Path.CurrentOS as FSC+import System.FilePath (FilePath) -- | HaskDeep configuration. data HaskDeepConfiguration = HaskDeepConfiguration@@ -39,8 +38,8 @@ -- | HaskDeep default configuration. defaultHaskDeepConfiguration :: HaskDeepConfiguration defaultHaskDeepConfiguration = HaskDeepConfiguration- { rootDirectory = FSC.decodeString "."- , knownHashes = FSC.decodeString "known.haskdeep"+ { rootDirectory = "."+ , knownHashes = "known.haskdeep" , excludeRegex = Nothing , includeModFrom = Nothing , includeModUpTo = Nothing
src/HaskDeep/KnownHash/Reader.hs view
@@ -22,6 +22,7 @@ import Control.Applicative ((<*), many) import Control.Monad (liftM)+import Control.Monad.Trans.Resource (runResourceT) import Data.Maybe(fromJust) import Data.Word (Word8) import Prelude hiding (FilePath)@@ -32,12 +33,11 @@ import qualified Data.Attoparsec.Combinator as AC import qualified Data.ByteString.Char8 as B8 import Data.Conduit (($$))-import qualified Data.Conduit as C import qualified Data.Conduit.Attoparsec as CA-import qualified Data.Conduit.Filesystem as CF+import qualified Data.Conduit.Binary as CB import Data.Text () import qualified Data.Text.Encoding as TE-import Filesystem.Path ()+import System.FilePath () import HaskDeep.Configuration import HaskDeep.HashSet (HashSet, HashInfo(..))@@ -46,8 +46,8 @@ -- | Read known hashes file into an @HashSet@. readHashes :: HaskDeepConfiguration -- ^ Configuration -> IO HashSet -- ^ @HashSet@ red from file-readHashes conf = liftM HS.fromList $ C.runResourceT- $ CF.sourceFile (knownHashes conf) $$ CA.sinkParser knownHashesP+readHashes conf = liftM HS.fromList $ runResourceT+ $ CB.sourceFile (knownHashes conf) $$ CA.sinkParser knownHashesP -- Parsers
src/HaskDeep/KnownHash/Writer.hs view
@@ -20,21 +20,19 @@ ) where +import Control.Monad.Trans.Resource (runResourceT) import Prelude hiding (FilePath) import Data.ByteString (ByteString) import qualified Data.ByteString as BS import qualified Data.ByteString.Char8 as B8 import Data.Conduit (($$))-import qualified Data.Conduit as C-import qualified Data.Conduit.Filesystem as CF+import qualified Data.Conduit.Binary as CB import qualified Data.Conduit.List as CL import qualified Data.Time as DT-import Data.Text ()+import qualified Data.Text as T import qualified Data.Text.Encoding as TE-import Filesystem.Path ()-import qualified Filesystem.Path.CurrentOS as FSC-import qualified System.Locale as SL+import System.FilePath () import HaskDeep.Configuration import HaskDeep.HashSet (HashSet)@@ -44,18 +42,18 @@ writeHashes :: HaskDeepConfiguration -- ^ Configuration -> HashSet -- ^ @HashSet@ to write -> IO ()-writeHashes conf hs = C.runResourceT $ CL.sourceList bs_known $$ CF.sinkFile (knownHashes conf)+writeHashes conf hs = runResourceT $ CL.sourceList bs_known $$ CB.sinkFile (knownHashes conf) where newline = "\n" :: ByteString- root = TE.encodeUtf8 $ either id id $ FSC.toText $ rootDirectory conf+ root = TE.encodeUtf8 $ T.pack $ rootDirectory conf exclude_regex = case excludeRegex conf of (Just regex) -> TE.encodeUtf8 regex Nothing -> BS.empty include_mod_from = case includeModFrom conf of- (Just modFrom) -> B8.pack $ DT.formatTime SL.defaultTimeLocale "%FT%TZ" modFrom+ (Just modFrom) -> B8.pack $ DT.formatTime DT.defaultTimeLocale "%FT%TZ" modFrom Nothing -> BS.empty include_mod_upto = case includeModUpTo conf of- (Just modUpTo) -> B8.pack $ DT.formatTime SL.defaultTimeLocale "%FT%TZ" modUpTo+ (Just modUpTo) -> B8.pack $ DT.formatTime DT.defaultTimeLocale "%FT%TZ" modUpTo Nothing -> BS.empty files_count = B8.pack $ show $ HS.filesCount hs size_sum = B8.pack $ show $ HS.sizeSum hs
src/Options.hs view
@@ -25,16 +25,13 @@ import Data.Text (Text) import qualified Data.Text as T import Data.Time (UTCTime)-import qualified Data.Time as DT-import Filesystem.Path.CurrentOS (FilePath)-import qualified Filesystem.Path.CurrentOS as FSC+import qualified Data.Time.Format as DTF import Options.Applicative-import qualified System.Locale as SL import HaskDeep haskdeepVersion :: String-haskdeepVersion = "haskdeep 0.2.0.0 - file hashing and audit"+haskdeepVersion = "haskdeep 0.2.0.1 - file hashing and audit" data Options = Version | Options OptExecution OptCompMode HaskDeepConfiguration@@ -55,42 +52,37 @@ configurationP :: Parser HaskDeepConfiguration configurationP = HaskDeepConfiguration- <$> nullOption+ <$> strOption ( long "root" <> short 'r' <> metavar "DIRNAME" <> help "Root directory - default current directory"- <> reader fpReader <> value (rootDirectory defaultHaskDeepConfiguration))- <*> nullOption+ <*> strOption ( long "known" <> short 'k' <> metavar "FILENAME" <> help "Known hashes file - default known.haskdeep"- <> reader fpReader <> value (knownHashes defaultHaskDeepConfiguration))- <*> nullOption+ <*> option (str >>= parseText) ( long "excl-regex" <> short 'e' <> metavar "REGEX" <> help "Exclude files or directories based on regex"- <> reader regexReader <> value (excludeRegex defaultHaskDeepConfiguration) <> hidden )- <*> nullOption+ <*> option (str >>= parseTime) ( long "incl-mod-from" <> short 'f' <> metavar "DATE" <> help "Include files modified from yyyy-mm-ddThh:mm:ssZ"- <> reader timeReader <> value (includeModFrom defaultHaskDeepConfiguration) <> hidden )- <*> nullOption+ <*> option (str >>= parseTime) ( long "incl-mod-upto" <> short 't' <> metavar "DATE" <> help "Include files modified up to yyyy-mm-ddThh:mm:ssZ"- <> reader timeReader <> value (includeModUpTo defaultHaskDeepConfiguration) <> hidden ) @@ -108,31 +100,29 @@ <> command "audit" (info (pure OptAudit) (progDesc "Audit files comparing them to known hashes")))- <*> nullOption+ <*> option (str >>= parseOptCompMode) ( long "computation" <> short 'c' <> metavar "MODE" <> help "md5 | sha1 | sha256 | skein512 - default md5"- <> reader compReader <> value OptMD5) <*> configurationP ) -compReader :: String -> Either ParseError OptCompMode-compReader "md5" = Right OptMD5-compReader "sha1" = Right OptSHA1-compReader "sha256" = Right OptSHA256-compReader "skein512" = Right OptSkein512-compReader _ = Left ShowHelpText -fpReader :: String -> Either ParseError FilePath-fpReader fp = Right $ FSC.decodeString fp+parseOptCompMode :: String -> ReadM OptCompMode+parseOptCompMode "md5" = return OptMD5+parseOptCompMode "sha1" = return OptSHA1+parseOptCompMode "sha256" = return OptSHA256+parseOptCompMode "skein512" = return OptSkein512+parseOptCompMode _ = readerAbort ShowHelpText -regexReader :: String -> Either ParseError (Maybe Text)-regexReader = Right . Just . T.pack+parseText :: String -> ReadM (Maybe Text)+parseText s = return $ Just $ T.pack s -timeReader :: String -> Either ParseError (Maybe UTCTime)-timeReader dt = case parsedTime of- (Just _) -> Right parsedTime- Nothing -> Left ShowHelpText+parseTime :: String -> ReadM (Maybe UTCTime)+parseTime s = case parsedTime of+ (Just _) -> return parsedTime+ Nothing -> readerAbort ShowHelpText where- parsedTime = DT.parseTime SL.defaultTimeLocale "%FT%TZ" dt+ parsedTime = DTF.parseTimeM True DTF.defaultTimeLocale "%FT%TZ" s+