Skip to content

Commit 2a1c672

Browse files
maxholmanclaude
andcommitted
refactor: remove redundant ping command — info provides the same data
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 67ebf9b commit 2a1c672

11 files changed

Lines changed: 286 additions & 306 deletions

File tree

crates/api/src/handlers.rs

Lines changed: 1 addition & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use axum::{
1111
use serde::{Deserialize, Serialize};
1212
use wallhack_wire::management::{
1313
ConnectRequest, DisconnectRequest, HintLevel, HintSetAutoRequest, HintSetRequest, InfoRequest,
14-
ListenRequest, NodeRole, PeerDisconnectRequest, PeersRequest, PingRequest,
14+
ListenRequest, NodeRole, PeerDisconnectRequest, PeersRequest,
1515
RouteAddRequest as ProtoRouteAddRequest, RouteDelRequest, RoutesRequest, ShutdownRequest,
1616
StatsRequest, management_request, management_response,
1717
};
@@ -125,14 +125,6 @@ pub struct ListenResponse {
125125
pub fingerprint: String,
126126
}
127127

128-
/// Ping response.
129-
#[derive(Debug, Serialize)]
130-
pub struct PingResponseBody {
131-
pub uptime_ms: u64,
132-
pub version: String,
133-
pub role: String,
134-
}
135-
136128
/// Hint set request body.
137129
#[derive(Debug, Deserialize)]
138130
pub struct HintSetRequestBody {
@@ -624,64 +616,6 @@ pub async fn disconnect(State(state): State<ApiState>) -> (StatusCode, Json<Succ
624616
}
625617
}
626618

627-
pub async fn ping(State(state): State<ApiState>) -> Result<Json<PingResponseBody>, StatusCode> {
628-
let resp = state
629-
.ipc
630-
.lock()
631-
.await
632-
.request(management_request::Request::Ping(PingRequest {
633-
peer: String::new(),
634-
}))
635-
.await
636-
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
637-
638-
match resp.response {
639-
Some(management_response::Response::Ping(ping)) => {
640-
let role = NodeRole::try_from(ping.node_role).unwrap_or(NodeRole::Unspecified);
641-
Ok(Json(PingResponseBody {
642-
uptime_ms: ping.uptime_ms,
643-
version: ping.version,
644-
role: role.to_string(),
645-
}))
646-
}
647-
_ => Err(StatusCode::INTERNAL_SERVER_ERROR),
648-
}
649-
}
650-
651-
pub async fn peer_ping(
652-
State(state): State<ApiState>,
653-
Path(peer): Path<String>,
654-
) -> Result<Json<PingResponseBody>, StatusCode> {
655-
let resp = state
656-
.ipc
657-
.lock()
658-
.await
659-
.request(management_request::Request::Ping(PingRequest { peer }))
660-
.await
661-
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
662-
663-
match resp.response {
664-
Some(management_response::Response::Ping(ping)) => {
665-
let role = NodeRole::try_from(ping.node_role).unwrap_or(NodeRole::Unspecified);
666-
Ok(Json(PingResponseBody {
667-
uptime_ms: ping.uptime_ms,
668-
version: ping.version,
669-
role: role.to_string(),
670-
}))
671-
}
672-
Some(management_response::Response::Error(e)) => {
673-
let not_supported: i32 = wallhack_wire::management::ErrorCode::NotSupported.into();
674-
if e.code == not_supported {
675-
Err(StatusCode::NOT_IMPLEMENTED)
676-
} else {
677-
tracing::warn!("Ping peer failed: {}", e.message);
678-
Err(StatusCode::NOT_FOUND)
679-
}
680-
}
681-
_ => Err(StatusCode::INTERNAL_SERVER_ERROR),
682-
}
683-
}
684-
685619
pub async fn shutdown(State(state): State<ApiState>) -> (StatusCode, Json<SuccessResponse>) {
686620
let resp = state
687621
.ipc

crates/api/src/lib.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ pub fn router(state: State) -> Router {
7575
.route("/connect", post(handlers::connect))
7676
.route("/listen", post(handlers::listen))
7777
.route("/disconnect", post(handlers::disconnect))
78-
.route("/ping", get(handlers::ping))
79-
.route("/ping/{peer}", get(handlers::peer_ping))
8078
.route("/shutdown", post(handlers::shutdown))
8179
.route(
8280
"/hints",

crates/cli/src/bin/wallhack.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@
1515
//!
1616
//! The dispatch heuristic: if the first argument starts with `-` it is a flag
1717
//! destined for the daemon CLI (auto-negotiation or global options). Control
18-
//! client subcommands are always bare words (`route`, `peers`, `ping`, etc.).
18+
//! client subcommands are always bare words (`route`, `peers`, `info`, etc.).
1919
2020
use wallhack_cli::{
2121
cli::{CtlCommand, RouteAction},
2222
ipc, output,
2323
};
2424
use wallhack_wire::management::{
2525
ConnectRequest, DisconnectRequest, HintLevel, HintSetAutoRequest, HintSetRequest, InfoRequest,
26-
ListenRequest, NodeRole, PeerDisconnectRequest, PeersRequest, PingRequest, RouteAddRequest,
27-
RouteDelRequest, RoutesRequest, ShutdownRequest, StatsRequest, management_request,
26+
ListenRequest, NodeRole, PeerDisconnectRequest, PeersRequest, RouteAddRequest, RouteDelRequest,
27+
RoutesRequest, ShutdownRequest, StatsRequest, management_request,
2828
};
2929

3030
const DAEMON_BIN_NAME: &str = "wallhackd";
@@ -312,9 +312,6 @@ async fn run_ctl_async(cli: wallhack_cli::cli::Cli) -> Result<(), output::CtlErr
312312
std::process::exit(1);
313313
};
314314
let request = match command {
315-
CtlCommand::Ping(cmd) => management_request::Request::Ping(PingRequest {
316-
peer: cmd.peer.unwrap_or_default(),
317-
}),
318315
CtlCommand::Info(_) => management_request::Request::Info(InfoRequest {}),
319316
CtlCommand::Stats(_) => management_request::Request::Stats(StatsRequest {}),
320317
#[cfg(feature = "json")]

crates/cli/src/cli.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ pub struct Cli {
2121
#[derive(FromArgs, Debug)]
2222
#[argh(subcommand)]
2323
pub enum CtlCommand {
24-
Ping(PingCmd),
2524
Info(InfoCmd),
2625
Stats(StatsCmd),
2726
Peers(PeersCmd),
@@ -34,15 +33,6 @@ pub enum CtlCommand {
3433
Shutdown(ShutdownCmd),
3534
}
3635

37-
/// Ping a peer.
38-
#[derive(FromArgs, Debug)]
39-
#[argh(subcommand, name = "ping")]
40-
pub struct PingCmd {
41-
/// peer name prefix to ping (auto-selects sole peer if omitted)
42-
#[argh(positional)]
43-
pub peer: Option<String>,
44-
}
45-
4636
/// Show daemon info.
4737
#[derive(FromArgs, Debug)]
4838
#[argh(subcommand, name = "info")]

crates/cli/src/output.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,6 @@ pub fn print_response(resp: &ManagementResponse) -> Result<(), CtlError> {
166166
Some(management_response::Response::Error(e)) => {
167167
return Err(CtlError::Daemon(e.message.clone()));
168168
}
169-
Some(management_response::Response::Ping(_)) => {
170-
// Ping response is handled by daemon; not used by CLI currently.
171-
return Err(CtlError::Daemon(
172-
"unexpected ping response from daemon".to_string(),
173-
));
174-
}
175169
None => {
176170
return Err(CtlError::EmptyResponse);
177171
}

crates/cli/src/repl.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -106,15 +106,6 @@ fn parse_command(line: &str) -> Option<management_request::Request> {
106106
let cmd = *parts.first()?;
107107

108108
match cmd {
109-
"ping" => {
110-
let peer = parts
111-
.get(1)
112-
.map(std::string::ToString::to_string)
113-
.unwrap_or_default();
114-
Some(management_request::Request::Ping(
115-
wallhack_wire::management::PingRequest { peer },
116-
))
117-
}
118109
"info" => Some(management_request::Request::Info(
119110
wallhack_wire::management::InfoRequest {},
120111
)),
@@ -255,7 +246,6 @@ fn print_help() {
255246

256247
let mut tw = TabWriter::new(std::io::stdout());
257248
let _ = writeln!(tw, "Commands:");
258-
let _ = writeln!(tw, " ping\tPing the daemon (peer ping not yet supported)");
259249
let _ = writeln!(tw, " info\tShow daemon info");
260250
let _ = writeln!(tw, " version\tShow version");
261251
let _ = writeln!(tw, " stats\tShow traffic statistics");

crates/core/src/ipc.rs

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use wallhack_transport::TransportError;
1818
use wallhack_wire::management::{
1919
self, ConnectResponse, DaemonMessage, DaemonNotification, ErrorCode, ErrorResponse,
2020
InfoResponse, ListenResponse, ManagementRequest, ManagementResponse, OkResponse, PeerConnected,
21-
PeerDisconnected, PeersResponse, PingResponse, RoutesResponse, StatsResponse, daemon_message,
21+
PeerDisconnected, PeersResponse, RoutesResponse, StatsResponse, daemon_message,
2222
daemon_notification, management_request, management_response,
2323
};
2424

@@ -287,27 +287,6 @@ fn dispatch_request(request: &ManagementRequest, api: &dyn NodeApi) -> Managemen
287287
let request_id = request.request_id;
288288

289289
let response = match &request.request {
290-
Some(management_request::Request::Ping(req)) => {
291-
if req.peer.is_empty() {
292-
// Ping the daemon itself
293-
let status = api.info();
294-
management_response::Response::Ping(PingResponse {
295-
uptime_ms: status.uptime_ms,
296-
version: status.version,
297-
node_role: management::NodeRole::from(status.role).into(),
298-
})
299-
} else {
300-
// Peer pinging is not yet implemented
301-
return ManagementResponse {
302-
request_id,
303-
response: Some(management_response::Response::Error(ErrorResponse {
304-
code: ErrorCode::NotSupported.into(),
305-
message: "peer ping not yet implemented".to_string(),
306-
})),
307-
};
308-
}
309-
}
310-
311290
Some(management_request::Request::Info(_)) => {
312291
let s = api.info();
313292
management_response::Response::Info(InfoResponse {

crates/mcp/src/convert.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,6 @@ pub fn format_response(resp: &ManagementResponse) -> Result<String, String> {
2727
let _ = writeln!(out, "uptime: {}", format_uptime(s.uptime_ms));
2828
Ok(out)
2929
}
30-
Some(management_response::Response::Ping(p)) => {
31-
let role = p.node_role().to_string();
32-
Ok(format!(
33-
"pong — role: {role}, version: {}, uptime: {}",
34-
p.version,
35-
format_uptime(p.uptime_ms),
36-
))
37-
}
3830
Some(management_response::Response::Stats(s)) => Ok(format!(
3931
"bytes in: {}\nbytes out: {}\npackets in: {}\npackets out: {}\n\
4032
connections: {}\nflows: {}\ndropped: {}",

crates/mcp/src/tools.rs

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,12 @@
33
use rmcp::{handler::server::wrapper::Parameters, schemars, tool};
44
use wallhack_wire::management::{
55
ConnectRequest, DisconnectRequest, HintLevel, HintSetAutoRequest, HintSetRequest, InfoRequest,
6-
ListenRequest, NodeRole, PeerDisconnectRequest, PeersRequest, PingRequest, RouteAddRequest,
7-
RouteDelRequest, RoutesRequest, ShutdownRequest, StatsRequest, management_request,
6+
ListenRequest, NodeRole, PeerDisconnectRequest, PeersRequest, RouteAddRequest, RouteDelRequest,
7+
RoutesRequest, ShutdownRequest, StatsRequest, management_request,
88
};
99

1010
use crate::convert;
1111

12-
#[derive(Debug, serde::Deserialize, schemars::JsonSchema)]
13-
pub struct PingParams {
14-
/// Reserved — peer-specific ping is not yet supported. Leave empty.
15-
pub peer: Option<String>,
16-
}
17-
1812
#[derive(Debug, serde::Deserialize, schemars::JsonSchema)]
1913
pub struct AddRouteParams {
2014
/// CIDR range, e.g. "10.0.0.0/8"
@@ -75,19 +69,6 @@ impl WallhackServer {
7569
ipc_call(management_request::Request::Info(InfoRequest {})).await
7670
}
7771

78-
#[tool(
79-
description = "Ping the daemon to check liveness. Returns role, version, and uptime. (Peer-specific ping is not yet supported.)"
80-
)]
81-
async fn ping(
82-
&self,
83-
Parameters(params): Parameters<PingParams>,
84-
) -> Result<String, rmcp::ErrorData> {
85-
ipc_call(management_request::Request::Ping(PingRequest {
86-
peer: params.peer.unwrap_or_default(),
87-
}))
88-
.await
89-
}
90-
9172
#[tool(
9273
description = "Get traffic statistics: bytes/packets in/out, active connections and flows"
9374
)]

crates/wire/proto/management.proto

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ package wallhack.management;
1010
message ManagementRequest {
1111
uint64 request_id = 1; // assigned by sender, echoed in response
1212
oneof request {
13-
PingRequest ping = 2;
1413
InfoRequest info = 3;
1514
StatsRequest stats = 4;
1615
PeersRequest peers = 5;
@@ -38,7 +37,6 @@ message DaemonMessage {
3837
message ManagementResponse {
3938
uint64 request_id = 1; // echoes the request
4039
oneof response {
41-
PingResponse ping = 2;
4240
InfoResponse info = 3;
4341
StatsResponse stats = 4;
4442
PeersResponse peers = 5;
@@ -64,10 +62,6 @@ message DaemonNotification {
6462

6563
// ── Request messages ────────────────────────────────────────────────
6664

67-
message PingRequest {
68-
string peer = 1; // prefix to match; empty = auto-select sole peer
69-
}
70-
7165
message InfoRequest {}
7266

7367
message StatsRequest {}
@@ -134,12 +128,6 @@ enum PeerStatus {
134128
}
135129

136130

137-
message PingResponse {
138-
uint64 uptime_ms = 1;
139-
string version = 2;
140-
NodeRole node_role = 3;
141-
}
142-
143131
message InfoResponse {
144132
NodeRole role = 1;
145133
bool connected = 2;

0 commit comments

Comments
 (0)