haskdeep-0.2.0.0: src/Options.hs
-- |
-- Module : HaskDeep.Command.Options
-- Copyright : Mauro Taraborelli 2012
-- License : BSD3
--
-- Maintainer : maurotaraborelli@gmail.com
-- Stability : experimental
-- Portability : unknown
--
-- Computes hashes traversing recursively through the directory structure.
-- Use a list of known hashes to audit a set of files.
module Options
(
Options(..)
,OptExecution(..)
,OptCompMode(..)
,optionsPI
,haskdeepVersion
)
where
import Prelude hiding (FilePath)
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 Options.Applicative
import qualified System.Locale as SL
import HaskDeep
haskdeepVersion :: String
haskdeepVersion = "haskdeep 0.2.0.0 - file hashing and audit"
data Options = Version
| Options OptExecution OptCompMode HaskDeepConfiguration
data OptExecution = OptComputation
| OptAudit
data OptCompMode = OptMD5
| OptSHA1
| OptSHA256
| OptSkein512
optionsPI :: ParserInfo Options
optionsPI = info (helper <*> optionsP)
( fullDesc
<> progDesc "Computes hashes and audit a set of files"
<> header haskdeepVersion)
configurationP :: Parser HaskDeepConfiguration
configurationP = HaskDeepConfiguration
<$> nullOption
( long "root"
<> short 'r'
<> metavar "DIRNAME"
<> help "Root directory - default current directory"
<> reader fpReader
<> value (rootDirectory defaultHaskDeepConfiguration))
<*> nullOption
( long "known"
<> short 'k'
<> metavar "FILENAME"
<> help "Known hashes file - default known.haskdeep"
<> reader fpReader
<> value (knownHashes defaultHaskDeepConfiguration))
<*> nullOption
( long "excl-regex"
<> short 'e'
<> metavar "REGEX"
<> help "Exclude files or directories based on regex"
<> reader regexReader
<> value (excludeRegex defaultHaskDeepConfiguration)
<> hidden )
<*> nullOption
( 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
( 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 )
optionsP :: Parser Options
optionsP = flag' Version
( long "version"
<> short 'v'
<> help "Show version information"
<> hidden )
<|> ( Options
<$> subparser
( command "compute"
(info (pure OptComputation)
(progDesc "Computes file hashes and saves them to known hashes file"))
<> command "audit"
(info (pure OptAudit)
(progDesc "Audit files comparing them to known hashes")))
<*> nullOption
( 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
regexReader :: String -> Either ParseError (Maybe Text)
regexReader = Right . Just . T.pack
timeReader :: String -> Either ParseError (Maybe UTCTime)
timeReader dt = case parsedTime of
(Just _) -> Right parsedTime
Nothing -> Left ShowHelpText
where
parsedTime = DT.parseTime SL.defaultTimeLocale "%FT%TZ" dt