summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2017-07-27 00:09:18 -0400
committerjoe <joe@jerkface.net>2017-07-27 00:09:18 -0400
commitaee5037c333abc77174d4867b75b1ef068fbaf1b (patch)
tree287f2fcdc59777f7bd8a98beb5d91751a993edb9 /examples
parent133087121638a883ff15bc4141425c7df474b92b (diff)
external-ip command.
Diffstat (limited to 'examples')
-rw-r--r--examples/dhtd.hs40
1 files changed, 36 insertions, 4 deletions
diff --git a/examples/dhtd.hs b/examples/dhtd.hs
index 5c1bbb26..f98b05bd 100644
--- a/examples/dhtd.hs
+++ b/examples/dhtd.hs
@@ -4,6 +4,7 @@
4{-# LANGUAGE FlexibleInstances #-} 4{-# LANGUAGE FlexibleInstances #-}
5{-# LANGUAGE LambdaCase #-} 5{-# LANGUAGE LambdaCase #-}
6{-# LANGUAGE MultiParamTypeClasses #-} 6{-# LANGUAGE MultiParamTypeClasses #-}
7{-# LANGUAGE NamedFieldPuns #-}
7{-# LANGUAGE NondecreasingIndentation #-} 8{-# LANGUAGE NondecreasingIndentation #-}
8{-# LANGUAGE OverloadedStrings #-} 9{-# LANGUAGE OverloadedStrings #-}
9{-# LANGUAGE PartialTypeSignatures #-} 10{-# LANGUAGE PartialTypeSignatures #-}
@@ -59,9 +60,14 @@ showReport kvs = do
59marshalForClient :: String -> String 60marshalForClient :: String -> String
60marshalForClient s = show (length s) ++ ":" ++ s 61marshalForClient s = show (length s) ++ ":" ++ s
61 62
63-- | Writes a message and signals ready for next command.
62hPutClient :: Handle -> String -> IO () 64hPutClient :: Handle -> String -> IO ()
63hPutClient h s = hPutStr h ('.' : marshalForClient s) 65hPutClient h s = hPutStr h ('.' : marshalForClient s)
64 66
67-- | Writes message, but signals there is more to come.
68hPutClientChunk :: Handle -> String -> IO ()
69hPutClientChunk h s = hPutStr h (' ' : marshalForClient s)
70
65data DHT = forall ni. ( Show ni 71data DHT = forall ni. ( Show ni
66 , Read ni 72 , Read ni
67 , ToJSON ni 73 , ToJSON ni
@@ -117,13 +123,20 @@ reportTable bkts = map (show *** show . fst)
117 $ R.toList 123 $ R.toList
118 $ bkts 124 $ bkts
119 125
120clientSession netname dhts signalQuit sock n h = do 126data Session = Session
127 { netname :: String
128 , dhts :: Map.Map String DHT
129 , externalAddresses :: IO [SockAddr]
130 , signalQuit :: MVar ()
131 }
132
133clientSession s@Session{..} sock cnum h = do
121 line <- map toLower . dropWhile isSpace <$> hGetLine h 134 line <- map toLower . dropWhile isSpace <$> hGetLine h
122 let (c,args) = second (dropWhile isSpace) $ break isSpace line 135 let (c,args) = second (dropWhile isSpace) $ break isSpace line
123 cmd0 :: IO () -> IO () 136 cmd0 :: IO () -> IO ()
124 cmd0 action = action >> clientSession netname dhts signalQuit sock n h 137 cmd0 action = action >> clientSession s sock cnum h
125 switchNetwork dest = do hPutClient h ("Network: "++dest) 138 switchNetwork dest = do hPutClient h ("Network: "++dest)
126 clientSession dest dhts signalQuit sock n h 139 clientSession s{netname=dest} sock cnum h
127 case (c,args) of 140 case (c,args) of
128 ("stop", _) -> do hPutClient h "Terminating DHT Daemon." 141 ("stop", _) -> do hPutClient h "Terminating DHT Daemon."
129 hClose h 142 hClose h
@@ -134,6 +147,9 @@ clientSession netname dhts signalQuit sock n h = do
134 ("pid", _) -> cmd0 $ do 147 ("pid", _) -> cmd0 $ do
135 pid <- getProcessID 148 pid <- getProcessID
136 hPutClient h (show pid) 149 hPutClient h (show pid)
150 ("external-ip", _) -> cmd0 $ do
151 unlines . map show <$> externalAddresses
152 >>= hPutClient h
137#ifdef THREAD_DEBUG 153#ifdef THREAD_DEBUG
138 ("threads", _) -> cmd0 $ do 154 ("threads", _) -> cmd0 $ do
139 ts <- threadsInformation 155 ts <- threadsInformation
@@ -205,6 +221,13 @@ clientSession netname dhts signalQuit sock n h = do
205 221
206 _ -> cmd0 $ hPutClient h "error." 222 _ -> cmd0 $ hPutClient h "error."
207 223
224
225readExternals :: [TVar (BucketList Mainline.NodeInfo)] -> IO [SockAddr]
226readExternals vars = do
227 as <- atomically $ mapM (fmap (Mainline.nodeAddr . selfNode) . readTVar) vars
228 -- TODO: Filter to only global addresses?
229 return as
230
208defaultPort = "6881" 231defaultPort = "6881"
209 232
210main = do 233main = do
@@ -228,7 +251,16 @@ main = do
228 251
229 waitForSignal <- do 252 waitForSignal <- do
230 signalQuit <- newEmptyMVar 253 signalQuit <- newEmptyMVar
231 srv <- streamServer (withSession $ clientSession "bt4" dhts signalQuit) (SockAddrUnix "dht.sock") 254 let session = clientSession $ Session
255 { netname = "bt4" -- initial default DHT
256 , dhts = dhts -- all DHTs
257 , signalQuit = signalQuit
258 , externalAddresses = readExternals
259 [ Mainline.routing4 btR
260 , Mainline.routing6 btR
261 ]
262 }
263 srv <- streamServer (withSession session) (SockAddrUnix "dht.sock")
232 return $ do 264 return $ do
233 () <- takeMVar signalQuit 265 () <- takeMVar signalQuit
234 quitListening srv 266 quitListening srv