From 7a1c5ab7a07fd84ce1193ef789fe5ded98c880b0 Mon Sep 17 00:00:00 2001 From: Martin Hoffmann Date: Mon, 20 Nov 2023 15:39:14 +0100 Subject: [PATCH] Introduce daemonbase and use it for logging. --- Cargo.lock | 456 +++++++++++++++++++++++++------------------ Cargo.toml | 3 +- src/config.rs | 131 +++---------- src/http.rs | 6 +- src/lib.rs | 2 +- src/log.rs | 458 -------------------------------------------- src/main.rs | 22 +-- src/manager.rs | 2 +- src/payload.rs | 2 +- src/targets/http.rs | 2 +- src/targets/mod.rs | 2 +- src/targets/rtr.rs | 30 +-- src/units/json.rs | 2 +- src/units/rtr.rs | 2 +- src/units/slurm.rs | 2 +- 15 files changed, 333 insertions(+), 789 deletions(-) delete mode 100644 src/log.rs diff --git a/Cargo.lock b/Cargo.lock index 71b5caf..32520c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -33,22 +33,59 @@ dependencies = [ ] [[package]] -name = "arc-swap" -version = "1.6.0" +name = "anstream" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] -name = "atty" -version = "0.2.14" +name = "anstyle-parse" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys", ] +[[package]] +name = "anstyle-wincon" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "arc-swap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" + [[package]] name = "autocfg" version = "1.1.0" @@ -72,9 +109,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.4" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "bcder" @@ -92,6 +129,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + [[package]] name = "bumpalo" version = "3.14.0" @@ -136,29 +179,50 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.25" +version = "4.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" dependencies = [ - "atty", - "bitflags", + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" +dependencies = [ + "anstream", + "anstyle", "clap_lex", - "indexmap 1.9.3", - "once_cell", "strsim", - "termcolor", - "textwrap", ] [[package]] -name = "clap_lex" -version = "0.2.4" +name = "clap_derive" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ - "os_str_bytes", + "heck", + "proc-macro2", + "quote", + "syn", ] +[[package]] +name = "clap_lex" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "core-foundation" version = "0.9.3" @@ -184,6 +248,20 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "daemonbase" +version = "0.1.0-dev" +source = "git+https://github.com/NLnetLabs/daemonbase.git#59d7fd6a0bee102c941af4f26e3c6e00b9cfaf3b" +dependencies = [ + "chrono", + "clap", + "log", + "nix", + "serde", + "syslog", + "toml_edit 0.20.7", +] + [[package]] name = "deranged" version = "0.3.9" @@ -243,9 +321,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -258,9 +336,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -268,15 +346,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -285,15 +363,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", @@ -302,21 +380,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -332,9 +410,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if", "libc", @@ -349,9 +427,9 @@ checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "h2" -version = "0.3.21" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -359,7 +437,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap", "slab", "tokio", "tokio-util", @@ -368,24 +446,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" [[package]] -name = "hashbrown" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" - -[[package]] -name = "hermit-abi" -version = "0.1.19" +name = "heck" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" @@ -406,9 +475,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -455,7 +524,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -464,9 +533,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http", @@ -511,29 +580,19 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.1", + "hashbrown", ] [[package]] name = "ipnet" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "itoa" @@ -543,18 +602,18 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" dependencies = [ "wasm-bindgen", ] [[package]] name = "libc" -version = "0.2.149" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "log" @@ -602,15 +661,26 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi", "windows-sys", ] +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.4.1", + "cfg-if", + "libc", +] + [[package]] name = "num-traits" version = "0.2.17" @@ -626,7 +696,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi", "libc", ] @@ -654,12 +724,6 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" -[[package]] -name = "os_str_bytes" -version = "6.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" - [[package]] name = "percent-encoding" version = "2.3.0" @@ -796,12 +860,26 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", - "untrusted", + "spin 0.5.2", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +dependencies = [ + "cc", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys", +] + [[package]] name = "rpki" version = "0.17.2" @@ -814,12 +892,12 @@ dependencies = [ "chrono", "futures-util", "log", - "ring", + "ring 0.16.20", "serde", "serde_json", "tokio", "tokio-stream", - "untrusted", + "untrusted 0.7.1", "uuid", ] @@ -831,6 +909,7 @@ dependencies = [ "chrono", "clap", "crossbeam-utils", + "daemonbase", "fern", "futures", "hyper", @@ -863,33 +942,33 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustls" -version = "0.21.7" +version = "0.21.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" dependencies = [ "log", - "ring", + "ring 0.17.5", "rustls-webpki", "sct", ] [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ "base64", ] [[package]] name = "rustls-webpki" -version = "0.101.6" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring", - "untrusted", + "ring 0.17.5", + "untrusted 0.9.0", ] [[package]] @@ -900,28 +979,28 @@ checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring", - "untrusted", + "ring 0.17.5", + "untrusted 0.9.0", ] [[package]] name = "serde" -version = "1.0.189" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.189" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", @@ -930,9 +1009,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", @@ -941,9 +1020,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" dependencies = [ "serde", ] @@ -971,15 +1050,15 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", @@ -987,9 +1066,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys", @@ -1001,6 +1080,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "strsim" version = "0.10.0" @@ -1009,9 +1094,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "2.0.38" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", @@ -1037,7 +1122,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "system-configuration-sys", ] @@ -1052,21 +1137,6 @@ dependencies = [ "libc", ] -[[package]] -name = "termcolor" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "textwrap" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" - [[package]] name = "time" version = "0.3.30" @@ -1115,9 +1185,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.33.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ "backtrace", "bytes", @@ -1125,16 +1195,16 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", - "socket2 0.5.4", + "socket2 0.5.5", "tokio-macros", "windows-sys", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", @@ -1164,9 +1234,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -1178,32 +1248,43 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.2" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.21.0", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.20.2" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.0.2", + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +dependencies = [ + "indexmap", "serde", "serde_spanned", "toml_datetime", @@ -1218,9 +1299,9 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.39" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2ef2af84856a50c1d430afce2fdded0a4ec7eda868db86409b4543df0797f9" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "pin-project-lite", "tracing-core", @@ -1268,6 +1349,12 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.4.1" @@ -1280,11 +1367,17 @@ dependencies = [ "serde", ] +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "uuid" -version = "1.4.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" [[package]] name = "version_check" @@ -1309,9 +1402,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1319,9 +1412,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" dependencies = [ "bumpalo", "log", @@ -1334,9 +1427,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" dependencies = [ "cfg-if", "js-sys", @@ -1346,9 +1439,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1356,9 +1449,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", @@ -1369,15 +1462,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" dependencies = [ "js-sys", "wasm-bindgen", @@ -1405,15 +1498,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" -dependencies = [ - "winapi", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -1497,9 +1581,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winnow" -version = "0.5.17" +version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c" +checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index acef6e2..fdfa9ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,8 +13,9 @@ readme = "README.md" [dependencies] arc-swap = "1.0" chrono = "0.4.31" -clap = { version = "3.0", features = [ "cargo" ] } +clap = { version = "4", features = [ "cargo", "derive" ] } crossbeam-utils = "0.8.4" +daemonbase = { git = "https://github.com/NLnetLabs/daemonbase.git" } fern = "0.6.0" futures = "0.3" hyper = { version = "0.14.8", features = [ "server", "stream" ] } diff --git a/src/config.rs b/src/config.rs index 79d030e..3d4547f 100644 --- a/src/config.rs +++ b/src/config.rs @@ -6,14 +6,15 @@ //! file referred to in command line options. use std::{borrow, error, fmt, fs, io, ops}; -use std::cell::RefCell; -use std::path::{Path, PathBuf}; +use std::path::Path; use std::sync::Arc; -use clap::{Arg, ArgMatches, Command}; +use clap::{Args as _, FromArgMatches}; +use daemonbase::logging; +use daemonbase::config::ConfigPath; +use daemonbase::error::Failed; use serde::Deserialize; use toml::Spanned; use crate::http; -use crate::log::{ExitError, Failed, LogConfig}; use crate::manager::{Manager, TargetSet, UnitSet}; @@ -39,7 +40,7 @@ pub struct Config { /// The logging configuration. #[serde(flatten)] - pub log: LogConfig, + pub log: logging::Config, /// The HTTP server configuration. #[serde(flatten)] @@ -47,11 +48,11 @@ pub struct Config { } impl Config { - /// Initialises everything. + /// Adds the basic arguments to a Clap command. /// - /// This function should be called first thing. - pub fn init() -> Result<(), ExitError> { - LogConfig::init_logging() + /// Returns the command with the arguments added. + pub fn config_args(app: clap::Command) -> clap::Command { + Args::augment_args(app) } /// Creates a configuration from a bytes slice with TOML data. @@ -66,20 +67,6 @@ impl Config { res } - /// Configures a clap app with the arguments to load the configuration. - pub fn config_args(app: Command) -> Command { - let app = app.arg( - Arg::new("config") - .short('c') - .long("config") - .required(true) - .takes_value(true) - .value_name("PATH") - .help("Read base configuration from this file") - ); - LogConfig::config_args(app) - } - /// Loads the configuration based on command line options provided. /// /// The `matches` must be the result of getting argument matches from a @@ -91,30 +78,42 @@ impl Config { /// paths. The manager is necessary to resolve links given in the /// configuration. pub fn from_arg_matches( - matches: &ArgMatches, - cur_dir: &Path, + matches: &clap::ArgMatches, manager: &mut Manager, ) -> Result { - let conf_path = cur_dir.join(matches.value_of("config").unwrap()); - let conf = match ConfigFile::load(&conf_path) { + let args = Args::from_arg_matches( + matches + ).expect("bug in command line arguments parser"); + let conf = match ConfigFile::load(&args.config) { Ok(conf) => conf, Err(err) => { eprintln!( "Failed to read config file '{}': {}", - conf_path.display(), + args.config.display(), err ); return Err(Failed) } }; let mut res = manager.load(conf)?; - res.log.update_with_arg_matches(matches, cur_dir)?; - res.log.switch_logging(false)?; + res.log.apply_args(&args.log); Ok(res) } } +//------------ Args ---------------------------------------------------------- + +#[derive(clap::Parser)] +pub struct Args { + #[arg(short, long)] + pub config: ConfigPath, + + #[command(flatten)] + pub log: logging::Args, +} + + //------------ Source -------------------------------------------------------- /// Description of the source of configuration. @@ -370,75 +369,3 @@ impl fmt::Display for ConfigError { impl error::Error for ConfigError { } - -//------------ ConfigPath ---------------------------------------------------- - -/// A path that encountered in a config file. -/// -/// This is a basically a `PathBuf` that, when, deserialized resolves all -/// relative paths from a certain base path so that all relative paths -/// encountered in a config file are automatically resolved relative to the -/// location of the config file. -#[derive( - Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd -)] -#[serde(from = "String")] -pub struct ConfigPath(PathBuf); - -impl ConfigPath { - thread_local!( - static BASE_PATH: RefCell> = RefCell::new(None) - ); - - fn set_base_path(path: PathBuf) { - Self::BASE_PATH.with(|base_path| { - base_path.replace(Some(path)); - }) - } - - fn clear_base_path() { - Self::BASE_PATH.with(|base_path| { - base_path.replace(None); - }) - } -} - -impl From for ConfigPath { - fn from(path: PathBuf) -> Self { - Self(path) - } -} - -impl From for PathBuf { - fn from(path: ConfigPath) -> Self { - path.0 - } -} - -impl From for ConfigPath { - fn from(path: String) -> Self { - Self::BASE_PATH.with(|base_path| { - ConfigPath( - match base_path.borrow().as_ref() { - Some(base_path) => base_path.join(path.as_str()), - None => path.into() - } - ) - }) - } -} - -impl ops::Deref for ConfigPath { - type Target = Path; - - fn deref(&self) -> &Self::Target { - self.0.as_ref() - } -} - -impl AsRef for ConfigPath { - fn as_ref(&self) -> &Path { - self.0.as_ref() - } -} - diff --git a/src/http.rs b/src/http.rs index f76800a..40439ba 100644 --- a/src/http.rs +++ b/src/http.rs @@ -15,6 +15,7 @@ use std::pin::Pin; use std::sync::{Arc, Mutex, Weak}; use std::task::{Context, Poll}; use arc_swap::ArcSwap; +use daemonbase::error::ExitError; use futures::pin_mut; use hyper::{Body, Method, Request, Response, StatusCode}; use hyper::server::accept::Accept; @@ -24,7 +25,6 @@ use serde::Deserialize; use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; use tokio::net::{TcpListener, TcpStream}; use tokio::runtime::Runtime; -use crate::log::ExitError; use crate::metrics; @@ -64,7 +64,7 @@ impl Server { Ok(listener) => listener, Err(err) => { error!("Fatal: error listening on {}: {}", addr, err); - return Err(ExitError); + return Err(ExitError::default()); } }; if let Err(err) = listener.set_nonblocking(true) { @@ -72,7 +72,7 @@ impl Server { "Fatal: failed to set listener {} to non-blocking: {}.", addr, err ); - return Err(ExitError); + return Err(ExitError::default()); } debug!("HTTP server listening on {}", addr); listeners.push(listener); diff --git a/src/lib.rs b/src/lib.rs index 8c6a2da..5d5b7cd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -27,7 +27,7 @@ pub mod comms; pub mod config; pub mod formats; pub mod http; -pub mod log; +//pub mod log; pub mod manager; pub mod metrics; pub mod payload; diff --git a/src/log.rs b/src/log.rs deleted file mode 100644 index ae7b6b7..0000000 --- a/src/log.rs +++ /dev/null @@ -1,458 +0,0 @@ -//! Logging. -//! -//! This module provides facilities to set up logging based on a configuration -//! via [`LogConfig`]. -//! -//! The module also provides two error types [`Failed`] and [`ExitError`] that -//! indicate that error information has been logged and a consumer can just -//! return quietly. -use std::{fmt, io, process}; -use std::convert::TryFrom; -use std::path::Path; -use std::str::FromStr; -use clap::{Arg, ArgMatches, Command}; -use log::{error, LevelFilter, Log}; -use serde::Deserialize; -use crate::config::ConfigPath; - - -//------------ LogConfig ----------------------------------------------------- - -/// Logging configuration. -#[derive(Deserialize)] -pub struct LogConfig { - /// Where to log to? - #[serde(default)] - pub log_target: LogTarget, - - /// If logging to a file, use this file. - /// - /// This isn’t part of `log_target` for deserialization reasons. - #[serde(default)] - pub log_file: ConfigPath, - - /// The syslog facility when logging to syslog. - /// - /// This isn’t part of `log_target` for deserialization reasons. - #[cfg(unix)] - #[serde(default)] - pub log_facility: LogFacility, - - /// The minimum log level to actually log. - #[serde(default)] - pub log_level: LogFilter, -} - -impl LogConfig { - /// Configures a clap app with the options for logging. - pub fn config_args(app: Command) -> Command { - app - .arg(Arg::new("verbose") - .short('v') - .long("verbose") - .multiple_occurrences(true) - .help("Log more information, twice or thrice for even more") - ) - .arg(Arg::new("quiet") - .short('q') - .long("quiet") - .multiple_occurrences(true) - .conflicts_with("verbose") - .help("Log less information, twice for no information") - ) - .arg(Arg::new("syslog") - .long("syslog") - .help("Log to syslog") - ) - .arg(Arg::new("syslog-facility") - .long("syslog-facility") - .takes_value(true) - .default_value("daemon") - .help("Facility to use for syslog logging") - ) - .arg(Arg::new("logfile") - .long("logfile") - .takes_value(true) - .value_name("PATH") - .help("Log to this file") - ) - } - - /// Update the logging configuration from command line arguments. - /// - /// This should be called after the configuration file has been loaded. - pub fn update_with_arg_matches( - &mut self, - matches: &ArgMatches, - cur_dir: &Path, - ) -> Result<(), Failed> { - // log_level - for _ in 0..matches.occurrences_of("verbose") { - self.log_level.increase() - } - for _ in 0..matches.occurrences_of("quiet") { - self.log_level.decrease() - } - - self.apply_log_matches(matches, cur_dir)?; - - Ok(()) - } - - /// Applies the logging-specific command line arguments to the config. - /// - /// This is the Unix version that also considers syslog as a valid - /// target. - #[cfg(unix)] - fn apply_log_matches( - &mut self, - matches: &ArgMatches, - cur_dir: &Path, - ) -> Result<(), Failed> { - if matches.is_present("syslog") { - self.log_target = LogTarget::Syslog; - if let Some(value) = - Self::from_str_value_of(matches, "syslog-facility")? - { - self.log_facility = value - } - } - else if let Some(file) = matches.value_of("logfile") { - if file == "-" { - self.log_target = LogTarget::Stderr - } - else { - self.log_target = LogTarget::File; - self.log_file = cur_dir.join(file).into(); - } - } - Ok(()) - } - - /// Applies the logging-specific command line arguments to the config. - /// - /// This is the non-Unix version that does not use syslog. - #[cfg(not(unix))] - #[allow(clippy::unnecessary_wraps)] - fn apply_log_matches( - &mut self, - matches: &ArgMatches, - cur_dir: &Path, - ) -> Result<(), Failed> { - if let Some(file) = matches.value_of("logfile") { - if file == "-" { - self.log_target = LogTarget::Stderr - } - else { - self.log_target = LogTarget::File; - self.log_file = cur_dir.join(file).into(); - } - } - Ok(()) - } - - - /// Try to convert a string encoded value. - /// - /// This helper function just changes error handling. Instead of returning - /// the actual conversion error, it logs it as an invalid value for entry - /// `key` and returns the standard error. - #[allow(dead_code)] // unused on Windows - fn from_str_value_of( - matches: &ArgMatches, - key: &str - ) -> Result, Failed> - where T: FromStr, T::Err: fmt::Display { - match matches.value_of(key) { - Some(value) => { - match T::from_str(value) { - Ok(value) => Ok(Some(value)), - Err(err) => { - error!( - "Invalid value for {}: {}.", - key, err - ); - Err(Failed) - } - } - } - None => Ok(None) - } - } - - /// Initialize logging. - /// - /// All diagnostic output of RTRTR is done via logging, never to - /// stderr directly. Thus, it is important to initalize logging before - /// doing anything else that may result in such output. This function - /// does exactly that. It sets a maximum log level of `warn`, leading - /// only printing important information, and directs all logging to - /// stderr. - pub fn init_logging() -> Result<(), ExitError> { - log::set_max_level(log::LevelFilter::Warn); - if let Err(err) = log_reroute::init() { - eprintln!("Failed to initialize logger: {}.\nAborting.", err); - return Err(ExitError) - }; - let dispatch = fern::Dispatch::new() - .level(log::LevelFilter::Error) - .chain(io::stderr()) - .into_log().1; - log_reroute::reroute_boxed(dispatch); - Ok(()) - } - - /// Switches logging to the configured target. - /// - /// Once the configuration has been successfully loaded, logging should - /// be switched to whatever the user asked for via this method. - #[allow(unused_variables)] // for cfg(not(unix)) - pub fn switch_logging(&self, daemon: bool) -> Result<(), Failed> { - let logger = match self.log_target { - #[cfg(unix)] - LogTarget::Default => { - if daemon { - self.syslog_logger()? - } - else { - self.stderr_logger(false) - } - } - #[cfg(not(unix))] - LogTarget::Default => { - self.stderr_logger(daemon) - } - #[cfg(unix)] - LogTarget::Syslog => { - self.syslog_logger()? - } - LogTarget::Stderr => { - self.stderr_logger(daemon) - } - LogTarget::File => { - self.file_logger()? - } - }; - log_reroute::reroute_boxed(logger); - log::set_max_level(self.log_level.0); - Ok(()) - } - - /// Creates a syslog logger and configures correctly. - #[cfg(unix)] - fn syslog_logger( - &self - ) -> Result, Failed> { - let mut formatter = syslog::Formatter3164 { - facility: self.log_facility.0, - .. Default::default() - }; - if formatter.hostname.is_none() { - formatter.hostname = Some("routinator".into()); - } - let formatter = formatter; - let logger = syslog::unix(formatter.clone()).or_else(|_| { - syslog::tcp(formatter.clone(), ("127.0.0.1", 601)) - }).or_else(|_| { - syslog::udp(formatter, ("127.0.0.1", 0), ("127.0.0.1", 514)) - }); - match logger { - Ok(logger) => Ok(Box::new(syslog::BasicLogger::new(logger))), - Err(err) => { - error!("Cannot connect to syslog: {}", err); - Err(Failed) - } - } - } - - /// Creates a stderr logger. - /// - /// If we are in daemon mode, we add a timestamp to the output. - fn stderr_logger(&self, daemon: bool) -> Box{ - self.fern_logger(daemon).chain(io::stderr()).into_log().1 - } - - /// Creates a file logger using the file provided by `path`. - fn file_logger(&self) -> Result, Failed> { - let file = match fern::log_file(&self.log_file) { - Ok(file) => file, - Err(err) => { - error!( - "Failed to open log file '{}': {}", - self.log_file.display(), err - ); - return Err(Failed) - } - }; - Ok(self.fern_logger(true).chain(file).into_log().1) - } - - /// Creates and returns a fern logger. - fn fern_logger(&self, timestamp: bool) -> fern::Dispatch { - let mut res = fern::Dispatch::new(); - if timestamp { - res = res.format(|out, message, _record| { - out.finish(format_args!( - "{} {} {}", - chrono::Local::now().format("[%Y-%m-%d %H:%M:%S]"), - _record.module_path().unwrap_or(""), - message - )) - }); - } - res = res - .level(self.log_level.0) - .level_for("rustls", LevelFilter::Error); - if self.log_level.0 == LevelFilter::Debug { - res = res - .level_for("tokio_reactor", LevelFilter::Info) - .level_for("hyper", LevelFilter::Info) - .level_for("reqwest", LevelFilter::Info) - .level_for("h2", LevelFilter::Info); - } - res - } -} - - - -//------------ LogTarget ----------------------------------------------------- - -/// The target to log to. -#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)] -pub enum LogTarget { - /// Use the system default. - #[serde(rename = "default")] - #[default] - Default, - - /// Syslog. - #[cfg(unix)] - #[serde(rename = "syslog")] - Syslog, - - /// Stderr. - #[serde(rename = "stderr")] - Stderr, - - /// A file. - #[serde(rename = "file")] - File -} - - -//------------ LogFacility --------------------------------------------------- - -#[cfg(unix)] -#[derive(Deserialize)] -#[serde(try_from = "String")] -pub struct LogFacility(syslog::Facility); - -#[cfg(unix)] -impl Default for LogFacility { - fn default() -> Self { - LogFacility(syslog::Facility::LOG_DAEMON) - } -} - -#[cfg(unix)] -impl TryFrom for LogFacility { - type Error = String; - - fn try_from(value: String) -> Result { - syslog::Facility::from_str(&value).map(LogFacility).map_err(|_| { - format!("unknown syslog facility {}", &value) - }) - } -} - -#[cfg(unix)] -impl FromStr for LogFacility { - type Err = &'static str; - - fn from_str(s: &str) -> Result { - syslog::Facility::from_str(s).map(LogFacility).map_err(|_| { - "unknown facility" - }) - } -} - - -//------------ LogFilter ----------------------------------------------------- - -#[derive(Deserialize)] -#[serde(try_from = "String")] -pub struct LogFilter(log::LevelFilter); - -impl LogFilter { - pub fn increase(&mut self) { - use log::LevelFilter::*; - - self.0 = match self.0 { - Off => Error, - Error => Warn, - Warn => Info, - Info => Debug, - Debug => Trace, - Trace => Trace, - } - } - - pub fn decrease(&mut self) { - use log::LevelFilter::*; - - self.0 = match self.0 { - Off => Off, - Error => Off, - Warn => Error, - Info => Warn, - Debug => Info, - Trace => Debug, - } - } -} - -impl Default for LogFilter { - fn default() -> Self { - LogFilter(log::LevelFilter::Warn) - } -} - -impl TryFrom for LogFilter { - type Error = log::ParseLevelError; - - fn try_from(value: String) -> Result { - log::LevelFilter::from_str(&value).map(LogFilter) - } -} - - - -//------------ Failed -------------------------------------------------------- - -/// An error happened that has been logged. -/// -/// This is a marker type that can be used in results to indicate that if an -/// error happend, it has been logged and doesn’t need further treatment. -#[derive(Clone, Copy, Debug)] -pub struct Failed; - - -//------------ ExitError ----------------------------------------------------- - -/// An error happened that should cause the process to exit. -pub struct ExitError; - -impl ExitError { - /// Exits the process. - pub fn exit(self) -> ! { - process::exit(1) - } -} - -impl From for ExitError { - fn from(_: Failed) -> ExitError { - ExitError - } -} - diff --git a/src/main.rs b/src/main.rs index fbc642e..a4a8761 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,36 +1,26 @@ -use std::env::current_dir; use std::process::exit; use clap::{Command, crate_authors, crate_version}; +use daemonbase::error::ExitError; +use daemonbase::logging::Logger; use futures::future::pending; -use log::error; use tokio::runtime; use rtrtr::config::Config; -use rtrtr::log::ExitError; use rtrtr::manager::Manager; fn _main() -> Result<(), ExitError> { - Config::init()?; + Logger::init_logging()?; let matches = Config::config_args( Command::new("rtrtr") .version(crate_version!()) .author(crate_authors!()) .about("collecting, processing and distributing route filtering data") ).get_matches(); - let cur_dir = match current_dir() { - Ok(dir) => dir, - Err(err) => { - error!( - "Fatal: cannot get current directory ({}). Aborting.", - err - ); - return Err(ExitError); - } - }; let mut manager = Manager::new(); let mut config = Config::from_arg_matches( - &matches, &cur_dir, &mut manager + &matches, &mut manager )?; + Logger::from_config(&config.log)?.switch_logging(false)?; let runtime = runtime::Builder::new_multi_thread() .enable_all() .build() @@ -43,7 +33,7 @@ fn _main() -> Result<(), ExitError> { fn main() { match _main() { Ok(_) => exit(0), - Err(ExitError) => exit(1), + Err(err) => err.exit(), } } diff --git a/src/manager.rs b/src/manager.rs index 71e584b..990f4af 100644 --- a/src/manager.rs +++ b/src/manager.rs @@ -3,6 +3,7 @@ use std::cell::RefCell; use std::collections::HashMap; use std::sync::Arc; +use daemonbase::error::Failed; use log::error; use serde::Deserialize; use reqwest::blocking::Client as HttpClient; @@ -10,7 +11,6 @@ use tokio::runtime::Runtime; use crate::{http, metrics}; use crate::comms::{Gate, GateAgent, Link}; use crate::config::{Config, ConfigFile, Marked}; -use crate::log::Failed; use crate::targets::Target; use crate::units::Unit; diff --git a/src/payload.rs b/src/payload.rs index f8dd223..049a462 100644 --- a/src/payload.rs +++ b/src/payload.rs @@ -657,7 +657,7 @@ pub struct OwnedSetIter { impl OwnedSetIter { fn new(set: Set) -> Self { - let item = set.blocks.get(0).map(|block| block.start()).unwrap_or(0); + let item = set.blocks.first().map(|block| block.start()).unwrap_or(0); OwnedSetIter { set, block: 0, item } diff --git a/src/targets/http.rs b/src/targets/http.rs index c088539..6b7a996 100644 --- a/src/targets/http.rs +++ b/src/targets/http.rs @@ -3,6 +3,7 @@ use std::convert::Infallible; use std::sync::Arc; use arc_swap::ArcSwap; +use daemonbase::error::ExitError; use futures::stream; use hyper::{Body, Method, Request, Response}; use log::debug; @@ -10,7 +11,6 @@ use serde::Deserialize; use crate::payload; use crate::comms::Link; use crate::formats::output; -use crate::log::ExitError; use crate::manager::Component; diff --git a/src/targets/mod.rs b/src/targets/mod.rs index da8e342..19a7333 100644 --- a/src/targets/mod.rs +++ b/src/targets/mod.rs @@ -21,8 +21,8 @@ mod rtr; //------------ Target -------------------------------------------------------- +use daemonbase::error::ExitError; use serde::Deserialize; -use crate::log::ExitError; use crate::manager::Component; diff --git a/src/targets/rtr.rs b/src/targets/rtr.rs index e296e29..19c7848 100644 --- a/src/targets/rtr.rs +++ b/src/targets/rtr.rs @@ -8,6 +8,8 @@ use std::net::TcpListener as StdTcpListener; use std::pin::Pin; use std::task::{Context, Poll}; use arc_swap::ArcSwap; +use daemonbase::config::ConfigPath; +use daemonbase::error::ExitError; use futures::{TryFuture, ready}; use log::{debug, error}; use pin_project_lite::pin_project; @@ -23,8 +25,6 @@ use tokio_rustls::server::TlsStream; use tokio_stream::wrappers::TcpListenerStream; use crate::payload; use crate::comms::Link; -use crate::config::ConfigPath; -use crate::log::ExitError; use crate::manager::Component; @@ -79,7 +79,7 @@ impl Tcp { Ok(listener) => listener, Err(err) => { error!("Can’t bind to {}: {}", addr, err); - return Err(ExitError) + return Err(ExitError::default()) } }; if let Err(err) = listener.set_nonblocking(true) { @@ -87,13 +87,13 @@ impl Tcp { "Fatal: failed to set listener {} to non-blocking: {}.", addr, err ); - return Err(ExitError); + return Err(ExitError::default()); } let listener = match TcpListener::from_std(listener) { Ok(listener) => listener, Err(err) => { error!("Fatal error listening on {}: {}", addr, err); - return Err(ExitError) + return Err(ExitError::default()) } }; tokio::spawn(async move { @@ -158,7 +158,7 @@ impl Tls { "Failed to open TLS certificate file '{}': {}.", self.certificate.display(), err ); - ExitError + ExitError::default() })? ) ).map_err(|err| { @@ -166,7 +166,7 @@ impl Tls { "Failed to read TLS certificate file '{}': {}.", self.certificate.display(), err ); - ExitError + ExitError::default() }).map(|mut certs| { certs.drain(..).map(Certificate).collect() })?; @@ -178,7 +178,7 @@ impl Tls { "Failed to open TLS key file '{}': {}.", self.key.display(), err ); - ExitError + ExitError::default() })? ) ).map_err(|err| { @@ -186,21 +186,21 @@ impl Tls { "Failed to read TLS key file '{}': {}.", self.key.display(), err ); - ExitError + ExitError::default() }).and_then(|mut certs| { if certs.is_empty() { error!( "TLS key file '{}' does not contain any usable keys.", self.key.display() ); - return Err(ExitError) + return Err(ExitError::default()) } if certs.len() != 1 { error!( "TLS key file '{}' contains multiple keys.", self.key.display() ); - return Err(ExitError) + return Err(ExitError::default()) } Ok(PrivateKey(certs.pop().unwrap())) })?; @@ -211,7 +211,7 @@ impl Tls { .with_single_cert(certs, key) .map_err(|err| { error!("Failed to create TLS server config: {}", err); - ExitError + ExitError::default() }) } @@ -224,7 +224,7 @@ impl Tls { Ok(listener) => listener, Err(err) => { error!("Can’t bind to {}: {}", addr, err); - return Err(ExitError) + return Err(ExitError::default()) } }; if let Err(err) = listener.set_nonblocking(true) { @@ -232,13 +232,13 @@ impl Tls { "Fatal: failed to set listener {} to non-blocking: {}.", addr, err ); - return Err(ExitError); + return Err(ExitError::default()); } let listener = match TcpListener::from_std(listener) { Ok(listener) => listener, Err(err) => { error!("Fatal error listening on {}: {}", addr, err); - return Err(ExitError) + return Err(ExitError::default()) } }; tokio::spawn(async move { diff --git a/src/units/json.rs b/src/units/json.rs index 0ce0f64..e6315ec 100644 --- a/src/units/json.rs +++ b/src/units/json.rs @@ -5,6 +5,7 @@ use std::convert::TryFrom; use std::fs::File; use std::str::FromStr; use std::time::Duration; +use daemonbase::config::ConfigPath; use log::{debug, warn}; use reqwest::Url; use rpki::rtr::Serial; @@ -13,7 +14,6 @@ use tokio::sync::oneshot; use tokio::time::{Instant, timeout_at}; use crate::payload; use crate::comms::{Gate, Terminated, UnitStatus}; -use crate::config::ConfigPath; use crate::formats::json::Set as JsonSet; use crate::manager::Component; diff --git a/src/units/rtr.rs b/src/units/rtr.rs index ecec343..b6d9471 100644 --- a/src/units/rtr.rs +++ b/src/units/rtr.rs @@ -15,6 +15,7 @@ use std::sync::atomic::{AtomicI64, AtomicU32, AtomicU64}; use std::task::{Context, Poll}; use std::time::Duration; use chrono::{TimeZone, Utc}; +use daemonbase::config::ConfigPath; use futures::pin_mut; use futures::future::{select, Either}; use log::{debug, error, info, warn}; @@ -34,7 +35,6 @@ use tokio_rustls::{ use webpki::TrustAnchor; use crate::metrics; use crate::comms::{Gate, GateMetrics, GateStatus, Terminated, UnitStatus}; -use crate::config::ConfigPath; use crate::manager::Component; use crate::metrics::{Metric, MetricType, MetricUnit}; use crate::payload; diff --git a/src/units/slurm.rs b/src/units/slurm.rs index 21f295e..d1c787f 100644 --- a/src/units/slurm.rs +++ b/src/units/slurm.rs @@ -5,13 +5,13 @@ use std::path::{Path, PathBuf}; use std::sync::{Arc, Weak}; use std::time::{Duration, SystemTime}; use arc_swap::ArcSwap; +use daemonbase::config::ConfigPath; use log::debug; use rpki::slurm::{SlurmFile, ValidationOutputFilters}; use serde::Deserialize; use tokio::sync::Notify; use crate::payload; use crate::comms::{Gate, Link, Terminated, UnitStatus}; -use crate::config::ConfigPath; use crate::manager::Component;