rusty-ping 0.1.0

A pretty ping/ICMP utility
# 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 <host>
```

Or before installation :

```shell
$ cargo run -- <host>
```

### 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.

### 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