0.12.0

vectordotdev/vector0.12.0Dec 4, 2024by github-actions[bot]

AI Summary

This major release introduces a new TUI information bar, internationalization (i18n) support, and new columns for loss heuristics, along with new Debian and Ubuntu packages.

Key Highlights

  • New TUI information bar at the bottom of the screen displaying configurable settings
  • Enhanced sample history chart to highlight missing probes in red
  • Dynamic hop privacy settings via new `expand-privacy` and `contract-privacy` commands
  • Three new columns for forward and backward loss heuristics

Breaking Changes

  • Deprecated `toggle-privacy` command in favor of `expand-privacy` and `contract-privacy`
  • Repurposed `tui-privacy-max-ttl` meaning; value of 0 now hides source instead of no hops
  • Updated default value for `tui-privacy-max-ttl` (if not set, nothing is hidden)

New Features

  • TUI Information Bar with customizable colors
  • New distribution packages for Debian and Ubuntu
  • New columns for loss heuristics

Full Release Notes

## Highlights

The latest release of Trippy brings both cosmetic and functional improvements to the TUI, new columns, new distribution packages, and a number of bug fixes.

The TUI has been updated to include a new _information bar_ at the bottom of the screen which allows for the header to be shortened and simplified. The sample history chart has been enhanced to highlight missing probes and the presentation of source and target addresses has also been simplified.

As well as these cosmetic changes, the TUI has gained support for internationalization (i18n) and the ability to adjust the hop privacy setting dynamically.

This release introduces three new columns, which provide novel heuristics for measuring _forward loss_ and _backward loss_, that are designed to assist users in interpreting the status of the trace.

Finally, this update includes new distribution packages for Debian and Ubuntu and addresses a number of bugs.

### TUI Information Bar

The TUI now includes an _information bar_ at the bottom of the screen, replacing the previous `Config` line in the header. This change shortens the header by one line, optimizing space usage while keeping the overall vertical space of the TUI unchanged.

The main TUI screen now appears as shown below (120x40 terminal size):

<img width="60%" src="https://raw.githubusercontent.com/fujiapple852/trippy/master/assets/0.12.0/main_screen.png"/>

The left-hand side of the information bar displays a selection of static configuration items (in order):

- The address family and tracing protocol, e.g., `IPv4/ICMP`
- The privilege level, either `privileged` or `unprivileged`
- The locale, e.g., English (`en`), French (`fr`), etc.

The right-hand side of the information bar displays a selection of adjustable configuration items (in order):

- A toggle controlling whether `ASN` information is displayed (`□ ASN` for disabled, `■ ASN` for enabled)
- A toggle controlling whether hop detail mode is enabled (`□ detail` for disabled, `■ detail` for enabled)
- A toggle controlling whether hostnames, IP addresses, or both are displayed (`host`, `ip`, or `both`)
- The maximum `ttl` value for hop privacy, shown as `-` (privacy disabled) or a number (0, 1, 2, etc.)
- The maximum number of hosts displayed per hop, shown as `-` (automatic) or a number (1, 2, etc.)

In the above screenshot, the information bar indicates the trace is using `IPv4/ICMP`, is running in `privileged` mode, the locale is English (`en`), `ASN` information is displayed, hop detail mode is disabled, hostnames are displayed, the hop privacy maximum `ttl` is 2, and the maximum number of hosts per hop is set to automatic.

> **Note**: The information bar displays only a small number of important settings. All other settings can be viewed in
> the settings dialog, which can be opened by pressing `s` (default key binding).

The theme colors of the information bar can be customized using the `info-bar-bg-color` and `info-bar-text-color` theme items. Refer to the [Theme Reference](https://github.com/fujiapple852/trippy#theme-reference) for more details.

Thanks to @c-git for their valuable feedback in refining the design of the information bar.

See [#1349](https://github.com/fujiapple852/trippy/issues/1349) for details.

### Sample History Missing Probes

Trippy displays a history of samples for each hop as a chart at the bottom of the TUI display. Each vertical line in the chart corresponds to one sample, representing the value of the `Last` column.

Previously, if a probe was lost, the sample for that round would be shown as a blank vertical line. Starting with this release, Trippy now highlights lost probes using a full vertical line in red (default theme color), making them easier to identify.

<img width="60%" src="https://raw.githubusercontent.com/fujiapple852/trippy/master/assets/0.12.0/lost_probes.png"/>

The theme color for regular samples can be configured using the existing `samples-chart-color` configuration option. Additionally, the theme color for lost probes can now be customized using the new `samples-chart-lost-color` configuration option. For more details, see the [Theme Reference](https://github.com/fujiapple852/trippy#theme-reference).

See [#1247](https://github.com/fujiapple852/trippy/issues/1247) for further details.

### Source and Target Address Display Improvements

This release simplifies the display of the source and target addresses in the `Target` line in the header of the TUI.

The `Target` line has been updated such that, for both the source and destination addresses, the hostname is only shown if it differs from the IP address.

For the destination address:

- If the user supplies a target hostname, it is resolved to an IP address, and both the IP address and the _provided_ hostname are shown.
- If the user supplies an IP address, a reverse DNS hostname lookup is attempted. If successful, both the IP address and the _first resolved_ hostname are shown; otherwise, only the IP address is displayed.

For the source address:

- A reverse DNS hostname lookup is attempted. If successful, both the IP address and the _first resolved_ hostname are shown; otherwise, only the IP address is displayed.

For example, when the user supplies an IP address as the tracing target, the `Target` line in the header is now shown as follows:

```
Target: 192.168.1.21 -> 93.184.215.14 (example.com)
```

See [#1363](https://github.com/fujiapple852/trippy/issues/1363) for details.

### Adjustable Hop Privacy Mode Settings

Trippy includes a privacy feature designed to hide sensitive information, such as IP addresses and GeoIP data, for all hops up to a configurable maximum `ttl` via the `tui-privacy-max-ttl` configuration option.

Previously, the privacy feature could only be toggled on or off within the TUI using the `toggle-privacy` command and only if `tui-privacy-max-ttl` was configured _before_ Trippy was started.

In this release, the `toggle-privacy` command has been deprecated and replaced by two new TUI commands, `expand-privacy` (bound to the `p` key by default) and `contract-privacy` (bound to the `o` key by default).

The `expand-privacy` command increases the `tui-privacy-max-ttl` value up to the maximum number of hops in the current trace and the `contract-privacy` command decreases the `tui-privacy-max-ttl` value to the minimum value, which disables privacy mode.

See [#1347](https://github.com/fujiapple852/trippy/issues/1347) for more details.

This release also repurposes the meaning of `tui-privacy-max-ttl` when set to `0`. Previously, a value of `0` indicated that no hops should be hidden. Starting from this release, a value of `0` will indicate that the source of the trace, as shown in the `Target` line of the header, should be hidden.

Values of `1` or greater retain their existing behavior but will now also hide the source of the trace in addition to the specified number of hops.

As a result of this change, the default value for `tui-privacy-max-ttl` has been updated:

- If not explicitly set (via a command-line argument or the configuration file), nothing will be hidden by default.
- If explicitly set to `0` (the previous default), the source of the trace will be hidden.

See [#1365](https://github.com/fujiapple852/trippy/issues/1365) for details.

### Preserve Screen on Exit

Trippy previously supported the `--tui-preserve-screen` command-line flag, which could be used to prevent the terminal screen from being cleared when Trippy exits. This feature is useful for users who wish to review trace results after exiting the application. However, the flag had to be set before starting Trippy and could not be toggled during a trace.

This release introduces the `quit-preserve-screen` TUI command (bound to the `shift+q` key by default). This command allows users to quit Trippy without clearing the terminal screen, regardless of whether the `--tui-preserve-screen` flag is set.

See [#1382](https://github.com/fujiapple852/trippy/issues/1382) for details.

### TUI Internationalization (i18n)

The Trippy TUI has been translated into multiple languages. This includes all text displayed in the TUI across all screens and dialogs, as well as GeoIP location data shown on the world map.

The TUI will automatically detect the system locale and use the corresponding translations if available. The locale can be overridden using the `--tui-locale` configuration option.

Locales can be specified for a language or a combination of language and region. For example a general locale can be created for English (`en`) and specific regional locales can be created, such as United Kingdom English (`en-UK`) and United States English (`en-US`).

If the user's chosen full locale (`language-region`) is not available, Trippy will fall back to using the locale for the language only, if it exists. For example if the user sets the locale to `en-AU`, which is not currently defined in Trippy, it will fall back to the `en` locale, which is defined.

If the user's chosen locale does not exist at all, Trippy will fall back to English (`en`).

Locales are generally added for the language only unless there is a specific need for region-based translations.

Some caveats to be aware of:

- The configuration file, command-line options, and most error messages are not translated.
- Many common abbreviated technical terms, such as `IPv4` and `ASN`, are not translated.

The following example sets the TUI locale to be Chinese (`zh`):

```shell
trip example.com --tui-locale zh
```

This can be made permanent by setting the `tui-locale` value in the `tui` section of the configuration file:

```toml
[tui]
tui-locale = "zh"
```

The following screenshot shows the TUI with the locale set to Chinese (`zh`):

<img width="60%" src="https://raw.githubusercontent.com/fujiapple852/trippy/master/assets/0.12.0/help_screen_zh.png"/>

The list of available locales can be printed using the `--print-locales` flag:

```shell
trip --print-locales
```

As of this release, the following locales are available:

- Chinese (`zh`)
- English (`en`)
- French (`fr`)
- German (`de`)
- Italian (`it`)
- Portuguese (`pt`)
- Russian (`ru`)
- Spanish (`es`)
- Swedish (`sv`)
- Turkish (`tr`)

See [#1319](https://github.com/fujiapple852/trippy/issues/1319), [#1357](https://github.com/fujiapple852/trippy/issues/1357), [#1336](https://github.com/fujiapple852/trippy/issues/1336) and the [Locale Reference](https://github.com/fujiapple852/trippy#locale-reference) for more details.

Corrections to existing translations or the addition of new translations are always welcome. See the [tracking issue](https://github.com/fujiapple852/trippy/issues/506) for the status of each translation and details on how to contribute.

Adding these translations has been a significant effort and I would like to express a huge _thank you_ (谢谢! Merci! Danke! Grazie! Obrigado! Спасибо! Gracias! Tack! Teşekkürler!) to @0323pin, @arda-guler, @histrio, @josueBarretogit, @one, @orhun, @peshay, @ricott1, @sxyazi, @ulissesf, and @zarkdav for all of their time and effort adding and reviewing translations for this release.

### Forward and Backward Packet Loss Heuristics

In line with most classic traceroute tools, Trippy displays the number of probes sent (`Snd`), received (`Recv`), and a loss percentage (`Loss%`) for each hop. However, many routers are configured to rate-limit or even drop ICMP traffic. This can lead to false positives for packet loss, particularly for intermediate hops, as the lack of a response from such hops does not typically indicate genuine packet loss. This is a common source of confusion for users interpreting trace results.

Trippy already provides a color-coded status column (`Sts`), that considers both packet loss percentage and whether the hop is the target of the trace, to try and assist users in interpreting the status of each hop. While this feature is helpful, it does not make it clear _why_ a hop has a particular status nor help users interpret the overall status of the trace.

To further assist users, this release of Trippy introduces a pair of novel heuristics to measure _forward loss_ and _backward loss_. Informally, _forward loss_ indicates whether the loss of a probe is the _cause_ of subsequent losses and _backward loss_ indicates whether the loss of a probe is the _result_ of a prior loss on the path.

More precisely:

- _forward loss_ for probe `P` in round `R` occurs when probe `P` is lost in round `R` and _all_ subsequent probes within round `R` are also lost.
- _backward loss_ for probe `P` in round `R` occurs when probe `P` is lost in round `R` and _any_ prior probe within round `R` has _forward loss_.

These heuristics are encoded in three new columns:

- `Floss` (`F`): The number of probes with _forward loss_
- `Bloss` (`B`): The number of probes with _backward loss_
- `Floss%` (`D`): The percentage of probes with _forward loss_

These columns are hidden by default but can be enabled as needed. For more details, see the [Column Reference](https://github.com/fujiapple852/trippy#column-reference).

The following screenshot shows an example trace with the new columns enabled:

<img width="60%" src="https://raw.githubusercontent.com/fujiapple852/trippy/master/assets/0.12.0/floss_bloss.png"/>

In the following (contrived) example, after initially discovering the target (`10.0.0.105`) during the first round, genuine packet loss occurs in _all_ subsequent rounds at the third hop. This means that no probes on the common path are able to get beyond the third hop.

```
╭Hops───────────────────────────────────────────────────────────────╮
│#    Host         Loss%    Snd     Recv    Floss   Bloss   Floss%  │
│1    10.0.0.101   0.0%     96      96      0       0       0.0%    │
│2    10.0.0.102   0.0%     96      96      0       0       0.0%    │
│3    No response  100.0%   96      0       95      0       98.9%   │
│4    No response  100.0%   96      0       0       95      0.0%    │
│5    10.0.0.105   99.0%    96      1       0       95      0.0%    │
```

From this we can determine that the loss at the third hop is classified as _forward loss_ because all subsequent probes (4th and 5th) in the same round are also lost. We can also conclude that the 4th and 5th hops have _backward loss_ starting from round two, as in those rounds a prior hop (the third hop) has _forward loss_.

Note the difference between the traditional `Loss%` column and the new `Floss%` column. The `Loss%` column indicates packet loss at several hops (3rd, 4th, and 5th). In contrast, the `Floss%` column helps us determine that the true packet loss most likely occurs at the 3rd hop.

It is important to stress that this technique is a _heuristic_, and both _false positives_ and _false negatives_ are possible. Some specific caveats to be aware of include:

- Every probe sent in every round is an _independent trial_, meaning there is no guarantee that all probes within a given round will follow the same path (or "flow"). The concept of "forward loss" and "backward loss" assumes that all probes followed a single path. This assumption is typically met (but not guaranteed) when using tracing strategies such as ICMP, UDP/Dublin, or UDP/Paris.
- Any given host on the path may drop packets for only a subset of probes sent within a round, either due to rate limiting or genuine intermittent packet loss. This could result in a false positive for "forward loss" at a given hop if all subsequent hops in the round exhibit packet loss that is not genuine. For example, in the scenario above, the hop with `ttl=3` could be incorrectly deemed to have "forward loss" if observed loss from hops `ttl=4` and `ttl=5` is not genuine (e.g., caused by rate-limiting).
- A false positive for "backward loss" could occur at a hop experiencing genuine packet loss if a previous hop on the path has "forward loss" that is not genuine. In the scenario above, if the hop with `ttl=4` has genuine packet loss, it will still be marked with "backward loss" due to the "forward loss" at `ttl=3`.

Despite these caveats, the addition of _forward loss_ and _backward loss_ heuristics aims to help users more accurately interpret trace outputs. However, these heuristics should be considered experimental and may be subject to change in future releases.

See [#860](https://github.com/fujiapple852/trippy/issues/860) for details.

### Bug Fixes

The previous release of Trippy introduced a bug ([#1290](https://github.com/fujiapple852/trippy/issues/1290)) that caused reverse DNS lookups to be enqueued multiple times when the `dns-ttl` expired, potentially leading to the hostname being displayed as `Timeout: xxx` for a brief period.

A long standing bug ([#1398](https://github.com/fujiapple852/trippy/issues/1398)) which caused the TUI sample history and frequency charts to ignore sub-millisecond samples has been fixed.

This release fixes a bug ([#1287](https://github.com/fujiapple852/trippy/issues/1287)) that caused the tracer to panic when parsing certain ICMP extensions with malformed lengths.

It also resolves an issue ([#1289](https://github.com/fujiapple852/trippy/issues/1289)) where the ICMP extensions mode was not being displayed in the TUI settings dialog.

A bug ([#1375](https://github.com/fujiapple852/trippy/issues/1375)) that caused the cursor to not move to the bottom of the screen when exiting while preserving the screen has also been fixed.

Finally, this release fixes a bug ([#1327](https://github.com/fujiapple852/trippy/issues/1327)) that caused Trippy to incorrectly reject the value `ip` for the `tui-address-mode` configuration option (thanks to @c-git).

### New Distribution Packages

Trippy is now available in Debian 13 (`trixie`) and later (with thanks to @nc7s!).

[![Debian 13 package](https://repology.org/badge/version-for-repo/debian_13/trippy.svg)](https://tracker.debian.org/pkg/trippy)

```shell
apt install trippy
```

See [#1312](https://github.com/fujiapple852/trippy/issues/1312) for details.

The official Trippy PPA for Ubuntu is now also available for the `noble` distribution.

[![Ubuntu PPA](https://img.shields.io/badge/Ubuntu%20PPA-0.12.0-brightgreen)](https://launchpad.net/~fujiapple/+archive/ubuntu/trippy/+packages)

```shell
sudo add-apt-repository ppa:fujiapple/trippy
sudo apt update && apt install trippy
```

See [#1308](https://github.com/fujiapple852/trippy/issues/1308) for details.

You can find the full list of [distributions](https://github.com/fujiapple852/trippy/tree/master#distributions) in the
documentation.

### Thanks

My thanks to all Trippy contributors, package maintainers, translators and community members.

Feel free to drop by the Trippy Zulip room for a chat:

[![project chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://trippy.zulipchat.com/)

Happy Tracing!

## Change Log

### Added

- Highlight lost probes in sample history ([#1247](https://github.com/fujiapple852/trippy/issues/1247))
- Added `quit-preserve-screen` (default: `shift+q`) key binding to quit Tui without clearing the screen ([#1382](https://github.com/fujiapple852/trippy/issues/1382))
- Added forward add backward loss heuristics ([#860](https://github.com/fujiapple852/trippy/issues/860))
- Added `--tui-locale` flag to support i18n ([#1319](https://github.com/fujiapple852/trippy/issues/1319))
- Added translations for locales `en`, `fr`, `tr`, `zh`, `pt`, `sv`, `it`, `ru`, `es` & `de` ([#506](https://github.com/fujiapple852/trippy/issues/506))
- Added `--print-locales` flag to print all available locales ([#1357](https://github.com/fujiapple852/trippy/issues/1357))
- Added Debian package ([#1312](https://github.com/fujiapple852/trippy/issues/1312))
- Added Ubuntu `noble` PPA package ([#1308](https://github.com/fujiapple852/trippy/issues/1308))

### Changed

- Added information bar to Tui ([#1349](https://github.com/fujiapple852/trippy/issues/1349))
- [BREAKING CHANGE] Remove `Timestamp` from all `DnsEntry` variants ([#1296](https://github.com/fujiapple852/trippy/issues/1296))
- [BREAKING CHANGE] Replace `toggle-privacy` key binding with `expand-privacy` and `contract-privacy` ([#1347](https://github.com/fujiapple852/trippy/issues/1347))
- [BREAKING CHANGE] Hide source address when `--tui-privacy-max-ttl` is set ([#1365](https://github.com/fujiapple852/trippy/issues/1365))
- Only show hostnames if different from IPs ([#1363](https://github.com/fujiapple852/trippy/issues/1363))
- Lookup GeoIp with current locale ([#1336](https://github.com/fujiapple852/trippy/issues/1336))
- Enable Link-Time Optimization (LTO) for release builds ([#1341](https://github.com/fujiapple852/trippy/issues/1341))

### Fixed

- Reverse dns enqueued multiple times when dns-ttl expires ([#1290](https://github.com/fujiapple852/trippy/issues/1290))
- Fixed panic for icmp extensions with malformed length ([#1287](https://github.com/fujiapple852/trippy/issues/1287))
- Cursor not moved to the bottom on exit when using `--tui-preserve-screen` ([#1375](https://github.com/fujiapple852/trippy/issues/1375))
- Config item `tui-address-mode` does not accept `ip` ([#1327](https://github.com/fujiapple852/trippy/issues/1327))
- Icmp extension mode not shown in Tui settings ([#1289](https://github.com/fujiapple852/trippy/issues/1289))
- Sample history and frequency charts ignore sub-millisecond samples ([#1398](https://github.com/fujiapple852/trippy/issues/1398))

## New Contributors
* @zamazan4ik made their first contribution in https://github.com/fujiapple852/trippy/pull/1352

See [CHANGELOG.md](https://github.com/fujiapple852/trippy/blob/master/CHANGELOG.md) for details.

**Full Changelog**: https://github.com/fujiapple852/trippy/compare/0.11.0...0.12.0