11module System.Nix.Store.Remote.Client
2- ( Run
3- , simpleOp
2+ ( simpleOp
43 , simpleOpArgs
54 , runOp
65 , runOpArgs
76 , runOpArgsIO
8- , runStoreSocket
9- , ourProtoVersion
10- , doReq
117 , addToStore
128 , buildDerivation
139 , isValidPath
10+ , module System.Nix.Store.Remote.Client.Core
1411 ) where
1512
16- import Control.Monad (unless , when )
13+ import Control.Monad (when )
1714import Control.Monad.Except (throwError )
18- import Control.Monad.IO.Class (MonadIO , liftIO )
19- import Data.DList (DList )
15+ import Control.Monad.IO.Class (liftIO )
2016import Data.Serialize.Put (Put , runPut )
21- import Data.Some (Some (Some ))
22-
23- import qualified Data.ByteString
24- import qualified Network.Socket.ByteString
17+ import Data.Some (Some )
18+ import Data.Text (Text )
2519
20+ import System.Nix.Build (BuildMode , BuildResult )
21+ import System.Nix.Derivation (Derivation )
2622import System.Nix.Hash (HashAlgo (.. ))
2723import System.Nix.Nar (NarSource )
2824import System.Nix.StorePath (StorePath , StorePathName )
2925import System.Nix.Store.Remote.Logger (processOutput )
3026import System.Nix.Store.Remote.MonadStore
3127import System.Nix.Store.Remote.Socket (sockPutS , sockGetS )
32- import System.Nix.Store.Remote.Serializer (bool , enum , int , mapErrorS , protoVersion , storeRequest , text , trustedFlag , workerMagic )
33- import System.Nix.Store.Remote.Types.Handshake (ClientHandshakeInput (.. ), ClientHandshakeOutput (.. ))
34- import System.Nix.Store.Remote.Types.Logger (Logger )
35- import System.Nix.Store.Remote.Types.ProtoVersion (ProtoVersion (.. ), ourProtoVersion )
36- import System.Nix.Store.Remote.Types.StoreConfig (PreStoreConfig , StoreConfig , preStoreConfigToStoreConfig )
28+ import System.Nix.Store.Remote.Serializer (bool , enum , mapErrorS )
3729import System.Nix.Store.Remote.Types.StoreRequest (StoreRequest (.. ))
38- import System.Nix.Store.Remote.Types.StoreReply (StoreReply (.. ))
39- import System.Nix.Store.Remote.Types.WorkerMagic (WorkerMagic (.. ))
4030import System.Nix.Store.Remote.Types.WorkerOp (WorkerOp )
31+ import System.Nix.Store.Remote.Client.Core
4132import System.Nix.Store.Types (FileIngestionMethod (.. ), RepairMode (.. ))
4233
43- import Data.Text
44- import System.Nix.Build
45- import System.Nix.Derivation (Derivation )
34+ import qualified Data.ByteString
35+ import qualified Network.Socket.ByteString
4636
4737simpleOp
4838 :: MonadRemoteStore m
@@ -93,47 +83,6 @@ runOpArgsIO op encoder = do
9383
9484 processOutput
9585
96- -- | Perform @StoreRequest@
97- doReq
98- :: forall m a
99- . ( MonadIO m
100- , MonadRemoteStore m
101- , StoreReply a
102- , Show a
103- )
104- => StoreRequest a
105- -> m a
106- doReq = \ case
107- x -> do
108- sockPutS
109- (mapErrorS
110- RemoteStoreError_SerializerRequest
111- storeRequest
112- )
113- (Some x)
114-
115- case x of
116- AddToStore {} -> do
117-
118- ms <- takeNarSource
119- case ms of
120- Just (stream :: NarSource IO ) -> do
121- soc <- getStoreSocket
122- liftIO
123- $ stream
124- $ Network.Socket.ByteString. sendAll soc
125- Nothing ->
126- throwError
127- RemoteStoreError_NoNarSourceProvided
128-
129- _ -> pure ()
130-
131- processOutput
132- sockGetS
133- (mapErrorS RemoteStoreError_SerializerReply
134- $ getReplyS @ a
135- )
136-
13786-- | Add `NarSource` to the store
13887addToStore
13988 :: MonadRemoteStore m
@@ -159,100 +108,5 @@ buildDerivation
159108 -> m BuildResult
160109buildDerivation a b c = doReq (BuildDerivation a b c)
161110
162- -- isValidPath :: MonadIO m => StorePath -> RemoteStoreT StoreConfig m Bool
163- -- isValidPath = doReq . IsValidPath
164-
165- -- TOOD: want this, but Logger.processOutput is fixed to RemoteStoreT r m
166111isValidPath :: MonadRemoteStore m => StorePath -> m Bool
167112isValidPath = doReq . IsValidPath
168-
169- type Run m a = m (Either RemoteStoreError a , DList Logger )
170-
171- runStoreSocket
172- :: ( Monad m
173- , MonadIO m
174- )
175- => PreStoreConfig
176- -> RemoteStoreT StoreConfig m a
177- -> Run m a
178- runStoreSocket preStoreConfig code =
179- runRemoteStoreT preStoreConfig $ do
180- ClientHandshakeOutput {.. }
181- <- greet
182- ClientHandshakeInput
183- { clientHandshakeInputOurVersion = ourProtoVersion
184- }
185-
186- mapStoreConfig
187- (preStoreConfigToStoreConfig
188- clientHandshakeOutputLeastCommonVerison)
189- code
190-
191- where
192- greet
193- :: MonadIO m
194- => ClientHandshakeInput
195- -> RemoteStoreT PreStoreConfig m ClientHandshakeOutput
196- greet ClientHandshakeInput {.. } = do
197-
198- sockPutS
199- (mapErrorS
200- RemoteStoreError_SerializerHandshake
201- workerMagic
202- )
203- WorkerMagic_One
204-
205- magic <-
206- sockGetS
207- $ mapErrorS
208- RemoteStoreError_SerializerHandshake
209- workerMagic
210-
211- unless
212- (magic == WorkerMagic_Two )
213- $ throwError RemoteStoreError_WorkerMagic2Mismatch
214-
215- daemonVersion <- sockGetS protoVersion
216-
217- when (daemonVersion < ProtoVersion 1 10 )
218- $ throwError RemoteStoreError_ClientVersionTooOld
219-
220- sockPutS protoVersion clientHandshakeInputOurVersion
221-
222- let leastCommonVersion = min daemonVersion ourProtoVersion
223-
224- when (leastCommonVersion >= ProtoVersion 1 14 )
225- $ sockPutS int (0 :: Int ) -- affinity, obsolete
226-
227- when (leastCommonVersion >= ProtoVersion 1 11 ) $ do
228- sockPutS
229- (mapErrorS RemoteStoreError_SerializerPut bool)
230- False -- reserveSpace, obsolete
231-
232- daemonNixVersion <- if leastCommonVersion >= ProtoVersion 1 33
233- then do
234- -- If we were buffering I/O, we would flush the output here.
235- txtVer <-
236- sockGetS
237- $ mapErrorS
238- RemoteStoreError_SerializerGet
239- text
240- pure $ Just txtVer
241- else pure Nothing
242-
243- remoteTrustsUs <- if leastCommonVersion >= ProtoVersion 1 35
244- then do
245- sockGetS
246- $ mapErrorS RemoteStoreError_SerializerHandshake trustedFlag
247- else pure Nothing
248-
249- mapStoreConfig
250- (preStoreConfigToStoreConfig leastCommonVersion)
251- processOutput
252-
253- pure ClientHandshakeOutput
254- { clientHandshakeOutputNixVersion = daemonNixVersion
255- , clientHandshakeOutputTrust = remoteTrustsUs
256- , clientHandshakeOutputLeastCommonVerison = leastCommonVersion
257- , clientHandshakeOutputServerVersion = daemonVersion
258- }
0 commit comments