mirror of
https://github.com/jmcorgan/fips.git
synced 2026-08-12 01:27:32 +00:00
Add rustfmt formatting policy and reformat codebase
Add rustfmt.toml with stable defaults and apply cargo fmt to all source files. This establishes a consistent formatting baseline for CI enforcement.
This commit is contained in:
+5
-4
@@ -105,7 +105,10 @@ impl ControlSocket {
|
||||
let group_name = CString::new("fips").unwrap();
|
||||
let grp = unsafe { libc::getgrnam(group_name.as_ptr()) };
|
||||
if grp.is_null() {
|
||||
debug!("'fips' group not found, skipping chown for {}", path.display());
|
||||
debug!(
|
||||
"'fips' group not found, skipping chown for {}",
|
||||
path.display()
|
||||
);
|
||||
return;
|
||||
}
|
||||
let gid = unsafe { (*grp).gr_gid };
|
||||
@@ -184,9 +187,7 @@ impl ControlSocket {
|
||||
.await;
|
||||
|
||||
let response = match read_result {
|
||||
Ok(Ok(())) if line.is_empty() => {
|
||||
Response::error("empty request")
|
||||
}
|
||||
Ok(Ok(())) if line.is_empty() => Response::error("empty request"),
|
||||
Ok(Ok(())) => {
|
||||
// Parse the request
|
||||
match serde_json::from_str::<Request>(line.trim()) {
|
||||
|
||||
+285
-258
@@ -5,7 +5,7 @@
|
||||
|
||||
use crate::identity::encode_npub;
|
||||
use crate::node::Node;
|
||||
use serde_json::{json, Value};
|
||||
use serde_json::{Value, json};
|
||||
|
||||
/// Helper: get current Unix time in milliseconds.
|
||||
fn now_ms() -> u64 {
|
||||
@@ -70,113 +70,120 @@ pub fn show_peers(node: &Node) -> Value {
|
||||
let parent_id = *tree.my_declaration().parent_id();
|
||||
let is_root = tree.is_root();
|
||||
|
||||
let peers: Vec<Value> = node.peers().map(|peer| {
|
||||
let node_addr = *peer.node_addr();
|
||||
let addr_hex = hex::encode(node_addr.as_bytes());
|
||||
let peers: Vec<Value> = node
|
||||
.peers()
|
||||
.map(|peer| {
|
||||
let node_addr = *peer.node_addr();
|
||||
let addr_hex = hex::encode(node_addr.as_bytes());
|
||||
|
||||
// Determine tree relationship
|
||||
let is_parent = !is_root && node_addr == parent_id;
|
||||
let is_child = tree.peer_declaration(&node_addr)
|
||||
.is_some_and(|decl| *decl.parent_id() == my_addr);
|
||||
// Determine tree relationship
|
||||
let is_parent = !is_root && node_addr == parent_id;
|
||||
let is_child = tree
|
||||
.peer_declaration(&node_addr)
|
||||
.is_some_and(|decl| *decl.parent_id() == my_addr);
|
||||
|
||||
let mut peer_json = json!({
|
||||
"node_addr": addr_hex,
|
||||
"npub": peer.npub(),
|
||||
"display_name": node.peer_display_name(&node_addr),
|
||||
"ipv6_addr": format!("{}", peer.address()),
|
||||
"connectivity": format!("{}", peer.connectivity()),
|
||||
"link_id": peer.link_id().as_u64(),
|
||||
"authenticated_at_ms": peer.authenticated_at(),
|
||||
"last_seen_ms": peer.last_seen(),
|
||||
"has_tree_position": peer.has_tree_position(),
|
||||
"has_bloom_filter": peer.filter_sequence() > 0,
|
||||
"filter_sequence": peer.filter_sequence(),
|
||||
"is_parent": is_parent,
|
||||
"is_child": is_child,
|
||||
});
|
||||
|
||||
// Add transport address if available
|
||||
if let Some(addr) = peer.current_addr() {
|
||||
peer_json["transport_addr"] = json!(format!("{}", addr));
|
||||
}
|
||||
|
||||
// Add link info (direction, transport type)
|
||||
let link_id = peer.link_id();
|
||||
if let Some(link) = node.get_link(&link_id) {
|
||||
peer_json["direction"] = json!(format!("{}", link.direction()));
|
||||
let transport_id = link.transport_id();
|
||||
if let Some(handle) = node.get_transport(&transport_id) {
|
||||
peer_json["transport_type"] = json!(handle.transport_type().name);
|
||||
}
|
||||
}
|
||||
|
||||
// Add tree depth if available
|
||||
if let Some(coords) = peer.coords() {
|
||||
peer_json["tree_depth"] = json!(coords.depth());
|
||||
}
|
||||
|
||||
// Add link stats
|
||||
let stats = peer.link_stats();
|
||||
peer_json["stats"] = json!({
|
||||
"packets_sent": stats.packets_sent,
|
||||
"packets_recv": stats.packets_recv,
|
||||
"bytes_sent": stats.bytes_sent,
|
||||
"bytes_recv": stats.bytes_recv,
|
||||
});
|
||||
|
||||
// Add MMP metrics if available
|
||||
if let Some(mmp) = peer.mmp() {
|
||||
let mut mmp_json = json!({
|
||||
"mode": format!("{}", mmp.mode()),
|
||||
let mut peer_json = json!({
|
||||
"node_addr": addr_hex,
|
||||
"npub": peer.npub(),
|
||||
"display_name": node.peer_display_name(&node_addr),
|
||||
"ipv6_addr": format!("{}", peer.address()),
|
||||
"connectivity": format!("{}", peer.connectivity()),
|
||||
"link_id": peer.link_id().as_u64(),
|
||||
"authenticated_at_ms": peer.authenticated_at(),
|
||||
"last_seen_ms": peer.last_seen(),
|
||||
"has_tree_position": peer.has_tree_position(),
|
||||
"has_bloom_filter": peer.filter_sequence() > 0,
|
||||
"filter_sequence": peer.filter_sequence(),
|
||||
"is_parent": is_parent,
|
||||
"is_child": is_child,
|
||||
});
|
||||
if let Some(srtt) = mmp.metrics.srtt_ms() {
|
||||
mmp_json["srtt_ms"] = json!(srtt);
|
||||
}
|
||||
mmp_json["loss_rate"] = json!(mmp.metrics.loss_rate());
|
||||
mmp_json["etx"] = json!(mmp.metrics.etx);
|
||||
mmp_json["goodput_bps"] = json!(mmp.metrics.goodput_bps);
|
||||
mmp_json["delivery_ratio_forward"] = json!(mmp.metrics.delivery_ratio_forward);
|
||||
mmp_json["delivery_ratio_reverse"] = json!(mmp.metrics.delivery_ratio_reverse);
|
||||
if let Some(smoothed_loss) = mmp.metrics.smoothed_loss() {
|
||||
mmp_json["smoothed_loss"] = json!(smoothed_loss);
|
||||
}
|
||||
if let Some(smoothed_etx) = mmp.metrics.smoothed_etx() {
|
||||
mmp_json["smoothed_etx"] = json!(smoothed_etx);
|
||||
}
|
||||
if let Some(srtt) = mmp.metrics.srtt_ms()
|
||||
&& let Some(setx) = mmp.metrics.smoothed_etx()
|
||||
{
|
||||
mmp_json["lqi"] = json!(setx * (1.0 + srtt / 100.0));
|
||||
}
|
||||
peer_json["mmp"] = mmp_json;
|
||||
}
|
||||
|
||||
peer_json
|
||||
}).collect();
|
||||
// Add transport address if available
|
||||
if let Some(addr) = peer.current_addr() {
|
||||
peer_json["transport_addr"] = json!(format!("{}", addr));
|
||||
}
|
||||
|
||||
// Add link info (direction, transport type)
|
||||
let link_id = peer.link_id();
|
||||
if let Some(link) = node.get_link(&link_id) {
|
||||
peer_json["direction"] = json!(format!("{}", link.direction()));
|
||||
let transport_id = link.transport_id();
|
||||
if let Some(handle) = node.get_transport(&transport_id) {
|
||||
peer_json["transport_type"] = json!(handle.transport_type().name);
|
||||
}
|
||||
}
|
||||
|
||||
// Add tree depth if available
|
||||
if let Some(coords) = peer.coords() {
|
||||
peer_json["tree_depth"] = json!(coords.depth());
|
||||
}
|
||||
|
||||
// Add link stats
|
||||
let stats = peer.link_stats();
|
||||
peer_json["stats"] = json!({
|
||||
"packets_sent": stats.packets_sent,
|
||||
"packets_recv": stats.packets_recv,
|
||||
"bytes_sent": stats.bytes_sent,
|
||||
"bytes_recv": stats.bytes_recv,
|
||||
});
|
||||
|
||||
// Add MMP metrics if available
|
||||
if let Some(mmp) = peer.mmp() {
|
||||
let mut mmp_json = json!({
|
||||
"mode": format!("{}", mmp.mode()),
|
||||
});
|
||||
if let Some(srtt) = mmp.metrics.srtt_ms() {
|
||||
mmp_json["srtt_ms"] = json!(srtt);
|
||||
}
|
||||
mmp_json["loss_rate"] = json!(mmp.metrics.loss_rate());
|
||||
mmp_json["etx"] = json!(mmp.metrics.etx);
|
||||
mmp_json["goodput_bps"] = json!(mmp.metrics.goodput_bps);
|
||||
mmp_json["delivery_ratio_forward"] = json!(mmp.metrics.delivery_ratio_forward);
|
||||
mmp_json["delivery_ratio_reverse"] = json!(mmp.metrics.delivery_ratio_reverse);
|
||||
if let Some(smoothed_loss) = mmp.metrics.smoothed_loss() {
|
||||
mmp_json["smoothed_loss"] = json!(smoothed_loss);
|
||||
}
|
||||
if let Some(smoothed_etx) = mmp.metrics.smoothed_etx() {
|
||||
mmp_json["smoothed_etx"] = json!(smoothed_etx);
|
||||
}
|
||||
if let Some(srtt) = mmp.metrics.srtt_ms()
|
||||
&& let Some(setx) = mmp.metrics.smoothed_etx()
|
||||
{
|
||||
mmp_json["lqi"] = json!(setx * (1.0 + srtt / 100.0));
|
||||
}
|
||||
peer_json["mmp"] = mmp_json;
|
||||
}
|
||||
|
||||
peer_json
|
||||
})
|
||||
.collect();
|
||||
|
||||
json!({ "peers": peers })
|
||||
}
|
||||
|
||||
/// `show_links` — Active links.
|
||||
pub fn show_links(node: &Node) -> Value {
|
||||
let links: Vec<Value> = node.links().map(|link| {
|
||||
let stats = link.stats();
|
||||
json!({
|
||||
"link_id": link.link_id().as_u64(),
|
||||
"transport_id": link.transport_id().as_u32(),
|
||||
"remote_addr": format!("{}", link.remote_addr()),
|
||||
"direction": format!("{}", link.direction()),
|
||||
"state": format!("{}", link.state()),
|
||||
"created_at_ms": link.created_at(),
|
||||
"stats": {
|
||||
"packets_sent": stats.packets_sent,
|
||||
"packets_recv": stats.packets_recv,
|
||||
"bytes_sent": stats.bytes_sent,
|
||||
"bytes_recv": stats.bytes_recv,
|
||||
"last_recv_ms": stats.last_recv_ms,
|
||||
},
|
||||
let links: Vec<Value> = node
|
||||
.links()
|
||||
.map(|link| {
|
||||
let stats = link.stats();
|
||||
json!({
|
||||
"link_id": link.link_id().as_u64(),
|
||||
"transport_id": link.transport_id().as_u32(),
|
||||
"remote_addr": format!("{}", link.remote_addr()),
|
||||
"direction": format!("{}", link.direction()),
|
||||
"state": format!("{}", link.state()),
|
||||
"created_at_ms": link.created_at(),
|
||||
"stats": {
|
||||
"packets_sent": stats.packets_sent,
|
||||
"packets_recv": stats.packets_recv,
|
||||
"bytes_sent": stats.bytes_sent,
|
||||
"bytes_recv": stats.bytes_recv,
|
||||
"last_recv_ms": stats.last_recv_ms,
|
||||
},
|
||||
})
|
||||
})
|
||||
}).collect();
|
||||
.collect();
|
||||
|
||||
json!({ "links": links })
|
||||
}
|
||||
@@ -188,29 +195,34 @@ pub fn show_tree(node: &Node) -> Value {
|
||||
let decl = tree.my_declaration();
|
||||
|
||||
// Build coords array as hex strings
|
||||
let coords: Vec<String> = my_coords.entries()
|
||||
let coords: Vec<String> = my_coords
|
||||
.entries()
|
||||
.iter()
|
||||
.map(|e| hex::encode(e.node_addr.as_bytes()))
|
||||
.collect();
|
||||
|
||||
// Build peer tree data
|
||||
let peers: Vec<Value> = tree.peer_ids().map(|peer_id| {
|
||||
let mut peer_json = json!({
|
||||
"node_addr": hex::encode(peer_id.as_bytes()),
|
||||
"display_name": node.peer_display_name(peer_id),
|
||||
});
|
||||
if let Some(coords) = tree.peer_coords(peer_id) {
|
||||
let coord_path: Vec<String> = coords.entries()
|
||||
.iter()
|
||||
.map(|e| hex::encode(e.node_addr.as_bytes()))
|
||||
.collect();
|
||||
peer_json["depth"] = json!(coords.depth());
|
||||
peer_json["root"] = json!(hex::encode(coords.root_id().as_bytes()));
|
||||
peer_json["coords"] = json!(coord_path);
|
||||
peer_json["distance_to_us"] = json!(my_coords.distance_to(coords));
|
||||
}
|
||||
peer_json
|
||||
}).collect();
|
||||
let peers: Vec<Value> = tree
|
||||
.peer_ids()
|
||||
.map(|peer_id| {
|
||||
let mut peer_json = json!({
|
||||
"node_addr": hex::encode(peer_id.as_bytes()),
|
||||
"display_name": node.peer_display_name(peer_id),
|
||||
});
|
||||
if let Some(coords) = tree.peer_coords(peer_id) {
|
||||
let coord_path: Vec<String> = coords
|
||||
.entries()
|
||||
.iter()
|
||||
.map(|e| hex::encode(e.node_addr.as_bytes()))
|
||||
.collect();
|
||||
peer_json["depth"] = json!(coords.depth());
|
||||
peer_json["root"] = json!(hex::encode(coords.root_id().as_bytes()));
|
||||
peer_json["coords"] = json!(coord_path);
|
||||
peer_json["distance_to_us"] = json!(my_coords.distance_to(coords));
|
||||
}
|
||||
peer_json
|
||||
})
|
||||
.collect();
|
||||
|
||||
// Determine parent display name
|
||||
let parent_addr = my_coords.parent_id();
|
||||
@@ -237,68 +249,71 @@ pub fn show_tree(node: &Node) -> Value {
|
||||
|
||||
/// `show_sessions` — End-to-end sessions.
|
||||
pub fn show_sessions(node: &Node) -> Value {
|
||||
let sessions: Vec<Value> = node.session_entries().map(|(addr, entry)| {
|
||||
let state_str = if entry.is_established() {
|
||||
"established"
|
||||
} else if entry.is_initiating() {
|
||||
"initiating"
|
||||
} else if entry.is_awaiting_msg3() {
|
||||
"awaiting_msg3"
|
||||
} else {
|
||||
"unknown"
|
||||
};
|
||||
let sessions: Vec<Value> = node
|
||||
.session_entries()
|
||||
.map(|(addr, entry)| {
|
||||
let state_str = if entry.is_established() {
|
||||
"established"
|
||||
} else if entry.is_initiating() {
|
||||
"initiating"
|
||||
} else if entry.is_awaiting_msg3() {
|
||||
"awaiting_msg3"
|
||||
} else {
|
||||
"unknown"
|
||||
};
|
||||
|
||||
let mut session_json = json!({
|
||||
"remote_addr": hex::encode(addr.as_bytes()),
|
||||
"display_name": node.peer_display_name(addr),
|
||||
"state": state_str,
|
||||
"is_initiator": entry.is_initiator(),
|
||||
"last_activity_ms": entry.last_activity(),
|
||||
});
|
||||
|
||||
// Derive npub from session's remote public key
|
||||
let (xonly, _parity) = entry.remote_pubkey().x_only_public_key();
|
||||
session_json["npub"] = json!(encode_npub(&xonly));
|
||||
|
||||
// Traffic counters
|
||||
let (pkts_tx, pkts_rx, bytes_tx, bytes_rx) = entry.traffic_counters();
|
||||
session_json["stats"] = json!({
|
||||
"packets_sent": pkts_tx,
|
||||
"packets_recv": pkts_rx,
|
||||
"bytes_sent": bytes_tx,
|
||||
"bytes_recv": bytes_rx,
|
||||
});
|
||||
|
||||
// Add session MMP if available
|
||||
if let Some(mmp) = entry.mmp() {
|
||||
let mut mmp_json = json!({
|
||||
"mode": format!("{}", mmp.mode()),
|
||||
"loss_rate": mmp.metrics.loss_rate(),
|
||||
"etx": mmp.metrics.etx,
|
||||
"goodput_bps": mmp.metrics.goodput_bps,
|
||||
"delivery_ratio_forward": mmp.metrics.delivery_ratio_forward,
|
||||
"delivery_ratio_reverse": mmp.metrics.delivery_ratio_reverse,
|
||||
"path_mtu": mmp.path_mtu.current_mtu(),
|
||||
let mut session_json = json!({
|
||||
"remote_addr": hex::encode(addr.as_bytes()),
|
||||
"display_name": node.peer_display_name(addr),
|
||||
"state": state_str,
|
||||
"is_initiator": entry.is_initiator(),
|
||||
"last_activity_ms": entry.last_activity(),
|
||||
});
|
||||
if let Some(srtt) = mmp.metrics.srtt_ms() {
|
||||
mmp_json["srtt_ms"] = json!(srtt);
|
||||
}
|
||||
if let Some(smoothed_loss) = mmp.metrics.smoothed_loss() {
|
||||
mmp_json["smoothed_loss"] = json!(smoothed_loss);
|
||||
}
|
||||
if let Some(smoothed_etx) = mmp.metrics.smoothed_etx() {
|
||||
mmp_json["smoothed_etx"] = json!(smoothed_etx);
|
||||
}
|
||||
if let Some(srtt) = mmp.metrics.srtt_ms()
|
||||
&& let Some(setx) = mmp.metrics.smoothed_etx()
|
||||
{
|
||||
mmp_json["sqi"] = json!(setx * (1.0 + srtt / 100.0));
|
||||
}
|
||||
session_json["mmp"] = mmp_json;
|
||||
}
|
||||
|
||||
session_json
|
||||
}).collect();
|
||||
// Derive npub from session's remote public key
|
||||
let (xonly, _parity) = entry.remote_pubkey().x_only_public_key();
|
||||
session_json["npub"] = json!(encode_npub(&xonly));
|
||||
|
||||
// Traffic counters
|
||||
let (pkts_tx, pkts_rx, bytes_tx, bytes_rx) = entry.traffic_counters();
|
||||
session_json["stats"] = json!({
|
||||
"packets_sent": pkts_tx,
|
||||
"packets_recv": pkts_rx,
|
||||
"bytes_sent": bytes_tx,
|
||||
"bytes_recv": bytes_rx,
|
||||
});
|
||||
|
||||
// Add session MMP if available
|
||||
if let Some(mmp) = entry.mmp() {
|
||||
let mut mmp_json = json!({
|
||||
"mode": format!("{}", mmp.mode()),
|
||||
"loss_rate": mmp.metrics.loss_rate(),
|
||||
"etx": mmp.metrics.etx,
|
||||
"goodput_bps": mmp.metrics.goodput_bps,
|
||||
"delivery_ratio_forward": mmp.metrics.delivery_ratio_forward,
|
||||
"delivery_ratio_reverse": mmp.metrics.delivery_ratio_reverse,
|
||||
"path_mtu": mmp.path_mtu.current_mtu(),
|
||||
});
|
||||
if let Some(srtt) = mmp.metrics.srtt_ms() {
|
||||
mmp_json["srtt_ms"] = json!(srtt);
|
||||
}
|
||||
if let Some(smoothed_loss) = mmp.metrics.smoothed_loss() {
|
||||
mmp_json["smoothed_loss"] = json!(smoothed_loss);
|
||||
}
|
||||
if let Some(smoothed_etx) = mmp.metrics.smoothed_etx() {
|
||||
mmp_json["smoothed_etx"] = json!(smoothed_etx);
|
||||
}
|
||||
if let Some(srtt) = mmp.metrics.srtt_ms()
|
||||
&& let Some(setx) = mmp.metrics.smoothed_etx()
|
||||
{
|
||||
mmp_json["sqi"] = json!(setx * (1.0 + srtt / 100.0));
|
||||
}
|
||||
session_json["mmp"] = mmp_json;
|
||||
}
|
||||
|
||||
session_json
|
||||
})
|
||||
.collect();
|
||||
|
||||
json!({ "sessions": sessions })
|
||||
}
|
||||
@@ -307,27 +322,31 @@ pub fn show_sessions(node: &Node) -> Value {
|
||||
pub fn show_bloom(node: &Node) -> Value {
|
||||
let bloom = node.bloom_state();
|
||||
|
||||
let leaf_deps: Vec<String> = bloom.leaf_dependents()
|
||||
let leaf_deps: Vec<String> = bloom
|
||||
.leaf_dependents()
|
||||
.iter()
|
||||
.map(|addr| hex::encode(addr.as_bytes()))
|
||||
.collect();
|
||||
|
||||
// Build per-peer filter info
|
||||
let peer_filters: Vec<Value> = node.peers().map(|peer| {
|
||||
let addr = *peer.node_addr();
|
||||
let mut pf = json!({
|
||||
"peer": hex::encode(addr.as_bytes()),
|
||||
"display_name": node.peer_display_name(&addr),
|
||||
"has_filter": peer.filter_sequence() > 0,
|
||||
"filter_sequence": peer.filter_sequence(),
|
||||
});
|
||||
if let Some(filter) = peer.inbound_filter() {
|
||||
pf["estimated_count"] = json!(filter.estimated_count());
|
||||
pf["set_bits"] = json!(filter.count_ones());
|
||||
pf["fill_ratio"] = json!(filter.fill_ratio());
|
||||
}
|
||||
pf
|
||||
}).collect();
|
||||
let peer_filters: Vec<Value> = node
|
||||
.peers()
|
||||
.map(|peer| {
|
||||
let addr = *peer.node_addr();
|
||||
let mut pf = json!({
|
||||
"peer": hex::encode(addr.as_bytes()),
|
||||
"display_name": node.peer_display_name(&addr),
|
||||
"has_filter": peer.filter_sequence() > 0,
|
||||
"filter_sequence": peer.filter_sequence(),
|
||||
});
|
||||
if let Some(filter) = peer.inbound_filter() {
|
||||
pf["estimated_count"] = json!(filter.estimated_count());
|
||||
pf["set_bits"] = json!(filter.count_ones());
|
||||
pf["fill_ratio"] = json!(filter.fill_ratio());
|
||||
}
|
||||
pf
|
||||
})
|
||||
.collect();
|
||||
|
||||
let bloom_stats = node.stats().snapshot().bloom;
|
||||
|
||||
@@ -397,36 +416,39 @@ pub fn show_mmp(node: &Node) -> Value {
|
||||
}).collect();
|
||||
|
||||
// Session-layer MMP
|
||||
let sessions: Vec<Value> = node.session_entries().filter_map(|(addr, entry)| {
|
||||
let mmp = entry.mmp()?;
|
||||
let metrics = &mmp.metrics;
|
||||
let sessions: Vec<Value> = node
|
||||
.session_entries()
|
||||
.filter_map(|(addr, entry)| {
|
||||
let mmp = entry.mmp()?;
|
||||
let metrics = &mmp.metrics;
|
||||
|
||||
let mut session_layer = json!({
|
||||
"loss_rate": metrics.loss_rate(),
|
||||
"etx": metrics.etx,
|
||||
"path_mtu": mmp.path_mtu.current_mtu(),
|
||||
});
|
||||
let mut session_layer = json!({
|
||||
"loss_rate": metrics.loss_rate(),
|
||||
"etx": metrics.etx,
|
||||
"path_mtu": mmp.path_mtu.current_mtu(),
|
||||
});
|
||||
|
||||
if let Some(smoothed_loss) = metrics.smoothed_loss() {
|
||||
session_layer["smoothed_loss"] = json!(smoothed_loss);
|
||||
}
|
||||
if let Some(smoothed_etx) = metrics.smoothed_etx() {
|
||||
session_layer["smoothed_etx"] = json!(smoothed_etx);
|
||||
}
|
||||
if let Some(srtt) = metrics.srtt_ms() {
|
||||
session_layer["srtt_ms"] = json!(srtt);
|
||||
if let Some(setx) = metrics.smoothed_etx() {
|
||||
session_layer["sqi"] = json!(setx * (1.0 + srtt / 100.0));
|
||||
if let Some(smoothed_loss) = metrics.smoothed_loss() {
|
||||
session_layer["smoothed_loss"] = json!(smoothed_loss);
|
||||
}
|
||||
if let Some(smoothed_etx) = metrics.smoothed_etx() {
|
||||
session_layer["smoothed_etx"] = json!(smoothed_etx);
|
||||
}
|
||||
if let Some(srtt) = metrics.srtt_ms() {
|
||||
session_layer["srtt_ms"] = json!(srtt);
|
||||
if let Some(setx) = metrics.smoothed_etx() {
|
||||
session_layer["sqi"] = json!(setx * (1.0 + srtt / 100.0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Some(json!({
|
||||
"remote": hex::encode(addr.as_bytes()),
|
||||
"display_name": node.peer_display_name(addr),
|
||||
"mode": format!("{}", mmp.mode()),
|
||||
"session_layer": session_layer,
|
||||
}))
|
||||
}).collect();
|
||||
Some(json!({
|
||||
"remote": hex::encode(addr.as_bytes()),
|
||||
"display_name": node.peer_display_name(addr),
|
||||
"mode": format!("{}", mmp.mode()),
|
||||
"session_layer": session_layer,
|
||||
}))
|
||||
})
|
||||
.collect();
|
||||
|
||||
json!({
|
||||
"peers": peers,
|
||||
@@ -452,60 +474,65 @@ pub fn show_cache(node: &Node) -> Value {
|
||||
/// `show_connections` — Pending handshakes.
|
||||
pub fn show_connections(node: &Node) -> Value {
|
||||
let now = now_ms();
|
||||
let connections: Vec<Value> = node.connections().map(|conn| {
|
||||
let mut conn_json = json!({
|
||||
"link_id": conn.link_id().as_u64(),
|
||||
"direction": format!("{}", conn.direction()),
|
||||
"handshake_state": format!("{}", conn.handshake_state()),
|
||||
"started_at_ms": conn.started_at(),
|
||||
"idle_ms": now.saturating_sub(conn.last_activity()),
|
||||
"resend_count": conn.resend_count(),
|
||||
});
|
||||
let connections: Vec<Value> = node
|
||||
.connections()
|
||||
.map(|conn| {
|
||||
let mut conn_json = json!({
|
||||
"link_id": conn.link_id().as_u64(),
|
||||
"direction": format!("{}", conn.direction()),
|
||||
"handshake_state": format!("{}", conn.handshake_state()),
|
||||
"started_at_ms": conn.started_at(),
|
||||
"idle_ms": now.saturating_sub(conn.last_activity()),
|
||||
"resend_count": conn.resend_count(),
|
||||
});
|
||||
|
||||
if let Some(identity) = conn.expected_identity() {
|
||||
conn_json["expected_peer"] = json!(identity.npub());
|
||||
}
|
||||
if let Some(identity) = conn.expected_identity() {
|
||||
conn_json["expected_peer"] = json!(identity.npub());
|
||||
}
|
||||
|
||||
conn_json
|
||||
}).collect();
|
||||
conn_json
|
||||
})
|
||||
.collect();
|
||||
|
||||
json!({ "connections": connections })
|
||||
}
|
||||
|
||||
/// `show_transports` — Transport instances.
|
||||
pub fn show_transports(node: &Node) -> Value {
|
||||
let transports: Vec<Value> = node.transport_ids().map(|id| {
|
||||
let handle = node.get_transport(id).unwrap();
|
||||
let mut t_json = json!({
|
||||
"transport_id": id.as_u32(),
|
||||
"type": handle.transport_type().name,
|
||||
"state": format!("{}", handle.state()),
|
||||
"mtu": handle.mtu(),
|
||||
});
|
||||
let transports: Vec<Value> = node
|
||||
.transport_ids()
|
||||
.map(|id| {
|
||||
let handle = node.get_transport(id).unwrap();
|
||||
let mut t_json = json!({
|
||||
"transport_id": id.as_u32(),
|
||||
"type": handle.transport_type().name,
|
||||
"state": format!("{}", handle.state()),
|
||||
"mtu": handle.mtu(),
|
||||
});
|
||||
|
||||
if let Some(name) = handle.name() {
|
||||
t_json["name"] = json!(name);
|
||||
}
|
||||
if let Some(addr) = handle.local_addr() {
|
||||
t_json["local_addr"] = json!(format!("{}", addr));
|
||||
}
|
||||
if let Some(name) = handle.name() {
|
||||
t_json["name"] = json!(name);
|
||||
}
|
||||
if let Some(addr) = handle.local_addr() {
|
||||
t_json["local_addr"] = json!(format!("{}", addr));
|
||||
}
|
||||
|
||||
// Tor-specific fields
|
||||
if let Some(mode) = handle.tor_mode() {
|
||||
t_json["tor_mode"] = json!(mode);
|
||||
}
|
||||
if let Some(onion) = handle.onion_address() {
|
||||
t_json["onion_address"] = json!(onion);
|
||||
}
|
||||
if let Some(monitoring) = handle.tor_monitoring() {
|
||||
t_json["tor_monitoring"] =
|
||||
serde_json::to_value(&monitoring).unwrap_or_default();
|
||||
}
|
||||
// Tor-specific fields
|
||||
if let Some(mode) = handle.tor_mode() {
|
||||
t_json["tor_mode"] = json!(mode);
|
||||
}
|
||||
if let Some(onion) = handle.onion_address() {
|
||||
t_json["onion_address"] = json!(onion);
|
||||
}
|
||||
if let Some(monitoring) = handle.tor_monitoring() {
|
||||
t_json["tor_monitoring"] = serde_json::to_value(&monitoring).unwrap_or_default();
|
||||
}
|
||||
|
||||
t_json["stats"] = handle.transport_stats();
|
||||
t_json["stats"] = handle.transport_stats();
|
||||
|
||||
t_json
|
||||
}).collect();
|
||||
t_json
|
||||
})
|
||||
.collect();
|
||||
|
||||
json!({ "transports": transports })
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user