Skip to content

Commit

Permalink
feat!: add tui-privacy configuration and change default for `tui-pr…
Browse files Browse the repository at this point in the history
…ivacy-max-ttl` (#1347)
  • Loading branch information
fujiapple852 committed Oct 14, 2024
1 parent 7c438ad commit 955bbbb
Show file tree
Hide file tree
Showing 21 changed files with 62 additions and 25 deletions.
1 change: 1 addition & 0 deletions crates/trippy-tui/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ fn configure_logging(cfg: &TrippyConfig) -> Option<FlushGuard> {
fn make_tui_config(args: &TrippyConfig) -> TuiConfig {
TuiConfig::new(
args.tui_refresh_rate,
args.tui_privacy,
args.tui_privacy_max_ttl,
args.tui_preserve_screen,
args.tui_address_mode,
Expand Down
25 changes: 24 additions & 1 deletion crates/trippy-tui/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,7 @@ pub struct TrippyConfig {
pub max_flows: usize,
pub tui_preserve_screen: bool,
pub tui_refresh_rate: Duration,
pub tui_privacy: bool,
pub tui_privacy_max_ttl: u8,
pub tui_address_mode: AddressMode,
pub tui_as_mode: AsMode,
Expand Down Expand Up @@ -501,6 +502,11 @@ impl TrippyConfig {
cfg_file_tui.tui_refresh_rate,
constants::DEFAULT_TUI_REFRESH_RATE,
);
let tui_privacy = cfg_layer_bool_flag(
args.tui_privacy,
cfg_file_tui.tui_privacy,
constants::DEFAULT_TUI_PRIVACY,
);
let tui_privacy_max_ttl = cfg_layer(
args.tui_privacy_max_ttl,
cfg_file_tui.tui_privacy_max_ttl,
Expand Down Expand Up @@ -692,6 +698,7 @@ impl TrippyConfig {
max_flows,
tui_preserve_screen,
tui_refresh_rate,
tui_privacy,
tui_privacy_max_ttl,
tui_address_mode,
tui_as_mode,
Expand Down Expand Up @@ -746,6 +753,7 @@ impl Default for TrippyConfig {
max_flows: defaults::DEFAULT_MAX_FLOWS,
tui_preserve_screen: constants::DEFAULT_TUI_PRESERVE_SCREEN,
tui_refresh_rate: constants::DEFAULT_TUI_REFRESH_RATE,
tui_privacy: constants::DEFAULT_TUI_PRIVACY,
tui_privacy_max_ttl: constants::DEFAULT_TUI_PRIVACY_MAX_TTL,
tui_address_mode: constants::DEFAULT_TUI_ADDRESS_MODE,
tui_as_mode: constants::DEFAULT_TUI_AS_MODE,
Expand Down Expand Up @@ -1462,7 +1470,13 @@ mod tests {
compare(parse_config(cmd), expected);
}

#[test_case("trip example.com", Ok(cfg().tui_privacy_max_ttl(0).build()); "default tui privacy max ttl")]
#[test_case("trip example.com", Ok(cfg().tui_privacy(false).build()); "default tui privacy")]
#[test_case("trip example.com --tui-privacy", Ok(cfg().tui_privacy(true).build()); "enable tui privacy")]
fn test_tui_privacy(cmd: &str, expected: anyhow::Result<TrippyConfig>) {
compare(parse_config(cmd), expected);
}

#[test_case("trip example.com", Ok(cfg().tui_privacy_max_ttl(1).build()); "default tui privacy max ttl")]
#[test_case("trip example.com --tui-privacy-max-ttl 4", Ok(cfg().tui_privacy_max_ttl(4).build()); "custom tui privacy max ttl")]
#[test_case("trip example.com --tui-privacy-max-ttl foo", Err(anyhow!("error: invalid value 'foo' for '--tui-privacy-max-ttl <TUI_PRIVACY_MAX_TTL>': invalid digit found in string For more information, try '--help'.")); "invalid tui privacy max ttl")]
fn test_tui_privacy_max_ttl(cmd: &str, expected: anyhow::Result<TrippyConfig>) {
Expand Down Expand Up @@ -2041,6 +2055,15 @@ mod tests {
}
}

pub fn tui_privacy(self, tui_privacy: bool) -> Self {
Self {
config: TrippyConfig {
tui_privacy,
..self.config
},
}
}

pub fn tui_privacy_max_ttl(self, tui_privacy_max_ttl: u8) -> Self {
Self {
config: TrippyConfig {
Expand Down
6 changes: 5 additions & 1 deletion crates/trippy-tui/src/config/cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,11 @@ pub struct Args {
#[arg(long, value_parser = parse_duration)]
pub tui_refresh_rate: Option<Duration>,

/// The maximum ttl of hops which will be masked for privacy [default: 0]
/// Mask hops for privacy [default: false]
#[arg(long)]
pub tui_privacy: bool,

/// The maximum ttl of hops which will be masked for privacy [default: 1]
#[arg(long)]
pub tui_privacy_max_ttl: Option<u8>,

Expand Down
5 changes: 4 additions & 1 deletion crates/trippy-tui/src/config/constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,11 @@ pub const DEFAULT_TUI_ADDRESS_MODE: AddressMode = AddressMode::Host;
/// The default value for `tui-refresh-rate`.
pub const DEFAULT_TUI_REFRESH_RATE: Duration = Duration::from_millis(100);

/// The default value for `tui-privacy`.
pub const DEFAULT_TUI_PRIVACY: bool = false;

/// The default value for `tui-privacy-max-ttl`.
pub const DEFAULT_TUI_PRIVACY_MAX_TTL: u8 = 0;
pub const DEFAULT_TUI_PRIVACY_MAX_TTL: u8 = 1;

/// The default value for `dns-resolve-method`.
pub const DEFAULT_DNS_RESOLVE_METHOD: DnsResolveMethodConfig = DnsResolveMethodConfig::System;
Expand Down
2 changes: 2 additions & 0 deletions crates/trippy-tui/src/config/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,7 @@ pub struct ConfigTui {
#[serde(default)]
#[serde(deserialize_with = "humantime_deser")]
pub tui_refresh_rate: Option<Duration>,
pub tui_privacy: Option<bool>,
pub tui_privacy_max_ttl: Option<u8>,
pub tui_address_mode: Option<AddressMode>,
pub tui_as_mode: Option<AsMode>,
Expand All @@ -259,6 +260,7 @@ impl Default for ConfigTui {
Self {
tui_preserve_screen: Some(super::constants::DEFAULT_TUI_PRESERVE_SCREEN),
tui_refresh_rate: Some(super::constants::DEFAULT_TUI_REFRESH_RATE),
tui_privacy: Some(super::constants::DEFAULT_TUI_PRIVACY),
tui_privacy_max_ttl: Some(super::constants::DEFAULT_TUI_PRIVACY_MAX_TTL),
tui_address_mode: Some(super::constants::DEFAULT_TUI_ADDRESS_MODE),
tui_as_mode: Some(super::constants::DEFAULT_TUI_AS_MODE),
Expand Down
7 changes: 5 additions & 2 deletions crates/trippy-tui/src/frontend/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ use std::time::Duration;
pub struct TuiConfig {
/// Refresh rate.
pub refresh_rate: Duration,
/// Mask addresses for privacy.
pub privacy: bool,
/// The maximum ttl of hops which will be masked for privacy.
pub privacy_max_ttl: u8,
/// Preserve screen on exit.
Expand Down Expand Up @@ -37,9 +39,10 @@ pub struct TuiConfig {
}

impl TuiConfig {
#[allow(clippy::too_many_arguments)]
#[allow(clippy::too_many_arguments, clippy::fn_params_excessive_bools)]
pub fn new(
refresh_rate: Duration,
privacy: bool,
privacy_max_ttl: u8,
preserve_screen: bool,
address_mode: AddressMode,
Expand All @@ -51,12 +54,12 @@ impl TuiConfig {
tui_theme: TuiTheme,
tui_bindings: &TuiBindings,
tui_columns: &TuiColumns,

geoip_mmdb_file: Option<String>,
dns_resolve_all: bool,
) -> Self {
Self {
refresh_rate,
privacy,
privacy_max_ttl,
preserve_screen,
address_mode,
Expand Down
2 changes: 1 addition & 1 deletion crates/trippy-tui/src/frontend/render/header.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ pub fn render(f: &mut Frame<'_>, app: &TuiApp, rect: Rect) {
.tui_config
.max_addrs
.map_or_else(|| String::from(t!("auto")), |m| m.to_string());
let privacy = if app.hide_private_hops && app.tui_config.privacy_max_ttl > 0 {
let privacy = if app.tui_config.privacy {
t!("on")
} else {
t!("off")
Expand Down
3 changes: 2 additions & 1 deletion crates/trippy-tui/src/frontend/render/settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ fn format_tui_settings(app: &TuiApp) -> Vec<SettingsItem> {
"tui-refresh-rate",
format!("{}", format_duration(app.tui_config.refresh_rate)),
),
SettingsItem::new("tui-privacy", format!("{}", app.tui_config.privacy)),
SettingsItem::new(
"tui-privacy-max-ttl",
format!("{}", app.tui_config.privacy_max_ttl),
Expand Down Expand Up @@ -519,7 +520,7 @@ pub const SETTINGS_TAB_COLUMNS: usize = 6;
/// The name and number of items for each tabs in the setting dialog.
pub fn settings_tabs() -> [(String, usize); 7] {
[
(t!("settings_tab_tui_title").to_string(), 9),
(t!("settings_tab_tui_title").to_string(), 10),
(t!("settings_tab_trace_title").to_string(), 17),
(t!("settings_tab_dns_title").to_string(), 5),
(t!("settings_tab_geoip_title").to_string(), 1),
Expand Down
4 changes: 2 additions & 2 deletions crates/trippy-tui/src/frontend/render/table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ fn render_hostname(
geoip_lookup: &GeoIpLookup,
) -> (Cell<'static>, u16) {
let (hostname, count) = if hop.total_recv() > 0 {
if app.hide_private_hops && app.tui_config.privacy_max_ttl >= hop.ttl() {
if app.tui_config.privacy && app.tui_config.privacy_max_ttl >= hop.ttl() {
(format!("**{}**", t!("hidden")), 1)
} else {
match app.tui_config.max_addrs {
Expand Down Expand Up @@ -512,7 +512,7 @@ fn render_hostname_with_details(
config: &TuiConfig,
) -> (Cell<'static>, u16) {
let rendered = if hop.total_recv() > 0 {
if app.hide_private_hops && config.privacy_max_ttl >= hop.ttl() {
if app.tui_config.privacy && config.privacy_max_ttl >= hop.ttl() {
format!("**{}**", t!("hidden"))
} else {
let index = app.selected_hop_address;
Expand Down
4 changes: 2 additions & 2 deletions crates/trippy-tui/src/frontend/render/world.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ fn render_map_canvas(f: &mut Frame<'_>, app: &TuiApp, rect: Rect, entries: &[Map
.hops
.iter()
.any(|hop| *hop > app.tui_config.privacy_max_ttl);
if !app.hide_private_hops || any_show {
if !app.tui_config.privacy || any_show {
render_map_canvas_pin(ctx, entry);
render_map_canvas_radius(ctx, entry, theme.map_radius);
render_map_canvas_selected(
Expand Down Expand Up @@ -146,7 +146,7 @@ fn render_map_info_panel(f: &mut Frame<'_>, app: &TuiApp, rect: Rect, entries: &
}
})
.collect::<Vec<_>>();
let info = if app.hide_private_hops && app.tui_config.privacy_max_ttl >= selected_hop.ttl() {
let info = if app.tui_config.privacy && app.tui_config.privacy_max_ttl >= selected_hop.ttl() {
format!("**{}**", t!("hidden"))
} else {
match locations.as_slice() {
Expand Down
5 changes: 1 addition & 4 deletions crates/trippy-tui/src/frontend/tui_app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@ pub struct TuiApp {
pub show_settings: bool,
pub show_hop_details: bool,
pub show_flows: bool,
/// Whether private hops should be shown or not.
pub hide_private_hops: bool,
pub show_chart: bool,
pub show_map: bool,
pub frozen_start: Option<SystemTime>,
Expand Down Expand Up @@ -70,7 +68,6 @@ impl TuiApp {
show_settings: false,
show_hop_details: false,
show_flows: false,
hide_private_hops: true,
show_chart: false,
show_map: false,
frozen_start: None,
Expand Down Expand Up @@ -383,7 +380,7 @@ impl TuiApp {
}

pub fn toggle_privacy(&mut self) {
self.hide_private_hops = !self.hide_private_hops;
self.tui_config.privacy = !self.tui_config.privacy;
}

pub fn toggle_asinfo(&mut self) {
Expand Down
2 changes: 1 addition & 1 deletion ...rippy-tui/tests/resources/snapshots/[email protected]
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
---
source: crates/trippy-tui/src/config.rs
---
AnetworkdiagnostictoolUsage:trip[OPTIONS][TARGETS]...Arguments:[TARGETS]...AspacedelimitedlistofhostnamesandIPstotraceOptions:-c,--config-file<CONFIG_FILE>Configfile-m,--mode<MODE>Outputmode[default:tui][possiblevalues:tui,stream,pretty,markdown,csv,json,dot,flows,silent]-u,--unprivilegedTracewithoutrequiringelevatedprivilegesonsupportedplatforms[default:false]-p,--protocol<PROTOCOL>Tracingprotocol[default:icmp][possiblevalues:icmp,udp,tcp]--udpTraceusingtheUDPprotocol--tcpTraceusingtheTCPprotocol--icmpTraceusingtheICMPprotocol-F,--addr-family<ADDR_FAMILY>Theaddressfamily[default:Ipv4thenIpv6][possiblevalues:ipv4,ipv6,ipv6-then-ipv4,ipv4-then-ipv6]-4,--ipv4UseIPv4only-6,--ipv6UseIPv6only-P,--target-port<TARGET_PORT>Thetargetport(TCP&UDPonly)[default:80]-S,--source-port<SOURCE_PORT>Thesourceport(TCP&UDPonly)[default:auto]-A,--source-address<SOURCE_ADDRESS>ThesourceIPaddress[default:auto]-I,--interface<INTERFACE>Thenetworkinterface[default:auto]-i,--min-round-duration<MIN_ROUND_DURATION>Theminimumdurationofeveryround[default:1s]-T,--max-round-duration<MAX_ROUND_DURATION>Themaximumdurationofeveryround[default:1s]-g,--grace-duration<GRACE_DURATION>TheperiodoftimetowaitforadditionalICMPresponsesafterthetargethasresponded[default:100ms]--initial-sequence<INITIAL_SEQUENCE>Theinitialsequencenumber[default:33434]-R,--multipath-strategy<MULTIPATH_STRATEGY>TheEqual-costMulti-Pathroutingstrategy(UDPonly)[default:classic][possiblevalues:classic,paris,dublin]-U,--max-inflight<MAX_INFLIGHT>Themaximumnumberofin-flightICMPechorequests[default:24]-f,--first-ttl<FIRST_TTL>TheTTLtostartfrom[default:1]-t,--max-ttl<MAX_TTL>ThemaximumnumberofTTLhops[default:64]--packet-size<PACKET_SIZE>ThesizeofIPpackettosend(IPheader+ICMPheader+payload)[default:84]--payload-pattern<PAYLOAD_PATTERN>TherepeatingpatterninthepayloadoftheICMPpacket[default:0]-Q,--tos<TOS>TheTOS(i.e.DSCP+ECN)IPheadervalue(TCPandUDPonly)[default:0]-e,--icmp-extensionsParseICMPextensions--read-timeout<READ_TIMEOUT>Thesocketreadtimeout[default:10ms]-r,--dns-resolve-method<DNS_RESOLVE_METHOD>HowtoperformDNSqueries[default:system][possiblevalues:system,resolv,google,cloudflare]-y,--dns-resolve-allTracetoallIPsresolvedfromDNSlookup[default:false]--dns-timeout<DNS_TIMEOUT>ThemaximumtimetowaittoperformDNSqueries[default:5s]--dns-ttl<DNS_TTL>Thetime-to-live(TTL)ofDNSentries[default:300s]-z,--dns-lookup-as-infoLookupautonomoussystem(AS)informationduringDNSqueries[default:false]-s,--max-samples<MAX_SAMPLES>Themaximumnumberofsamplestorecordperhop[default:256]--max-flows<MAX_FLOWS>Themaximumnumberofflowstorecord[default:64]-a,--tui-address-mode<TUI_ADDRESS_MODE>Howtorenderaddresses[default:host][possiblevalues:ip,host,both]--tui-as-mode<TUI_AS_MODE>Howtorenderautonomoussystem(AS)information[default:asn][possiblevalues:asn,prefix,country-code,registry,allocated,name]--tui-custom-columns<TUI_CUSTOM_COLUMNS>CustomcolumnstobedisplayedintheTUIhopstable[default:holsravbwdt]--tui-icmp-extension-mode<TUI_ICMP_EXTENSION_MODE>HowtorenderICMPextensions[default:off][possiblevalues:off,mpls,full,all]--tui-geoip-mode<TUI_GEOIP_MODE>HowtorenderGeoIpinformation[default:short][possiblevalues:off,short,long,location]-M,--tui-max-addrs<TUI_MAX_ADDRS>Themaximumnumberofaddressestoshowperhop[default:auto]--tui-preserve-screenPreservethescreenonexit[default:false]--tui-refresh-rate<TUI_REFRESH_RATE>TheTuirefreshrate[default:100ms]--tui-privacy-max-ttl<TUI_PRIVACY_MAX_TTL>Themaximumttlofhopswhichwillbemaskedforprivacy[default:0]--tui-locale<TUI_LOCALE>ThelocaletousefortheTUI[default:auto]--tui-theme-colors<TUI_THEME_COLORS>TheTUIthemecolors[item=color,item=color,..]--print-tui-theme-itemsPrintallTUIthemeitemsandexit--tui-key-bindings<TUI_KEY_BINDINGS>TheTUIkeybindings[command=key,command=key,..]--print-tui-binding-commandsPrintallTUIcommandsthatcanbeboundandexit-C,--report-cycles<REPORT_CYCLES>Thenumberofreportcyclestorun[default:10]-G,--geoip-mmdb-file<GEOIP_MMDB_FILE>ThesupportedMaxMindorIPinfoGeoIpmmdbfile--generate<GENERATE>Generateshellcompletion[possiblevalues:bash,elvish,fish,powershell,zsh]--generate-manGenerateROFFmanpage--print-config-templatePrintatemplatetomlconfigfileandexit--log-format<LOG_FORMAT>Thedebuglogformat[default:pretty][possiblevalues:compact,pretty,json,chrome]--log-filter<LOG_FILTER>Thedebuglogfilter[default:trippy=debug]--log-span-events<LOG_SPAN_EVENTS>Thedebuglogformat[default:off][possiblevalues:off,active,full]-v,--verboseEnableverbosedebuglogging-h,--helpPrinthelp(seemorewith'--help')-V,--versionPrintversion
AnetworkdiagnostictoolUsage:trip[OPTIONS][TARGETS]...Arguments:[TARGETS]...AspacedelimitedlistofhostnamesandIPstotraceOptions:-c,--config-file<CONFIG_FILE>Configfile-m,--mode<MODE>Outputmode[default:tui][possiblevalues:tui,stream,pretty,markdown,csv,json,dot,flows,silent]-u,--unprivilegedTracewithoutrequiringelevatedprivilegesonsupportedplatforms[default:false]-p,--protocol<PROTOCOL>Tracingprotocol[default:icmp][possiblevalues:icmp,udp,tcp]--udpTraceusingtheUDPprotocol--tcpTraceusingtheTCPprotocol--icmpTraceusingtheICMPprotocol-F,--addr-family<ADDR_FAMILY>Theaddressfamily[default:Ipv4thenIpv6][possiblevalues:ipv4,ipv6,ipv6-then-ipv4,ipv4-then-ipv6]-4,--ipv4UseIPv4only-6,--ipv6UseIPv6only-P,--target-port<TARGET_PORT>Thetargetport(TCP&UDPonly)[default:80]-S,--source-port<SOURCE_PORT>Thesourceport(TCP&UDPonly)[default:auto]-A,--source-address<SOURCE_ADDRESS>ThesourceIPaddress[default:auto]-I,--interface<INTERFACE>Thenetworkinterface[default:auto]-i,--min-round-duration<MIN_ROUND_DURATION>Theminimumdurationofeveryround[default:1s]-T,--max-round-duration<MAX_ROUND_DURATION>Themaximumdurationofeveryround[default:1s]-g,--grace-duration<GRACE_DURATION>TheperiodoftimetowaitforadditionalICMPresponsesafterthetargethasresponded[default:100ms]--initial-sequence<INITIAL_SEQUENCE>Theinitialsequencenumber[default:33434]-R,--multipath-strategy<MULTIPATH_STRATEGY>TheEqual-costMulti-Pathroutingstrategy(UDPonly)[default:classic][possiblevalues:classic,paris,dublin]-U,--max-inflight<MAX_INFLIGHT>Themaximumnumberofin-flightICMPechorequests[default:24]-f,--first-ttl<FIRST_TTL>TheTTLtostartfrom[default:1]-t,--max-ttl<MAX_TTL>ThemaximumnumberofTTLhops[default:64]--packet-size<PACKET_SIZE>ThesizeofIPpackettosend(IPheader+ICMPheader+payload)[default:84]--payload-pattern<PAYLOAD_PATTERN>TherepeatingpatterninthepayloadoftheICMPpacket[default:0]-Q,--tos<TOS>TheTOS(i.e.DSCP+ECN)IPheadervalue(TCPandUDPonly)[default:0]-e,--icmp-extensionsParseICMPextensions--read-timeout<READ_TIMEOUT>Thesocketreadtimeout[default:10ms]-r,--dns-resolve-method<DNS_RESOLVE_METHOD>HowtoperformDNSqueries[default:system][possiblevalues:system,resolv,google,cloudflare]-y,--dns-resolve-allTracetoallIPsresolvedfromDNSlookup[default:false]--dns-timeout<DNS_TIMEOUT>ThemaximumtimetowaittoperformDNSqueries[default:5s]--dns-ttl<DNS_TTL>Thetime-to-live(TTL)ofDNSentries[default:300s]-z,--dns-lookup-as-infoLookupautonomoussystem(AS)informationduringDNSqueries[default:false]-s,--max-samples<MAX_SAMPLES>Themaximumnumberofsamplestorecordperhop[default:256]--max-flows<MAX_FLOWS>Themaximumnumberofflowstorecord[default:64]-a,--tui-address-mode<TUI_ADDRESS_MODE>Howtorenderaddresses[default:host][possiblevalues:ip,host,both]--tui-as-mode<TUI_AS_MODE>Howtorenderautonomoussystem(AS)information[default:asn][possiblevalues:asn,prefix,country-code,registry,allocated,name]--tui-custom-columns<TUI_CUSTOM_COLUMNS>CustomcolumnstobedisplayedintheTUIhopstable[default:holsravbwdt]--tui-icmp-extension-mode<TUI_ICMP_EXTENSION_MODE>HowtorenderICMPextensions[default:off][possiblevalues:off,mpls,full,all]--tui-geoip-mode<TUI_GEOIP_MODE>HowtorenderGeoIpinformation[default:short][possiblevalues:off,short,long,location]-M,--tui-max-addrs<TUI_MAX_ADDRS>Themaximumnumberofaddressestoshowperhop[default:auto]--tui-preserve-screenPreservethescreenonexit[default:false]--tui-refresh-rate<TUI_REFRESH_RATE>TheTuirefreshrate[default:100ms]--tui-privacyMaskhopsforprivacy[default:false]--tui-privacy-max-ttl<TUI_PRIVACY_MAX_TTL>Themaximumttlofhopswhichwillbemaskedforprivacy[default:1]--tui-locale<TUI_LOCALE>ThelocaletousefortheTUI[default:auto]--tui-theme-colors<TUI_THEME_COLORS>TheTUIthemecolors[item=color,item=color,..]--print-tui-theme-itemsPrintallTUIthemeitemsandexit--tui-key-bindings<TUI_KEY_BINDINGS>TheTUIkeybindings[command=key,command=key,..]--print-tui-binding-commandsPrintallTUIcommandsthatcanbeboundandexit-C,--report-cycles<REPORT_CYCLES>Thenumberofreportcyclestorun[default:10]-G,--geoip-mmdb-file<GEOIP_MMDB_FILE>ThesupportedMaxMindorIPinfoGeoIpmmdbfile--generate<GENERATE>Generateshellcompletion[possiblevalues:bash,elvish,fish,powershell,zsh]--generate-manGenerateROFFmanpage--print-config-templatePrintatemplatetomlconfigfileandexit--log-format<LOG_FORMAT>Thedebuglogformat[default:pretty][possiblevalues:compact,pretty,json,chrome]--log-filter<LOG_FILTER>Thedebuglogfilter[default:trippy=debug]--log-span-events<LOG_SPAN_EVENTS>Thedebuglogformat[default:off][possiblevalues:off,active,full]-v,--verboseEnableverbosedebuglogging-h,--helpPrinthelp(seemorewith'--help')-V,--versionPrintversion
Loading

0 comments on commit 955bbbb

Please sign in to comment.