Use env interpolation in config (#826)
This commit is contained in:
+31
-30
@@ -1,3 +1,4 @@
|
||||
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
|
||||
{-|
|
||||
Module : PostgREST.Config
|
||||
Description : Manages PostgREST configuration options.
|
||||
@@ -27,9 +28,11 @@ import qualified Data.ByteString as B
|
||||
import qualified Data.ByteString.Char8 as BS
|
||||
import qualified Data.CaseInsensitive as CI
|
||||
import qualified Data.Configurator as C
|
||||
import qualified Data.Configurator.Types as C
|
||||
import qualified Data.Configurator.Parser as C
|
||||
import Data.Configurator.Types (Value(..))
|
||||
import Data.List (lookup)
|
||||
import Data.Monoid
|
||||
import Data.Scientific (floatingOrInteger)
|
||||
import Data.Text (strip, intercalate, lines)
|
||||
import Data.Text.Encoding (encodeUtf8)
|
||||
import Data.Text.IO (hPutStrLn)
|
||||
@@ -38,6 +41,7 @@ import Network.Wai
|
||||
import Network.Wai.Middleware.Cors (CorsResourcePolicy (..))
|
||||
import Options.Applicative hiding (str)
|
||||
import Paths_postgrest (version)
|
||||
import System.IO (hPrint)
|
||||
import Text.Heredoc
|
||||
import Text.PrettyPrint.ANSI.Leijen hiding ((<>), (<$>))
|
||||
import qualified Text.PrettyPrint.ANSI.Leijen as L
|
||||
@@ -95,30 +99,37 @@ readOptions = do
|
||||
cfgPath <- customExecParser parserPrefs opts
|
||||
-- Now read the actual config file
|
||||
conf <- catch
|
||||
(C.load [C.Required cfgPath])
|
||||
(C.readConfig =<< C.load [C.Required cfgPath])
|
||||
configNotfoundHint
|
||||
|
||||
handle missingKeyHint $ do
|
||||
-- db ----------------
|
||||
cDbUri <- C.require conf "db-uri"
|
||||
cDbSchema <- C.require conf "db-schema"
|
||||
cDbAnon <- C.require conf "db-anon-role"
|
||||
cPool <- C.lookupDefault 10 conf "db-pool"
|
||||
-- server ------------
|
||||
cHost <- C.lookupDefault "*4" conf "server-host"
|
||||
cPort <- C.lookupDefault 3000 conf "server-port"
|
||||
cProxy <- C.lookup conf "server-proxy-uri"
|
||||
-- jwt ---------------
|
||||
cJwtSec <- C.lookup conf "jwt-secret"
|
||||
cJwtB64 <- C.lookupDefault False conf "secret-is-base64"
|
||||
-- safety ------------
|
||||
cMaxRows <- C.lookup conf "max-rows"
|
||||
cReqCheck <- C.lookup conf "pre-request"
|
||||
let (mAppConf, errs) = flip C.runParserA conf $
|
||||
AppConfig <$>
|
||||
C.key "db-uri"
|
||||
<*> C.key "db-anon-role"
|
||||
<*> C.key "server-proxy-uri"
|
||||
<*> C.key "db-schema"
|
||||
<*> (fromMaybe "*4" <$> C.key "server-host")
|
||||
<*> (fromMaybe 3000 . join . fmap coerceInt <$> C.key "server-port")
|
||||
<*> (fmap encodeUtf8 . mfilter (/= "") <$> C.key "jwt-secret")
|
||||
<*> (fromMaybe False <$> C.key "secret-is-base64")
|
||||
<*> (fromMaybe 10 . join . fmap coerceInt <$> C.key "db-pool")
|
||||
<*> (join . fmap coerceInt <$> C.key "max-rows")
|
||||
<*> C.key "pre-request"
|
||||
<*> pure False
|
||||
|
||||
return $ AppConfig cDbUri cDbAnon cProxy cDbSchema cHost cPort
|
||||
(encodeUtf8 <$> cJwtSec) cJwtB64 cPool cMaxRows cReqCheck False
|
||||
case mAppConf of
|
||||
Nothing -> do
|
||||
forM_ errs $ hPrint stderr
|
||||
exitFailure
|
||||
Just appConf ->
|
||||
return appConf
|
||||
|
||||
where
|
||||
coerceInt :: (Read i, Integral i) => Value -> Maybe i
|
||||
coerceInt (Number x) = rightToMaybe $ floatingOrInteger x
|
||||
coerceInt (String x) = readMaybe $ toS x
|
||||
coerceInt _ = Nothing
|
||||
|
||||
opts = info (helper <*> pathParser) $
|
||||
fullDesc
|
||||
<> progDesc (
|
||||
@@ -139,15 +150,6 @@ readOptions = do
|
||||
"Cannot open config file:\n\t" <> show e
|
||||
exitFailure
|
||||
|
||||
missingKeyHint :: C.KeyError -> IO a
|
||||
missingKeyHint (C.KeyError n) = do
|
||||
hPutStrLn stderr $
|
||||
"Required config parameter \"" <> n <> "\" is missing or of wrong type.\n" <>
|
||||
"Documentation for configuration options available at\n" <>
|
||||
"\thttp://postgrest.com/en/v0.4/admin.html#configuration\n\n" <>
|
||||
"Try the --example-config option to see how to configure PostgREST."
|
||||
exitFailure
|
||||
|
||||
exampleCfg :: Doc
|
||||
exampleCfg = vsep . map (text . toS) . lines $
|
||||
[str|db-uri = "postgres://user:pass@localhost:5432/dbname"
|
||||
@@ -173,7 +175,6 @@ readOptions = do
|
||||
|# pre-request = "stored_proc_name"
|
||||
|]
|
||||
|
||||
|
||||
pathParser :: Parser FilePath
|
||||
pathParser =
|
||||
strArgument $
|
||||
|
||||
Reference in New Issue
Block a user