packages feed

hercules-ci-agent-0.7.5: hercules-ci-agent/Hercules/Agent/Init.hs

module Hercules.Agent.Init where

import qualified CNix
import qualified Hercules.Agent.Cachix.Init
import qualified Hercules.Agent.Compat as Compat
import qualified Hercules.Agent.Config as Config
import qualified Hercules.Agent.Config.BinaryCaches as BC
import qualified Hercules.Agent.Env as Env
import Hercules.Agent.Env (Env (Env))
import qualified Hercules.Agent.Nix.Init
import qualified Hercules.Agent.SecureDirectory as SecureDirectory
import qualified Hercules.Agent.ServiceInfo as ServiceInfo
import qualified Hercules.Agent.Token as Token
import qualified Katip as K
import qualified Network.HTTP.Client.TLS
import Protolude
import qualified Servant.Auth.Client
import qualified Servant.Client
import qualified System.Directory

newEnv :: Config.FinalConfig -> K.LogEnv -> IO Env
newEnv config logEnv = do
  let withLogging :: K.KatipContextT IO a -> IO a
      withLogging = K.runKatipContextT logEnv () "Init"
  withLogging $ K.logLocM K.DebugS $ "Config: " <> K.logStr (show config :: Text)
  System.Directory.createDirectoryIfMissing True (Config.workDirectory config)
  SecureDirectory.init config
  bcs <- withLogging $ BC.parseFile config
  manager <- Network.HTTP.Client.TLS.newTlsManager
  baseUrl <- Servant.Client.parseBaseUrl $ toS $ Config.herculesApiBaseURL config
  let clientEnv :: Servant.Client.ClientEnv
      clientEnv = Servant.Client.mkClientEnv manager baseUrl
  token <- Token.readTokenFile $ toS $ Config.clusterJoinTokenPath config
  cachix <- withLogging $ Hercules.Agent.Cachix.Init.newEnv config (BC.cachixCaches bcs)
  nix <- Hercules.Agent.Nix.Init.newEnv
  serviceInfo <- ServiceInfo.newEnv clientEnv
  pure Env
    { manager = manager,
      config = config,
      herculesBaseUrl = baseUrl,
      herculesClientEnv = clientEnv,
      serviceInfo = serviceInfo,
      currentToken = Servant.Auth.Client.Token $ encodeUtf8 token,
      binaryCaches = bcs,
      cachixEnv = cachix,
      socket = panic "Socket not defined yet.", -- Hmm, needs different monad?
      kNamespace = emptyNamespace,
      kContext = mempty,
      kLogEnv = logEnv,
      nixEnv = nix
    }

setupLogging :: Config.FinalConfig -> (K.LogEnv -> IO ()) -> IO ()
setupLogging cfg f = do
  handleScribe <- K.mkHandleScribe K.ColorIfTerminal stderr (Compat.katipLevel (Config.logLevel cfg)) K.V2
  let mkLogEnv =
        K.registerScribe "stderr" handleScribe K.defaultScribeSettings
          =<< K.initLogEnv emptyNamespace ""
  bracket mkLogEnv K.closeScribes f

emptyNamespace :: K.Namespace
emptyNamespace = K.Namespace []

initCNix :: IO ()
initCNix = do
  CNix.init
  CNix.setTalkative