diff options
author | Joe Crayne <joe@jerkface.net> | 2019-12-27 05:05:22 -0500 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2020-01-01 23:28:00 -0500 |
commit | 3ea58661542e7677371a7947e311a1def442b959 (patch) | |
tree | ecc1de54e88fca8e32df9d9ddecc0cc88e34f301 | |
parent | d8a7ad88bfdb76b7c481c0ce89de63528a06e734 (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.hs | 65 |
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(..)) | |||
75 | import Network.QueryResponse | 75 | import Network.QueryResponse |
76 | import qualified Network.QueryResponse.TCP as TCP | 76 | import qualified Network.QueryResponse.TCP as TCP |
77 | import Network.StreamServer | 77 | import Network.StreamServer |
78 | import Network.Kademlia.Bootstrap (refreshBuckets,bootstrap) | 78 | import Network.Kademlia.Bootstrap (refreshBuckets,bootstrap, BucketRefresher(..), BucketSearch(..) ) |
79 | import Network.Kademlia.CommonAPI | 79 | import Network.Kademlia.CommonAPI |
80 | import Network.Kademlia.Persistence | 80 | import Network.Kademlia.Persistence |
81 | import Network.Kademlia.Routing as R | 81 | import Network.Kademlia.Routing as R |
@@ -91,6 +91,7 @@ import Network.BitTorrent.DHT.ContactInfo as Peers | |||
91 | import qualified Data.MinMaxPSQ as MM | 91 | import qualified Data.MinMaxPSQ as MM |
92 | import Data.Wrapper.PSQ as PSQ (pattern (:->)) | 92 | import Data.Wrapper.PSQ as PSQ (pattern (:->)) |
93 | import qualified Data.Wrapper.PSQ as PSQ | 93 | import qualified Data.Wrapper.PSQ as PSQ |
94 | import Data.Wrapper.PSQInt as IPSQ (findMin) | ||
94 | import Data.Ord | 95 | import Data.Ord |
95 | import Data.Time.Clock.POSIX | 96 | import Data.Time.Clock.POSIX |
96 | import qualified Network.Tox.DHT.Transport as Tox | 97 | import 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 |
237 | showSearches searches = do | 238 | showSearches 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 | |||
243 | showSearchTuples 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 | |||
249 | getSearchTuple 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 | 261 | showRefresherStatus 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 | |||
281 | showSearchState refresher searches = do | ||
282 | b <- showRefresherStatus refresher | ||
283 | u <- showSearches searches | ||
284 | return $ "Bucket Maintenance\n" ++ b ++ "User Searches\n" ++ u | ||
254 | 285 | ||
255 | forkSearch :: | 286 | forkSearch :: |
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 |