server: try environment variables if flags are missing, closes #45

This commit is contained in:
Rakesh Emmadi
2018-07-06 10:43:46 +05:30
committed by Vamshi Surabhi
parent 1998e211af
commit e834bc51a6
3 changed files with 38 additions and 22 deletions

View File

@@ -7,6 +7,7 @@ import Ops
import Data.Time.Clock (getCurrentTime)
import Options.Applicative
import System.Environment (lookupEnv)
import System.Exit (exitFailure)
import Web.Spock.Core (runSpockNoBanner, spockT)
@@ -38,7 +39,7 @@ data ServeOptions
, soTxIso :: !Q.TxIsolation
, soRootDir :: !(Maybe String)
, soAccessKey :: !(Maybe AccessKey)
, soCorsConfig :: !CorsConfig
, soCorsConfig :: !CorsConfigFlags
, soWebHook :: !(Maybe T.Text)
, soEnableConsole :: !Bool
} deriving (Show, Eq)
@@ -93,25 +94,32 @@ mkAuthMode mAccessKey mWebHook =
(Nothing, Nothing) -> return AMNoAuth
(Just key, Nothing) -> return $ AMAccessKey key
(Nothing, Just _) -> throwError $
"Fatal Error : --auth-hook requires --access-key to be set"
"Fatal Error : --auth-hook (HASURA_GRAPHQL_AUTH_HOOK)"
++ " requires --access-key (HASURA_GRAPHQL_ACCESS_KEY) to be set"
(Just key, Just hook) -> return $ AMAccessKeyAndHook key hook
main :: IO ()
main = withStdoutLogger ravenLogGen $ \rlogger -> do
(RavenOptions rci ravenMode) <- parseArgs
ci <- either ((>> exitFailure) . (putStrLn . connInfoErrModifier))
return $ mkConnInfo rci
mEnvDbUrl <- lookupEnv "HASURA_GRAPHQL_DATABASE_URL"
ci <- either ((>> exitFailure) . putStrLn . connInfoErrModifier)
return $ mkConnInfo mEnvDbUrl rci
printConnInfo ci
case ravenMode of
ROServe (ServeOptions port cp isoL mRootDir mAccessKey corsCfg mWebHook enableConsole) -> do
mFinalAccessKey <- considerEnv "HASURA_GRAPHQL_ACCESS_KEY" mAccessKey
mFinalWebHook <- considerEnv "HASURA_GRAPHQL_AUTH_HOOK" mWebHook
am <- either ((>> exitFailure) . putStrLn) return $
mkAuthMode mAccessKey mWebHook
mkAuthMode mFinalAccessKey mFinalWebHook
finalCorsDomain <- fromMaybe "*" <$> considerEnv "HASURA_GRAPHQL_CORS_DOMAIN" (ccDomain corsCfg)
let finalCorsCfg =
CorsConfigG finalCorsDomain $ ccDisabled corsCfg
initialise ci
migrate ci
pool <- Q.initPGPool ci cp
runSpockNoBanner port $ do
putStrLn $ "server: running on port " ++ show port
spockT id $ app isoL mRootDir rlogger pool am corsCfg enableConsole
spockT id $ app isoL mRootDir rlogger pool am finalCorsCfg enableConsole
ROExport -> do
res <- runTx ci fetchMetadata
either ((>> exitFailure) . printJSON) printJSON res
@@ -147,3 +155,7 @@ main = withStdoutLogger ravenLogGen $ \rlogger -> do
++ "\n Port: " ++ show (Q.connPort ci)
++ "\n User: " ++ Q.connUser ci
++ "\n Database: " ++ Q.connDatabase ci
-- if flags given are Nothing consider it's value from Env
considerEnv _ (Just t) = return $ Just t
considerEnv e Nothing = fmap T.pack <$> lookupEnv e

View File

@@ -75,9 +75,10 @@ parseRawConnInfo =
connInfoErrModifier :: String -> String
connInfoErrModifier s = "Fatal Error : " ++ s
mkConnInfo :: RawConnInfo -> Either String Q.ConnInfo
mkConnInfo (RawConnInfo mHost mPort mUser pass mURL mDB opts) =
case (mHost, mPort, mUser, mDB, mURL) of
mkConnInfo :: Maybe String -> RawConnInfo -> Either String Q.ConnInfo
mkConnInfo mEnvDbUrl (RawConnInfo mHost mPort mUser pass mURL mDB opts) = do
let mFinalDBUrl = ifNothingTakeEnv mURL
case (mHost, mPort, mUser, mDB, mFinalDBUrl) of
(Just host, Just port, Just user, Just db, Nothing) ->
return $ Q.ConnInfo host port user pass db opts
@@ -87,10 +88,12 @@ mkConnInfo (RawConnInfo mHost mPort mUser pass mURL mDB opts) =
_ -> throwError $ "Invalid options. "
++ "Expecting all database connection params "
++ "(host, port, user, dbname, password) or "
++ "database-url"
++ "database-url (HASURA_GRAPHQL_DATABASE_URL)"
where
invalidUrlMsg = "Invalid database-url. "
invalidUrlMsg = "Invalid database-url (HASURA_GRAPHQL_DATABASE_URL). "
++ "Example postgres://foo:bar@example.com:2345/database"
ifNothingTakeEnv Nothing = mEnvDbUrl
ifNothingTakeEnv t = t
readIsoLevel :: String -> Either String Q.TxIsolation
readIsoLevel isoS =
@@ -147,21 +150,22 @@ parseAccessKey = optional $ strOption ( long "access-key" <>
help "Secret access key, required to access this instance"
)
data CorsConfig
= CorsConfig
{ ccDomain :: !T.Text
data CorsConfigG a
= CorsConfigG
{ ccDomain :: !a
, ccDisabled :: !Bool
} deriving (Show, Eq)
parseCorsConfig :: Parser CorsConfig
type CorsConfigFlags = CorsConfigG (Maybe T.Text)
type CorsConfig = CorsConfigG T.Text
parseCorsConfig :: Parser CorsConfigFlags
parseCorsConfig =
CorsConfig
<$> strOption ( long "cors-domain" <>
CorsConfigG
<$> optional (strOption ( long "cors-domain" <>
metavar "CORS DOMAIN" <>
value "*" <>
showDefault <>
help "The domain, including scheme and port, to allow CORS for"
)
))
<*> switch ( long "disable-cors" <>
help "Disable CORS handling"
)

View File

@@ -234,7 +234,7 @@ raven_app :: RavenLogger -> PGQ.PGPool -> IO Application
raven_app rlogger pool =
do
_ <- liftIO $ runExceptT $ Q.runTx pool defTxMode resetStateTx
let corsCfg = CorsConfig "*" True -- cors is disabled
let corsCfg = CorsConfigG "*" True -- cors is disabled
spockAsApp $ spockT id $ app Q.Serializable Nothing rlogger pool AMNoAuth corsCfg True -- no access key and no webhook
main :: IO ()
@@ -242,7 +242,7 @@ main = withStdoutLogger ravenLogGen $ \rlogger -> do
Options rci cp args <- parseArgs
ci <- either ((>> exitFailure) . (putStrLn . connInfoErrModifier))
return $ mkConnInfo rci
return $ mkConnInfo Nothing rci
pool <- Q.initPGPool ci cp