module CertServers( CertServer(..),CertServers,readCertServers, Attr,Attrs,Name,readAttrs,parseAttrs,printAttrs,certFiles,lookupServer ) where import Prelude hiding (readFile) import AbstractIO import Maybe(catMaybes,mapMaybe,listToMaybe) import List(partition) import MUtils import Attrs import ParseAttrs import ParseCertAttrs data CertServer = Server {serverName :: Name, serverDir :: FilePath, serverAttrs :: Attrs, certAttrs :: CertAttrs } deriving Show type CertServers = [CertServer] --readCertServers :: FilePath -> IO CertServer readCertServers certServerDir = collectWith (readServer certServerDir) =<< getDirectoryContents certServerDir --readServer :: String -> String -> IO CertServer readServer certServerDir name = do let serverRoot = certServerDir++name serverAttr = serverRoot `fileSep` "server.attr" splitAttrs = partition ((=="attribute").fst) (certattrs,servattrs) <- splitAttrs # readAttrs serverAttr return Server{serverName = name, serverDir = serverRoot, serverAttrs = servattrs, certAttrs = mapMaybe parseCertAttr (map snd certattrs)} -- Hmm. Errors are silently ignored!! --collect :: (a->IO b) -> [a] -> IO [b] collectWith m xs = catMaybes # mapM (maybeM . m) xs fileSep :: FilePath->FilePath->FilePath fileSep dir file = dir ++ "/" ++ file lookupServer :: CertServers -> Name -> Maybe CertServer lookupServer servers ctype = listToMaybe [s|s<-servers,serverName s==ctype]