module Main where
import Control.Lens ( (&)
, (.~)
)
import Data.Text
import Data.ByteString ( hPut )
import qualified Network.AWS.Auth as AWSAuth
import qualified Network.AWS.Env as AWSEnv
import System.Exit ( die )
import System.IO ( stdout )
import Network.AWS ( LogLevel (Info)
, newLogger
)
import qualified Network.AWS.RDS.Utils as RDSU
import Options.Applicative
awsRegionEnvName :: Text
awsRegionEnvName = "AWS_REGION"
-- | Works similarly to / aws rds generate-db-auth-token --hostname --port --username --region /
main :: IO ()
main = run =<< execParser opts
where
opts =
info (awsOpts <**> helper)
( fullDesc
<> progDesc "Generate a temporary access token for RDS"
<> header "generate-db-auth-token is a Haskell equivalent of 'aws rds generate-db-auth-token' CLI utility"
)
run :: AWSOptions -> IO ()
run parsedOpts = do
let credsMethod = if (useDiscover parsedOpts)
then AWSAuth.Discover
else AWSAuth.FromEnv
AWSAuth.envAccessKey
AWSAuth.envSecretKey
(Just AWSAuth.envSessionToken)
(Just awsRegionEnvName)
lgr <- newLogger Info stdout
env <- AWSEnv.newEnv credsMethod
case (RDSU.regionFromText . pack . region $ parsedOpts) of
Left err -> die $ "Error: " <> err
Right reg -> do
token <- RDSU.generateDbAuthToken
(env & AWSEnv.envLogger .~ lgr)
(hostname parsedOpts)
(port parsedOpts)
(username parsedOpts)
reg
hPut stdout token
data AWSOptions = AWSOptions
{ hostname :: RDSU.Endpoint
, port :: RDSU.Port
, username :: RDSU.DBUsername
, region :: String
, useDiscover :: Bool
}
awsOpts :: Parser AWSOptions
awsOpts = AWSOptions
<$> strOption
( long "hostname"
<> metavar "RDS_ENDPOINT"
<> help "RDS Endpoint could be found on AWS RDS web console"
)
<*> option auto
( long "port"
<> help "RDS Database Port"
<> showDefault
<> value 5432
<> metavar "RDS_PORT"
)
<*> strOption
( long "username"
<> help "RDS Username"
<> metavar "RDS_USERNAME"
)
<*> strOption
( long "region"
<> help "AWS Region"
<> metavar "AWS_REGION"
)
<*> switch
( long "discover"
<> help "auto-discover AWS credentials. Without this flag AWS env vars will be required"
)