mirror of https://github.com/voidlizard/hbs2
wip
This commit is contained in:
parent
90ec4a9b48
commit
55e2f1cc32
|
@ -129,3 +129,4 @@ pHostName = do
|
||||||
pure (host, Text.pack (show port))
|
pure (host, Text.pack (show port))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -184,3 +184,12 @@ instance Messaging MessagingUDP UDP ByteString where
|
||||||
|
|
||||||
liftIO $ atomically $ Q0.readTQueue (sink bus) <&> L.singleton
|
liftIO $ atomically $ Q0.readTQueue (sink bus) <&> L.singleton
|
||||||
|
|
||||||
|
|
||||||
|
parsePeerAddr :: MonadIO m => String -> m (Maybe (Peer UDP))
|
||||||
|
parsePeerAddr s = do
|
||||||
|
ai <- liftIO $ parseAddr (fromString s) <&> listToMaybe
|
||||||
|
let sa = fmap addrAddress ai
|
||||||
|
pure $ PeerUDP <$> sa
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -8,10 +8,10 @@ class OrDie m a where
|
||||||
type family OrDieResult a :: Type
|
type family OrDieResult a :: Type
|
||||||
orDie :: m a -> String -> m (OrDieResult a)
|
orDie :: m a -> String -> m (OrDieResult a)
|
||||||
|
|
||||||
instance OrDie IO (Maybe a) where
|
instance MonadIO m => OrDie m (Maybe a) where
|
||||||
type instance OrDieResult (Maybe a) = a
|
type instance OrDieResult (Maybe a) = a
|
||||||
orDie mv err = mv >>= \case
|
orDie mv err = mv >>= \case
|
||||||
Nothing -> die err
|
Nothing -> liftIO $ die err
|
||||||
Just x -> pure x
|
Just x -> pure x
|
||||||
|
|
||||||
instance MonadIO m => OrDie m ExitCode where
|
instance MonadIO m => OrDie m ExitCode where
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
{-# Language AllowAmbiguousTypes #-}
|
||||||
|
module DetectGateway (detectGatewayLoop) where
|
||||||
|
|
||||||
|
import HBS2.Prelude.Plated
|
||||||
|
import HBS2.Clock
|
||||||
|
import HBS2.Net.Messaging
|
||||||
|
import HBS2.Net.Proto.Types
|
||||||
|
import HBS2.OrDie
|
||||||
|
import HBS2.Net.Messaging.UDP
|
||||||
|
|
||||||
|
import HBS2.System.Logger.Simple
|
||||||
|
|
||||||
|
import Data.Attoparsec.Text as Atto
|
||||||
|
import Data.Functor
|
||||||
|
import Control.Concurrent.Async
|
||||||
|
-- import Data.ByteString.Char8 qualified as BS8
|
||||||
|
import Data.ByteString.Lazy.Char8 qualified as LBS
|
||||||
|
import Data.ByteString.Lazy.Char8 (ByteString)
|
||||||
|
import Control.Monad
|
||||||
|
import Data.Text.Encoding qualified as T
|
||||||
|
import Data.Text as T
|
||||||
|
import Data.List qualified as List
|
||||||
|
import Data.Maybe
|
||||||
|
|
||||||
|
detectGatewayLoop :: forall m . (MonadIO m) => m ()
|
||||||
|
detectGatewayLoop = do
|
||||||
|
|
||||||
|
mlisten <- newMessagingUDPMulticast upnpMulticast
|
||||||
|
`orDie` "Can't start UPnP protocol"
|
||||||
|
|
||||||
|
trace $ "UPnP listen:" <+> pretty (listenAddr mlisten)
|
||||||
|
|
||||||
|
upaddr <- parsePeerAddr upnpMulticast
|
||||||
|
`orDie` "Can't parse upnp address"
|
||||||
|
|
||||||
|
udpMessListen <- liftIO $ async $ runMessagingUDP mlisten
|
||||||
|
|
||||||
|
|
||||||
|
reqLoop <- liftIO $ async $ forever do
|
||||||
|
sendTo mlisten (To upaddr) (From upaddr) gwDetectMsg
|
||||||
|
pause @'Seconds 10
|
||||||
|
|
||||||
|
forever $ do
|
||||||
|
debug "detectGatewayLoop"
|
||||||
|
|
||||||
|
answ <- receive @_ @UDP @ByteString mlisten (To upaddr)
|
||||||
|
|
||||||
|
gwAddrs <- forM answ $ \(From sa,msg) -> do
|
||||||
|
let txt = foldMap T.words $ T.lines $ T.decodeUtf8 $ LBS.toStrict msg
|
||||||
|
debug $ pretty sa <+> pretty (show msg)
|
||||||
|
pure Nothing
|
||||||
|
-- maybe1 (List.find (== "urn:schemas-upnp-org:device:InternetGatewayDevice:1") txt)
|
||||||
|
-- (pure Nothing)
|
||||||
|
-- (const $ pure $ Just sa)
|
||||||
|
|
||||||
|
pure ()
|
||||||
|
-- let gwAddr = headMay $ catMaybes gwAddrs
|
||||||
|
|
||||||
|
-- TODO: what-if-more-than-one-gateway
|
||||||
|
-- maybe1 gwAddr none $ \gwa -> do
|
||||||
|
-- debug $ "FOUND FIRST GATEWAY:" <+> pretty gwa
|
||||||
|
|
||||||
|
-- FIXME: remove-debug-hardcode
|
||||||
|
-- pause @'Seconds 30
|
||||||
|
|
||||||
|
-- void $ liftIO $ waitAnyCatchCancel [udpMessSend] -- , udpMessListen]
|
||||||
|
|
||||||
|
where
|
||||||
|
upnpMulticast = "239.255.255.250:1900"
|
||||||
|
gwDetectMsg = LBS.intercalate "\r\n"
|
||||||
|
[ "M-SEARCH * HTTP/1.1"
|
||||||
|
, "HOST: 239.255.255.250:1900"
|
||||||
|
, "MAN: \"ssdp:discover\""
|
||||||
|
, "MX: 2"
|
||||||
|
, "ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1"
|
||||||
|
]
|
||||||
|
|
|
@ -36,6 +36,7 @@ import PeerInfo
|
||||||
import PeerConfig
|
import PeerConfig
|
||||||
import Bootstrap
|
import Bootstrap
|
||||||
import CheckMetrics
|
import CheckMetrics
|
||||||
|
import DetectGateway
|
||||||
|
|
||||||
import Data.Text qualified as Text
|
import Data.Text qualified as Text
|
||||||
import Data.Foldable (for_)
|
import Data.Foldable (for_)
|
||||||
|
@ -537,6 +538,8 @@ runPeer opts = Exception.handle myException $ do
|
||||||
debug "sending local peer announce"
|
debug "sending local peer announce"
|
||||||
request localMulticast (PeerAnnounce @e pnonce)
|
request localMulticast (PeerAnnounce @e pnonce)
|
||||||
|
|
||||||
|
peerThread detectGatewayLoop
|
||||||
|
|
||||||
peerThread (checkMetrics metrics)
|
peerThread (checkMetrics metrics)
|
||||||
|
|
||||||
peerThread (peerPingLoop @e)
|
peerThread (peerPingLoop @e)
|
||||||
|
|
|
@ -20,6 +20,7 @@ common common-deps
|
||||||
build-depends:
|
build-depends:
|
||||||
base, hbs2-core, hbs2-storage-simple
|
base, hbs2-core, hbs2-storage-simple
|
||||||
, async
|
, async
|
||||||
|
, attoparsec
|
||||||
, bytestring
|
, bytestring
|
||||||
, cache
|
, cache
|
||||||
, containers
|
, containers
|
||||||
|
@ -114,6 +115,7 @@ executable hbs2-peer
|
||||||
, PeerTypes
|
, PeerTypes
|
||||||
, PeerConfig
|
, PeerConfig
|
||||||
, CheckMetrics
|
, CheckMetrics
|
||||||
|
, DetectGateway
|
||||||
|
|
||||||
-- other-extensions:
|
-- other-extensions:
|
||||||
build-depends: base
|
build-depends: base
|
||||||
|
|
Loading…
Reference in New Issue