packages feed

ginsu-0.8.0: GinsuConfig.hs

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 [("<LOGIN>@$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")