This commit is contained in:
voidlizard 2024-11-03 12:48:28 +03:00
parent 25cf9a2040
commit 68baa0adb1
4 changed files with 39 additions and 2 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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