diff --git a/server/src-exec/Main.hs b/server/src-exec/Main.hs index 9fe823ef..d193e21f 100644 --- a/server/src-exec/Main.hs +++ b/server/src-exec/Main.hs @@ -141,6 +141,7 @@ main = do am <- either (printErrExit . T.unpack) return authModeRes ci <- procConnInfo rci + -- log postgres connection info unLogger logger $ connInfoToLog ci diff --git a/server/src-lib/Hasura/Server/Init.hs b/server/src-lib/Hasura/Server/Init.hs index f1463e2b..1b6b77dc 100644 --- a/server/src-lib/Hasura/Server/Init.hs +++ b/server/src-lib/Hasura/Server/Init.hs @@ -3,10 +3,6 @@ module Hasura.Server.Init where import qualified Database.PG.Query as Q -import Data.Char (toLower) -import Network.Wai.Handler.Warp (HostPreference) -import Options.Applicative - import qualified Data.Aeson as J import qualified Data.Aeson.Casing as J import qualified Data.Aeson.TH as J @@ -14,9 +10,15 @@ import qualified Data.ByteString.Lazy.Char8 as BLC import qualified Data.HashSet as Set import qualified Data.String as DataString import qualified Data.Text as T +import qualified Data.Text.Encoding as TE +import qualified Text.PrettyPrint.ANSI.Leijen as PP + +import Data.Char (toLower) +import Network.Wai.Handler.Warp (HostPreference) +import Options.Applicative + import qualified Hasura.GraphQL.Execute.LiveQuery as LQ import qualified Hasura.Logging as L -import qualified Text.PrettyPrint.ANSI.Leijen as PP import Hasura.Prelude import Hasura.RQL.Types (RoleName (..), @@ -26,6 +28,7 @@ import Hasura.Server.Auth import Hasura.Server.Cors import Hasura.Server.Logging import Hasura.Server.Utils +import Network.URI (parseURI) newtype InstanceId = InstanceId { getInstanceId :: Text } @@ -655,24 +658,22 @@ parseRawConnInfo = connInfoErrModifier :: String -> String connInfoErrModifier s = "Fatal Error : " ++ s -mkConnInfo ::RawConnInfo -> Either String Q.ConnInfo +mkConnInfo :: RawConnInfo -> Either String Q.ConnInfo mkConnInfo (RawConnInfo mHost mPort mUser password mURL mDB opts mRetries) = + Q.ConnInfo retries <$> case (mHost, mPort, mUser, mDB, mURL) of (Just host, Just port, Just user, Just db, Nothing) -> - return $ Q.ConnInfo host port user password db opts retries + return $ Q.CDOptions $ Q.ConnOptions host port user password db opts - (_, _, _, _, Just dbURL) -> maybe (throwError invalidUrlMsg) - withRetries $ parseDatabaseUrl dbURL opts + (_, _, _, _, Just dbURL) -> + return $ Q.CDDatabaseURI $ TE.encodeUtf8 $ T.pack dbURL _ -> throwError $ "Invalid options. " ++ "Expecting all database connection params " ++ "(host, port, user, dbname, password) or " ++ "database-url (HASURA_GRAPHQL_DATABASE_URL)" where retries = fromMaybe 1 mRetries - withRetries ci = return $ ci{Q.connRetries = retries} - invalidUrlMsg = "Invalid database-url (HASURA_GRAPHQL_DATABASE_URL). " - ++ "Example postgres://foo:bar@example.com:2345/database" parseTxIsolation :: Parser (Maybe Q.TxIsolation) parseTxIsolation = optional $ @@ -959,15 +960,28 @@ parseLogLevel = optional $ -- Init logging related connInfoToLog :: Q.ConnInfo -> StartupLog -connInfoToLog (Q.ConnInfo host port user _ db _ retries) = +connInfoToLog connInfo = StartupLog L.LevelInfo "postgres_connection" infoVal where - infoVal = J.object [ "host" J..= host - , "port" J..= port - , "user" J..= user - , "database" J..= db - , "retries" J..= retries - ] + Q.ConnInfo retries details = connInfo + infoVal = case details of + Q.CDDatabaseURI uri -> mkDBUriLog $ T.unpack $ bsToTxt uri + Q.CDOptions co -> + J.object [ "host" J..= Q.connHost co + , "port" J..= Q.connPort co + , "user" J..= Q.connUser co + , "database" J..= Q.connDatabase co + , "retries" J..= retries + ] + + mkDBUriLog uri = + case show <$> parseURI uri of + Nothing -> J.object + [ "error" J..= ("parsing database url failed" :: String)] + Just s -> J.object + [ "retries" J..= retries + , "database_url" J..= s + ] serveOptsToLog :: ServeOptions -> StartupLog serveOptsToLog so = diff --git a/server/src-lib/Hasura/Server/PGDump.hs b/server/src-lib/Hasura/Server/PGDump.hs index 2e5cf20d..1078c547 100644 --- a/server/src-lib/Hasura/Server/PGDump.hs +++ b/server/src-lib/Hasura/Server/PGDump.hs @@ -48,7 +48,8 @@ execPGDump b ci = do ExitSuccess -> Right $ CS.cs (clean stdOut) ExitFailure _ -> Left $ CS.cs stdErr - opts = Q.pgConnString ci : "--encoding=utf8" : prbOpts b + connString = T.unpack $ bsToTxt $ Q.pgConnString $ Q.ciDetails ci + opts = connString : "--encoding=utf8" : prbOpts b clean str | fromMaybe False (prbCleanOutput b) = diff --git a/server/src-lib/Hasura/Server/Utils.hs b/server/src-lib/Hasura/Server/Utils.hs index 391325d8..9309cfe8 100644 --- a/server/src-lib/Hasura/Server/Utils.hs +++ b/server/src-lib/Hasura/Server/Utils.hs @@ -1,31 +1,27 @@ module Hasura.Server.Utils where -import qualified Database.PG.Query.Connection as Q - import Data.Aeson import Data.Char -import Data.List (find) -import Data.List.Split +import Data.List (find) import Data.Time.Clock -import Network.URI import System.Environment import System.Exit import System.Process -import qualified Data.ByteString as B -import qualified Data.CaseInsensitive as CI -import qualified Data.HashSet as Set -import qualified Data.Text as T -import qualified Data.Text.Encoding as TE -import qualified Data.Text.IO as TI -import qualified Data.UUID as UUID -import qualified Data.UUID.V4 as UUID -import qualified Language.Haskell.TH.Syntax as TH -import qualified Network.HTTP.Client as HC -import qualified Network.HTTP.Types as HTTP -import qualified Text.Ginger as TG -import qualified Text.Regex.TDFA as TDFA -import qualified Text.Regex.TDFA.ByteString as TDFA +import qualified Data.ByteString as B +import qualified Data.CaseInsensitive as CI +import qualified Data.HashSet as Set +import qualified Data.Text as T +import qualified Data.Text.Encoding as TE +import qualified Data.Text.IO as TI +import qualified Data.UUID as UUID +import qualified Data.UUID.V4 as UUID +import qualified Language.Haskell.TH.Syntax as TH +import qualified Network.HTTP.Client as HC +import qualified Network.HTTP.Types as HTTP +import qualified Text.Ginger as TG +import qualified Text.Regex.TDFA as TDFA +import qualified Text.Regex.TDFA.ByteString as TDFA import Hasura.Prelude @@ -72,44 +68,6 @@ getRequestId headers = Nothing -> RequestId <$> liftIO generateFingerprint Just reqId -> return $ RequestId $ bsToTxt reqId --- Parsing postgres database url --- from: https://github.com/futurice/postgresql-simple-url/ -parseDatabaseUrl :: String -> Maybe String -> Maybe Q.ConnInfo -parseDatabaseUrl databaseUrl opts = parseURI databaseUrl >>= uriToConnectInfo opts - -uriToConnectInfo :: Maybe String -> URI -> Maybe Q.ConnInfo -uriToConnectInfo opts uri - | uriScheme uri /= "postgres:" && uriScheme uri /= "postgresql:" = Nothing - | otherwise = ($ Q.defaultConnInfo {Q.connOptions = opts}) <$> mkConnectInfo uri - -type ConnectInfoChange = Q.ConnInfo -> Q.ConnInfo - -mkConnectInfo :: URI -> Maybe ConnectInfoChange -mkConnectInfo uri = case uriPath uri of - ('/' : rest) | not (null rest) -> Just $ uriParameters uri - _ -> Nothing - -uriParameters :: URI -> ConnectInfoChange -uriParameters uri = (\info -> info { Q.connDatabase = tail $ uriPath uri }) . maybe id uriAuthParameters (uriAuthority uri) - -dropLast :: [a] -> [a] -dropLast [] = [] -dropLast [_] = [] -dropLast (x:xs) = x : dropLast xs - -uriAuthParameters :: URIAuth -> ConnectInfoChange -uriAuthParameters uriAuth = port . host . auth - where port = case uriPort uriAuth of - (':' : p) -> \info -> info { Q.connPort = read p } - _ -> id - host = case uriRegName uriAuth of - h -> \info -> info { Q.connHost = unEscapeString h } - auth = case splitOn ":" (uriUserInfo uriAuth) of - [""] -> id - [u] -> \info -> info { Q.connUser = unEscapeString $ dropLast u } - [u, p] -> \info -> info { Q.connUser = unEscapeString u, Q.connPassword = unEscapeString $ dropLast p } - _ -> id - -- Get an env var during compile time getValFromEnvOrScript :: String -> String -> TH.Q TH.Exp getValFromEnvOrScript n s = do diff --git a/server/stack.yaml b/server/stack.yaml index 9b61426f..e1d27ec0 100644 --- a/server/stack.yaml +++ b/server/stack.yaml @@ -15,8 +15,9 @@ rebuild-ghc-options: true # Packages to be pulled from upstream that are not in the resolver (e.g., acme-missiles-0.3) extra-deps: +# use https URLs so that build systems can clone these repos - git: https://github.com/hasura/pg-client-hs.git - commit: 16f27a134f12c4f24fee19d57f0ca179bdb4135b + commit: 1eb97c11f52b360ce7f796d9427dc294ce8e45fc - git: https://github.com/hasura/graphql-parser-hs.git commit: 1ccdbb4c4d743b679f3141992df39feaee971640 - git: https://github.com/hasura/ci-info-hs.git @@ -29,7 +30,6 @@ extra-deps: - primitive-extras-0.7.1 - stm-hamt-1.2.0.2 - stm-containers-1.1.0.4 - - reroute-0.5.0.0 - Spock-core-0.13.0.0 - monad-validate-1.2.0.0 diff --git a/server/stack.yaml.lock b/server/stack.yaml.lock index 2297ee47..54d4bbec 100644 --- a/server/stack.yaml.lock +++ b/server/stack.yaml.lock @@ -12,12 +12,12 @@ packages: version: 0.1.0 git: https://github.com/hasura/pg-client-hs.git pantry-tree: - size: 1051 - sha256: fbab919039158f3714c3f0ac3d605d3fb9c85061517b4b9fc67147403b0b9975 - commit: 16f27a134f12c4f24fee19d57f0ca179bdb4135b + size: 1107 + sha256: 8d5502889184e1b751d55c4b7d0e10985711284c6fae0b40cf7cb171949f0ccf + commit: 1eb97c11f52b360ce7f796d9427dc294ce8e45fc original: git: https://github.com/hasura/pg-client-hs.git - commit: 16f27a134f12c4f24fee19d57f0ca179bdb4135b + commit: 1eb97c11f52b360ce7f796d9427dc294ce8e45fc - completed: cabal-file: size: 3295 diff --git a/server/tests-py/test_jwt.py b/server/tests-py/test_jwt.py index 26980f91..257b2626 100644 --- a/server/tests-py/test_jwt.py +++ b/server/tests-py/test_jwt.py @@ -293,7 +293,7 @@ class TestSubscriptionJwtExpiry(object): } } init_ws_conn(hge_ctx, ws_client, payload) - time.sleep(5) + time.sleep(6) assert ws_client.remote_closed == True, ws_client.remote_closed