summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-12-27 05:05:22 -0500
committerJoe Crayne <joe@jerkface.net>2020-01-01 23:28:00 -0500
commit3ea58661542e7677371a7947e311a1def442b959 (patch)
treeecc1de54e88fca8e32df9d9ddecc0cc88e34f301
parentd8a7ad88bfdb76b7c481c0ce89de63528a06e734 (diff)
Modify s command to give bootstrapping info.
Also added the * wildcard to the x command to remove multiple searches.
-rw-r--r--dht/examples/dhtd.hs65
1 files changed, 54 insertions, 11 deletions
diff --git a/dht/examples/dhtd.hs b/dht/examples/dhtd.hs
index 4f83beb2..ce04b020 100644
--- a/dht/examples/dhtd.hs
+++ b/dht/examples/dhtd.hs
@@ -75,7 +75,7 @@ import Network.Address hiding (NodeId, NodeInfo(..))
75import Network.QueryResponse 75import Network.QueryResponse
76import qualified Network.QueryResponse.TCP as TCP 76import qualified Network.QueryResponse.TCP as TCP
77import Network.StreamServer 77import Network.StreamServer
78import Network.Kademlia.Bootstrap (refreshBuckets,bootstrap) 78import Network.Kademlia.Bootstrap (refreshBuckets,bootstrap, BucketRefresher(..), BucketSearch(..) )
79import Network.Kademlia.CommonAPI 79import Network.Kademlia.CommonAPI
80import Network.Kademlia.Persistence 80import Network.Kademlia.Persistence
81import Network.Kademlia.Routing as R 81import Network.Kademlia.Routing as R
@@ -91,6 +91,7 @@ import Network.BitTorrent.DHT.ContactInfo as Peers
91import qualified Data.MinMaxPSQ as MM 91import qualified Data.MinMaxPSQ as MM
92import Data.Wrapper.PSQ as PSQ (pattern (:->)) 92import Data.Wrapper.PSQ as PSQ (pattern (:->))
93import qualified Data.Wrapper.PSQ as PSQ 93import qualified Data.Wrapper.PSQ as PSQ
94import Data.Wrapper.PSQInt as IPSQ (findMin)
94import Data.Ord 95import Data.Ord
95import Data.Time.Clock.POSIX 96import Data.Time.Clock.POSIX
96import qualified Network.Tox.DHT.Transport as Tox 97import qualified Network.Tox.DHT.Transport as Tox
@@ -236,6 +237,16 @@ showSearches :: ( Show nid
236 ) => Map.Map (String,nid) (DHTSearch nid ni) -> IO String 237 ) => Map.Map (String,nid) (DHTSearch nid ni) -> IO String
237showSearches searches = do 238showSearches searches = do
238 tups <- forM (Map.toList searches) $ \((meth,nid),DHTSearch{..}) -> do 239 tups <- forM (Map.toList searches) $ \((meth,nid),DHTSearch{..}) -> do
240 getSearchTuple meth nid searchState searchResults searchThread
241 return $ showSearchTuples tups
242
243showSearchTuples tups = do
244 let cnt'width = maximum $ map (\(_,cnt,_,_)->length cnt) tups
245 mth'width = maximum $ map (\(_,_,mth,_)->length mth) tups
246 (stat,cnt,meth,nid) <- tups
247 printf " %c %-*s %-*s %s\n" stat cnt'width cnt mth'width meth nid
248
249getSearchTuple meth nid searchState searchResults searchThread = do
239 (is'fin, cnt) <- atomically $ 250 (is'fin, cnt) <- atomically $
240 (,) <$> searchIsFinished searchState 251 (,) <$> searchIsFinished searchState
241 <*> (Set.size <$> readTVar searchResults) 252 <*> (Set.size <$> readTVar searchResults)
@@ -245,12 +256,32 @@ showSearches searches = do
245 ThreadFinished -> '-' 256 ThreadFinished -> '-'
246 ThreadDied -> '-' 257 ThreadDied -> '-'
247 _ -> '*' 258 _ -> '*'
248 return (stat,show cnt,meth,show nid) 259 return ( (stat,show cnt,meth,show nid) :: (Char,String,String,String) )
249 let cnt'width = maximum $ map (\(_,cnt,_,_)->length cnt) tups 260
250 mth'width = maximum $ map (\(_,_,mth,_)->length mth) tups 261showRefresherStatus BucketRefresher{..} = do
251 return $ do -- List monad. 262 now <- getPOSIXTime
252 (stat,cnt,meth,nid) <- tups 263 (st,hdr) <- atomically $ do
253 printf " %c %-*s %-*s %s\n" stat cnt'width cnt mth'width meth nid 264 rq <- readTVar refreshQueue -- Int.PSQ PosixTime
265 lt <- readTVar refreshLastTouch -- POSIXTime
266 bm <- readTVar bootstrapMode -- Bool
267 cd <- readTVar bootstrapCountdown -- Maybe Int
268 st <- readTVar refreshState -- IntMap [BucketSearch nid ni]
269 return $ (,) st $ showReport
270 [ (" bootstrap:", show bm)
271 , (" countdown:", show cd)
272 , (" touched:", show (now - lt))
273 , (" next-up:", maybe "Nothing" (\(n,t,()) -> show n ++ " " ++ show (t - now)) $ IPSQ.findMin rq)
274 ]
275 let bgschs = concatMap (\(n,xs) -> map ((,) n) xs) $ IntMap.toList st
276 tups <- forM bgschs $ \(n,BucketSearch{..}) -> do
277 getSearchTuple ('#' : show n) bucketSample bucketState bucketResults bucketThread
278 return $ hdr ++ showSearchTuples tups
279
280
281showSearchState refresher searches = do
282 b <- showRefresherStatus refresher
283 u <- showSearches searches
284 return $ "Bucket Maintenance\n" ++ b ++ "User Searches\n" ++ u
254 285
255forkSearch :: 286forkSearch ::
256 ( Ord nid 287 ( Ord nid
@@ -742,9 +773,9 @@ clientSession s@Session{..} sock cnum h = do
742 (rcnt,relays) <- currentRelays (tcpRelayPinger onionRouter) 773 (rcnt,relays) <- currentRelays (tcpRelayPinger onionRouter)
743 return $ do 774 return $ do
744 hPutClientChunk h $ unlines 775 hPutClientChunk h $ unlines
745 [ "trampolines(UDP): " ++ show (IntMap.size uts,tcnt,icnt) 776 [ "trampolines(UDP): " ++ show (IntMap.size uts) -- ,tcnt,icnt)
746 ++ if tcpmode then "" else " *" 777 ++ if tcpmode then "" else " *"
747 , "trampolines(TCP): " ++ show (IntMap.size tts,ttcnt,ticnt) 778 , "trampolines(TCP): " ++ show (IntMap.size tts) -- ,ttcnt,ticnt)
748 ++ if tcpmode then " *" else "" 779 ++ if tcpmode then " *" else ""
749 , "active TCP: " ++ show (MM.size tcps) 780 , "active TCP: " ++ show (MM.size tcps)
750 , "pending: " ++ show (W64.size pqs) 781 , "pending: " ++ show (W64.size pqs)
@@ -998,7 +1029,7 @@ clientSession s@Session{..} sock cnum h = do
998 let (method,xs) = break isSpace s 1029 let (method,xs) = break isSpace s
999 (nidstr,ys) = break isSpace $ dropWhile isSpace xs 1030 (nidstr,ys) = break isSpace $ dropWhile isSpace xs
1000 presentSearches = hPutClient h 1031 presentSearches = hPutClient h
1001 =<< showSearches 1032 =<< showSearchState dhtBuckets
1002 =<< atomically (readTVar dhtSearches) 1033 =<< atomically (readTVar dhtSearches)
1003 goTarget qry nid = do 1034 goTarget qry nid = do
1004 kvar <- atomically $ newTVar Nothing 1035 kvar <- atomically $ newTVar Nothing
@@ -1034,7 +1065,19 @@ clientSession s@Session{..} sock cnum h = do
1034 return $ do 1065 return $ do
1035 killThread searchThread 1066 killThread searchThread
1036 hPutClient h "Removed search." 1067 hPutClient h "Removed search."
1037 either (hPutClient h . ("Bad search target: "++)) go $ dhtParseId nidstr 1068 removeAll = join $ atomically $ do
1069 schs <- readTVar dhtSearches
1070 let (scrapped,remainder) = Map.partitionWithKey (\(m,_) _ -> m == method) schs
1071 writeTVar dhtSearches remainder
1072 return $ do
1073 ns <- forM (Map.toList scrapped) $
1074 \((m,nid),DHTSearch{searchThread}) -> do
1075 killThread searchThread
1076 return $ show nid
1077 hPutClient h $ unlines $ map (mappend "Removed " . mappend method . mappend " ") ns
1078 case nidstr of
1079 "*" -> removeAll
1080 _ -> either (hPutClient h . ("Bad search target: "++)) go $ dhtParseId nidstr
1038 1081
1039 ("save", _) | Just dht <- Map.lookup netname dhts 1082 ("save", _) | Just dht <- Map.lookup netname dhts
1040 -> cmd0 $ do 1083 -> cmd0 $ do