packages feed

ldif-0.0.7: src/ldifmodify.hs

{-# LANGUAGE DeriveDataTypeable #-}
-- | Apply LDAP operations within LDIF on another LDIF.
-- | Without schema related verification like syntax, cardinality etc.
import Data.List
import Data.Either
import Data.Maybe
import Control.Monad 
import System.FilePath 
import System.Environment
import Text.LDIF
import System.Console.CmdArgs

progDesc = "Apply LDAP operations from LDIF to LDIF (like ldapmodify)"

data LdifModify = LdifModify { baseFile :: FilePath
                             , modFiles  :: [FilePath]
                             , outFile  :: FilePath } deriving (Show, Data, Typeable)

defaultCfg = mode $ LdifModify { baseFile = def &= typFile & flag "f" & text "Base LDIF File"
                               , modFiles = def &= args & typ "LDIF Files for applying"
                               , outFile = def &= typFile & flag "o" & text "Output LDIF File" }

verifyCfg :: LdifModify -> IO ()
verifyCfg (LdifModify [] [] [])                       = do
               msg <- cmdArgsHelp progDesc [defaultCfg] Text
               error msg
verifyCfg (LdifModify bf mfx ouf) | length bf  == 0   = error "Missing Base LDIF File parameter (-f)"
                                  | length mfx == 0   = error "Missing LDIF Files for applying as arguments"
                                  | otherwise         = return ()                                                              

main = do
  cfg <- cmdArgs progDesc [defaultCfg]
  verifyCfg cfg
  baseLDIF <- safeParseLDIFFile (baseFile cfg)
  modLDIFs <- mapM (safeParseLDIFFile) (modFiles cfg)
  let outLDIF = foldr (flip applyLDIF) baseLDIF modLDIFs
  if length (outFile cfg) == 0 then do
      putStrLn (ldif2str outLDIF)
    else do
      writeFile (outFile cfg) (ldif2str outLDIF)
      putStrLn $ (outFile cfg) ++ " written."

safeParseLDIFFile :: FilePath -> IO LDIF
safeParseLDIFFile name = liftM (either (\e -> error $ "Can not parse: "++(show e)) (id)) (parseLDIFFile name)