- Rust 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| src | ||
| Cargo.toml | ||
| Licence_CeCILL_V2.1-en.txt | ||
| Licence_CeCILL_V2.1-fr.txt | ||
| README.md | ||
rusty-ping
A replacement for prettyping.
A very simple ping utility that tries to be as visual as possible.
Tested on Linux only.
Install
$ git clone https://source.tube/ache/rusty-ping
$ cd rusty-ping
$ cargo install --path .
You can also clone :
Usage
$ rusty-ping <host>
Or before installation :
$ cargo run -- <host>
Uninstall
$ 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.
In $HOME/.config/fish/function/pp.fish or $HOME/.config/fish/conf.d/pp.fish :
abbr --add pp rusty-ping --stats --status --default-target 2606:4700:4700::1111
But a function works too.
function pp
rusty-ping --stats --status --default-target 2606:4700:4700::1111
end
Bash / zsh
You can just use a function :
function pp {
rusty-ping --stats --legend --status --default-target 2606:4700:4700::1111
}
"User Interface"
Here is the full UI and the explanations :
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.
┏━> 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 :
$ 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.
# 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:
clapto parse args.pingcrate to actually do the ping.term_sizeto print the legend on a single line.tokioformpsc, the default mpsc queue seems to be deprecated;
License
CeCILL 2.1