packages feed

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