# rusty-ping A replacement for [prettyping](https://github.com/denilsonsa/prettyping). A very simple ping utility that tries to be as visual as possible. Tested on Linux only. ## Install ```shell $ git clone https://source.tube/ache/rusty-ping $ cd rusty-ping $ cargo install --path . ``` You can also clone : - https://git.ache.one/rusty-ping.git - https://codeberg.org/ache/rusty-ping/ ## Usage ```shell $ rusty-ping ``` Or before installation : ```shell $ cargo run -- ``` ### Uninstall ```shell $ cargo uninstall rusty-ping ``` ⚠️ Don't forget to remove any shell integration ! ## Shell integration Rusty-ping doesn't use a config file to keep things as simple as possible. The goal, **for me**, is to type `pp` to quickly do a ping. **I will not call this project** `pp` as it may conflict with other CLI tools. So you should set up a shell alias (e.g., `pp`, `rp`, or any name you prefer) via shell integration. I primarily use Fish, so if anything breaks with `bash` or `zsh`, please send me an email. ### Fish I prefer to use [fish abbreviations](https://fishshell.com/docs/current/cmds/abbr.html). In `$HOME/.config/fish/function/pp.fish` or `$HOME/.config/fish/conf.d/pp.fish` : ```fish abbr --add pp rusty-ping --stats --status --default-target 2606:4700:4700::1111 ``` But a function works too. ```fish function pp rusty-ping --stats --status --default-target 2606:4700:4700::1111 end ``` ### Bash / zsh You can just use a function : ```bash function pp { rusty-ping --stats --legend --status --default-target 2606:4700:4700::1111 } ``` ## "User Interface" Here is the full UI and the explanations : ```shell rusty-ping --stats --status --default-target git.ache.one --legend 0 ▁ 30 ▄ 50 ▆ 70 █ 90 ▂ 120 ▅ 150 █ 170 ▂ 190 ▄ 210 ▆ 240 ? <-- The legend (--legend) PING git.ache.one (145.239.86.0) <-- The status line (--status) ▄▄▄▄▄▄▄▄? <-- The ping line 0/9 (0.0%) | ⌊34⌋ ⌈35⌉ [35] [Δ0]ms <-- Statistics on every packet (--stats) 0/9 (0.0%) | ⌊34⌋ ⌈35⌉ [35] [Δ0]ms <-- Statistics on the last 30 packets (--stats) ``` The legend indicates which characters correspond to which RTT in the ping line. On the ping line, each character represents an ICMP packet sent. `?` => Packet not yet received `!` => Packet lost ### The statistics RTT is expressed in miliseconds. ```plain ┏━> Number of packets lost / Total sent (Percentage of packets lost) │ ┏━> Just a separator 0/9 (0.0%) | ⌊36⌋ ⌈56⌉ [40] [Δ4]ms │ │ │ ┕━> The mean absolute difference │ │ │ to the average RTT │ │ ┕━> The average RTT │ ┕━> The maximum RTT ┕━> The minimum RTT ``` ## Technical Notes Rusty-ping does NOT use the `ping` command. It isn't tied to Bash or any specific shell. ### 🐛 Known "bugs" 🪲 🐞 The list of « bugs » that may be fixed. #### ICMP unprivilegied must be allowed rusty-ping doesn't implement _privilegied ping_. You must have unprivilegied ping allowed (default on Arch Linux, not the default in the Linux kernel). Check with `sysctl` : ```shell $ sysctl net.ipv4.ping_group_range net.ipv4.ping_group_range = 1 0 ``` Change it to 0 to 2147483647 to allow every user to create ICMP_PROTO datagram sockets. ```shell # sysctl net.ipv4.ping_group_range="0 2147483647" # Reset on reboot # echo "net.ipv4.ping_group_range = 0 2147483647" | tee /etc/sysctl.d/99-ping.conf # Make it permanent ``` #### Repetitive UI If there is not enougth lines to print the whole UI, the terminal will scroll and shift the ping line. It will so happen at each ping and the whole UI will be shifted more and more. Some code should detect that there is not enougth lines to print everything and fail. ### Rust dependencies: - `clap` to parse args. - `ping` crate to actually do the ping. - `term_size` to print the legend on a single line. - `tokio` for `mpsc`, the default mpsc queue seems to be deprecated; ### License CeCILL 2.1 - [fr](http://www.cecill.info/licences/Licence_CeCILL_V2.1-fr.html) - [en](http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html)