33{-# LANGUAGE OverloadedStrings #-}
44
55module System.Nix.Store.Remote
6- ( addToStore
6+ (
7+ -- * Operations
8+ addToStore
79 , addTextToStore
810 , addSignatures
911 , addIndirectRoot
@@ -25,51 +27,124 @@ module System.Nix.Store.Remote
2527 , queryPathFromHashPart
2628 , queryMissing
2729 , optimiseStore
28- , runStore
2930 , syncWithGC
3031 , verifyStore
3132 , module System.Nix.Store.Types
3233 , module System.Nix.Store.Remote.MonadStore
3334 , module System.Nix.Store.Remote.Types
35+ -- * Compat
36+ , MonadStore
37+ -- * Runners
38+ , runStore
39+ , runStoreOpts
40+ , runStoreOptsTCP
3441 ) where
3542
3643import Crypto.Hash (SHA256 )
3744import Data.ByteString (ByteString )
45+ import Data.Default.Class (Default (def ))
3846import Data.Dependent.Sum (DSum ((:=>) ))
3947import Data.HashSet (HashSet )
4048import Data.Map (Map )
4149import Data.Text (Text )
4250import Data.Word (Word64 )
51+ import Network.Socket (Family , SockAddr (SockAddrUnix ))
4352import System.Nix.Nar (NarSource )
4453import System.Nix.Derivation (Derivation )
4554import System.Nix.Store.Types (FileIngestionMethod (.. ), RepairMode (.. ))
4655import System.Nix.Build (BuildMode , BuildResult )
4756import System.Nix.Hash (NamedAlgo (.. ), BaseEncoding (Base16 ), decodeDigestWith )
48- import System.Nix.StorePath (StorePath , StorePathName , StorePathHashPart , InvalidPathError )
57+ import System.Nix.StorePath (StoreDir ( .. ), StorePath , StorePathName , StorePathHashPart , InvalidPathError )
4958import System.Nix.StorePath.Metadata (Metadata (.. ), StorePathTrust (.. ))
5059
5160import qualified Data.Text
61+ import qualified Control.Exception
5262import qualified Control.Monad
5363import qualified Data.Attoparsec.Text
5464import qualified Data.Text.Encoding
5565import qualified Data.Map.Strict
5666import qualified Data.Serialize.Put
5767import qualified Data.Set
68+ import qualified Network.Socket
5869
5970import qualified System.Nix.ContentAddress
6071import qualified System.Nix.Hash
6172import qualified System.Nix.Signature
6273import qualified System.Nix.StorePath
6374
64- import System.Nix.Store.Remote.MonadStore
65- import System.Nix.Store.Remote.Protocol
75+ import System.Nix.Store.Remote.MonadStore ( MonadRemoteStore , getStoreDir , RemoteStoreError ( RemoteStoreError_GetAddrInfoFailed ))
76+ import System.Nix.Store.Remote.Protocol ( Run , runStoreSocket , runOp , runOpArgs , runOpArgsIO , simpleOp , simpleOpArgs )
6677import System.Nix.Store.Remote.Socket
6778import System.Nix.Store.Remote.Types
6879
6980import Data.Serialize (get )
70- import System.Nix.Store.Remote.Serialize
81+ import System.Nix.Store.Remote.Serialize ( putDerivation )
7182import System.Nix.Store.Remote.Serialize.Prim
7283
84+ -- * Compat
85+
86+ type MonadStore = MonadRemoteStore
87+
88+ -- * Runners
89+
90+ runStore :: MonadStore a -> Run a
91+ runStore = runStoreOpts defaultSockPath def
92+ where
93+ defaultSockPath :: String
94+ defaultSockPath = " /nix/var/nix/daemon-socket/socket"
95+
96+ runStoreOpts
97+ :: FilePath
98+ -> StoreDir
99+ -> MonadStore a
100+ -> Run a
101+ runStoreOpts socketPath =
102+ runStoreOpts'
103+ Network.Socket. AF_UNIX
104+ (SockAddrUnix socketPath)
105+
106+ runStoreOptsTCP
107+ :: String
108+ -> Int
109+ -> StoreDir
110+ -> MonadStore a
111+ -> Run a
112+ runStoreOptsTCP host port sd code = do
113+ Network.Socket. getAddrInfo
114+ (Just Network.Socket. defaultHints)
115+ (Just host)
116+ (Just $ show port)
117+ >>= \ case
118+ (sockAddr: _) ->
119+ runStoreOpts'
120+ (Network.Socket. addrFamily sockAddr)
121+ (Network.Socket. addrAddress sockAddr)
122+ sd
123+ code
124+ _ -> pure (Left RemoteStoreError_GetAddrInfoFailed , [] )
125+
126+ runStoreOpts'
127+ :: Family
128+ -> SockAddr
129+ -> StoreDir
130+ -> MonadStore a
131+ -> Run a
132+ runStoreOpts' sockFamily sockAddr storeRootDir code =
133+ Control.Exception. bracket
134+ open
135+ (Network.Socket. close . hasStoreSocket)
136+ (flip runStoreSocket code)
137+ where
138+ open = do
139+ soc <- Network.Socket. socket sockFamily Network.Socket. Stream 0
140+ Network.Socket. connect soc sockAddr
141+ pure PreStoreConfig
142+ { preStoreConfig_socket = soc
143+ , preStoreConfig_dir = storeRootDir
144+ }
145+
146+ -- * Operations
147+
73148-- | Pack `Nar` and add it to the store.
74149addToStore
75150 :: forall a
0 commit comments