connlib: add logging string configuration (#2115)

Split from #2104

This adds logging string configuration, unifies behavior between gateway
and headless clients and some cli improvements for those.

---------

Signed-off-by: Gabi <gabrielalejandro7@gmail.com>
Co-authored-by: Jamil <jamilbk@users.noreply.github.com>
This commit is contained in:
Gabi
2023-09-25 17:17:22 -03:00
committed by GitHub
parent 0d7ff13fe3
commit 5a998f7373
27 changed files with 305 additions and 399 deletions

View File

@@ -144,6 +144,9 @@ class TunnelService: VpnService() {
token = config.token,
deviceId = deviceId(),
logDir = getLogDir(),
// TODO: make logging string depend on build config #2067
// Docs on filter strings: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html
logFilter = "connlib_android=info,firezone_tunnel=info,libs_common=info,firezone_client_connlib=info,warn",
callback = callback
)
Log.d(TAG, "connlib session started! sessionPtr: $sessionPtr")

View File

@@ -1,6 +1,6 @@
package dev.firezone.android.tunnel
object TunnelSession {
external fun connect(controlPlaneUrl: String, token: String, deviceId: String, logDir: String, callback: Any): Long
external fun connect(controlPlaneUrl: String, token: String, deviceId: String, logDir: String, logFilter: String, callback: Any): Long
external fun disconnect(session: Long): Boolean
}

185
rust/Cargo.lock generated
View File

@@ -126,18 +126,9 @@ dependencies = [
[[package]]
name = "aho-corasick"
version = "0.6.10"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5"
dependencies = [
"memchr",
]
[[package]]
name = "aho-corasick"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783"
checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab"
dependencies = [
"memchr",
]
@@ -179,9 +170,9 @@ dependencies = [
[[package]]
name = "anstyle"
version = "1.0.2"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea"
checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46"
[[package]]
name = "anstyle-parse"
@@ -309,7 +300,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -320,7 +311,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -553,9 +544,9 @@ dependencies = [
[[package]]
name = "bumpalo"
version = "3.13.0"
version = "3.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"
checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
[[package]]
name = "bytecodec"
@@ -734,7 +725,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -960,7 +951,7 @@ checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -1065,7 +1056,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -1079,19 +1070,6 @@ dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "dmidecode"
version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "35bbcc83e06814bcafa454ec0586c41d3000db69c0451208119270c05b840247"
dependencies = [
"aho-corasick 0.6.10",
"bitflags 1.3.2",
"failure",
"failure_derive",
"lazy_static",
]
[[package]]
name = "domain"
version = "0.8.1"
@@ -1177,28 +1155,6 @@ dependencies = [
"libc",
]
[[package]]
name = "failure"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
dependencies = [
"backtrace",
"failure_derive",
]
[[package]]
name = "failure_derive"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
"synstructure",
]
[[package]]
name = "fastrand"
version = "2.0.0"
@@ -1360,7 +1316,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -1398,12 +1354,10 @@ name = "gateway"
version = "0.1.0"
dependencies = [
"anyhow",
"ctrlc",
"clap",
"firezone-gateway-connlib",
"ip_network",
"headless-utils",
"tracing",
"tracing-subscriber",
"url",
]
[[package]]
@@ -1505,13 +1459,21 @@ name = "headless"
version = "0.1.0"
dependencies = [
"anyhow",
"clap",
"firezone-client-connlib",
"headless-utils",
"tracing",
]
[[package]]
name = "headless-utils"
version = "0.1.0"
dependencies = [
"clap",
"ctrlc",
"dmidecode",
"firezone-client-connlib",
"ip_network",
"tracing",
"tracing-appender",
"tracing-subscriber",
"url",
]
@@ -1524,9 +1486,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]]
name = "hermit-abi"
version = "0.3.2"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b"
checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
[[package]]
name = "hex"
@@ -1945,9 +1907,9 @@ dependencies = [
[[package]]
name = "linux-raw-sys"
version = "0.4.5"
version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503"
checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128"
[[package]]
name = "lock_api"
@@ -2488,7 +2450,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -2537,7 +2499,7 @@ dependencies = [
"proc-macro2",
"quote",
"regex",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -2592,9 +2554,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
name = "proc-macro2"
version = "1.0.66"
version = "1.0.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328"
dependencies = [
"unicode-ident",
]
@@ -2743,7 +2705,7 @@ version = "1.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47"
dependencies = [
"aho-corasick 1.0.5",
"aho-corasick",
"memchr",
"regex-automata 0.3.8",
"regex-syntax 0.7.5",
@@ -2764,7 +2726,7 @@ version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795"
dependencies = [
"aho-corasick 1.0.5",
"aho-corasick",
"memchr",
"regex-syntax 0.7.5",
]
@@ -2920,9 +2882,9 @@ dependencies = [
[[package]]
name = "rustix"
version = "0.38.12"
version = "0.38.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bdf14a7a466ce88b5eac3da815b53aefc208ce7e74d1c263aabb04d88c4abeb1"
checksum = "747c788e9ce8e92b12cd485c49ddf90723550b654b32508f979b71a7b1ecda4f"
dependencies = [
"bitflags 2.4.0",
"errno",
@@ -2952,7 +2914,7 @@ checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8"
dependencies = [
"log",
"ring",
"rustls-webpki 0.101.4",
"rustls-webpki 0.101.6",
"sct 0.7.0",
]
@@ -2979,9 +2941,9 @@ dependencies = [
[[package]]
name = "rustls-webpki"
version = "0.100.2"
version = "0.100.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e98ff011474fa39949b7e5c0428f9b4937eda7da7848bbb947786b7be0b27dab"
checksum = "5f6a5fc258f1c1276dfe3016516945546e2d5383911efc0fc4f1cdc5df3a4ae3"
dependencies = [
"ring",
"untrusted 0.7.1",
@@ -2989,9 +2951,9 @@ dependencies = [
[[package]]
name = "rustls-webpki"
version = "0.101.4"
version = "0.101.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d"
checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe"
dependencies = [
"ring",
"untrusted 0.7.1",
@@ -3136,7 +3098,7 @@ checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -3158,9 +3120,9 @@ checksum = "cc30b1e1e8c40c121ca33b86c23308a090d19974ef001b4bf6e61fd1a0fb095c"
[[package]]
name = "sha1"
version = "0.10.5"
version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3"
checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
dependencies = [
"cfg-if 1.0.0",
"cpufeatures",
@@ -3223,9 +3185,9 @@ dependencies = [
[[package]]
name = "smallvec"
version = "1.11.0"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
[[package]]
name = "smbios-lib"
@@ -3303,7 +3265,7 @@ dependencies = [
"proc-macro2",
"quote",
"structmeta-derive",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -3314,7 +3276,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -3422,9 +3384,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.31"
version = "2.0.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398"
checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8"
dependencies = [
"proc-macro2",
"quote",
@@ -3464,9 +3426,9 @@ dependencies = [
[[package]]
name = "termcolor"
version = "1.2.0"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64"
dependencies = [
"winapi-util",
]
@@ -3480,7 +3442,7 @@ dependencies = [
"proc-macro2",
"quote",
"structmeta",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -3500,7 +3462,7 @@ checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -3593,7 +3555,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -3635,9 +3597,9 @@ dependencies = [
[[package]]
name = "tokio-util"
version = "0.7.8"
version = "0.7.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d"
checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d"
dependencies = [
"bytes",
"futures-core",
@@ -3754,7 +3716,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
]
[[package]]
@@ -3853,6 +3815,7 @@ dependencies = [
"matchers",
"nu-ansi-term",
"once_cell",
"parking_lot",
"regex",
"serde",
"serde_json",
@@ -3914,7 +3877,7 @@ dependencies = [
"log",
"rand",
"rustls 0.21.7",
"sha1 0.10.5",
"sha1 0.10.6",
"thiserror",
"url",
"utf-8",
@@ -3941,9 +3904,9 @@ dependencies = [
[[package]]
name = "typenum"
version = "1.16.0"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]]
name = "unarray"
@@ -3959,9 +3922,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
[[package]]
name = "unicode-ident"
version = "1.0.11"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]]
name = "unicode-normalization"
@@ -3974,9 +3937,9 @@ dependencies = [
[[package]]
name = "unicode-width"
version = "0.1.10"
version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
[[package]]
name = "unicode-xid"
@@ -4121,7 +4084,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
"wasm-bindgen-shared",
]
@@ -4143,7 +4106,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@@ -4190,7 +4153,7 @@ version = "0.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338"
dependencies = [
"rustls-webpki 0.100.2",
"rustls-webpki 0.100.3",
]
[[package]]
@@ -4273,7 +4236,7 @@ dependencies = [
"rustls 0.19.1",
"sec1",
"serde",
"sha1 0.10.5",
"sha1 0.10.6",
"sha2",
"subtle",
"thiserror",
@@ -4362,7 +4325,7 @@ dependencies = [
"log",
"rtcp",
"rtp",
"sha1 0.10.5",
"sha1 0.10.6",
"subtle",
"thiserror",
"tokio",
@@ -4419,9 +4382,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
version = "0.1.5"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
dependencies = [
"winapi",
]
@@ -4679,5 +4642,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.31",
"syn 2.0.37",
]

View File

@@ -2,6 +2,7 @@
members = [
"relay",
"phoenix-channel",
"connlib/headless-utils",
"connlib/clients/android",
"connlib/clients/apple",
"connlib/clients/headless",
@@ -17,11 +18,12 @@ boringtun = { git = "https://github.com/firezone/boringtun", branch = "master",
chrono = { version = "0.4", default-features = false, features = ["std", "clock", "oldtime", "serde"] }
swift-bridge = "0.1.52"
backoff = { version = "0.4", features = ["tokio"] }
tracing = { version = "0.1.37" }
tracing-subscriber = { version = "0.3.17", features = ["parking_lot"] }
# Patched to use https://github.com/rust-lang/cc-rs/pull/708
# (the `patch` section can't be used for build deps...)
[patch.crates-io]
webrtc = { git = "https://github.com/firezone/webrtc", branch = "master" }
# It seems that this contains a dependency that no longer points to a valid ref, so we'll try our luck with
# the mainline versions. The error from GH actions build pipeline copied here:
@@ -36,3 +38,7 @@ webrtc = { git = "https://github.com/firezone/webrtc", branch = "master" }
# object not found - no match for id (4ca92100c25ac2df679f0cce11c4c3e830f2e455); class=Odb (9); code=NotFound (-3)
#
# ring = { git = "https://github.com/firezone/ring", branch = "v0.16.20-cc-fix" }
webrtc = { git = "https://github.com/firezone/webrtc", branch = "master" }
[profile.release]
strip = true

View File

@@ -13,8 +13,8 @@ mock = ["firezone-client-connlib/mock"]
[dependencies]
tracing-android = "0.2"
tracing = { version = "0.1", features = ["std", "attributes"] }
tracing-subscriber = "0.3"
tracing = { workspace = true, features = ["std", "attributes"] }
tracing-subscriber = { workspace = true }
tracing-appender = "0.2"
firezone-client-connlib = { path = "../../libs/client" }
jni = { version = "0.21.1", features = ["invocation"] }
@@ -22,3 +22,6 @@ ip_network = "0.4"
log = "0.4"
serde_json = "1"
thiserror = "1"
[target.'cfg(target_os = "android")'.dependencies]
tracing-android = "0.2"

View File

@@ -81,9 +81,23 @@ fn call_method(
.map_err(|source| CallbackError::CallMethodFailed { name, source })
}
fn init_logging(log_dir: PathBuf) {
static LOGGING_GUARD: OnceLock<WorkerGuard> = OnceLock::new();
#[cfg(target_os = "android")]
fn android_layer<S>() -> impl tracing_subscriber::Layer<S>
where
S: tracing::Subscriber + for<'span> tracing_subscriber::registry::LookupSpan<'span>,
{
tracing_android::layer("connlib").unwrap()
}
#[cfg(not(target_os = "android"))]
fn android_layer<S>() -> impl tracing_subscriber::Layer<S>
where
S: tracing::Subscriber,
{
tracing_subscriber::layer::Identity::new()
}
fn init_logging(log_dir: PathBuf, log_filter: String) {
// On Android, logging state is persisted indefinitely after the System.loadLibrary
// call, which means that a disconnect and tunnel process restart will not
// reinitialize the guard. This is a problem because the guard remains tied to
@@ -92,11 +106,12 @@ fn init_logging(log_dir: PathBuf) {
//
// So we use a static variable to track whether the guard has been initialized and avoid
// re-initialized it if so.
static LOGGING_GUARD: OnceLock<WorkerGuard> = OnceLock::new();
if LOGGING_GUARD.get().is_some() {
return;
}
let (file_layer, guard) = file_logger::layer(log_dir);
let (file_layer, guard) = file_logger::layer(log_dir, log_filter);
LOGGING_GUARD
.set(guard)
@@ -104,7 +119,7 @@ fn init_logging(log_dir: PathBuf) {
let _ = tracing_subscriber::registry()
.with(file_layer)
.with(tracing_android::layer("connlib").unwrap())
.with(android_layer())
.try_init();
}
@@ -304,48 +319,39 @@ enum ConnectError {
ConnectFailed(#[from] Error),
}
macro_rules! string_from_jstring {
($env:expr, $j:ident) => {
String::from(
($env)
.get_string(&($j))
.map_err(|source| ConnectError::StringInvalid {
name: stringify!($j),
source,
})?,
)
};
}
fn connect(
env: &mut JNIEnv,
portal_url: JString,
portal_token: JString,
device_id: JString,
log_dir: JString,
log_filter: JString,
callback_handler: GlobalRef,
) -> Result<Session<CallbackHandler>, ConnectError> {
let portal_url = String::from(env.get_string(&portal_url).map_err(|source| {
ConnectError::StringInvalid {
name: "portal_url",
source,
}
})?);
let portal_token = String::from(env.get_string(&portal_token).map_err(|source| {
ConnectError::StringInvalid {
name: "portal_token",
source,
}
})?);
let device_id =
String::from(
env.get_string(&device_id)
.map_err(|source| ConnectError::StringInvalid {
name: "device_id",
source,
})?,
);
let log_dir =
String::from(
env.get_string(&log_dir)
.map_err(|source| ConnectError::StringInvalid {
name: "log_dir",
source,
})?,
);
let portal_url = string_from_jstring!(env, portal_url);
let portal_token = string_from_jstring!(env, portal_token);
let device_id = string_from_jstring!(env, device_id);
let log_dir = string_from_jstring!(env, log_dir);
let log_filter = string_from_jstring!(env, log_filter);
let callback_handler = CallbackHandler {
vm: env.get_java_vm().map_err(ConnectError::GetJavaVmFailed)?,
callback_handler,
};
init_logging(log_dir.into());
init_logging(log_dir.into(), log_filter.into());
Session::connect(
portal_url.as_str(),
@@ -368,6 +374,7 @@ pub unsafe extern "system" fn Java_dev_firezone_android_tunnel_TunnelSession_con
portal_token: JString,
device_id: JString,
log_dir: JString,
log_filter: JString,
callback_handler: JObject,
) -> *const Session<CallbackHandler> {
let Ok(callback_handler) = env.new_global_ref(callback_handler) else {
@@ -381,6 +388,7 @@ pub unsafe extern "system" fn Java_dev_firezone_android_tunnel_TunnelSession_con
portal_token,
device_id,
log_dir,
log_filter,
callback_handler,
)
}) {

View File

@@ -18,7 +18,7 @@ libc = "0.2"
swift-bridge = { workspace = true }
firezone-client-connlib = { path = "../../libs/client" }
serde_json = "1"
tracing = "0.1"
tracing = { workspace = true }
# TODO: https://github.com/Absolucy/tracing-oslog/pull/9
tracing-oslog = { git = "https://github.com/sbag13/tracing-oslog", rev = "0f82b8051c65de86191e1350afc7a26d5c670c29" }
tracing-subscriber = "0.3"

View File

@@ -23,6 +23,7 @@ mod ffi {
token: String,
device_id: String,
log_dir: String,
log_filter: String,
callback_handler: CallbackHandler,
) -> Result<WrappedSession, String>;
@@ -136,8 +137,8 @@ impl Callbacks for CallbackHandler {
}
}
fn init_logging(log_dir: PathBuf) -> WorkerGuard {
let (file_layer, guard) = file_logger::layer(log_dir.clone());
fn init_logging(log_dir: PathBuf, log_filter: String) -> WorkerGuard {
let (file_layer, guard) = file_logger::layer(log_dir.clone(), log_filter);
let _ = tracing_subscriber::registry()
.with(tracing_oslog::OsLogger::new(
@@ -156,9 +157,10 @@ impl WrappedSession {
token: String,
device_id: String,
log_dir: String,
log_filter: String,
callback_handler: ffi::CallbackHandler,
) -> Result<Self, String> {
let _guard = init_logging(log_dir.into());
let _guard = init_logging(log_dir.into(), log_filter);
let session = Session::connect(
portal_url.as_str(),

View File

@@ -6,13 +6,8 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
dmidecode = "0.7"
firezone-client-connlib = { path = "../../libs/client" }
ip_network = "0.4"
url = { version = "2.4.1", default-features = false }
tracing-subscriber = { version = "0.3" }
tracing = { version = "0.1" }
tracing-appender = "0.2"
headless-utils = { path = "../../headless-utils" }
anyhow = { version = "1.0" }
clap = { version = "4.4", features = ["derive"] }
ctrlc = "3.4"
tracing = { workspace = true }
clap = { version = "4.4", features = ["derive", "env"] }

View File

@@ -1,134 +1,20 @@
use anyhow::{Context, Result};
use anyhow::Result;
use clap::Parser;
use ip_network::IpNetwork;
use std::{
net::{Ipv4Addr, Ipv6Addr},
os::fd::RawFd,
path::PathBuf,
str::FromStr,
};
use tracing_appender::non_blocking::WorkerGuard;
use tracing_subscriber::{fmt, prelude::*};
use firezone_client_connlib::{
file_logger, get_device_id, get_user_agent, Callbacks, Error, ResourceDescription, Session,
};
use url::Url;
#[derive(Clone)]
pub struct CallbackHandler;
impl Callbacks for CallbackHandler {
type Error = std::convert::Infallible;
fn on_set_interface_config(
&self,
_tunnel_address_v4: Ipv4Addr,
_tunnel_address_v6: Ipv6Addr,
_dns_address: Ipv4Addr,
_dns_fallback_strategy: String,
) -> Result<RawFd, Self::Error> {
Ok(-1)
}
fn on_tunnel_ready(&self) -> Result<(), Self::Error> {
tracing::trace!("Tunnel connected");
Ok(())
}
fn on_add_route(&self, _route: IpNetwork) -> Result<(), Self::Error> {
Ok(())
}
fn on_remove_route(&self, _route: IpNetwork) -> Result<(), Self::Error> {
Ok(())
}
fn on_update_resources(
&self,
resource_list: Vec<ResourceDescription>,
) -> Result<(), Self::Error> {
tracing::trace!(message = "Resources updated", ?resource_list);
Ok(())
}
fn on_disconnect(&self, error: Option<&Error>) -> Result<(), Self::Error> {
tracing::trace!("Tunnel disconnected: {error:?}");
// Note that we can't panic here, since we already hooked the panic to this function.
std::process::exit(0);
}
fn on_error(&self, error: &Error) -> Result<(), Self::Error> {
tracing::warn!("Encountered recoverable error: {error}");
Ok(())
}
}
const URL_ENV_VAR: &str = "FZ_URL";
const SECRET_ENV_VAR: &str = "FZ_SECRET";
const LOG_DIR_ENV_VAR: &str = "FZ_LOG_DIR";
const DEFAULT_LOG_DIR: &str = "/var/log/firezone";
fn block_on_ctrl_c() {
let (tx, rx) = std::sync::mpsc::channel();
ctrlc::set_handler(move || tx.send(()).expect("Could not send stop signal on channel."))
.expect("Error setting Ctrl-C handler");
rx.recv().expect("Could not receive ctrl-c signal");
}
fn init_logging(log_dir: PathBuf) -> WorkerGuard {
let (file_layer, guard) = file_logger::layer(log_dir);
// Calling init twice causes a panic; instead use try_init which will fail
// gracefully if this is called more than once.
let _ = tracing_subscriber::registry()
.with(fmt::layer())
.with(file_layer)
.try_init();
guard
}
use firezone_client_connlib::{get_device_id, Session};
use headless_utils::{block_on_ctrl_c, setup_global_subscriber, Cli, HeadlessCallbackHandler};
fn main() -> Result<()> {
let cli = Cli::parse();
if cli.print_agent {
println!("{}", get_user_agent());
return Ok(());
}
let _guard = setup_global_subscriber(cli.log_dir);
// TODO: allow passing as arg vars
let url = parse_env_var::<Url>(URL_ENV_VAR)?;
let secret = parse_env_var::<String>(SECRET_ENV_VAR)?;
let device_id = get_device_id();
let log_dir = parse_env_var::<PathBuf>(LOG_DIR_ENV_VAR).unwrap_or(DEFAULT_LOG_DIR.into());
let _guard = init_logging(log_dir);
let mut session = Session::connect(url, secret, device_id, CallbackHandler).unwrap();
tracing::info!("Started new session");
let mut session =
Session::connect(cli.url, cli.secret, device_id, HeadlessCallbackHandler).unwrap();
tracing::info!("new_session");
block_on_ctrl_c();
session.disconnect(None);
Ok(())
}
fn parse_env_var<T>(key: &str) -> Result<T>
where
T: FromStr,
T::Err: std::error::Error + Send + Sync + 'static,
{
let res = std::env::var(key)
.with_context(|| format!("`{key}` env variable is unset"))?
.parse()
.with_context(|| format!("failed to parse {key} env variable"))?;
Ok(res)
}
// probably will change this to a subcommand in the future
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Cli {
#[arg(short, long)]
print_agent: bool,
}

View File

@@ -7,9 +7,7 @@ edition = "2021"
[dependencies]
firezone-gateway-connlib = { path = "../libs/gateway" }
ip_network = "0.4"
url = { version = "2.4.1", default-features = false }
tracing-subscriber = { version = "0.3" }
tracing = { version = "0.1" }
headless-utils = { path = "../headless-utils" }
anyhow = { version = "1.0" }
ctrlc = "3.4"
tracing = { workspace = true }
clap = { version = "4.3", features = ["derive", "env"] }

View File

@@ -1,92 +1,19 @@
use anyhow::{Context, Result};
use ip_network::IpNetwork;
use std::os::fd::RawFd;
use std::{
net::{Ipv4Addr, Ipv6Addr},
str::FromStr,
};
use firezone_gateway_connlib::{get_device_id, Callbacks, Error, ResourceDescription, Session};
use url::Url;
#[derive(Clone)]
pub struct CallbackHandler;
impl Callbacks for CallbackHandler {
type Error = std::convert::Infallible;
fn on_set_interface_config(
&self,
_tunnel_address_v4: Ipv4Addr,
_tunnel_address_v6: Ipv6Addr,
_dns_address: Ipv4Addr,
_dns_fallback_strategy: String,
) -> Result<RawFd, Self::Error> {
Ok(-1)
}
fn on_tunnel_ready(&self) -> Result<(), Self::Error> {
tracing::trace!("Tunnel connected with address");
Ok(())
}
fn on_add_route(&self, _route: IpNetwork) -> Result<(), Self::Error> {
Ok(())
}
fn on_remove_route(&self, _route: IpNetwork) -> Result<(), Self::Error> {
Ok(())
}
fn on_update_resources(
&self,
resource_list: Vec<ResourceDescription>,
) -> Result<(), Self::Error> {
tracing::trace!("Resources updated, current list: {resource_list:?}");
Ok(())
}
fn on_disconnect(&self, error: Option<&Error>) -> Result<(), Self::Error> {
tracing::warn!("Tunnel disconnected: {error:?}");
// Note that we can't panic here, since we already hooked the panic to this function.
std::process::exit(0);
}
fn on_error(&self, error: &Error) -> Result<(), Self::Error> {
tracing::warn!("Encountered recoverable error: {error}");
Ok(())
}
}
const URL_ENV_VAR: &str = "FZ_URL";
const SECRET_ENV_VAR: &str = "FZ_SECRET";
use anyhow::Result;
use clap::Parser;
use firezone_gateway_connlib::{get_device_id, Session};
use headless_utils::{block_on_ctrl_c, setup_global_subscriber, Cli, HeadlessCallbackHandler};
fn main() -> Result<()> {
tracing_subscriber::fmt::init();
// TODO: allow passing as arg vars
let url = parse_env_var::<Url>(URL_ENV_VAR)?;
let secret = parse_env_var::<String>(SECRET_ENV_VAR)?;
let device_id = get_device_id();
let mut session = Session::connect(url, secret, device_id, CallbackHandler).unwrap();
let cli = Cli::parse();
let _guard = setup_global_subscriber(cli.log_dir);
let (tx, rx) = std::sync::mpsc::channel();
ctrlc::set_handler(move || tx.send(()).expect("Could not send stop signal on channel."))
.expect("Error setting Ctrl-C handler");
rx.recv().expect("Could not receive ctrl-c signal");
let device_id = get_device_id();
let mut session =
Session::connect(cli.url, cli.secret, device_id, HeadlessCallbackHandler).unwrap();
tracing::info!("new_session");
block_on_ctrl_c();
session.disconnect(None);
Ok(())
}
fn parse_env_var<T>(key: &str) -> Result<T>
where
T: FromStr,
T::Err: std::error::Error + Send + Sync + 'static,
{
let res = std::env::var(key)
.with_context(|| format!("`{key}` env variable is unset"))?
.parse()
.with_context(|| format!("failed to parse {key} env variable"))?;
Ok(res)
}

View File

@@ -0,0 +1,15 @@
[package]
name = "headless-utils"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
firezone-client-connlib = { path = "../libs/client" }
ip_network = "0.4"
url = { version = "2.3.1", default-features = false }
tracing-subscriber = { workspace = true }
tracing = { workspace = true }
clap = { version = "4.3", features = ["derive", "env"] }
ctrlc = "3.4"

View File

@@ -0,0 +1,100 @@
use clap::Parser;
use ip_network::IpNetwork;
use std::{
net::{Ipv4Addr, Ipv6Addr},
os::fd::RawFd,
path::PathBuf,
};
use tracing_subscriber::{prelude::__tracing_subscriber_SubscriberExt, EnvFilter, Layer, Registry};
use firezone_client_connlib::{file_logger, Callbacks, Error, ResourceDescription, WorkerGuard};
use url::Url;
#[derive(Clone)]
pub struct HeadlessCallbackHandler;
impl Callbacks for HeadlessCallbackHandler {
type Error = std::convert::Infallible;
fn on_set_interface_config(
&self,
_tunnel_address_v4: Ipv4Addr,
_tunnel_address_v6: Ipv6Addr,
_dns_address: Ipv4Addr,
_dns_fallback_strategy: String,
) -> Result<RawFd, Self::Error> {
Ok(-1)
}
fn on_tunnel_ready(&self) -> Result<(), Self::Error> {
tracing::trace!("tunnel_connected");
Ok(())
}
fn on_add_route(&self, _route: IpNetwork) -> Result<(), Self::Error> {
Ok(())
}
fn on_remove_route(&self, _route: IpNetwork) -> Result<(), Self::Error> {
Ok(())
}
fn on_update_resources(
&self,
resource_list: Vec<ResourceDescription>,
) -> Result<(), Self::Error> {
tracing::trace!(?resource_list, "resource_updated");
Ok(())
}
fn on_disconnect(&self, error: Option<&Error>) -> Result<(), Self::Error> {
tracing::trace!(error = ?error, "tunnel_disconnected");
// Note that we can't panic here, since we already hooked the panic to this function.
std::process::exit(0);
}
fn on_error(&self, error: &Error) -> Result<(), Self::Error> {
tracing::warn!(error = ?error);
Ok(())
}
}
pub fn block_on_ctrl_c() {
let (tx, rx) = std::sync::mpsc::channel();
ctrlc::set_handler(move || tx.send(()).expect("Could not send stop signal on channel."))
.expect("Error setting Ctrl-C handler");
rx.recv().expect("Could not receive ctrl-c signal");
}
pub fn setup_global_subscriber(log_dir: Option<PathBuf>) -> Option<WorkerGuard> {
let fmt_subscriber =
tracing_subscriber::fmt::layer().with_filter(EnvFilter::from_default_env());
let guard = if let Some(log_dir) = log_dir {
let (file_logger, guard) = file_logger::layer(log_dir, EnvFilter::from_default_env());
let subscriber = Registry::default().with(fmt_subscriber).with(file_logger);
tracing::subscriber::set_global_default(subscriber).expect("Could not set global default");
Some(guard)
} else {
let subscriber = Registry::default().with(fmt_subscriber);
tracing::subscriber::set_global_default(subscriber).expect("Could not set global default");
None
};
guard
}
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
pub struct Cli {
/// Portal's websocket url
#[arg(short, long, env = "FZ_URL")]
pub url: Url,
/// Service token
#[arg(short, long, env = "FZ_SECRET")]
pub secret: String,
/// File logging directory optionally
#[arg(short, long, env = "FZ_LOG_DIR")]
pub log_dir: Option<PathBuf>,
}

View File

@@ -8,10 +8,10 @@ mock = ["libs-common/mock"]
[dependencies]
tokio = { version = "1.32", default-features = false, features = ["sync"] }
tracing = { version = "0.1", default-features = false, features = ["std", "attributes"] }
tracing-appender = "0.2"
tracing-stackdriver = "0.7.2"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
tracing = { workspace = true }
tracing-subscriber = { workspace = true, features = ["env-filter"] }
tracing-appender = { version = "0.2.2" }
tracing-stackdriver = { version = "0.7.2" }
async-trait = { version = "0.1", default-features = false }
libs-common = { path = "../common" }
firezone-tunnel = { path = "../tunnel" }
@@ -20,9 +20,9 @@ boringtun = { workspace = true }
backoff = { workspace = true }
[target.'cfg(target_os = "android")'.dependencies]
tracing = { version = "0.1", default-features = false, features = ["std", "attributes"] }
tracing = { workspace = true, features = ["std", "attributes"] }
tracing-android = "0.2"
[dev-dependencies]
serde_json = { version = "1.0", default-features = false, features = ["std"] }
serde_json = { version = "1.0", features = ["std"] }
chrono = { workspace = true }

View File

@@ -70,7 +70,7 @@ impl<CB: Callbacks + 'static> ControlPlane<CB> {
Ok(())
}
#[tracing::instrument(level = "trace", skip_all)]
#[tracing::instrument(level = "trace", skip(self))]
async fn init(
&mut self,
InitClient {
@@ -252,7 +252,7 @@ impl<CB: Callbacks + 'static> ControlPlane<CB> {
}
pub(super) async fn stats_event(&mut self) {
tracing::debug!(target: "tunnel_state", "{:#?}", self.tunnel.stats());
tracing::debug!(target: "tunnel_state", stats = ?self.tunnel.stats());
}
}

View File

@@ -14,14 +14,15 @@
//! - MAC addresses
use std::path::PathBuf;
use tracing::{level_filters::LevelFilter, Subscriber};
use tracing_subscriber::Layer;
use tracing::Subscriber;
use tracing_subscriber::{EnvFilter, Layer};
const LOG_FILE_BASE_NAME: &str = "connlib.log";
/// Create a new file logger layer.
pub fn layer<T>(
log_dir: PathBuf,
env_filter: impl Into<EnvFilter>,
) -> (
Box<dyn Layer<T> + Send + Sync + 'static>,
tracing_appender::non_blocking::WorkerGuard,
@@ -29,12 +30,6 @@ pub fn layer<T>(
where
T: Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>,
{
#[cfg(debug_assertions)]
let level = LevelFilter::DEBUG;
#[cfg(not(debug_assertions))]
let level = LevelFilter::WARN;
let (writer, guard) = tracing_appender::non_blocking(tracing_appender::rolling::hourly(
log_dir,
LOG_FILE_BASE_NAME,
@@ -42,7 +37,7 @@ where
let layer = tracing_stackdriver::layer()
.with_writer(writer)
.with_filter(level)
.with_filter(env_filter.into())
.boxed();
// Return the guard so that the caller maintains a handle to it. Otherwise,

View File

@@ -19,8 +19,7 @@ pub type Session<CB> = libs_common::Session<
CB,
>;
pub use libs_common::{
get_device_id, get_user_agent, messages::ResourceDescription, Callbacks, Error,
};
pub use libs_common::{get_device_id, messages::ResourceDescription, Callbacks, Error};
use messages::Messages;
use messages::ReplyMessages;
pub use tracing_appender::non_blocking::WorkerGuard;

View File

@@ -17,7 +17,7 @@ tokio-tungstenite = { version = "0.19", default-features = false, features = ["c
webrtc = { version = "0.8" }
uuid = { version = "1.4", default-features = false, features = ["std", "v4", "serde"] }
thiserror = { version = "1.0", default-features = false }
tracing = { version = "0.1", default-features = false, features = ["std", "attributes"] }
tracing = { workspace = true }
serde_json = { version = "1.0", default-features = false, features = ["std"] }
tokio = { version = "1.32", default-features = false, features = ["rt", "rt-multi-thread"]}
url = { version = "2.4.1", default-features = false }

View File

@@ -319,6 +319,7 @@ where
// `connection.start` calls the callback only after connecting
tracing::debug!("Attempting connection to portal...");
let result = connection.start(vec![topic.clone()], || exponential_backoff.reset()).await;
tracing::warn!("Disconnected from the portal");
if let Err(e) = &result {
tracing::warn!(error = ?e, "Portal connection error");
}

View File

@@ -8,7 +8,7 @@ libs-common = { path = "../common" }
async-trait = { version = "0.1", default-features = false }
firezone-tunnel = { path = "../tunnel" }
tokio = { version = "1.32", default-features = false, features = ["sync"] }
tracing = { version = "0.1", default-features = false, features = ["std", "attributes"] }
tracing = { workspace = true }
serde = { version = "1.0", default-features = false, features = ["std", "derive"] }
boringtun = { workspace = true }
chrono = { workspace = true }

View File

@@ -63,7 +63,7 @@ impl<CB: Callbacks + 'static> ControlPlane<CB> {
Ok(())
}
#[tracing::instrument(level = "trace", skip_all)]
#[tracing::instrument(level = "trace", skip(self))]
async fn init(&mut self, init: InitGateway) -> Result<()> {
if let Err(e) = self.tunnel.set_interface(&init.interface).await {
tracing::error!("Couldn't initialize interface: {e}");

View File

@@ -11,7 +11,7 @@ rand_core = { version = "0.6", default-features = false, features = ["getrandom"
serde = { version = "1.0", default-features = false, features = ["derive", "std"] }
futures = { version = "0.3", default-features = false, features = ["std", "async-await", "executor"] }
futures-util = { version = "0.3", default-features = false, features = ["std", "async-await", "async-await-macro"] }
tracing = { version = "0.1", default-features = false, features = ["std", "attributes"] }
tracing = { workspace = true }
parking_lot = { version = "0.12", default-features = false }
bytes = { version = "1.4", default-features = false, features = ["std"] }
itertools = { version = "0.11", default-features = false, features = ["use_std"] }

View File

@@ -1,7 +1,7 @@
#!/bin/bash
if [[ "${ENABLE_MASQUERADE}" == "1" ]]; then
IFACE="utun"
IFACE="tun-firezone"
iptables -A FORWARD -i $IFACE -j ACCEPT
iptables -A FORWARD -o $IFACE -j ACCEPT
iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE

View File

@@ -10,7 +10,7 @@ tokio-tungstenite = { version = "0.19.0", features = ["rustls-tls-native-roots"]
futures = "0.3.28"
base64 = "0.21.4"
serde = { version = "1.0.188", features = ["derive"] }
tracing = "0.1.37"
tracing = { workspace = true }
rand_core = "0.6.4"
url = "2.4.1"
serde_json = "1.0.107"

View File

@@ -13,8 +13,8 @@ hex-literal = "0.4.1"
rand = "0.8.5"
stun_codec = "0.3.3"
tokio = { version = "1.32.0", features = ["macros", "rt-multi-thread", "net", "time"] }
tracing = { version = "0.1.37", features = ["log"] }
tracing-subscriber = { version = "0.3", features = ["env-filter", "json", "fmt"] }
tracing = { workspace = true, features = ["log"] }
tracing-subscriber = { workspace = true, features = ["env-filter", "json", "fmt"] }
tracing-stackdriver = { version = "0.7.2", features = ["opentelemetry"] }
tracing-opentelemetry = "0.19.0"
opentelemetry = { version = "0.19.0", features = ["rt-tokio", "metrics"] }

View File

@@ -148,6 +148,9 @@ public class Adapter {
self.state = .startingTunnel(
session: try WrappedSession.connect(
self.controlPlaneURLString, self.token, self.getDeviceId(), self.logDir,
// TODO: make logging string depend on build config #2067
// Docs on filter strings: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html
"connlib_apple=info,firezone_tunnel=info,libs_common=info,firezone_client_connlib=info,warn",
self.callbackHandler),
onStarted: completionHandler
)
@@ -285,6 +288,8 @@ extension Adapter {
self.state = .startingTunnel(
session: try WrappedSession.connect(
controlPlaneURLString, token, self.getDeviceId(), logDir,
// TODO: make logging string depend on build config #2067
"connlib_apple=info,firezone_tunnel=info,libs_common=info,firezone_client_connlib=info,warn",
self.callbackHandler),
onStarted: { error in
if let error = error {