mirror of https://github.com/voidlizard/hbs2
wip, tcp
This commit is contained in:
parent
5bffbc1d03
commit
6862c81b27
|
@ -9,6 +9,7 @@ module HBS2.Net.Messaging.TCP
|
||||||
, tcpPeerConn
|
, tcpPeerConn
|
||||||
, tcpCookie
|
, tcpCookie
|
||||||
, tcpOnClientStarted
|
, tcpOnClientStarted
|
||||||
|
, tcpPeerKick
|
||||||
, messagingTCPSetProbe
|
, messagingTCPSetProbe
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
@ -205,6 +206,13 @@ data TCPMessagingError =
|
||||||
|
|
||||||
instance Exception TCPMessagingError
|
instance Exception TCPMessagingError
|
||||||
|
|
||||||
|
tcpPeerKick :: forall m . MonadIO m => MessagingTCP -> Peer L4Proto -> m ()
|
||||||
|
tcpPeerKick MessagingTCP{..} p = do
|
||||||
|
whoever <- readTVarIO _tcpPeerSocket <&> HM.lookup p
|
||||||
|
for_ whoever $ \so -> do
|
||||||
|
debug $ "tcpPeerKick" <+> pretty p
|
||||||
|
liftIO $ shutdown so ShutdownBoth
|
||||||
|
|
||||||
runMessagingTCP :: forall m . MonadIO m => MessagingTCP -> m ()
|
runMessagingTCP :: forall m . MonadIO m => MessagingTCP -> m ()
|
||||||
runMessagingTCP env@MessagingTCP{..} = liftIO do
|
runMessagingTCP env@MessagingTCP{..} = liftIO do
|
||||||
|
|
||||||
|
|
|
@ -1321,6 +1321,7 @@ runPeer opts = respawnOnError opts $ do
|
||||||
|
|
||||||
let rpcctx = RPC2Context { rpcConfig = fromPeerConfig conf
|
let rpcctx = RPC2Context { rpcConfig = fromPeerConfig conf
|
||||||
, rpcMessaging = rpcmsg
|
, rpcMessaging = rpcmsg
|
||||||
|
, rpcTCP = tcp
|
||||||
, rpcPokeAnswer = pokeAnsw
|
, rpcPokeAnswer = pokeAnsw
|
||||||
, rpcPeerEnv = penv
|
, rpcPeerEnv = penv
|
||||||
, rpcLocalMultiCast = localMulticast
|
, rpcLocalMultiCast = localMulticast
|
||||||
|
|
|
@ -24,6 +24,8 @@ import HBS2.Net.Auth.Schema
|
||||||
import HBS2.Peer.RPC.Internal.Types
|
import HBS2.Peer.RPC.Internal.Types
|
||||||
import HBS2.Peer.RPC.API.Peer
|
import HBS2.Peer.RPC.API.Peer
|
||||||
|
|
||||||
|
import HBS2.Net.Messaging.TCP
|
||||||
|
|
||||||
import Data.Config.Suckless.Script
|
import Data.Config.Suckless.Script
|
||||||
|
|
||||||
import RPC2.Peer
|
import RPC2.Peer
|
||||||
|
@ -35,12 +37,13 @@ import RPC2.Mailbox()
|
||||||
import PeerTypes
|
import PeerTypes
|
||||||
import PeerInfo
|
import PeerInfo
|
||||||
|
|
||||||
import UnliftIO
|
import Control.Monad.Trans.Maybe
|
||||||
|
import Control.Monad.Trans.Cont
|
||||||
import Data.Text qualified as Text
|
import Data.Text qualified as Text
|
||||||
import Data.Either
|
import Data.Either
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Numeric
|
import Numeric
|
||||||
|
import UnliftIO
|
||||||
|
|
||||||
instance (e ~ L4Proto, MonadUnliftIO m, HasRpcContext PeerAPI RPC2Context m) => HandleMethod m RpcRunScript where
|
instance (e ~ L4Proto, MonadUnliftIO m, HasRpcContext PeerAPI RPC2Context m) => HandleMethod m RpcRunScript where
|
||||||
handleMethod top = do
|
handleMethod top = do
|
||||||
|
@ -59,6 +62,29 @@ instance (e ~ L4Proto, MonadUnliftIO m, HasRpcContext PeerAPI RPC2Context m) =>
|
||||||
entry $ bindMatch "hey" $ const do
|
entry $ bindMatch "hey" $ const do
|
||||||
pure $ mkSym @C "hey"
|
pure $ mkSym @C "hey"
|
||||||
|
|
||||||
|
entry $ bindMatch "tcp:peer:kick" $ \case
|
||||||
|
[ StringLike addr ] -> flip runContT pure $ callCC \exit -> do
|
||||||
|
|
||||||
|
peer' <- liftIO $ try @_ @SomeException do
|
||||||
|
let pa = fromString @(PeerAddr L4Proto) addr
|
||||||
|
fromPeerAddr pa
|
||||||
|
|
||||||
|
peer <- either (const $ exit (mkSym "error:invalid-address")) pure peer'
|
||||||
|
|
||||||
|
mess <- ContT $ maybe1 rpcTCP (pure nil)
|
||||||
|
|
||||||
|
tcpPeerKick mess peer
|
||||||
|
|
||||||
|
liftIO $ withPeerM rpcPeerEnv do
|
||||||
|
pl <- getPeerLocator @e
|
||||||
|
delPeers pl [peer]
|
||||||
|
expire (PeerInfoKey peer)
|
||||||
|
expire (KnownPeerKey peer)
|
||||||
|
|
||||||
|
pure $ mkList [mkSym "kicked", mkSym (show $ pretty peer) ]
|
||||||
|
|
||||||
|
_ -> pure nil
|
||||||
|
|
||||||
entry $ bindMatch "peer-info" $ const do
|
entry $ bindMatch "peer-info" $ const do
|
||||||
|
|
||||||
now <- getTimeCoarse
|
now <- getTimeCoarse
|
||||||
|
|
|
@ -12,6 +12,7 @@ import HBS2.Storage()
|
||||||
import HBS2.Data.Types.Refs (HashRef)
|
import HBS2.Data.Types.Refs (HashRef)
|
||||||
import HBS2.Data.Types.SignedBox
|
import HBS2.Data.Types.SignedBox
|
||||||
import HBS2.Net.Messaging.Unix
|
import HBS2.Net.Messaging.Unix
|
||||||
|
import HBS2.Net.Messaging.TCP
|
||||||
import HBS2.Net.Messaging.Encrypted.ByPass (ByPassStat)
|
import HBS2.Net.Messaging.Encrypted.ByPass (ByPassStat)
|
||||||
import HBS2.Net.Proto.Service
|
import HBS2.Net.Proto.Service
|
||||||
import HBS2.Peer.Proto.Mailbox
|
import HBS2.Peer.Proto.Mailbox
|
||||||
|
@ -32,6 +33,7 @@ data RPC2Context =
|
||||||
RPC2Context
|
RPC2Context
|
||||||
{ rpcConfig :: [Syntax C]
|
{ rpcConfig :: [Syntax C]
|
||||||
, rpcMessaging :: MessagingUnix
|
, rpcMessaging :: MessagingUnix
|
||||||
|
, rpcTCP :: Maybe MessagingTCP
|
||||||
, rpcPokeAnswer :: String
|
, rpcPokeAnswer :: String
|
||||||
, rpcPeerEnv :: PeerEnv L4Proto
|
, rpcPeerEnv :: PeerEnv L4Proto
|
||||||
, rpcLocalMultiCast :: Peer L4Proto
|
, rpcLocalMultiCast :: Peer L4Proto
|
||||||
|
|
Loading…
Reference in New Issue