support P2PAnnex in connectPeer
This is probably enough to support accessing remotes using p2p-annex:: urls. Not tested yet of course since there is not yet support for serving the other side of such a connection, or for setting up such a connection. P2P.Generic has an implementation of the whole interface to the git-annex-p2p-<netname> commands.
This commit is contained in:
parent
a6f8248465
commit
4fb9b7cb67
4 changed files with 78 additions and 9 deletions
57
P2P/Generic.hs
Normal file
57
P2P/Generic.hs
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
{- P2P protocol, generic transports.
|
||||||
|
-
|
||||||
|
- See doc/design/generic_p2p_transport.mdwn
|
||||||
|
-
|
||||||
|
- Copyright 2025 Joey Hess <id@joeyh.name>
|
||||||
|
-
|
||||||
|
- Licensed under the GNU AGPL version 3 or higher.
|
||||||
|
-}
|
||||||
|
|
||||||
|
module P2P.Generic where
|
||||||
|
|
||||||
|
import Common
|
||||||
|
import P2P.Address
|
||||||
|
|
||||||
|
genericP2PCommand :: P2PNetName -> String
|
||||||
|
genericP2PCommand (P2PNetName netname) = "git-annex-p2p-" ++ netname
|
||||||
|
|
||||||
|
connectGenericP2P :: P2PNetName -> UnderlyingP2PAddress -> CreateProcess
|
||||||
|
connectGenericP2P netname (UnderlyingP2PAddress address) =
|
||||||
|
(proc (genericP2PCommand netname) [address])
|
||||||
|
{ std_in = CreatePipe
|
||||||
|
, std_out = CreatePipe
|
||||||
|
}
|
||||||
|
|
||||||
|
socketGenericP2P :: P2PNetName -> UnderlyingP2PAddress -> CreateProcess
|
||||||
|
socketGenericP2P netname (UnderlyingP2PAddress address) =
|
||||||
|
(proc (genericP2PCommand netname) ["socket", address])
|
||||||
|
{ std_in = CreatePipe
|
||||||
|
}
|
||||||
|
|
||||||
|
addressGenericP2P :: P2PNetName -> CreateProcess
|
||||||
|
addressGenericP2P netname =
|
||||||
|
(proc (genericP2PCommand netname) ["address"])
|
||||||
|
{ std_in = CreatePipe
|
||||||
|
}
|
||||||
|
|
||||||
|
getSocketGenericP2P :: P2PNetName -> UnderlyingP2PAddress -> IO (Maybe (OsPath, ProcessHandle))
|
||||||
|
getSocketGenericP2P netname address = do
|
||||||
|
(Just hin, Nothing, Nothing, pid) <- createProcess $
|
||||||
|
socketGenericP2P netname address
|
||||||
|
hGetLineUntilExitOrEOF pid hin >>= \case
|
||||||
|
Just l | not (null l) -> return $ Just (toOsPath l, pid)
|
||||||
|
_ -> return Nothing
|
||||||
|
|
||||||
|
getAddressGenericP2P :: P2PNetName -> IO [P2PAddress]
|
||||||
|
getAddressGenericP2P netname = do
|
||||||
|
(Just hin, Nothing, Nothing, pid) <- createProcess $
|
||||||
|
addressGenericP2P netname
|
||||||
|
go [] hin pid
|
||||||
|
where
|
||||||
|
go addrs hin pid = hGetLineUntilExitOrEOF pid hin >>= \case
|
||||||
|
Just l
|
||||||
|
| not (null l) ->
|
||||||
|
let addr = P2PAnnex netname (UnderlyingP2PAddress l)
|
||||||
|
in go (addr:addrs) hin pid
|
||||||
|
| otherwise -> go addrs hin pid
|
||||||
|
Nothing -> return addrs
|
23
P2P/IO.hs
23
P2P/IO.hs
|
@ -1,6 +1,6 @@
|
||||||
{- P2P protocol, IO implementation
|
{- P2P protocol, IO implementation
|
||||||
-
|
-
|
||||||
- Copyright 2016-2024 Joey Hess <id@joeyh.name>
|
- Copyright 2016-2025 Joey Hess <id@joeyh.name>
|
||||||
-
|
-
|
||||||
- Licensed under the GNU AGPL version 3 or higher.
|
- Licensed under the GNU AGPL version 3 or higher.
|
||||||
-}
|
-}
|
||||||
|
@ -20,7 +20,6 @@ module P2P.IO
|
||||||
, connectPeer
|
, connectPeer
|
||||||
, closeConnection
|
, closeConnection
|
||||||
, serveUnixSocket
|
, serveUnixSocket
|
||||||
, setupHandle
|
|
||||||
, ProtoFailure(..)
|
, ProtoFailure(..)
|
||||||
, describeProtoFailure
|
, describeProtoFailure
|
||||||
, runNetProto
|
, runNetProto
|
||||||
|
@ -31,6 +30,7 @@ module P2P.IO
|
||||||
import Common
|
import Common
|
||||||
import P2P.Protocol
|
import P2P.Protocol
|
||||||
import P2P.Address
|
import P2P.Address
|
||||||
|
import P2P.Generic
|
||||||
import Git
|
import Git
|
||||||
import Git.Command
|
import Git.Command
|
||||||
import Utility.AuthToken
|
import Utility.AuthToken
|
||||||
|
@ -138,7 +138,7 @@ stdioP2PConnectionDupped g = do
|
||||||
-- Opens a connection to a peer. Does not authenticate with it.
|
-- Opens a connection to a peer. Does not authenticate with it.
|
||||||
connectPeer :: Maybe Git.Repo -> P2PAddress -> IO P2PConnection
|
connectPeer :: Maybe Git.Repo -> P2PAddress -> IO P2PConnection
|
||||||
connectPeer g (TorAnnex onionaddress onionport) = do
|
connectPeer g (TorAnnex onionaddress onionport) = do
|
||||||
h <- setupHandle =<< connectHiddenService onionaddress onionport
|
h <- setupHandleFromSocket =<< connectHiddenService onionaddress onionport
|
||||||
return $ P2PConnection
|
return $ P2PConnection
|
||||||
{ connRepo = g
|
{ connRepo = g
|
||||||
, connCheckAuth = const False
|
, connCheckAuth = const False
|
||||||
|
@ -147,6 +147,17 @@ connectPeer g (TorAnnex onionaddress onionport) = do
|
||||||
, connProcess = Nothing
|
, connProcess = Nothing
|
||||||
, connIdent = ConnIdent Nothing
|
, connIdent = ConnIdent Nothing
|
||||||
}
|
}
|
||||||
|
connectPeer g (P2PAnnex netname address) = do
|
||||||
|
(Just hin, Just hout, Nothing, pid) <- createProcess $
|
||||||
|
connectGenericP2P netname address
|
||||||
|
return $ P2PConnection
|
||||||
|
{ connRepo = g
|
||||||
|
, connCheckAuth = const False
|
||||||
|
, connIhdl = P2PHandle hout
|
||||||
|
, connOhdl = P2PHandle hin
|
||||||
|
, connProcess = Just pid
|
||||||
|
, connIdent = ConnIdent Nothing
|
||||||
|
}
|
||||||
|
|
||||||
closeConnection :: P2PConnection -> IO ()
|
closeConnection :: P2PConnection -> IO ()
|
||||||
closeConnection conn = do
|
closeConnection conn = do
|
||||||
|
@ -185,10 +196,10 @@ serveUnixSocket unixsocket serveconn = do
|
||||||
S.listen soc 2
|
S.listen soc 2
|
||||||
forever $ do
|
forever $ do
|
||||||
(conn, _) <- S.accept soc
|
(conn, _) <- S.accept soc
|
||||||
setupHandle conn >>= serveconn
|
setupHandleFromSocket conn >>= serveconn
|
||||||
|
|
||||||
setupHandle :: Socket -> IO Handle
|
setupHandleFromSocket :: Socket -> IO Handle
|
||||||
setupHandle s = do
|
setupHandleFromSocket s = do
|
||||||
h <- socketToHandle s ReadWriteMode
|
h <- socketToHandle s ReadWriteMode
|
||||||
hSetBuffering h LineBuffering
|
hSetBuffering h LineBuffering
|
||||||
hSetBinaryMode h False
|
hSetBinaryMode h False
|
||||||
|
|
|
@ -33,9 +33,9 @@ to convert the P2P network's own equivilant into a unix socket file.
|
||||||
To configure `git-annex remotedaemon` to listen on a given P2P network,
|
To configure `git-annex remotedaemon` to listen on a given P2P network,
|
||||||
the user runs `git-annex p2p --enable <netname>`. That also
|
the user runs `git-annex p2p --enable <netname>`. That also
|
||||||
runs `git-annex-p2p-<netname>`, this time with the parameter "address".
|
runs `git-annex-p2p-<netname>`, this time with the parameter "address".
|
||||||
That should output a single line, the P2P network address that can be used
|
That should output one or more lines, the P2P network address (or addresses)
|
||||||
by peers to connect to the repository. It can first do whatever it needs to
|
that can be used by peers to connect to the repository. It can first do
|
||||||
do to set up the P2P network.
|
whatever it needs to do to set up the P2P network.
|
||||||
|
|
||||||
The program [[git-remote-p2p-annex]] is included in git-annex as a git
|
The program [[git-remote-p2p-annex]] is included in git-annex as a git
|
||||||
remote helper program. git will use that program to handle `pull` and
|
remote helper program. git will use that program to handle `pull` and
|
||||||
|
|
|
@ -923,6 +923,7 @@ Executable git-annex
|
||||||
P2P.Address
|
P2P.Address
|
||||||
P2P.Annex
|
P2P.Annex
|
||||||
P2P.Auth
|
P2P.Auth
|
||||||
|
P2P.Generic
|
||||||
P2P.Http.Types
|
P2P.Http.Types
|
||||||
P2P.Http.Client
|
P2P.Http.Client
|
||||||
P2P.Http.Url
|
P2P.Http.Url
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue