packages feed

cloudy-0.1.0.0: src/Cloudy/Cmd/Ssh.hs

{-# LANGUAGE OverloadedRecordDot #-}

module Cloudy.Cmd.Ssh where

import Cloudy.Cli (SshCliOpts (..))
import Cloudy.Cmd.Utils (SelectInstBy, findInstanceInfoForSelectInstBy, mkSelectInstBy)
import Cloudy.LocalConfFile (LocalConfFileOpts (..))
import Cloudy.Db (withCloudyDb, InstanceInfo (..), ScalewayInstance (..))
import Data.Text (unpack, Text)
import Data.Void (absurd)
import System.Posix.Process (executeFile)

data SshSettings = SshSettings
  { selectInstBy :: SelectInstBy
  , sshPassthruArgs :: [Text]
  }
  deriving stock Show

mkSettings :: LocalConfFileOpts -> SshCliOpts -> IO SshSettings
mkSettings _localConfFileOpts cliOpts = do
  selectInstBy <- mkSelectInstBy cliOpts.id cliOpts.name
  pure SshSettings { selectInstBy, sshPassthruArgs = cliOpts.passthru }

runSsh :: LocalConfFileOpts -> SshCliOpts -> IO ()
runSsh localConfFileOpts cliOpts = do
  settings <- mkSettings localConfFileOpts cliOpts
  ipAddr <- withCloudyDb $ \conn -> do
    instanceInfo <- findInstanceInfoForSelectInstBy conn settings.selectInstBy
    case instanceInfo of
      CloudyAwsInstance _cloudyInstance void -> absurd void
      CloudyScalewayInstance _cloudyInstance scalewayInstance -> pure scalewayInstance.scalewayIpAddress
  let sshArgs = fmap unpack $ "root@" <> ipAddr : settings.sshPassthruArgs
  executeFile "ssh" True sshArgs Nothing