module GinsuConfig( checkConfigIsGood, configureGinsu, doCheckConfig, getGaleProxy, getGaleId, getGaleDomain, getGaleAliases, galeFile, getEditor ) where import ConfigFile import Exception import Data.Monoid import Directory import ErrorLog import ExampleConf import Gale.Gale import Gale.Puff import GenUtil import Monad import System import System.Posix as Posix hiding (getEnv) checkConfigIsGood = do gd <- configLookup "GALE_DOMAIN" case gd of Just _ -> return () Nothing -> putStrLn "GALE_DOMAIN is not set! either set $GALE_DOMAIN in the enviornment or set it in ~/.gale/conf or ~/.gale/ginsu.conf\n" >> doCheckConfig configFileG xs = mapConfig ("GINSU_" ++) (configFile xs) `mappend` configFile xs configureGinsu = do galeDir <- getGaleDir configSetup $ mconcat [mapConfig ("GINSU_" ++) configEnv, configFileG (galeDir ++ "ginsu.config"), configEnv, configFileG (galeDir ++ "conf"), configDefault (parseConfigFile exampleConf), configBuilder] doCheckConfig = do galeDir <- getGaleDir gp <- getGaleProxy gid <- configLookupElse "GALE_ID" "* Not Found *" galeDomain <- configLookupElse "GALE_DOMAIN" "* Not Found *" galeAliases <- getGaleAliases galeSubscribe <- configLookupList "GALE_SUBSCRIBE" mapM_ putStrLn $ buildTableLL [ ( "GALE_DIR ", galeDir), ( "GALE_DOMAIN ", galeDomain), ( "GALE_ID ", gid), ( "GALE_PROXY ", simpleQuote gp), ( "GALE_SUBSCRIBE ", unwords (snub galeSubscribe)) ] when (galeAliases /= []) $ putStrLn $ "GALE_ALIASES \n" ++ unlines ( map (\ (l,cat) -> " " ++ l ++ " -> " ++ show cat) galeAliases) let p = (galeDir ++ "/auth/private/") knames = [p ++ gid, p ++ gid ++ ".gpri"] gn <- (mapM (\fn -> (doesFileExist fn >>= \b -> if b then return (Just fn) else return Nothing)) knames) case msum gn of Just fn -> putStrLn $ "Private key found in: " ++ fn Nothing -> putStrLn $ "Private key for '" ++ gid ++ "' not found in " ++ p putStrLn "" --putStrLn showKeyInfo --kt <- buildKeyTable --print kt exitSuccess configBuilder = toConfig cb where cb "GALE_ID" = do n <- first [getEnv "LOGNAME", getEnv "USER", Posix.getLoginName] d <- configLookup "GALE_DOMAIN" case d of Just d -> return [("@$GALE_DOMAIN",("GALE_ID", n ++ "@" ++ d))] Nothing -> return [] cb _ = return [] getGaleProxy :: IO [String] getGaleProxy = do gps <- configLookup "GALE_PROXY" case gps of Nothing -> do v <- configLookup "GALE_DOMAIN" case v of Just v -> return $ hostStrings v Nothing -> return [] (Just x) -> return (words x) getGaleId :: IO String getGaleId = do v <- configLookup "GALE_ID" case v of Just x -> return x Nothing -> return "" getGaleDomain :: IO String getGaleDomain = do v <- configLookup "GALE_DOMAIN" case v of Just x -> return x Nothing -> do gid <- getGaleId return $ drop 1 (dropWhile (/= '@') gid) getGaleAliases :: IO [(String,Category)] getGaleAliases = do v <- galeFile "aliases/" fs <- handle (\_ -> return []) $ getDirectoryContents v --putLog LogDebug $ "aliases/ " ++ show fs let f fn = do --fc <- first [readFile (v ++ fn), readSymbolicLink (v ++ fn)] fc <- readAlias (v ++ fn) --putLog LogDebug $ "readAlias " ++ (v ++ fn) ++ " " ++ fc return (fn, catParseNew fc) ks <- mapM (\x -> tryMost (f x)) fs return [x | (Right x) <- ks] readAlias :: String -> IO String readAlias fn = getSymbolicLinkStatus fn >>= \s -> if isRegularFile s then readFile fn else (if isSymbolicLink s then readSymbolicLink fn else fail "bad alias") varsLookupElse :: [String] -> IO String -> IO String varsLookupElse ss action = do v <- fmap concat $ mapM configLookupList ss case v of (x:_) -> return x _ -> action galeFile :: String -> IO String galeFile fn = do gd <- getGaleDir return (gd ++ fn) getEditor = varsLookupElse ["VISUAL", "EDITOR"] (return "vi")