haskdeep-0.2.0.1: 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.Format as DTF
import Options.Applicative
import HaskDeep
haskdeepVersion :: String
haskdeepVersion = "haskdeep 0.2.0.1 - 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
<$> strOption
( long "root"
<> short 'r'
<> metavar "DIRNAME"
<> help "Root directory - default current directory"
<> value (rootDirectory defaultHaskDeepConfiguration))
<*> strOption
( long "known"
<> short 'k'
<> metavar "FILENAME"
<> help "Known hashes file - default known.haskdeep"
<> value (knownHashes defaultHaskDeepConfiguration))
<*> option (str >>= parseText)
( long "excl-regex"
<> short 'e'
<> metavar "REGEX"
<> help "Exclude files or directories based on regex"
<> value (excludeRegex defaultHaskDeepConfiguration)
<> hidden )
<*> option (str >>= parseTime)
( long "incl-mod-from"
<> short 'f'
<> metavar "DATE"
<> help "Include files modified from yyyy-mm-ddThh:mm:ssZ"
<> value (includeModFrom defaultHaskDeepConfiguration)
<> hidden )
<*> option (str >>= parseTime)
( long "incl-mod-upto"
<> short 't'
<> metavar "DATE"
<> help "Include files modified up to yyyy-mm-ddThh:mm:ssZ"
<> 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")))
<*> option (str >>= parseOptCompMode)
( long "computation"
<> short 'c'
<> metavar "MODE"
<> help "md5 | sha1 | sha256 | skein512 - default md5"
<> value OptMD5)
<*> configurationP )
parseOptCompMode :: String -> ReadM OptCompMode
parseOptCompMode "md5" = return OptMD5
parseOptCompMode "sha1" = return OptSHA1
parseOptCompMode "sha256" = return OptSHA256
parseOptCompMode "skein512" = return OptSkein512
parseOptCompMode _ = readerAbort ShowHelpText
parseText :: String -> ReadM (Maybe Text)
parseText s = return $ Just $ T.pack s
parseTime :: String -> ReadM (Maybe UTCTime)
parseTime s = case parsedTime of
(Just _) -> return parsedTime
Nothing -> readerAbort ShowHelpText
where
parsedTime = DTF.parseTimeM True DTF.defaultTimeLocale "%FT%TZ" s