diff options
author | joe <joe@jerkface.net> | 2017-07-27 00:09:18 -0400 |
---|---|---|
committer | joe <joe@jerkface.net> | 2017-07-27 00:09:18 -0400 |
commit | aee5037c333abc77174d4867b75b1ef068fbaf1b (patch) | |
tree | 287f2fcdc59777f7bd8a98beb5d91751a993edb9 /examples | |
parent | 133087121638a883ff15bc4141425c7df474b92b (diff) |
external-ip command.
Diffstat (limited to 'examples')
-rw-r--r-- | examples/dhtd.hs | 40 |
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 | |||
59 | marshalForClient :: String -> String | 60 | marshalForClient :: String -> String |
60 | marshalForClient s = show (length s) ++ ":" ++ s | 61 | marshalForClient s = show (length s) ++ ":" ++ s |
61 | 62 | ||
63 | -- | Writes a message and signals ready for next command. | ||
62 | hPutClient :: Handle -> String -> IO () | 64 | hPutClient :: Handle -> String -> IO () |
63 | hPutClient h s = hPutStr h ('.' : marshalForClient s) | 65 | hPutClient h s = hPutStr h ('.' : marshalForClient s) |
64 | 66 | ||
67 | -- | Writes message, but signals there is more to come. | ||
68 | hPutClientChunk :: Handle -> String -> IO () | ||
69 | hPutClientChunk h s = hPutStr h (' ' : marshalForClient s) | ||
70 | |||
65 | data DHT = forall ni. ( Show ni | 71 | data 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 | ||
120 | clientSession netname dhts signalQuit sock n h = do | 126 | data Session = Session |
127 | { netname :: String | ||
128 | , dhts :: Map.Map String DHT | ||
129 | , externalAddresses :: IO [SockAddr] | ||
130 | , signalQuit :: MVar () | ||
131 | } | ||
132 | |||
133 | clientSession 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 | |||
225 | readExternals :: [TVar (BucketList Mainline.NodeInfo)] -> IO [SockAddr] | ||
226 | readExternals vars = do | ||
227 | as <- atomically $ mapM (fmap (Mainline.nodeAddr . selfNode) . readTVar) vars | ||
228 | -- TODO: Filter to only global addresses? | ||
229 | return as | ||
230 | |||
208 | defaultPort = "6881" | 231 | defaultPort = "6881" |
209 | 232 | ||
210 | main = do | 233 | main = 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 |