From fac09b381fcfea4f1072490a7cf91682d1557067 Mon Sep 17 00:00:00 2001 From: jasonwitty Date: Fri, 8 Aug 2025 01:03:35 -0700 Subject: [PATCH] initial checkin --- .gitignore | 1 + Cargo.lock | 2102 ++++++++++++++++++++++++++++++++++++ Cargo.toml | 35 + README.md | 86 ++ socktop-screenshot.png | Bin 0 -> 154305 bytes socktop/Cargo.toml | 20 + socktop/src/main.rs | 537 +++++++++ socktop_agent/Cargo.toml | 15 + socktop_agent/src/main.rs | 217 ++++ socktop_agent/src/proto.rs | 32 + 10 files changed, 3045 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 socktop-screenshot.png create mode 100644 socktop/Cargo.toml create mode 100644 socktop/src/main.rs create mode 100644 socktop_agent/Cargo.toml create mode 100644 socktop_agent/src/main.rs create mode 100644 socktop_agent/src/proto.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..a7205ab --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2102 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "axum-macros", + "base64", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cassowary" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" + +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + +[[package]] +name = "cc" +version = "1.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "compact_str" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crossterm" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" +dependencies = [ + "bitflags", + "crossterm_winapi", + "libc", + "mio 0.8.11", + "parking_lot", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" +dependencies = [ + "bitflags", + "crossterm_winapi", + "mio 1.0.4", + "parking_lot", + "rustix", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "hashbrown" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", +] + +[[package]] +name = "hyper-util" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "hyper", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indoc" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" + +[[package]] +name = "instability" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" +dependencies = [ + "darling", + "indoc", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "io-uring" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.174" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.59.0", +] + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +dependencies = [ + "bitflags", +] + +[[package]] +name = "objc2-io-kit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a" +dependencies = [ + "libc", + "objc2-core-foundation", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "ratatui" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdef7f9be5c0122f890d58bdf4d964349ba6a6161f705907526d891efabba57d" +dependencies = [ + "bitflags", + "cassowary", + "compact_str", + "crossterm 0.28.1", + "instability", + "itertools", + "lru", + "paste", + "strum", + "strum_macros", + "unicode-segmentation", + "unicode-truncate", + "unicode-width", +] + +[[package]] +name = "redox_syscall" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.142" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +dependencies = [ + "libc", + "mio 0.8.11", + "mio 1.0.4", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "socktop" +version = "0.1.0" +dependencies = [ + "anyhow", + "chrono", + "crossterm 0.27.0", + "futures", + "futures-util", + "ratatui", + "serde", + "serde_json", + "tokio", + "tokio-tungstenite", + "tungstenite", + "url", +] + +[[package]] +name = "socktop_agent" +version = "0.1.0" +dependencies = [ + "axum", + "futures", + "futures-util", + "serde", + "serde_json", + "sysinfo", + "tokio", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sysinfo" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d" +dependencies = [ + "libc", + "memchr", + "ntapi", + "objc2-core-foundation", + "objc2-io-kit", + "windows", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +dependencies = [ + "backtrace", + "bytes", + "io-uring", + "libc", + "mio 1.0.4", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "slab", + "socket2", + "tokio-macros", + "windows-sys 0.59.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand", + "sha1", + "thiserror", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-truncate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" +dependencies = [ + "itertools", + "unicode-segmentation", + "unicode-width", +] + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-link", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..31bc777 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,35 @@ +[workspace] +members = [ + "socktop", + "socktop_agent" +] + +[workspace.dependencies] +# async + streams +tokio = { version = "1", features = ["full"] } +futures = "0.3" +futures-util = "0.3" +anyhow = "1.0" + +# websocket +tokio-tungstenite = "0.24" +tungstenite = "0.24" +url = "2.5" + +# JSON + error handling +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +thiserror = "1.0" + +# system stats +sysinfo = "0.32" + +# CLI UI +ratatui = "0.28" +crossterm = "0.27" + +# date/time +chrono = { version = "0.4", features = ["serde"] } + +# web server (remote-agent) +axum = { version = "0.7", features = ["ws"] } diff --git a/README.md b/README.md new file mode 100644 index 0000000..1b6e1a5 --- /dev/null +++ b/README.md @@ -0,0 +1,86 @@ +# btop-remote (Rust) + +A remote `btop`-style terminal UI to monitor system metrics over WebSockets, written in Rust. + +## ๐Ÿ“ฆ Build + +```bash +cargo build --release +``` + +--- + +## ๐Ÿš€ Run the Agent (on the remote host) + +The agent collects system metrics and exposes them via WebSocket. + +### ๐Ÿ”ง `sh` / `bash` example: + +```sh +export AGENT_LISTEN=0.0.0.0:8765 +export AGENT_TOKEN=mysharedsecret # optional, for authentication + +./target/release/remote-agent +``` + +### ๐ŸŸ `fish` shell example: + +```fish +set -x AGENT_LISTEN 0.0.0.0:8765 +set -x AGENT_TOKEN mysharedsecret # optional + +./target/release/remote-agent +``` + +--- + +## ๐Ÿ–ฅ๏ธ Run the TUI (on the local machine) + +Connect to the remote agent over WebSocket: + +```bash +./target/release/btop-remote ws://:8765/ws mysharedsecret +``` + +- Replace `` with your remote agent's IP address. +- Press `q` to quit. + +--- + +## ๐Ÿ” Authentication (optional) + +If `AGENT_TOKEN` is set on the agent, the TUI **must** provide it as the second argument. +If no token is set, authentication is disabled. + +--- + +## ๐Ÿงช Example + +```bash +# On remote machine: +export AGENT_LISTEN=0.0.0.0:8765 +export AGENT_TOKEN=secret123 +./target/release/remote-agent + +# On local machine: +./target/release/btop-remote ws://192.168.1.100:8765/ws secret123 +``` + +--- + +## ๐Ÿ›  Dependencies + +- Rust (2021 edition or later) +- WebSocket-compatible network (agent port must be accessible remotely) + +--- + +## ๐Ÿงน Cleanup Build Artifacts + +```bash +cargo clean +``` + +--- + +MIT License. diff --git a/socktop-screenshot.png b/socktop-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..de157c0cf35a8e7b62b5ef15d0c3cf99342e4f25 GIT binary patch literal 154305 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 literal 0 HcmV?d00001 diff --git a/socktop/Cargo.toml b/socktop/Cargo.toml new file mode 100644 index 0000000..167cf61 --- /dev/null +++ b/socktop/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "socktop" +version = "0.1.0" +authors = ["Jason Witty "] +description = "Remote system monitor over WebSocket, TUI like top" +edition = "2021" + +[dependencies] +tokio = { workspace = true } +tokio-tungstenite = { workspace = true } +tungstenite = { workspace = true } +futures = { workspace = true } +futures-util = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +url = { workspace = true } +ratatui = { workspace = true } +crossterm = { workspace = true } +chrono = { workspace = true } +anyhow = { workspace = true } diff --git a/socktop/src/main.rs b/socktop/src/main.rs new file mode 100644 index 0000000..e77d479 --- /dev/null +++ b/socktop/src/main.rs @@ -0,0 +1,537 @@ +use std::{collections::VecDeque, env, error::Error, io, time::{Duration, Instant}}; + +use crossterm::{ + event::{self, Event, KeyCode}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, +}; +use futures_util::{SinkExt, StreamExt}; +use ratatui::{ + backend::CrosstermBackend, + layout::{Constraint, Direction, Layout, Rect}, + style::{Color, Style}, + widgets::{Block, Borders, Gauge, Row, Sparkline, Table, Cell}, + Terminal, + text::{Line, Span}, +}; + +use ratatui::style::{Modifier}; + +use serde::Deserialize; +use tokio::time::sleep; +use tokio_tungstenite::{connect_async, tungstenite::Message}; + + +#[derive(Debug, Deserialize, Clone)] +struct Disk { name: String, total: u64, available: u64 } +#[derive(Debug, Deserialize, Clone)] +struct Network { received: u64, transmitted: u64 } +#[derive(Debug, Deserialize, Clone)] +struct ProcessInfo { + pid: i32, + name: String, + cpu_usage: f32, + mem_bytes: u64, +} + +#[derive(Debug, Deserialize, Clone)] +struct Metrics { + cpu_total: f32, + cpu_per_core: Vec, + mem_total: u64, + mem_used: u64, + swap_total: u64, + swap_used: u64, + process_count: usize, + hostname: String, + cpu_temp_c: Option, + disks: Vec, + networks: Vec, + top_processes: Vec, +} + +#[tokio::main] +async fn main() -> Result<(), Box> { + let args: Vec = env::args().collect(); + if args.len() < 2 { + eprintln!("Usage: {} ws://HOST:PORT/ws", args[0]); + std::process::exit(1); + } + let url = &args[1]; + let (mut ws, _) = connect_async(url).await?; + + // Terminal + enable_raw_mode()?; + let mut stdout = io::stdout(); + execute!(stdout, EnterAlternateScreen)?; + let backend = CrosstermBackend::new(stdout); + let mut terminal = Terminal::new(backend)?; + terminal.clear()?; + + // State + let mut last_metrics: Option = None; + let mut cpu_hist: VecDeque = VecDeque::with_capacity(600); + + let mut per_core_hist: Vec> = Vec::new(); // one deque per core + const CORE_HISTORY: usize = 60; // ~30s if you tick every 500ms + + // Network: keep totals across ALL ifaces + timestamp + let mut last_net_totals: Option<(u64, u64, Instant)> = None; + let mut rx_hist: VecDeque = VecDeque::with_capacity(600); + let mut tx_hist: VecDeque = VecDeque::with_capacity(600); + let mut rx_peak: u64 = 0; + let mut tx_peak: u64 = 0; + + let mut should_quit = false; + + loop { + while event::poll(Duration::from_millis(10))? { + if let Event::Key(k) = event::read()? { + if matches!(k.code, KeyCode::Char('q') | KeyCode::Char('Q') | KeyCode::Esc) { + should_quit = true; + } + } + } + if should_quit { break; } + + ws.send(Message::Text("get_metrics".into())).await.ok(); + + if let Some(Ok(Message::Text(json))) = ws.next().await { + if let Ok(m) = serde_json::from_str::(&json) { + // CPU history + let v = m.cpu_total.clamp(0.0, 100.0).round() as u64; + push_capped(&mut cpu_hist, v, 600); + + // NET: sum across all ifaces, compute KB/s via elapsed time + let now = Instant::now(); + let rx_total = m.networks.iter().map(|n| n.received).sum::(); + let tx_total = m.networks.iter().map(|n| n.transmitted).sum::(); + let (rx_kb, tx_kb) = if let Some((prx, ptx, pts)) = last_net_totals { + let dt = now.duration_since(pts).as_secs_f64().max(1e-6); + let rx = ((rx_total.saturating_sub(prx)) as f64 / dt / 1024.0).round() as u64; + let tx = ((tx_total.saturating_sub(ptx)) as f64 / dt / 1024.0).round() as u64; + (rx, tx) + } else { (0, 0) }; + last_net_totals = Some((rx_total, tx_total, now)); + push_capped(&mut rx_hist, rx_kb, 600); + push_capped(&mut tx_hist, tx_kb, 600); + rx_peak = rx_peak.max(rx_kb); + tx_peak = tx_peak.max(tx_kb); + + if let Some(m) = last_metrics.as_ref() { + // resize history buffers if core count changes + if per_core_hist.len() != m.cpu_per_core.len() { + per_core_hist = (0..m.cpu_per_core.len()) + .map(|_| VecDeque::with_capacity(CORE_HISTORY)) + .collect(); + } + } + // push latest per-core samples + if let Some(m) = last_metrics.as_ref() { + for (i, v) in m.cpu_per_core.iter().enumerate() { + let v = v.clamp(0.0, 100.0).round() as u16; + push_capped(&mut per_core_hist[i], v, CORE_HISTORY); + } + } + + last_metrics = Some(m); + } + } + + terminal.draw(|f| { + let area = f.area(); + + let rows = Layout::default() + .direction(Direction::Vertical) + .constraints([ + Constraint::Length(1), + Constraint::Ratio(1, 3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Min(10), + ]) + .split(area); + + draw_header(f, rows[0], last_metrics.as_ref()); + + let top = Layout::default() + .direction(Direction::Horizontal) + .constraints([Constraint::Percentage(66), Constraint::Percentage(34)]) + .split(rows[1]); + + draw_cpu_avg_graph(f, top[0], &cpu_hist, last_metrics.as_ref()); + draw_per_core_bars(f, top[1], last_metrics.as_ref(), &per_core_hist); + + draw_mem(f, rows[2], last_metrics.as_ref()); + draw_swap(f, rows[3], last_metrics.as_ref()); + + let bottom = Layout::default() + .direction(Direction::Horizontal) + .constraints([Constraint::Percentage(66), Constraint::Percentage(34)]) + .split(rows[4]); + + let left_stack = Layout::default() + .direction(Direction::Vertical) + .constraints([Constraint::Min(6), Constraint::Length(4), Constraint::Length(4)]) + .split(bottom[0]); + + draw_disks(f, left_stack[0], last_metrics.as_ref()); + draw_net_spark( + f, + left_stack[1], + &format!("Download (KB/s) โ€” now: {} | peak: {}", rx_hist.back().copied().unwrap_or(0), rx_peak), + &rx_hist, + Color::Green, + ); + draw_net_spark( + f, + left_stack[2], + &format!("Upload (KB/s) โ€” now: {} | peak: {}", tx_hist.back().copied().unwrap_or(0), tx_peak), + &tx_hist, + Color::Blue, + ); + + draw_top_processes(f, bottom[1], last_metrics.as_ref()); + })?; + + sleep(Duration::from_millis(500)).await; + } + + disable_raw_mode()?; + let backend = terminal.backend_mut(); + execute!(backend, LeaveAlternateScreen)?; + terminal.show_cursor()?; + Ok(()) +} + +fn push_capped(dq: &mut VecDeque, v: T, cap: usize) { + if dq.len() == cap { dq.pop_front(); } + dq.push_back(v); +} + +fn human(b: u64) -> String { + const K: f64 = 1024.0; + let b = b as f64; + if b < K { return format!("{b:.0}B"); } + let kb = b / K; + if kb < K { return format!("{kb:.1}KB"); } + let mb = kb / K; + if mb < K { return format!("{mb:.1}MB"); } + let gb = mb / K; + if gb < K { return format!("{gb:.1}GB"); } + let tb = gb / K; + format!("{tb:.2}TB") +} + +fn draw_header(f: &mut ratatui::Frame<'_>, area: Rect, m: Option<&Metrics>) { + let title = if let Some(mm) = m { + let temp = mm.cpu_temp_c.map(|t| { + let icon = if t < 50.0 { "๐Ÿ˜Ž" } else if t < 85.0 { "โš ๏ธ" } else { "๐Ÿ”ฅ" }; + format!("CPU Temp: {:.1}ยฐC {}", t, icon) + }).unwrap_or_else(|| "CPU Temp: N/A".into()); + format!("socktop โ€” host: {} | {} (press 'q' to quit)", mm.hostname, temp) + } else { + "socktop โ€” connecting... (press 'q' to quit)".into() + }; + f.render_widget(Block::default().title(title).borders(Borders::BOTTOM), area); +} + +fn draw_cpu_avg_graph( + f: &mut ratatui::Frame<'_>, + area: Rect, + hist: &VecDeque, + m: Option<&Metrics>, +) { + let title = if let Some(mm) = m { format!("CPU avg (now: {:>5.1}%)", mm.cpu_total) } else { "CPU avg".into() }; + let max_points = area.width.saturating_sub(2) as usize; + let start = hist.len().saturating_sub(max_points); + let data: Vec = hist.iter().skip(start).cloned().collect(); + let spark = Sparkline::default() + .block(Block::default().borders(Borders::ALL).title(title)) + .data(&data) + .max(100) + .style(Style::default().fg(Color::Cyan)); + f.render_widget(spark, area); +} + +fn draw_per_core_bars( + f: &mut ratatui::Frame<'_>, + area: Rect, + m: Option<&Metrics>, + // ๐Ÿ‘‡ add this param + per_core_hist: &Vec>, +) { + // frame + f.render_widget(Block::default().borders(Borders::ALL).title("Per-core"), area); + let Some(mm) = m else { return; }; + + let inner = Rect { x: area.x + 1, y: area.y + 1, width: area.width.saturating_sub(2), height: area.height.saturating_sub(2) }; + if inner.height == 0 { return; } + + // one row per core + let rows = inner.height as usize; + let show_n = rows.min(mm.cpu_per_core.len()); + let constraints: Vec = (0..show_n).map(|_| Constraint::Length(1)).collect(); + let vchunks = Layout::default().direction(Direction::Vertical).constraints(constraints).split(inner); + + for i in 0..show_n { + let rect = vchunks[i]; + + // split each row: sparkline (history) | stat text + let hchunks = Layout::default() + .direction(Direction::Horizontal) + .constraints([Constraint::Min(6), Constraint::Length(12)]) // was 10 โ†’ now 12 + .split(rect); + + let curr = mm.cpu_per_core[i].clamp(0.0, 100.0); + let older = per_core_hist.get(i) + .and_then(|d| d.iter().rev().nth(20).copied()) // ~10s back + .map(|v| v as f32) + .unwrap_or(curr); + let trend = if curr > older + 0.2 { "โ†‘" } + else if curr + 0.2 < older { "โ†“" } + else { "โ•Œ" }; + + // colors by current load + let fg = match curr { + x if x < 25.0 => Color::Green, + x if x < 60.0 => Color::Yellow, + _ => Color::Red, + }; + + // history + let hist: Vec = per_core_hist + .get(i) + .map(|d| { + let max_points = hchunks[0].width as usize; + let start = d.len().saturating_sub(max_points); + d.iter().skip(start).map(|&v| v as u64).collect() + }) + .unwrap_or_default(); + + // sparkline + let spark = Sparkline::default() + .data(&hist) + .max(100) + .style(Style::default().fg(fg)); + f.render_widget(spark, hchunks[0]); // โœ… render_widget on rect + + // right stat โ€œcpuN 37.2% โ†‘โ€ + let label = format!("cpu{:<2}{}{:>5.1}%", i, trend, curr); + let line = Line::from(Span::styled(label, Style::default().fg(fg).add_modifier(Modifier::BOLD))); + let block = Block::default(); // no borders per row to keep it clean + f.render_widget(block, hchunks[1]); + f.render_widget(ratatui::widgets::Paragraph::new(line).right_aligned(), hchunks[1]); + } +} + +fn draw_mem(f: &mut ratatui::Frame<'_>, area: Rect, m: Option<&Metrics>) { + let (used, total, pct) = if let Some(mm) = m { + let pct = if mm.mem_total > 0 { (mm.mem_used as f64 / mm.mem_total as f64 * 100.0) as u16 } else { 0 }; + (mm.mem_used, mm.mem_total, pct) + } else { (0, 0, 0) }; + + let g = Gauge::default() + .block(Block::default().borders(Borders::ALL).title("Memory")) + .gauge_style(Style::default().fg(Color::Magenta)) + .percent(pct) + .label(format!("{} / {}", human(used), human(total))); + f.render_widget(g, area); +} + +fn draw_swap(f: &mut ratatui::Frame<'_>, area: Rect, m: Option<&Metrics>) { + let (used, total, pct) = if let Some(mm) = m { + let pct = if mm.swap_total > 0 { (mm.swap_used as f64 / mm.swap_total as f64 * 100.0) as u16 } else { 0 }; + (mm.swap_used, mm.swap_total, pct) + } else { (0, 0, 0) }; + + let g = Gauge::default() + .block(Block::default().borders(Borders::ALL).title("Swap")) + .gauge_style(Style::default().fg(Color::Yellow)) + .percent(pct) + .label(format!("{} / {}", human(used), human(total))); + f.render_widget(g, area); +} + +fn draw_disks(f: &mut ratatui::Frame<'_>, area: Rect, m: Option<&Metrics>) { + // Panel frame + f.render_widget(Block::default().borders(Borders::ALL).title("Disks"), area); + + let Some(mm) = m else { return; }; + + // Inner area inside the "Disks" panel + let inner = Rect { + x: area.x + 1, + y: area.y + 1, + width: area.width.saturating_sub(2), + height: area.height.saturating_sub(2), + }; + if inner.height < 3 { return; } + + // Each disk gets a 3-row card: [title line] + [gauge line] + [spacer] + // If we run out of height, we show as many as we can. + let per_disk_h = 3u16; + let max_cards = (inner.height / per_disk_h).min(mm.disks.len() as u16) as usize; + + // Build rows layout (Length(3) per disk) + let constraints: Vec = (0..max_cards).map(|_| Constraint::Length(per_disk_h)).collect(); + let rows = Layout::default() + .direction(Direction::Vertical) + .constraints(constraints) + .split(inner); + + for (i, slot) in rows.iter().enumerate() { + let d = &mm.disks[i]; + let used = d.total.saturating_sub(d.available); + let ratio = if d.total > 0 { used as f64 / d.total as f64 } else { 0.0 }; + let pct = (ratio * 100.0).round() as u16; + + // Color by severity + let color = if pct < 70 { Color::Green } else if pct < 90 { Color::Yellow } else { Color::Red }; + + // 1) Title line (name left, usage right), inside its own little block + let title = format!( + "{} {} {} / {} ({}%)", + disk_icon(&d.name), + truncate_middle(&d.name, (slot.width.saturating_sub(6)) as usize / 2), + human(used), + human(d.total), + pct + ); + + // Card frame (thin border per disk) + let card = Block::default().borders(Borders::ALL).title(title); + + // Render card covering the whole 3-row slot + f.render_widget(card, *slot); + + // 2) Gauge on the second line inside the card + // Compute an inner rect (strip card borders), then pick the middle line for the bar + let inner_card = Rect { + x: slot.x + 1, + y: slot.y + 1, + width: slot.width.saturating_sub(2), + height: slot.height.saturating_sub(2), + }; + if inner_card.height == 0 { continue; } + + // Center line for the gauge + let gauge_rect = Rect { + x: inner_card.x, + y: inner_card.y + inner_card.height / 2, // 1 line down inside the card + width: inner_card.width, + height: 1, + }; + + let g = Gauge::default() + .percent(pct) + .gauge_style(Style::default().fg(color)); + + f.render_widget(g, gauge_rect); + } +} + +fn disk_icon(name: &str) -> &'static str { + let n = name.to_ascii_lowercase(); + if n.contains(":") { "๐Ÿ—„๏ธ" } // network mount + else if n.contains("nvme") { "โšก" } // nvme + else if n.starts_with("sd") { "๐Ÿ’ฝ" } // sata + else if n.contains("overlay") { "๐Ÿ“ฆ" } // containers/overlayfs + else { "๐Ÿ–ด" } // generic drive +} + +// Optional helper to keep device names tidy in the title +fn truncate_middle(s: &str, max: usize) -> String { + if s.len() <= max { return s.to_string(); } + if max <= 3 { return "...".into(); } + let keep = max - 3; + let left = keep / 2; + let right = keep - left; + format!("{}...{}", &s[..left], &s[s.len()-right..]) +} + + +fn draw_net_spark( + f: &mut ratatui::Frame<'_>, + area: Rect, + title: &str, + hist: &VecDeque, + color: Color, +) { + let max_points = area.width.saturating_sub(2) as usize; + let start = hist.len().saturating_sub(max_points); + let data: Vec = hist.iter().skip(start).cloned().collect(); + + let spark = Sparkline::default() + .block(Block::default().borders(Borders::ALL).title(title.to_string())) + .data(&data) + .style(Style::default().fg(color)); + f.render_widget(spark, area); +} + +fn draw_top_processes(f: &mut ratatui::Frame<'_>, area: Rect, m: Option<&Metrics>) { + let Some(mm) = m else { + f.render_widget(Block::default().borders(Borders::ALL).title("Top Processes"), area); + return; + }; + + let total_mem_bytes = mm.mem_total.max(1); // avoid div-by-zero + let title = format!("Top Processes ({} total)", mm.process_count); + + // Precompute peak CPU to highlight the hog + let peak_cpu = mm.top_processes.iter().map(|p| p.cpu_usage).fold(0.0_f32, f32::max); + + // Build rows with per-cell coloring + zebra striping + let rows: Vec = mm.top_processes.iter().enumerate().map(|(i, p)| { + let mem_pct = (p.mem_bytes as f64 / total_mem_bytes as f64) * 100.0; + + // Color helpers + let cpu_fg = match p.cpu_usage { + x if x < 25.0 => Color::Green, + x if x < 60.0 => Color::Yellow, + _ => Color::Red, + }; + let mem_fg = match mem_pct { + x if x < 5.0 => Color::Blue, + x if x < 20.0 => Color::Magenta, + _ => Color::Red, + }; + + // Light zebra striping (only foreground shift to avoid loud backgrounds) + let zebra = if i % 2 == 0 { Style::default().fg(Color::Gray) } else { Style::default() }; + + // Emphasize the single top CPU row + let emphasis = if (p.cpu_usage - peak_cpu).abs() < f32::EPSILON { + Style::default().add_modifier(Modifier::BOLD) + } else { Style::default() }; + + Row::new(vec![ + Cell::from(p.pid.to_string()).style(Style::default().fg(Color::DarkGray)), + Cell::from(p.name.clone()), + Cell::from(format!("{:.1}%", p.cpu_usage)).style(Style::default().fg(cpu_fg)), + Cell::from(human(p.mem_bytes)), + Cell::from(format!("{:.2}%", mem_pct)).style(Style::default().fg(mem_fg)), + ]) + .style(zebra.patch(emphasis)) + }).collect(); + + let header = Row::new(vec!["PID", "Name", "CPU %", "Mem", "Mem %"]) + .style(Style::default().fg(Color::Cyan).add_modifier(Modifier::BOLD)); + + let table = Table::new( + rows, + vec![ + Constraint::Length(8), // PID + Constraint::Percentage(40), // Name + Constraint::Length(8), // CPU % + Constraint::Length(12), // Mem + Constraint::Length(8), // Mem % + ], + ) + .header(header) + .column_spacing(1) + .block(Block::default().borders(Borders::ALL).title(title)); + + f.render_widget(table, area); +} + diff --git a/socktop_agent/Cargo.toml b/socktop_agent/Cargo.toml new file mode 100644 index 0000000..752ea65 --- /dev/null +++ b/socktop_agent/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "socktop_agent" +version = "0.1.0" +authors = ["Jason Witty "] +description = "Remote system monitor over WebSocket, TUI like top" +edition = "2021" + +[dependencies] +tokio = { version = "1", features = ["full"] } +axum = { version = "0.7", features = ["ws", "macros"] } +sysinfo = "0.36.1" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +futures = "0.3" +futures-util = "0.3.31" \ No newline at end of file diff --git a/socktop_agent/src/main.rs b/socktop_agent/src/main.rs new file mode 100644 index 0000000..bf49448 --- /dev/null +++ b/socktop_agent/src/main.rs @@ -0,0 +1,217 @@ +use axum::{ + extract::{ + ws::{Message, WebSocket, WebSocketUpgrade}, + State, + }, + response::IntoResponse, + routing::get, + Router, +}; +use futures_util::stream::StreamExt; +use serde::Serialize; +use std::{collections::HashMap, net::SocketAddr, sync::Arc}; +use sysinfo::{ + Components, CpuRefreshKind, Disks, MemoryRefreshKind, Networks, ProcessRefreshKind, RefreshKind, + System, +}; +use tokio::sync::Mutex; + +// ---------- Data types sent to the client ---------- + +#[derive(Debug, Serialize, Clone)] +struct ProcessInfo { + pid: u32, + name: String, + cpu_usage: f32, + mem_bytes: u64, +} + +#[derive(Debug, Serialize, Clone)] +struct DiskInfo { + name: String, + total: u64, + available: u64, +} + +#[derive(Debug, Serialize, Clone)] +struct NetworkInfo { + name: String, + // cumulative totals since the agent started (client should diff to get rates) + received: u64, + transmitted: u64, +} + +#[derive(Debug, Serialize, Clone)] +struct Metrics { + cpu_total: f32, + cpu_per_core: Vec, + mem_total: u64, + mem_used: u64, + swap_total: u64, + swap_used: u64, + process_count: usize, + hostname: String, + cpu_temp_c: Option, + disks: Vec, + networks: Vec, + top_processes: Vec, +} + +// ---------- Shared state ---------- + +type SharedSystem = Arc>; +type SharedNetworks = Arc>; +type SharedTotals = Arc>>; // iface -> (rx_total, tx_total) + +#[derive(Clone)] +struct AppState { + sys: SharedSystem, + nets: SharedNetworks, + net_totals: SharedTotals, +} + +#[tokio::main] +async fn main() { + // sysinfo 0.36: build specifics + let refresh_kind = RefreshKind::nothing() + .with_cpu(CpuRefreshKind::everything()) + .with_memory(MemoryRefreshKind::everything()) + .with_processes(ProcessRefreshKind::everything()); + + let mut sys = System::new_with_specifics(refresh_kind); + sys.refresh_all(); + + // Keep Networks alive across requests so received()/transmitted() deltas work + let mut nets = Networks::new(); + nets.refresh(true); + + let shared = Arc::new(Mutex::new(sys)); + let shared_nets = Arc::new(Mutex::new(nets)); + let net_totals: SharedTotals = Arc::new(Mutex::new(HashMap::new())); + + let app = Router::new() + .route("/ws", get(ws_handler)) + .with_state(AppState { + sys: shared, + nets: shared_nets, + net_totals, + }); + + let addr = SocketAddr::from(([0, 0, 0, 0], 3000)); + println!("Remote agent running at http://{}", addr); + + let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); + axum::serve(listener, app).await.unwrap(); +} + +async fn ws_handler(ws: WebSocketUpgrade, State(state): State) -> impl IntoResponse { + ws.on_upgrade(move |socket| handle_socket(socket, state)) +} + +async fn handle_socket(mut socket: WebSocket, state: AppState) { + while let Some(Ok(msg)) = socket.next().await { + if let Message::Text(text) = msg { + if text == "get_metrics" { + let metrics = collect_metrics(&state).await; + let json = serde_json::to_string(&metrics).unwrap(); + let _ = socket.send(Message::Text(json)).await; + } + } + } +} + +// ---------- Metrics collection ---------- + +async fn collect_metrics(state: &AppState) -> Metrics { + // System (CPU/mem/proc) + let mut sys = state.sys.lock().await; + sys.refresh_all(); + + let hostname = System::host_name().unwrap_or_else(|| "unknown".into()); + + // Temps via Components (separate handle in 0.36) + let mut components = Components::new(); + components.refresh(true); + let cpu_temp_c = best_cpu_temp(&components); + + // Disks (separate handle in 0.36) + let mut disks_struct = Disks::new(); + disks_struct.refresh(true); + // Filter anything with available == 0 (e.g., overlay) + let disks: Vec = disks_struct + .list() + .iter() + .filter(|d| d.available_space() > 0) + .map(|d| DiskInfo { + name: d.name().to_string_lossy().to_string(), + total: d.total_space(), + available: d.available_space(), + }) + .collect(); + + // Networks: use a persistent Networks + rolling totals + let mut nets = state.nets.lock().await; + nets.refresh(true); + + let mut totals = state.net_totals.lock().await; + let mut networks: Vec = Vec::new(); + + for (name, data) in nets.iter() { + // sysinfo 0.36: data.received()/transmitted() are deltas since *last* refresh + let delta_rx = data.received(); + let delta_tx = data.transmitted(); + + let entry = totals.entry(name.clone()).or_insert((0, 0)); + entry.0 = entry.0.saturating_add(delta_rx); + entry.1 = entry.1.saturating_add(delta_tx); + + networks.push(NetworkInfo { + name: name.clone(), + received: entry.0, + transmitted: entry.1, + }); + } + + // get number of cpu cores + let n_cpus = sys.cpus().len().max(1) as f32; + + // Top processes: include PID and memory, top 20 by CPU + let mut top_processes: Vec = sys + .processes() + .values() + .map(|p| ProcessInfo { + pid: p.pid().as_u32(), + name: p.name().to_string_lossy().to_string(), + cpu_usage: (p.cpu_usage() / n_cpus).min(100.0), + mem_bytes: p.memory(), // sysinfo 0.36: bytes + }) + .collect(); + top_processes.sort_by(|a, b| b.cpu_usage.partial_cmp(&a.cpu_usage).unwrap()); + top_processes.truncate(20); + + Metrics { + cpu_total: sys.global_cpu_usage(), + cpu_per_core: sys.cpus().iter().map(|c| c.cpu_usage()).collect(), + mem_total: sys.total_memory(), + mem_used: sys.used_memory(), + swap_total: sys.total_swap(), + swap_used: sys.used_swap(), + process_count: sys.processes().len(), + hostname, + cpu_temp_c, + disks, + networks, + top_processes, + } +} + +fn best_cpu_temp(components: &Components) -> Option { + components + .iter() + .filter(|c| { + let label = c.label().to_lowercase(); + label.contains("cpu") || label.contains("package") || label.contains("tctl") || label.contains("tdie") + }) + .filter_map(|c| c.temperature()) + .max_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal)) +} diff --git a/socktop_agent/src/proto.rs b/socktop_agent/src/proto.rs new file mode 100644 index 0000000..3ff466f --- /dev/null +++ b/socktop_agent/src/proto.rs @@ -0,0 +1,32 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Metrics { + pub ts_unix_ms: i64, + pub host: String, + pub uptime_secs: u64, + pub cpu_overall: f32, + pub cpu_per_core: Vec, + pub load_avg: (f64, f64, f64), + pub mem_total_mb: u64, + pub mem_used_mb: u64, + pub swap_total_mb: u64, + pub swap_used_mb: u64, + pub net_aggregate: NetTotals, + pub top_processes: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct NetTotals { + pub rx_bytes: u64, + pub tx_bytes: u64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Proc { + pub pid: i32, + pub name: String, + pub cpu: f32, + pub mem_mb: u64, + pub status: String, +} \ No newline at end of file