module Puppet.Interpreter.Functions
(fqdn_rand
,regsubst
,mysql_password
,regmatch
,versioncmp
,file
,puppetSplit
,puppetSHA1
,puppetMD5
) 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
puppetMD5 = md5s . Str
puppetSHA1 = BS.unpack . B16.encode . SHA1.hash . BS.pack
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
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