3
3
{-# LANGUAGE OverloadedStrings #-}
4
4
5
5
module System.Nix.Store.Remote
6
- ( addToStore
6
+ (
7
+ -- * Operations
8
+ addToStore
7
9
, addTextToStore
8
10
, addSignatures
9
11
, addIndirectRoot
@@ -25,51 +27,124 @@ module System.Nix.Store.Remote
25
27
, queryPathFromHashPart
26
28
, queryMissing
27
29
, optimiseStore
28
- , runStore
29
30
, syncWithGC
30
31
, verifyStore
31
32
, module System.Nix.Store.Types
32
33
, module System.Nix.Store.Remote.MonadStore
33
34
, module System.Nix.Store.Remote.Types
35
+ -- * Compat
36
+ , MonadStore
37
+ -- * Runners
38
+ , runStore
39
+ , runStoreOpts
40
+ , runStoreOptsTCP
34
41
) where
35
42
36
43
import Crypto.Hash (SHA256 )
37
44
import Data.ByteString (ByteString )
45
+ import Data.Default.Class (Default (def ))
38
46
import Data.Dependent.Sum (DSum ((:=>) ))
39
47
import Data.HashSet (HashSet )
40
48
import Data.Map (Map )
41
49
import Data.Text (Text )
42
50
import Data.Word (Word64 )
51
+ import Network.Socket (Family , SockAddr (SockAddrUnix ))
43
52
import System.Nix.Nar (NarSource )
44
53
import System.Nix.Derivation (Derivation )
45
54
import System.Nix.Store.Types (FileIngestionMethod (.. ), RepairMode (.. ))
46
55
import System.Nix.Build (BuildMode , BuildResult )
47
56
import 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 )
49
58
import System.Nix.StorePath.Metadata (Metadata (.. ), StorePathTrust (.. ))
50
59
51
60
import qualified Data.Text
61
+ import qualified Control.Exception
52
62
import qualified Control.Monad
53
63
import qualified Data.Attoparsec.Text
54
64
import qualified Data.Text.Encoding
55
65
import qualified Data.Map.Strict
56
66
import qualified Data.Serialize.Put
57
67
import qualified Data.Set
68
+ import qualified Network.Socket
58
69
59
70
import qualified System.Nix.ContentAddress
60
71
import qualified System.Nix.Hash
61
72
import qualified System.Nix.Signature
62
73
import qualified System.Nix.StorePath
63
74
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 )
66
77
import System.Nix.Store.Remote.Socket
67
78
import System.Nix.Store.Remote.Types
68
79
69
80
import Data.Serialize (get )
70
- import System.Nix.Store.Remote.Serialize
81
+ import System.Nix.Store.Remote.Serialize ( putDerivation )
71
82
import System.Nix.Store.Remote.Serialize.Prim
72
83
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
+
73
148
-- | Pack `Nar` and add it to the store.
74
149
addToStore
75
150
:: forall a
0 commit comments