Browse Source

net/ dnetview: show list of hosts in outbound info

lunar-mining 3 năm trước cách đây
mục cha
commit
5f7199a1a7

+ 3 - 1
bin/dnetview/src/model.rs

@@ -72,6 +72,7 @@ pub struct SessionInfo {
     pub is_empty: bool,
     pub children: Vec<ConnectInfo>,
     pub accept_addr: Option<String>,
+    pub hosts: Option<Vec<String>>,
 }
 
 impl SessionInfo {
@@ -82,8 +83,9 @@ impl SessionInfo {
         parent: String,
         children: Vec<ConnectInfo>,
         accept_addr: Option<String>,
+        hosts: Option<Vec<String>>,
     ) -> Self {
-        Self { id, name, is_empty, parent, children, accept_addr }
+        Self { id, name, is_empty, parent, children, accept_addr, hosts }
     }
 }
 

+ 32 - 8
bin/dnetview/src/parser.rs

@@ -133,7 +133,7 @@ impl DataParser {
 
         let accept_addr = None;
         let session_info =
-            SessionInfo::new(session_id, name, is_empty, parent, connects, accept_addr);
+            SessionInfo::new(session_id, name, is_empty, parent, connects, accept_addr, None);
         sessions.push(session_info);
 
         let node = NodeInfo::new(node_id, node_name, state, sessions.clone(), None, true);
@@ -405,12 +405,12 @@ impl DataParser {
                 if accept_vec.is_empty() {
                     let accept_addr = None;
                     let session_info =
-                        SessionInfo::new(id, name, is_empty, parent, connects, accept_addr);
+                        SessionInfo::new(id, name, is_empty, parent, connects, accept_addr, None);
                     Ok(session_info)
                 } else {
                     let accept_addr = Some(accept_vec[0].clone());
                     let session_info =
-                        SessionInfo::new(id, name, is_empty, parent, connects, accept_addr);
+                        SessionInfo::new(id, name, is_empty, parent, connects, accept_addr, None);
                     Ok(session_info)
                 }
             }
@@ -455,8 +455,15 @@ impl DataParser {
         let parent = connect_id;
         let is_empty = is_empty_session(&connects);
         let accept_addr = None;
-        let session_info =
-            SessionInfo::new(session_id, name, is_empty, parent, connects.clone(), accept_addr);
+        let session_info = SessionInfo::new(
+            session_id,
+            name,
+            is_empty,
+            parent,
+            connects.clone(),
+            accept_addr,
+            None,
+        );
 
         Ok(session_info)
     }
@@ -474,6 +481,8 @@ impl DataParser {
         let slots = &outbound["slots"];
         let mut slot_count = 0;
 
+        let hosts = &outbound["hosts"];
+
         match slots.as_array() {
             Some(slots) => {
                 for slot in slots {
@@ -549,9 +558,24 @@ impl DataParser {
                 let is_empty = is_empty_session(&connects);
 
                 let accept_addr = None;
-                let session_info =
-                    SessionInfo::new(id, name, is_empty, parent, connects, accept_addr);
-                Ok(session_info)
+
+                match hosts.as_array() {
+                    Some(hosts) => {
+                        let hosts: Vec<String> =
+                            hosts.iter().map(|addr| addr.as_str().unwrap().to_string()).collect();
+                        let session_info = SessionInfo::new(
+                            id,
+                            name,
+                            is_empty,
+                            parent,
+                            connects,
+                            accept_addr,
+                            Some(hosts),
+                        );
+                        Ok(session_info)
+                    }
+                    None => Err(DnetViewError::ValueIsNotObject),
+                }
             }
             None => Err(DnetViewError::ValueIsNotObject),
         }

+ 10 - 2
bin/dnetview/src/view.rs

@@ -322,11 +322,19 @@ impl<'a> View {
                 Some(SelectableObject::Session(session)) => {
                     //debug!(target: "dnetview", "render_info()::SelectableObject::Session");
                     if session.accept_addr.is_some() {
-                        let session_info = Span::styled(
+                        let accept_addr = Span::styled(
                             format!("Accept addr: {}", session.accept_addr.as_ref().unwrap()),
                             style,
                         );
-                        lines.push(Spans::from(session_info));
+                        lines.push(Spans::from(accept_addr));
+                    }
+                    if session.hosts.is_some() {
+                        let hosts = Span::styled(format!("Hosts:"), style);
+                        lines.push(Spans::from(hosts));
+                        for host in session.hosts.as_ref().unwrap() {
+                            let host = Span::styled(format!("      {}", host), style);
+                            lines.push(Spans::from(host));
+                        }
                     }
                 }
                 Some(SelectableObject::Connect(connect)) => {

+ 6 - 1
src/net/session/outbound_session.rs

@@ -5,7 +5,7 @@ use async_executor::Executor;
 use async_trait::async_trait;
 use log::{debug, info, warn};
 use rand::seq::SliceRandom;
-use serde_json::json;
+use serde_json::{json, Value};
 use url::Url;
 
 use crate::{
@@ -293,8 +293,13 @@ impl Session for OutboundSession {
             slots.push(info.get_info().await);
         }
 
+        let hosts = self.p2p().hosts().load_all().await;
+        let addrs: Vec<Value> =
+            hosts.iter().map(|addr| serde_json::Value::String(addr.to_string())).collect();
+
         json!({
             "slots": slots,
+            "hosts": serde_json::Value::Array(addrs),
         })
     }