2025-09-04 12:30:25 +00:00
|
|
|
//! WebSocket connector for communicating with socktop agents.
|
Major refactor, additional comments, performance improvements, idle performance improvements, access token, port specification
Release highlights
Introduced split client/agent architecture with a ratatui-based TUI and a lightweight WebSocket agent.
Added adaptive (idle-aware) sampler: agent samples fast only when clients are connected; sleeps when idle.
Implemented metrics JSON caching for instant ws replies; cold-start does one-off collection.
Port configuration: --port/-p, positional PORT, or SOCKTOP_PORT env (default 3000).
Optional token auth: SOCKTOP_TOKEN on agent, ws://HOST:PORT/ws?token=VALUE in client.
Logging via tracing with RUST_LOG control.
CI workflow (fmt, clippy, build) for Linux and Windows.
Systemd unit example for always-on agent.
TUI features
CPU: overall sparkline + per-core history with trend arrows and color thresholds.
Memory/Swap gauges with humanized labels.
Disks panel with per-device usage and icons.
Network download/upload sparklines (KB/s) with peak tracking.
Top processes table (PID, name, CPU%, mem, mem%).
Header with hostname and CPU temperature indicator.
Agent changes
sysinfo 0.36.1 targeted refresh: refresh_cpu_all, refresh_memory, refresh_processes_specifics(ProcessesToUpdate::All, ProcessRefreshKind::new().with_cpu().with_memory(), true).
WebSocket handler: client counting with wake notifications, cold-start handling, proper Response returns.
Sampler uses MissedTickBehavior::Skip to avoid catch-up bursts.
Docs
README updates: running instructions, port configuration, optional token auth, platform notes, example JSON.
Added socktop-agent.service systemd unit.
Platform notes
Linux (AMD/Intel) supported; tested on AMD, targeting Intel next.
Raspberry Pi supported (availability of temps varies by model).
Windows builds/run; CPU temperature may be unavailable (shows N/A).
Known/next
Roadmap includes configurable refresh interval, TUI filtering/sorting, TLS/WSS, and export to file.
Add Context...
README.md
2025-08-08 19:41:32 +00:00
|
|
|
|
multiple feature and performance improvements (see description)
Here are concise release notes you can paste into your GitHub release.
Release notes — 2025-08-12
Highlights
Agent back to near-zero CPU when idle (request-driven, no background samplers).
Accurate per-process CPU% via /proc deltas; only top-level processes (threads hidden).
TUI: processes pane gets scrollbar, click-to-sort (CPU% or Mem) with indicator, stable total count.
Network panes made taller; disks slightly reduced.
README revamped: rustup prereqs, crates.io install, update/systemd instructions.
Clippy cleanups across agent and client.
Agent
Reverted precompressed caches and background samplers; WebSocket path is request-driven again.
Ensured on-demand gzip for larger replies; no per-request overhead when small.
Processes: switched to refresh_processes_specifics with ProcessRefreshKind::everything().without_tasks() to exclude threads.
Per-process CPU% now computed from /proc jiffies deltas using a small ProcCpuTracker (fixes “always 0%”/scaling issues).
Optional metrics and light caching:
CPU temp and GPU metrics gated by env (SOCKTOP_AGENT_TEMP=0, SOCKTOP_AGENT_GPU=0).
Tiny TTL caches via once_cell to avoid rescanning sensors every tick.
Dependencies: added once_cell = "1.19".
No API changes to WS endpoints.
Client (TUI)
Processes pane:
Scrollbar (mouse wheel, drag; keyboard arrows/PageUp/PageDown/Home/End).
Click header to sort by CPU% or Mem; dot indicator on active column.
Preserves process_count across fast metrics updates to avoid flicker.
UI/theme:
Shared scrollbar colors moved to ui/theme.rs; both CPU and Processes reuse them.
Cached pane rect to fix input handling; removed unused vars.
Layout: network download/upload get more vertical space; disks shrink slightly.
Clippy fixes: derive Default for ProcSortBy; style/import cleanups.
Docs
README: added rustup install steps (with proper shell reload), install via cargo install socktop and cargo install socktop_agent, and a clear Updating section (systemd service steps included).
Features list updated; roadmap marks independent cadences as done.
Upgrade notes
Agent: cargo install socktop_agent --force, then restart your systemd service; if unit changed, systemctl daemon-reload.
TUI: cargo install socktop --force.
Optional envs to trim overhead: SOCKTOP_AGENT_GPU=0, SOCKTOP_AGENT_TEMP=0.
No config or API breaking changes.
2025-08-12 22:52:46 +00:00
|
|
|
use flate2::bufread::GzDecoder;
|
|
|
|
|
use futures_util::{SinkExt, StreamExt};
|
2025-08-20 06:24:36 +00:00
|
|
|
use prost::Message as _;
|
2025-08-23 09:18:09 +00:00
|
|
|
use rustls::client::danger::{HandshakeSignatureValid, ServerCertVerified, ServerCertVerifier};
|
2025-08-23 09:15:45 +00:00
|
|
|
use rustls::pki_types::{CertificateDer, ServerName, UnixTime};
|
2025-08-23 09:18:09 +00:00
|
|
|
use rustls::{ClientConfig, RootCertStore};
|
2025-08-23 09:15:45 +00:00
|
|
|
use rustls::{DigitallySignedStruct, SignatureScheme};
|
2025-08-16 08:23:20 +00:00
|
|
|
use rustls_pemfile::Item;
|
2025-08-20 06:24:36 +00:00
|
|
|
use std::io::Read;
|
2025-08-16 08:23:20 +00:00
|
|
|
use std::{fs::File, io::BufReader, sync::Arc};
|
Major refactor, additional comments, performance improvements, idle performance improvements, access token, port specification
Release highlights
Introduced split client/agent architecture with a ratatui-based TUI and a lightweight WebSocket agent.
Added adaptive (idle-aware) sampler: agent samples fast only when clients are connected; sleeps when idle.
Implemented metrics JSON caching for instant ws replies; cold-start does one-off collection.
Port configuration: --port/-p, positional PORT, or SOCKTOP_PORT env (default 3000).
Optional token auth: SOCKTOP_TOKEN on agent, ws://HOST:PORT/ws?token=VALUE in client.
Logging via tracing with RUST_LOG control.
CI workflow (fmt, clippy, build) for Linux and Windows.
Systemd unit example for always-on agent.
TUI features
CPU: overall sparkline + per-core history with trend arrows and color thresholds.
Memory/Swap gauges with humanized labels.
Disks panel with per-device usage and icons.
Network download/upload sparklines (KB/s) with peak tracking.
Top processes table (PID, name, CPU%, mem, mem%).
Header with hostname and CPU temperature indicator.
Agent changes
sysinfo 0.36.1 targeted refresh: refresh_cpu_all, refresh_memory, refresh_processes_specifics(ProcessesToUpdate::All, ProcessRefreshKind::new().with_cpu().with_memory(), true).
WebSocket handler: client counting with wake notifications, cold-start handling, proper Response returns.
Sampler uses MissedTickBehavior::Skip to avoid catch-up bursts.
Docs
README updates: running instructions, port configuration, optional token auth, platform notes, example JSON.
Added socktop-agent.service systemd unit.
Platform notes
Linux (AMD/Intel) supported; tested on AMD, targeting Intel next.
Raspberry Pi supported (availability of temps varies by model).
Windows builds/run; CPU temperature may be unavailable (shows N/A).
Known/next
Roadmap includes configurable refresh interval, TUI filtering/sorting, TLS/WSS, and export to file.
Add Context...
README.md
2025-08-08 19:41:32 +00:00
|
|
|
use tokio::net::TcpStream;
|
2025-08-16 08:23:20 +00:00
|
|
|
use tokio_tungstenite::{
|
2025-09-04 12:30:25 +00:00
|
|
|
Connector, MaybeTlsStream, WebSocketStream, connect_async, connect_async_tls_with_config,
|
|
|
|
|
tungstenite::Message, tungstenite::client::IntoClientRequest,
|
2025-08-16 08:23:20 +00:00
|
|
|
};
|
2025-08-16 08:25:03 +00:00
|
|
|
use url::Url;
|
Major refactor, additional comments, performance improvements, idle performance improvements, access token, port specification
Release highlights
Introduced split client/agent architecture with a ratatui-based TUI and a lightweight WebSocket agent.
Added adaptive (idle-aware) sampler: agent samples fast only when clients are connected; sleeps when idle.
Implemented metrics JSON caching for instant ws replies; cold-start does one-off collection.
Port configuration: --port/-p, positional PORT, or SOCKTOP_PORT env (default 3000).
Optional token auth: SOCKTOP_TOKEN on agent, ws://HOST:PORT/ws?token=VALUE in client.
Logging via tracing with RUST_LOG control.
CI workflow (fmt, clippy, build) for Linux and Windows.
Systemd unit example for always-on agent.
TUI features
CPU: overall sparkline + per-core history with trend arrows and color thresholds.
Memory/Swap gauges with humanized labels.
Disks panel with per-device usage and icons.
Network download/upload sparklines (KB/s) with peak tracking.
Top processes table (PID, name, CPU%, mem, mem%).
Header with hostname and CPU temperature indicator.
Agent changes
sysinfo 0.36.1 targeted refresh: refresh_cpu_all, refresh_memory, refresh_processes_specifics(ProcessesToUpdate::All, ProcessRefreshKind::new().with_cpu().with_memory(), true).
WebSocket handler: client counting with wake notifications, cold-start handling, proper Response returns.
Sampler uses MissedTickBehavior::Skip to avoid catch-up bursts.
Docs
README updates: running instructions, port configuration, optional token auth, platform notes, example JSON.
Added socktop-agent.service systemd unit.
Platform notes
Linux (AMD/Intel) supported; tested on AMD, targeting Intel next.
Raspberry Pi supported (availability of temps varies by model).
Windows builds/run; CPU temperature may be unavailable (shows N/A).
Known/next
Roadmap includes configurable refresh interval, TUI filtering/sorting, TLS/WSS, and export to file.
Add Context...
README.md
2025-08-08 19:41:32 +00:00
|
|
|
|
2025-09-04 12:30:25 +00:00
|
|
|
use crate::types::{AgentRequest, AgentResponse, DiskInfo, Metrics, ProcessInfo, ProcessesPayload};
|
|
|
|
|
|
|
|
|
|
#[cfg(feature = "tls")]
|
|
|
|
|
fn ensure_crypto_provider() {
|
|
|
|
|
use std::sync::Once;
|
|
|
|
|
static INIT: Once = Once::new();
|
|
|
|
|
INIT.call_once(|| {
|
|
|
|
|
let _ = rustls::crypto::ring::default_provider().install_default();
|
|
|
|
|
});
|
|
|
|
|
}
|
2025-08-20 06:24:36 +00:00
|
|
|
|
|
|
|
|
mod pb {
|
|
|
|
|
// generated by build.rs
|
|
|
|
|
include!(concat!(env!("OUT_DIR"), "/socktop.rs"));
|
|
|
|
|
}
|
Major refactor, additional comments, performance improvements, idle performance improvements, access token, port specification
Release highlights
Introduced split client/agent architecture with a ratatui-based TUI and a lightweight WebSocket agent.
Added adaptive (idle-aware) sampler: agent samples fast only when clients are connected; sleeps when idle.
Implemented metrics JSON caching for instant ws replies; cold-start does one-off collection.
Port configuration: --port/-p, positional PORT, or SOCKTOP_PORT env (default 3000).
Optional token auth: SOCKTOP_TOKEN on agent, ws://HOST:PORT/ws?token=VALUE in client.
Logging via tracing with RUST_LOG control.
CI workflow (fmt, clippy, build) for Linux and Windows.
Systemd unit example for always-on agent.
TUI features
CPU: overall sparkline + per-core history with trend arrows and color thresholds.
Memory/Swap gauges with humanized labels.
Disks panel with per-device usage and icons.
Network download/upload sparklines (KB/s) with peak tracking.
Top processes table (PID, name, CPU%, mem, mem%).
Header with hostname and CPU temperature indicator.
Agent changes
sysinfo 0.36.1 targeted refresh: refresh_cpu_all, refresh_memory, refresh_processes_specifics(ProcessesToUpdate::All, ProcessRefreshKind::new().with_cpu().with_memory(), true).
WebSocket handler: client counting with wake notifications, cold-start handling, proper Response returns.
Sampler uses MissedTickBehavior::Skip to avoid catch-up bursts.
Docs
README updates: running instructions, port configuration, optional token auth, platform notes, example JSON.
Added socktop-agent.service systemd unit.
Platform notes
Linux (AMD/Intel) supported; tested on AMD, targeting Intel next.
Raspberry Pi supported (availability of temps varies by model).
Windows builds/run; CPU temperature may be unavailable (shows N/A).
Known/next
Roadmap includes configurable refresh interval, TUI filtering/sorting, TLS/WSS, and export to file.
Add Context...
README.md
2025-08-08 19:41:32 +00:00
|
|
|
|
|
|
|
|
pub type WsStream = WebSocketStream<MaybeTlsStream<TcpStream>>;
|
|
|
|
|
|
2025-09-04 12:30:25 +00:00
|
|
|
/// Configuration for connecting to a socktop agent
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
pub struct ConnectorConfig {
|
|
|
|
|
pub url: String,
|
|
|
|
|
pub tls_ca_path: Option<String>,
|
|
|
|
|
pub verify_hostname: bool,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl ConnectorConfig {
|
|
|
|
|
pub fn new(url: impl Into<String>) -> Self {
|
|
|
|
|
Self {
|
|
|
|
|
url: url.into(),
|
|
|
|
|
tls_ca_path: None,
|
|
|
|
|
verify_hostname: false,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn with_tls_ca(mut self, ca_path: impl Into<String>) -> Self {
|
|
|
|
|
self.tls_ca_path = Some(ca_path.into());
|
|
|
|
|
self
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn with_hostname_verification(mut self, verify: bool) -> Self {
|
|
|
|
|
self.verify_hostname = verify;
|
|
|
|
|
self
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// A WebSocket connector for communicating with socktop agents
|
|
|
|
|
pub struct SocktopConnector {
|
|
|
|
|
config: ConnectorConfig,
|
|
|
|
|
stream: Option<WsStream>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl SocktopConnector {
|
|
|
|
|
/// Create a new connector with the given configuration
|
|
|
|
|
pub fn new(config: ConnectorConfig) -> Self {
|
|
|
|
|
Self {
|
|
|
|
|
config,
|
|
|
|
|
stream: None,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Connect to the agent
|
|
|
|
|
pub async fn connect(&mut self) -> Result<(), Box<dyn std::error::Error>> {
|
|
|
|
|
let stream = connect_to_agent(
|
|
|
|
|
&self.config.url,
|
|
|
|
|
self.config.tls_ca_path.as_deref(),
|
|
|
|
|
self.config.verify_hostname,
|
|
|
|
|
)
|
|
|
|
|
.await?;
|
|
|
|
|
self.stream = Some(stream);
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Send a request to the agent and get the response
|
|
|
|
|
pub async fn request(
|
|
|
|
|
&mut self,
|
|
|
|
|
request: AgentRequest,
|
|
|
|
|
) -> Result<AgentResponse, Box<dyn std::error::Error>> {
|
|
|
|
|
let stream = self.stream.as_mut().ok_or("Not connected")?;
|
|
|
|
|
|
|
|
|
|
match request {
|
|
|
|
|
AgentRequest::Metrics => {
|
|
|
|
|
let metrics = request_metrics(stream)
|
|
|
|
|
.await
|
|
|
|
|
.ok_or("Failed to get metrics")?;
|
|
|
|
|
Ok(AgentResponse::Metrics(metrics))
|
|
|
|
|
}
|
|
|
|
|
AgentRequest::Disks => {
|
|
|
|
|
let disks = request_disks(stream).await.ok_or("Failed to get disks")?;
|
|
|
|
|
Ok(AgentResponse::Disks(disks))
|
|
|
|
|
}
|
|
|
|
|
AgentRequest::Processes => {
|
|
|
|
|
let processes = request_processes(stream)
|
|
|
|
|
.await
|
|
|
|
|
.ok_or("Failed to get processes")?;
|
|
|
|
|
Ok(AgentResponse::Processes(processes))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Check if the connector is connected
|
|
|
|
|
pub fn is_connected(&self) -> bool {
|
|
|
|
|
self.stream.is_some()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Disconnect from the agent
|
|
|
|
|
pub async fn disconnect(&mut self) -> Result<(), Box<dyn std::error::Error>> {
|
|
|
|
|
if let Some(mut stream) = self.stream.take() {
|
|
|
|
|
let _ = stream.close(None).await;
|
|
|
|
|
}
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
Major refactor, additional comments, performance improvements, idle performance improvements, access token, port specification
Release highlights
Introduced split client/agent architecture with a ratatui-based TUI and a lightweight WebSocket agent.
Added adaptive (idle-aware) sampler: agent samples fast only when clients are connected; sleeps when idle.
Implemented metrics JSON caching for instant ws replies; cold-start does one-off collection.
Port configuration: --port/-p, positional PORT, or SOCKTOP_PORT env (default 3000).
Optional token auth: SOCKTOP_TOKEN on agent, ws://HOST:PORT/ws?token=VALUE in client.
Logging via tracing with RUST_LOG control.
CI workflow (fmt, clippy, build) for Linux and Windows.
Systemd unit example for always-on agent.
TUI features
CPU: overall sparkline + per-core history with trend arrows and color thresholds.
Memory/Swap gauges with humanized labels.
Disks panel with per-device usage and icons.
Network download/upload sparklines (KB/s) with peak tracking.
Top processes table (PID, name, CPU%, mem, mem%).
Header with hostname and CPU temperature indicator.
Agent changes
sysinfo 0.36.1 targeted refresh: refresh_cpu_all, refresh_memory, refresh_processes_specifics(ProcessesToUpdate::All, ProcessRefreshKind::new().with_cpu().with_memory(), true).
WebSocket handler: client counting with wake notifications, cold-start handling, proper Response returns.
Sampler uses MissedTickBehavior::Skip to avoid catch-up bursts.
Docs
README updates: running instructions, port configuration, optional token auth, platform notes, example JSON.
Added socktop-agent.service systemd unit.
Platform notes
Linux (AMD/Intel) supported; tested on AMD, targeting Intel next.
Raspberry Pi supported (availability of temps varies by model).
Windows builds/run; CPU temperature may be unavailable (shows N/A).
Known/next
Roadmap includes configurable refresh interval, TUI filtering/sorting, TLS/WSS, and export to file.
Add Context...
README.md
2025-08-08 19:41:32 +00:00
|
|
|
// Connect to the agent and return the WS stream
|
2025-09-04 12:30:25 +00:00
|
|
|
async fn connect_to_agent(
|
2025-08-16 08:23:20 +00:00
|
|
|
url: &str,
|
|
|
|
|
tls_ca: Option<&str>,
|
2025-09-04 12:30:25 +00:00
|
|
|
verify_hostname: bool,
|
2025-08-16 08:23:20 +00:00
|
|
|
) -> Result<WsStream, Box<dyn std::error::Error>> {
|
2025-09-04 12:30:25 +00:00
|
|
|
#[cfg(feature = "tls")]
|
|
|
|
|
ensure_crypto_provider();
|
|
|
|
|
|
2025-08-16 08:23:20 +00:00
|
|
|
let mut u = Url::parse(url)?;
|
|
|
|
|
if let Some(ca_path) = tls_ca {
|
|
|
|
|
if u.scheme() == "ws" {
|
|
|
|
|
let _ = u.set_scheme("wss");
|
|
|
|
|
}
|
2025-09-04 12:30:25 +00:00
|
|
|
return connect_with_ca(u.as_str(), ca_path, verify_hostname).await;
|
2025-08-16 08:23:20 +00:00
|
|
|
}
|
2025-09-04 12:30:25 +00:00
|
|
|
// No TLS - hostname verification is not applicable
|
2025-08-16 08:23:20 +00:00
|
|
|
let (ws, _) = connect_async(u.as_str()).await?;
|
|
|
|
|
Ok(ws)
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-04 12:30:25 +00:00
|
|
|
#[cfg(feature = "tls")]
|
|
|
|
|
async fn connect_with_ca(
|
|
|
|
|
url: &str,
|
|
|
|
|
ca_path: &str,
|
|
|
|
|
verify_hostname: bool,
|
|
|
|
|
) -> Result<WsStream, Box<dyn std::error::Error>> {
|
|
|
|
|
// Initialize the crypto provider for rustls
|
|
|
|
|
let _ = rustls::crypto::ring::default_provider().install_default();
|
|
|
|
|
|
2025-08-16 08:23:20 +00:00
|
|
|
let mut root = RootCertStore::empty();
|
|
|
|
|
let mut reader = BufReader::new(File::open(ca_path)?);
|
|
|
|
|
let mut der_certs = Vec::new();
|
|
|
|
|
while let Ok(Some(item)) = rustls_pemfile::read_one(&mut reader) {
|
|
|
|
|
if let Item::X509Certificate(der) = item {
|
|
|
|
|
der_certs.push(der);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
root.add_parsable_certificates(der_certs);
|
|
|
|
|
|
2025-08-23 09:15:45 +00:00
|
|
|
let mut cfg = ClientConfig::builder()
|
2025-08-16 08:23:20 +00:00
|
|
|
.with_root_certificates(root)
|
|
|
|
|
.with_no_client_auth();
|
|
|
|
|
|
|
|
|
|
let req = url.into_client_request()?;
|
2025-09-04 12:30:25 +00:00
|
|
|
if !verify_hostname {
|
2025-08-23 09:15:45 +00:00
|
|
|
#[derive(Debug)]
|
|
|
|
|
struct NoVerify;
|
|
|
|
|
impl ServerCertVerifier for NoVerify {
|
|
|
|
|
fn verify_server_cert(
|
|
|
|
|
&self,
|
|
|
|
|
_end_entity: &CertificateDer<'_>,
|
|
|
|
|
_intermediates: &[CertificateDer<'_>],
|
|
|
|
|
_server_name: &ServerName,
|
|
|
|
|
_ocsp_response: &[u8],
|
|
|
|
|
_now: UnixTime,
|
2025-08-23 09:18:09 +00:00
|
|
|
) -> Result<ServerCertVerified, rustls::Error> {
|
|
|
|
|
Ok(ServerCertVerified::assertion())
|
|
|
|
|
}
|
2025-08-23 09:15:45 +00:00
|
|
|
fn verify_tls12_signature(
|
|
|
|
|
&self,
|
|
|
|
|
_message: &[u8],
|
|
|
|
|
_cert: &CertificateDer<'_>,
|
|
|
|
|
_dss: &DigitallySignedStruct,
|
2025-08-23 09:18:09 +00:00
|
|
|
) -> Result<HandshakeSignatureValid, rustls::Error> {
|
|
|
|
|
Ok(HandshakeSignatureValid::assertion())
|
|
|
|
|
}
|
2025-08-23 09:15:45 +00:00
|
|
|
fn verify_tls13_signature(
|
|
|
|
|
&self,
|
|
|
|
|
_message: &[u8],
|
|
|
|
|
_cert: &CertificateDer<'_>,
|
|
|
|
|
_dss: &DigitallySignedStruct,
|
2025-08-23 09:18:09 +00:00
|
|
|
) -> Result<HandshakeSignatureValid, rustls::Error> {
|
|
|
|
|
Ok(HandshakeSignatureValid::assertion())
|
|
|
|
|
}
|
2025-08-23 09:15:45 +00:00
|
|
|
fn supported_verify_schemes(&self) -> Vec<SignatureScheme> {
|
|
|
|
|
vec![
|
|
|
|
|
SignatureScheme::ECDSA_NISTP256_SHA256,
|
|
|
|
|
SignatureScheme::ED25519,
|
|
|
|
|
SignatureScheme::RSA_PSS_SHA256,
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
cfg.dangerous().set_certificate_verifier(Arc::new(NoVerify));
|
2025-09-04 12:30:25 +00:00
|
|
|
eprintln!(
|
|
|
|
|
"socktop_connector: hostname verification disabled (default). Set SOCKTOP_VERIFY_NAME=1 to enable strict SAN checking."
|
|
|
|
|
);
|
2025-08-23 05:39:06 +00:00
|
|
|
}
|
2025-08-23 09:15:45 +00:00
|
|
|
let cfg = Arc::new(cfg);
|
2025-08-23 09:18:09 +00:00
|
|
|
let (ws, _) =
|
2025-09-04 12:30:25 +00:00
|
|
|
connect_async_tls_with_config(req, None, verify_hostname, Some(Connector::Rustls(cfg)))
|
2025-08-23 09:18:09 +00:00
|
|
|
.await?;
|
Major refactor, additional comments, performance improvements, idle performance improvements, access token, port specification
Release highlights
Introduced split client/agent architecture with a ratatui-based TUI and a lightweight WebSocket agent.
Added adaptive (idle-aware) sampler: agent samples fast only when clients are connected; sleeps when idle.
Implemented metrics JSON caching for instant ws replies; cold-start does one-off collection.
Port configuration: --port/-p, positional PORT, or SOCKTOP_PORT env (default 3000).
Optional token auth: SOCKTOP_TOKEN on agent, ws://HOST:PORT/ws?token=VALUE in client.
Logging via tracing with RUST_LOG control.
CI workflow (fmt, clippy, build) for Linux and Windows.
Systemd unit example for always-on agent.
TUI features
CPU: overall sparkline + per-core history with trend arrows and color thresholds.
Memory/Swap gauges with humanized labels.
Disks panel with per-device usage and icons.
Network download/upload sparklines (KB/s) with peak tracking.
Top processes table (PID, name, CPU%, mem, mem%).
Header with hostname and CPU temperature indicator.
Agent changes
sysinfo 0.36.1 targeted refresh: refresh_cpu_all, refresh_memory, refresh_processes_specifics(ProcessesToUpdate::All, ProcessRefreshKind::new().with_cpu().with_memory(), true).
WebSocket handler: client counting with wake notifications, cold-start handling, proper Response returns.
Sampler uses MissedTickBehavior::Skip to avoid catch-up bursts.
Docs
README updates: running instructions, port configuration, optional token auth, platform notes, example JSON.
Added socktop-agent.service systemd unit.
Platform notes
Linux (AMD/Intel) supported; tested on AMD, targeting Intel next.
Raspberry Pi supported (availability of temps varies by model).
Windows builds/run; CPU temperature may be unavailable (shows N/A).
Known/next
Roadmap includes configurable refresh interval, TUI filtering/sorting, TLS/WSS, and export to file.
Add Context...
README.md
2025-08-08 19:41:32 +00:00
|
|
|
Ok(ws)
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-04 12:30:25 +00:00
|
|
|
#[cfg(not(feature = "tls"))]
|
|
|
|
|
async fn connect_with_ca(
|
|
|
|
|
_url: &str,
|
|
|
|
|
_ca_path: &str,
|
|
|
|
|
) -> Result<WsStream, Box<dyn std::error::Error>> {
|
|
|
|
|
Err("TLS support not compiled in".into())
|
|
|
|
|
}
|
|
|
|
|
|
Major refactor, additional comments, performance improvements, idle performance improvements, access token, port specification
Release highlights
Introduced split client/agent architecture with a ratatui-based TUI and a lightweight WebSocket agent.
Added adaptive (idle-aware) sampler: agent samples fast only when clients are connected; sleeps when idle.
Implemented metrics JSON caching for instant ws replies; cold-start does one-off collection.
Port configuration: --port/-p, positional PORT, or SOCKTOP_PORT env (default 3000).
Optional token auth: SOCKTOP_TOKEN on agent, ws://HOST:PORT/ws?token=VALUE in client.
Logging via tracing with RUST_LOG control.
CI workflow (fmt, clippy, build) for Linux and Windows.
Systemd unit example for always-on agent.
TUI features
CPU: overall sparkline + per-core history with trend arrows and color thresholds.
Memory/Swap gauges with humanized labels.
Disks panel with per-device usage and icons.
Network download/upload sparklines (KB/s) with peak tracking.
Top processes table (PID, name, CPU%, mem, mem%).
Header with hostname and CPU temperature indicator.
Agent changes
sysinfo 0.36.1 targeted refresh: refresh_cpu_all, refresh_memory, refresh_processes_specifics(ProcessesToUpdate::All, ProcessRefreshKind::new().with_cpu().with_memory(), true).
WebSocket handler: client counting with wake notifications, cold-start handling, proper Response returns.
Sampler uses MissedTickBehavior::Skip to avoid catch-up bursts.
Docs
README updates: running instructions, port configuration, optional token auth, platform notes, example JSON.
Added socktop-agent.service systemd unit.
Platform notes
Linux (AMD/Intel) supported; tested on AMD, targeting Intel next.
Raspberry Pi supported (availability of temps varies by model).
Windows builds/run; CPU temperature may be unavailable (shows N/A).
Known/next
Roadmap includes configurable refresh interval, TUI filtering/sorting, TLS/WSS, and export to file.
Add Context...
README.md
2025-08-08 19:41:32 +00:00
|
|
|
// Send a "get_metrics" request and await a single JSON reply
|
2025-09-04 12:30:25 +00:00
|
|
|
async fn request_metrics(ws: &mut WsStream) -> Option<Metrics> {
|
Major refactor, additional comments, performance improvements, idle performance improvements, access token, port specification
Release highlights
Introduced split client/agent architecture with a ratatui-based TUI and a lightweight WebSocket agent.
Added adaptive (idle-aware) sampler: agent samples fast only when clients are connected; sleeps when idle.
Implemented metrics JSON caching for instant ws replies; cold-start does one-off collection.
Port configuration: --port/-p, positional PORT, or SOCKTOP_PORT env (default 3000).
Optional token auth: SOCKTOP_TOKEN on agent, ws://HOST:PORT/ws?token=VALUE in client.
Logging via tracing with RUST_LOG control.
CI workflow (fmt, clippy, build) for Linux and Windows.
Systemd unit example for always-on agent.
TUI features
CPU: overall sparkline + per-core history with trend arrows and color thresholds.
Memory/Swap gauges with humanized labels.
Disks panel with per-device usage and icons.
Network download/upload sparklines (KB/s) with peak tracking.
Top processes table (PID, name, CPU%, mem, mem%).
Header with hostname and CPU temperature indicator.
Agent changes
sysinfo 0.36.1 targeted refresh: refresh_cpu_all, refresh_memory, refresh_processes_specifics(ProcessesToUpdate::All, ProcessRefreshKind::new().with_cpu().with_memory(), true).
WebSocket handler: client counting with wake notifications, cold-start handling, proper Response returns.
Sampler uses MissedTickBehavior::Skip to avoid catch-up bursts.
Docs
README updates: running instructions, port configuration, optional token auth, platform notes, example JSON.
Added socktop-agent.service systemd unit.
Platform notes
Linux (AMD/Intel) supported; tested on AMD, targeting Intel next.
Raspberry Pi supported (availability of temps varies by model).
Windows builds/run; CPU temperature may be unavailable (shows N/A).
Known/next
Roadmap includes configurable refresh interval, TUI filtering/sorting, TLS/WSS, and export to file.
Add Context...
README.md
2025-08-08 19:41:32 +00:00
|
|
|
if ws.send(Message::Text("get_metrics".into())).await.is_err() {
|
|
|
|
|
return None;
|
|
|
|
|
}
|
|
|
|
|
match ws.next().await {
|
multiple feature and performance improvements (see description)
Here are concise release notes you can paste into your GitHub release.
Release notes — 2025-08-12
Highlights
Agent back to near-zero CPU when idle (request-driven, no background samplers).
Accurate per-process CPU% via /proc deltas; only top-level processes (threads hidden).
TUI: processes pane gets scrollbar, click-to-sort (CPU% or Mem) with indicator, stable total count.
Network panes made taller; disks slightly reduced.
README revamped: rustup prereqs, crates.io install, update/systemd instructions.
Clippy cleanups across agent and client.
Agent
Reverted precompressed caches and background samplers; WebSocket path is request-driven again.
Ensured on-demand gzip for larger replies; no per-request overhead when small.
Processes: switched to refresh_processes_specifics with ProcessRefreshKind::everything().without_tasks() to exclude threads.
Per-process CPU% now computed from /proc jiffies deltas using a small ProcCpuTracker (fixes “always 0%”/scaling issues).
Optional metrics and light caching:
CPU temp and GPU metrics gated by env (SOCKTOP_AGENT_TEMP=0, SOCKTOP_AGENT_GPU=0).
Tiny TTL caches via once_cell to avoid rescanning sensors every tick.
Dependencies: added once_cell = "1.19".
No API changes to WS endpoints.
Client (TUI)
Processes pane:
Scrollbar (mouse wheel, drag; keyboard arrows/PageUp/PageDown/Home/End).
Click header to sort by CPU% or Mem; dot indicator on active column.
Preserves process_count across fast metrics updates to avoid flicker.
UI/theme:
Shared scrollbar colors moved to ui/theme.rs; both CPU and Processes reuse them.
Cached pane rect to fix input handling; removed unused vars.
Layout: network download/upload get more vertical space; disks shrink slightly.
Clippy fixes: derive Default for ProcSortBy; style/import cleanups.
Docs
README: added rustup install steps (with proper shell reload), install via cargo install socktop and cargo install socktop_agent, and a clear Updating section (systemd service steps included).
Features list updated; roadmap marks independent cadences as done.
Upgrade notes
Agent: cargo install socktop_agent --force, then restart your systemd service; if unit changed, systemctl daemon-reload.
TUI: cargo install socktop --force.
Optional envs to trim overhead: SOCKTOP_AGENT_GPU=0, SOCKTOP_AGENT_TEMP=0.
No config or API breaking changes.
2025-08-12 22:52:46 +00:00
|
|
|
Some(Ok(Message::Binary(b))) => {
|
|
|
|
|
gunzip_to_string(&b).and_then(|s| serde_json::from_str::<Metrics>(&s).ok())
|
|
|
|
|
}
|
Major refactor, additional comments, performance improvements, idle performance improvements, access token, port specification
Release highlights
Introduced split client/agent architecture with a ratatui-based TUI and a lightweight WebSocket agent.
Added adaptive (idle-aware) sampler: agent samples fast only when clients are connected; sleeps when idle.
Implemented metrics JSON caching for instant ws replies; cold-start does one-off collection.
Port configuration: --port/-p, positional PORT, or SOCKTOP_PORT env (default 3000).
Optional token auth: SOCKTOP_TOKEN on agent, ws://HOST:PORT/ws?token=VALUE in client.
Logging via tracing with RUST_LOG control.
CI workflow (fmt, clippy, build) for Linux and Windows.
Systemd unit example for always-on agent.
TUI features
CPU: overall sparkline + per-core history with trend arrows and color thresholds.
Memory/Swap gauges with humanized labels.
Disks panel with per-device usage and icons.
Network download/upload sparklines (KB/s) with peak tracking.
Top processes table (PID, name, CPU%, mem, mem%).
Header with hostname and CPU temperature indicator.
Agent changes
sysinfo 0.36.1 targeted refresh: refresh_cpu_all, refresh_memory, refresh_processes_specifics(ProcessesToUpdate::All, ProcessRefreshKind::new().with_cpu().with_memory(), true).
WebSocket handler: client counting with wake notifications, cold-start handling, proper Response returns.
Sampler uses MissedTickBehavior::Skip to avoid catch-up bursts.
Docs
README updates: running instructions, port configuration, optional token auth, platform notes, example JSON.
Added socktop-agent.service systemd unit.
Platform notes
Linux (AMD/Intel) supported; tested on AMD, targeting Intel next.
Raspberry Pi supported (availability of temps varies by model).
Windows builds/run; CPU temperature may be unavailable (shows N/A).
Known/next
Roadmap includes configurable refresh interval, TUI filtering/sorting, TLS/WSS, and export to file.
Add Context...
README.md
2025-08-08 19:41:32 +00:00
|
|
|
Some(Ok(Message::Text(json))) => serde_json::from_str::<Metrics>(&json).ok(),
|
|
|
|
|
_ => None,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
multiple feature and performance improvements (see description)
Here are concise release notes you can paste into your GitHub release.
Release notes — 2025-08-12
Highlights
Agent back to near-zero CPU when idle (request-driven, no background samplers).
Accurate per-process CPU% via /proc deltas; only top-level processes (threads hidden).
TUI: processes pane gets scrollbar, click-to-sort (CPU% or Mem) with indicator, stable total count.
Network panes made taller; disks slightly reduced.
README revamped: rustup prereqs, crates.io install, update/systemd instructions.
Clippy cleanups across agent and client.
Agent
Reverted precompressed caches and background samplers; WebSocket path is request-driven again.
Ensured on-demand gzip for larger replies; no per-request overhead when small.
Processes: switched to refresh_processes_specifics with ProcessRefreshKind::everything().without_tasks() to exclude threads.
Per-process CPU% now computed from /proc jiffies deltas using a small ProcCpuTracker (fixes “always 0%”/scaling issues).
Optional metrics and light caching:
CPU temp and GPU metrics gated by env (SOCKTOP_AGENT_TEMP=0, SOCKTOP_AGENT_GPU=0).
Tiny TTL caches via once_cell to avoid rescanning sensors every tick.
Dependencies: added once_cell = "1.19".
No API changes to WS endpoints.
Client (TUI)
Processes pane:
Scrollbar (mouse wheel, drag; keyboard arrows/PageUp/PageDown/Home/End).
Click header to sort by CPU% or Mem; dot indicator on active column.
Preserves process_count across fast metrics updates to avoid flicker.
UI/theme:
Shared scrollbar colors moved to ui/theme.rs; both CPU and Processes reuse them.
Cached pane rect to fix input handling; removed unused vars.
Layout: network download/upload get more vertical space; disks shrink slightly.
Clippy fixes: derive Default for ProcSortBy; style/import cleanups.
Docs
README: added rustup install steps (with proper shell reload), install via cargo install socktop and cargo install socktop_agent, and a clear Updating section (systemd service steps included).
Features list updated; roadmap marks independent cadences as done.
Upgrade notes
Agent: cargo install socktop_agent --force, then restart your systemd service; if unit changed, systemctl daemon-reload.
TUI: cargo install socktop --force.
Optional envs to trim overhead: SOCKTOP_AGENT_GPU=0, SOCKTOP_AGENT_TEMP=0.
No config or API breaking changes.
2025-08-12 22:52:46 +00:00
|
|
|
// Send a "get_disks" request and await a JSON Vec<DiskInfo>
|
2025-09-04 12:30:25 +00:00
|
|
|
async fn request_disks(ws: &mut WsStream) -> Option<Vec<DiskInfo>> {
|
multiple feature and performance improvements (see description)
Here are concise release notes you can paste into your GitHub release.
Release notes — 2025-08-12
Highlights
Agent back to near-zero CPU when idle (request-driven, no background samplers).
Accurate per-process CPU% via /proc deltas; only top-level processes (threads hidden).
TUI: processes pane gets scrollbar, click-to-sort (CPU% or Mem) with indicator, stable total count.
Network panes made taller; disks slightly reduced.
README revamped: rustup prereqs, crates.io install, update/systemd instructions.
Clippy cleanups across agent and client.
Agent
Reverted precompressed caches and background samplers; WebSocket path is request-driven again.
Ensured on-demand gzip for larger replies; no per-request overhead when small.
Processes: switched to refresh_processes_specifics with ProcessRefreshKind::everything().without_tasks() to exclude threads.
Per-process CPU% now computed from /proc jiffies deltas using a small ProcCpuTracker (fixes “always 0%”/scaling issues).
Optional metrics and light caching:
CPU temp and GPU metrics gated by env (SOCKTOP_AGENT_TEMP=0, SOCKTOP_AGENT_GPU=0).
Tiny TTL caches via once_cell to avoid rescanning sensors every tick.
Dependencies: added once_cell = "1.19".
No API changes to WS endpoints.
Client (TUI)
Processes pane:
Scrollbar (mouse wheel, drag; keyboard arrows/PageUp/PageDown/Home/End).
Click header to sort by CPU% or Mem; dot indicator on active column.
Preserves process_count across fast metrics updates to avoid flicker.
UI/theme:
Shared scrollbar colors moved to ui/theme.rs; both CPU and Processes reuse them.
Cached pane rect to fix input handling; removed unused vars.
Layout: network download/upload get more vertical space; disks shrink slightly.
Clippy fixes: derive Default for ProcSortBy; style/import cleanups.
Docs
README: added rustup install steps (with proper shell reload), install via cargo install socktop and cargo install socktop_agent, and a clear Updating section (systemd service steps included).
Features list updated; roadmap marks independent cadences as done.
Upgrade notes
Agent: cargo install socktop_agent --force, then restart your systemd service; if unit changed, systemctl daemon-reload.
TUI: cargo install socktop --force.
Optional envs to trim overhead: SOCKTOP_AGENT_GPU=0, SOCKTOP_AGENT_TEMP=0.
No config or API breaking changes.
2025-08-12 22:52:46 +00:00
|
|
|
if ws.send(Message::Text("get_disks".into())).await.is_err() {
|
|
|
|
|
return None;
|
|
|
|
|
}
|
|
|
|
|
match ws.next().await {
|
|
|
|
|
Some(Ok(Message::Binary(b))) => {
|
|
|
|
|
gunzip_to_string(&b).and_then(|s| serde_json::from_str::<Vec<DiskInfo>>(&s).ok())
|
|
|
|
|
}
|
|
|
|
|
Some(Ok(Message::Text(json))) => serde_json::from_str::<Vec<DiskInfo>>(&json).ok(),
|
|
|
|
|
_ => None,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-20 06:24:36 +00:00
|
|
|
// Send a "get_processes" request and await a ProcessesPayload decoded from protobuf (binary, may be gzipped)
|
2025-09-04 12:30:25 +00:00
|
|
|
async fn request_processes(ws: &mut WsStream) -> Option<ProcessesPayload> {
|
multiple feature and performance improvements (see description)
Here are concise release notes you can paste into your GitHub release.
Release notes — 2025-08-12
Highlights
Agent back to near-zero CPU when idle (request-driven, no background samplers).
Accurate per-process CPU% via /proc deltas; only top-level processes (threads hidden).
TUI: processes pane gets scrollbar, click-to-sort (CPU% or Mem) with indicator, stable total count.
Network panes made taller; disks slightly reduced.
README revamped: rustup prereqs, crates.io install, update/systemd instructions.
Clippy cleanups across agent and client.
Agent
Reverted precompressed caches and background samplers; WebSocket path is request-driven again.
Ensured on-demand gzip for larger replies; no per-request overhead when small.
Processes: switched to refresh_processes_specifics with ProcessRefreshKind::everything().without_tasks() to exclude threads.
Per-process CPU% now computed from /proc jiffies deltas using a small ProcCpuTracker (fixes “always 0%”/scaling issues).
Optional metrics and light caching:
CPU temp and GPU metrics gated by env (SOCKTOP_AGENT_TEMP=0, SOCKTOP_AGENT_GPU=0).
Tiny TTL caches via once_cell to avoid rescanning sensors every tick.
Dependencies: added once_cell = "1.19".
No API changes to WS endpoints.
Client (TUI)
Processes pane:
Scrollbar (mouse wheel, drag; keyboard arrows/PageUp/PageDown/Home/End).
Click header to sort by CPU% or Mem; dot indicator on active column.
Preserves process_count across fast metrics updates to avoid flicker.
UI/theme:
Shared scrollbar colors moved to ui/theme.rs; both CPU and Processes reuse them.
Cached pane rect to fix input handling; removed unused vars.
Layout: network download/upload get more vertical space; disks shrink slightly.
Clippy fixes: derive Default for ProcSortBy; style/import cleanups.
Docs
README: added rustup install steps (with proper shell reload), install via cargo install socktop and cargo install socktop_agent, and a clear Updating section (systemd service steps included).
Features list updated; roadmap marks independent cadences as done.
Upgrade notes
Agent: cargo install socktop_agent --force, then restart your systemd service; if unit changed, systemctl daemon-reload.
TUI: cargo install socktop --force.
Optional envs to trim overhead: SOCKTOP_AGENT_GPU=0, SOCKTOP_AGENT_TEMP=0.
No config or API breaking changes.
2025-08-12 22:52:46 +00:00
|
|
|
if ws
|
|
|
|
|
.send(Message::Text("get_processes".into()))
|
|
|
|
|
.await
|
|
|
|
|
.is_err()
|
|
|
|
|
{
|
|
|
|
|
return None;
|
|
|
|
|
}
|
|
|
|
|
match ws.next().await {
|
|
|
|
|
Some(Ok(Message::Binary(b))) => {
|
2025-08-20 06:24:36 +00:00
|
|
|
let gz = is_gzip(&b);
|
|
|
|
|
let data = if gz { gunzip_to_vec(&b)? } else { b };
|
|
|
|
|
match pb::Processes::decode(data.as_slice()) {
|
|
|
|
|
Ok(pb) => {
|
|
|
|
|
let rows: Vec<ProcessInfo> = pb
|
|
|
|
|
.rows
|
|
|
|
|
.into_iter()
|
|
|
|
|
.map(|p: pb::Process| ProcessInfo {
|
|
|
|
|
pid: p.pid,
|
|
|
|
|
name: p.name,
|
|
|
|
|
cpu_usage: p.cpu_usage,
|
|
|
|
|
mem_bytes: p.mem_bytes,
|
|
|
|
|
})
|
|
|
|
|
.collect();
|
|
|
|
|
Some(ProcessesPayload {
|
|
|
|
|
process_count: pb.process_count as usize,
|
|
|
|
|
top_processes: rows,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
Err(e) => {
|
|
|
|
|
if std::env::var("SOCKTOP_DEBUG").ok().as_deref() == Some("1") {
|
|
|
|
|
eprintln!("protobuf decode failed: {e}");
|
multiple feature and performance improvements (see description)
Here are concise release notes you can paste into your GitHub release.
Release notes — 2025-08-12
Highlights
Agent back to near-zero CPU when idle (request-driven, no background samplers).
Accurate per-process CPU% via /proc deltas; only top-level processes (threads hidden).
TUI: processes pane gets scrollbar, click-to-sort (CPU% or Mem) with indicator, stable total count.
Network panes made taller; disks slightly reduced.
README revamped: rustup prereqs, crates.io install, update/systemd instructions.
Clippy cleanups across agent and client.
Agent
Reverted precompressed caches and background samplers; WebSocket path is request-driven again.
Ensured on-demand gzip for larger replies; no per-request overhead when small.
Processes: switched to refresh_processes_specifics with ProcessRefreshKind::everything().without_tasks() to exclude threads.
Per-process CPU% now computed from /proc jiffies deltas using a small ProcCpuTracker (fixes “always 0%”/scaling issues).
Optional metrics and light caching:
CPU temp and GPU metrics gated by env (SOCKTOP_AGENT_TEMP=0, SOCKTOP_AGENT_GPU=0).
Tiny TTL caches via once_cell to avoid rescanning sensors every tick.
Dependencies: added once_cell = "1.19".
No API changes to WS endpoints.
Client (TUI)
Processes pane:
Scrollbar (mouse wheel, drag; keyboard arrows/PageUp/PageDown/Home/End).
Click header to sort by CPU% or Mem; dot indicator on active column.
Preserves process_count across fast metrics updates to avoid flicker.
UI/theme:
Shared scrollbar colors moved to ui/theme.rs; both CPU and Processes reuse them.
Cached pane rect to fix input handling; removed unused vars.
Layout: network download/upload get more vertical space; disks shrink slightly.
Clippy fixes: derive Default for ProcSortBy; style/import cleanups.
Docs
README: added rustup install steps (with proper shell reload), install via cargo install socktop and cargo install socktop_agent, and a clear Updating section (systemd service steps included).
Features list updated; roadmap marks independent cadences as done.
Upgrade notes
Agent: cargo install socktop_agent --force, then restart your systemd service; if unit changed, systemctl daemon-reload.
TUI: cargo install socktop --force.
Optional envs to trim overhead: SOCKTOP_AGENT_GPU=0, SOCKTOP_AGENT_TEMP=0.
No config or API breaking changes.
2025-08-12 22:52:46 +00:00
|
|
|
}
|
2025-08-20 06:24:36 +00:00
|
|
|
// Fallback: maybe it's JSON (bytes already decompressed if gz)
|
|
|
|
|
match String::from_utf8(data) {
|
|
|
|
|
Ok(s) => serde_json::from_str::<ProcessesPayload>(&s).ok(),
|
|
|
|
|
Err(_) => None,
|
multiple feature and performance improvements (see description)
Here are concise release notes you can paste into your GitHub release.
Release notes — 2025-08-12
Highlights
Agent back to near-zero CPU when idle (request-driven, no background samplers).
Accurate per-process CPU% via /proc deltas; only top-level processes (threads hidden).
TUI: processes pane gets scrollbar, click-to-sort (CPU% or Mem) with indicator, stable total count.
Network panes made taller; disks slightly reduced.
README revamped: rustup prereqs, crates.io install, update/systemd instructions.
Clippy cleanups across agent and client.
Agent
Reverted precompressed caches and background samplers; WebSocket path is request-driven again.
Ensured on-demand gzip for larger replies; no per-request overhead when small.
Processes: switched to refresh_processes_specifics with ProcessRefreshKind::everything().without_tasks() to exclude threads.
Per-process CPU% now computed from /proc jiffies deltas using a small ProcCpuTracker (fixes “always 0%”/scaling issues).
Optional metrics and light caching:
CPU temp and GPU metrics gated by env (SOCKTOP_AGENT_TEMP=0, SOCKTOP_AGENT_GPU=0).
Tiny TTL caches via once_cell to avoid rescanning sensors every tick.
Dependencies: added once_cell = "1.19".
No API changes to WS endpoints.
Client (TUI)
Processes pane:
Scrollbar (mouse wheel, drag; keyboard arrows/PageUp/PageDown/Home/End).
Click header to sort by CPU% or Mem; dot indicator on active column.
Preserves process_count across fast metrics updates to avoid flicker.
UI/theme:
Shared scrollbar colors moved to ui/theme.rs; both CPU and Processes reuse them.
Cached pane rect to fix input handling; removed unused vars.
Layout: network download/upload get more vertical space; disks shrink slightly.
Clippy fixes: derive Default for ProcSortBy; style/import cleanups.
Docs
README: added rustup install steps (with proper shell reload), install via cargo install socktop and cargo install socktop_agent, and a clear Updating section (systemd service steps included).
Features list updated; roadmap marks independent cadences as done.
Upgrade notes
Agent: cargo install socktop_agent --force, then restart your systemd service; if unit changed, systemctl daemon-reload.
TUI: cargo install socktop --force.
Optional envs to trim overhead: SOCKTOP_AGENT_GPU=0, SOCKTOP_AGENT_TEMP=0.
No config or API breaking changes.
2025-08-12 22:52:46 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-08-20 06:24:36 +00:00
|
|
|
Some(Ok(Message::Text(json))) => serde_json::from_str::<ProcessesPayload>(&json).ok(),
|
|
|
|
|
_ => None,
|
multiple feature and performance improvements (see description)
Here are concise release notes you can paste into your GitHub release.
Release notes — 2025-08-12
Highlights
Agent back to near-zero CPU when idle (request-driven, no background samplers).
Accurate per-process CPU% via /proc deltas; only top-level processes (threads hidden).
TUI: processes pane gets scrollbar, click-to-sort (CPU% or Mem) with indicator, stable total count.
Network panes made taller; disks slightly reduced.
README revamped: rustup prereqs, crates.io install, update/systemd instructions.
Clippy cleanups across agent and client.
Agent
Reverted precompressed caches and background samplers; WebSocket path is request-driven again.
Ensured on-demand gzip for larger replies; no per-request overhead when small.
Processes: switched to refresh_processes_specifics with ProcessRefreshKind::everything().without_tasks() to exclude threads.
Per-process CPU% now computed from /proc jiffies deltas using a small ProcCpuTracker (fixes “always 0%”/scaling issues).
Optional metrics and light caching:
CPU temp and GPU metrics gated by env (SOCKTOP_AGENT_TEMP=0, SOCKTOP_AGENT_GPU=0).
Tiny TTL caches via once_cell to avoid rescanning sensors every tick.
Dependencies: added once_cell = "1.19".
No API changes to WS endpoints.
Client (TUI)
Processes pane:
Scrollbar (mouse wheel, drag; keyboard arrows/PageUp/PageDown/Home/End).
Click header to sort by CPU% or Mem; dot indicator on active column.
Preserves process_count across fast metrics updates to avoid flicker.
UI/theme:
Shared scrollbar colors moved to ui/theme.rs; both CPU and Processes reuse them.
Cached pane rect to fix input handling; removed unused vars.
Layout: network download/upload get more vertical space; disks shrink slightly.
Clippy fixes: derive Default for ProcSortBy; style/import cleanups.
Docs
README: added rustup install steps (with proper shell reload), install via cargo install socktop and cargo install socktop_agent, and a clear Updating section (systemd service steps included).
Features list updated; roadmap marks independent cadences as done.
Upgrade notes
Agent: cargo install socktop_agent --force, then restart your systemd service; if unit changed, systemctl daemon-reload.
TUI: cargo install socktop --force.
Optional envs to trim overhead: SOCKTOP_AGENT_GPU=0, SOCKTOP_AGENT_TEMP=0.
No config or API breaking changes.
2025-08-12 22:52:46 +00:00
|
|
|
}
|
|
|
|
|
}
|
2025-09-04 12:30:25 +00:00
|
|
|
|
|
|
|
|
// Decompress a gzip-compressed binary frame into a String.
|
|
|
|
|
fn gunzip_to_string(bytes: &[u8]) -> Option<String> {
|
|
|
|
|
let mut dec = GzDecoder::new(bytes);
|
|
|
|
|
let mut out = String::new();
|
|
|
|
|
dec.read_to_string(&mut out).ok()?;
|
|
|
|
|
Some(out)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn gunzip_to_vec(bytes: &[u8]) -> Option<Vec<u8>> {
|
|
|
|
|
let mut dec = GzDecoder::new(bytes);
|
|
|
|
|
let mut out = Vec::new();
|
|
|
|
|
dec.read_to_end(&mut out).ok()?;
|
|
|
|
|
Some(out)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn is_gzip(bytes: &[u8]) -> bool {
|
|
|
|
|
bytes.len() >= 2 && bytes[0] == 0x1f && bytes[1] == 0x8b
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Convenience function to create a connector and connect in one step.
|
|
|
|
|
///
|
|
|
|
|
/// This function is for non-TLS WebSocket connections (`ws://`). Since there's no
|
|
|
|
|
/// certificate involved, hostname verification is not applicable.
|
|
|
|
|
///
|
|
|
|
|
/// For TLS connections with certificate pinning, use `connect_to_socktop_agent_with_tls()`.
|
|
|
|
|
pub async fn connect_to_socktop_agent(
|
|
|
|
|
url: impl Into<String>,
|
|
|
|
|
) -> Result<SocktopConnector, Box<dyn std::error::Error>> {
|
|
|
|
|
let config = ConnectorConfig::new(url);
|
|
|
|
|
let mut connector = SocktopConnector::new(config);
|
|
|
|
|
connector.connect().await?;
|
|
|
|
|
Ok(connector)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Convenience function to create a connector with TLS and connect in one step.
|
|
|
|
|
///
|
|
|
|
|
/// This function enables TLS with certificate pinning using the provided CA certificate.
|
|
|
|
|
/// The `verify_hostname` parameter controls whether the server's hostname is verified
|
|
|
|
|
/// against the certificate (recommended for production, can be disabled for testing).
|
|
|
|
|
#[cfg(feature = "tls")]
|
|
|
|
|
#[cfg_attr(docsrs, doc(cfg(feature = "tls")))]
|
|
|
|
|
pub async fn connect_to_socktop_agent_with_tls(
|
|
|
|
|
url: impl Into<String>,
|
|
|
|
|
ca_path: impl Into<String>,
|
|
|
|
|
verify_hostname: bool,
|
|
|
|
|
) -> Result<SocktopConnector, Box<dyn std::error::Error>> {
|
|
|
|
|
let config = ConnectorConfig::new(url)
|
|
|
|
|
.with_tls_ca(ca_path)
|
|
|
|
|
.with_hostname_verification(verify_hostname);
|
|
|
|
|
let mut connector = SocktopConnector::new(config);
|
|
|
|
|
connector.connect().await?;
|
|
|
|
|
Ok(connector)
|
|
|
|
|
}
|