cachix-1.3: src/Cachix/Client/Env.hs
module Cachix.Client.Env
( Env (..),
mkEnv,
createClientEnv,
customManagerSettings,
)
where
import Cachix.Client.Config (Config)
import qualified Cachix.Client.Config as Config
import qualified Cachix.Client.OptionsParser as Options
import Cachix.Client.URI (getBaseUrl)
import Cachix.Client.Version (cachixVersion)
import qualified Hercules.CNix as CNix
import qualified Hercules.CNix.Util as CNix.Util
import Network.HTTP.Client
( ManagerSettings,
managerModifyRequest,
managerResponseTimeout,
responseTimeoutNone,
)
import Network.HTTP.Client.TLS (newTlsManagerWith, tlsManagerSettings)
import Network.HTTP.Simple (setRequestHeader)
import Protolude hiding (toS)
import Protolude.Conv
import Servant.Client.Streaming (ClientEnv, mkClientEnv)
import System.Directory (canonicalizePath)
import System.Posix.Signals (getSignalMask, setSignalMask)
data Env = Env
{ cachixoptions :: Config.CachixOptions,
clientenv :: ClientEnv,
config :: Config
}
mkEnv :: Options.Flags -> IO Env
mkEnv flags = do
signalset <- getSignalMask
-- Initialize the Nix library
CNix.init
-- darwin: restore the signal mask modified by Nix
-- https://github.com/cachix/cachix/issues/501
setSignalMask signalset
-- Interrupt Nix before throwing UserInterrupt
CNix.Util.installDefaultSigINTHandler
-- make sure path to the config is passed as absolute to dhall logic
canonicalConfigPath <- canonicalizePath (Options.configPath flags)
cfg <- Config.getConfig canonicalConfigPath
let cachixOptions =
Config.CachixOptions
{ Config.configPath = canonicalConfigPath,
Config.host = fromMaybe (Config.hostname cfg) (Options.hostname flags),
Config.verbose = Options.verbose flags
}
clientEnv <- createClientEnv cachixOptions
return
Env
{ cachixoptions = cachixOptions,
clientenv = clientEnv,
config = cfg
}
customManagerSettings :: ManagerSettings
customManagerSettings =
tlsManagerSettings
{ managerResponseTimeout = responseTimeoutNone,
-- managerModifyRequest :: Request -> IO Request
managerModifyRequest = return . setRequestHeader "User-Agent" [toS cachixVersion]
}
createClientEnv :: Config.CachixOptions -> IO ClientEnv
createClientEnv cachixOptions = do
manager <- newTlsManagerWith customManagerSettings
return $ mkClientEnv manager $ getBaseUrl (Config.host cachixOptions)