module Puppet.Interpreter.Functions (fqdn_rand ,regsubst ,mysql_password ,regmatch ,versioncmp ,file ,puppetSplit ,puppetSHA1 ,puppetMD5 ,generate ) where import Data.Hash.MD5 import qualified Crypto.Hash.SHA1 as SHA1 import qualified Data.ByteString.Char8 as BS import Data.String.Utils (join,replace) import Text.RegexPR import Puppet.Interpreter.Types import Control.Monad.Error import System.IO import qualified Data.ByteString.Base16 as B16 import SafeProcess puppetMD5 = md5s . Str puppetSHA1 = BS.unpack . B16.encode . SHA1.hash . BS.pack {- TODO : achieve compatibility with puppet the first String must be the fqdn -} fqdn_rand :: Integer -> [String] -> CatalogMonad Integer fqdn_rand n args = return (hash `mod` n) where fullstring = Data.String.Utils.join ":" args hash = md5i $ Str fullstring mysql_password :: String -> CatalogMonad String mysql_password pwd = return $ '*':hash where hash = puppetSHA1 pwd regsubst :: String -> String -> String -> String -> CatalogMonad String regsubst str src dst flags = do let multiline = 'M' `elem` flags extended = 'E' `elem` flags insensitive = 'I' `elem` flags global = 'G' `elem` flags refunc | global = gsubRegexPR | otherwise = subRegexPR when multiline $ throwError "Multiline flag not implemented" when extended $ throwError "Extended flag not implemented" when insensitive $ throwError "Case insensitive flag not implemented" return $ refunc (alterregexp src) dst str alterregexp :: String -> String alterregexp = replace "\\n" "\n" regmatch :: String -> String -> Bool regmatch str reg = case matchRegexPR (alterregexp str) reg of Just _ -> True Nothing -> False -- TODO versioncmp :: String -> String -> Integer versioncmp a b | a > b = 1 | a < b = -1 | otherwise = 0 file :: [String] -> IO (Maybe String) file [] = return Nothing file (x:xs) = catch (liftM Just (withFile x ReadMode hGetContents)) (\_ -> file xs) puppetSplit :: String -> String -> [String] puppetSplit str reg = splitRegexPR reg str generate :: String -> [String] -> IO (Maybe String) generate command args = do cmdout <- safeReadProcessTimeout command args "" 60000 case cmdout of Just (Right x) -> return $ Just x _ -> return Nothing