From 6c1d3c5ef8abc40dfa96cc299743dc69a5c72439 Mon Sep 17 00:00:00 2001 From: Ara Sadoyan Date: Fri, 9 Jan 2026 18:44:36 +0100 Subject: [PATCH] Error handling on API server --- Cargo.lock | 389 ++++++++++++++++++++++++++++++--------- Cargo.toml | 22 +-- src/utils/filewatch.rs | 2 +- src/utils/httpclient.rs | 27 +++ src/utils/kuberconsul.rs | 20 +- src/utils/parceyaml.rs | 16 +- src/web/bgservice.rs | 1 + src/web/webserver.rs | 18 +- 8 files changed, 375 insertions(+), 120 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 01a20c3..5a7ed0a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -138,7 +138,7 @@ dependencies = [ "port_check", "privdrop", "prometheus 0.14.0", - "rand 0.9.2", + "rand 0.10.0-rc.5", "reqwest", "rustls-pemfile", "serde", @@ -259,10 +259,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] -name = "axum" -version = "0.8.4" +name = "aws-lc-rs" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" +checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" +dependencies = [ + "aws-lc-sys", + "untrusted 0.7.1", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "axum" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b098575ebe77cb6d14fc7f32749631a6e44edbef6b796f89b020e99ba20d425" dependencies = [ "axum-core", "bytes", @@ -279,8 +303,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rustversion", - "serde", + "serde_core", "serde_json", "serde_path_to_error", "serde_urlencoded", @@ -294,9 +317,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" +checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" dependencies = [ "bytes", "futures-core", @@ -305,7 +328,6 @@ dependencies = [ "http-body-util", "mime", "pin-project-lite", - "rustversion", "sync_wrapper", "tower-layer", "tower-service", @@ -314,18 +336,20 @@ dependencies = [ [[package]] name = "axum-server" -version = "0.7.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "495c05f60d6df0093e8fb6e74aa5846a0ad06abaf96d76166283720bf740f8ab" +checksum = "b1df331683d982a0b9492b38127151e6453639cd34926eb9c07d4cd8c6d22bfc" dependencies = [ "arc-swap", "bytes", + "either", "fs-err", "http", "http-body", "hyper", "hyper-util", "openssl", + "openssl-sys", "pin-project-lite", "tokio", "tokio-openssl", @@ -359,6 +383,29 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.8.0", + "cexpr", + "clang-sys", + "itertools", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.100", + "which", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -398,6 +445,15 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + [[package]] name = "brotli" version = "3.5.0" @@ -448,6 +504,15 @@ dependencies = [ "shlex", ] +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cf-rustracing" version = "1.1.0" @@ -488,6 +553,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.0-rc.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cbf41c6ec3c4b9eaf7f8f5c11a72cd7d3aa0428125c20d5ef4d09907a0f019" +dependencies = [ + "cfg-if", + "cpufeatures", + "rand_core 0.10.0-rc-2", +] + [[package]] name = "chrono" version = "0.4.39" @@ -497,6 +573,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "clap" version = "3.2.25" @@ -612,20 +699,20 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.2.0-rc.4" +version = "0.2.0-rc.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8235645834fbc6832939736ce2f2d08192652269e11010a6240f61b908a1c6" +checksum = "919bd05924682a5480aec713596b9e2aabed3a0a6022fab6847f85a99e5f190a" dependencies = [ "hybrid-array", ] [[package]] name = "ctrlc" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881c5d0a13b2f1498e2306e82cbada78390e152d4b1378fb28a84f4dcd0dc4f3" +checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" dependencies = [ - "dispatch", + "dispatch2", "nix 0.30.1", "windows-sys 0.61.0", ] @@ -706,19 +793,25 @@ dependencies = [ [[package]] name = "digest" -version = "0.11.0-rc.2" +version = "0.11.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6749b668519cd7149ee3d11286a442a8a8bdc3a9d529605f579777bfccc5a4bc" +checksum = "ea390c940e465846d64775e55e3115d5dc934acb953de6f6e6360bc232fe2bf7" dependencies = [ "block-buffer 0.11.0-rc.5", - "crypto-common 0.2.0-rc.4", + "crypto-common 0.2.0-rc.5", ] [[package]] -name = "dispatch" -version = "0.2.0" +name = "dispatch2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.8.0", + "block2", + "libc", + "objc2", +] [[package]] name = "displaydoc" @@ -731,6 +824,12 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "either" version = "1.15.0" @@ -848,6 +947,12 @@ dependencies = [ "tokio", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "fsevent-sys" version = "4.1.0" @@ -963,10 +1068,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -987,6 +1090,12 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + [[package]] name = "h2" version = "0.4.12" @@ -1050,6 +1159,15 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.0", +] + [[package]] name = "hostname" version = "0.3.1" @@ -1124,13 +1242,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.6.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2", "http", "http-body", @@ -1138,6 +1257,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -1191,9 +1311,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.14" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" dependencies = [ "base64", "bytes", @@ -1207,7 +1327,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", + "socket2", "system-configuration", "tokio", "tower-service", @@ -1416,6 +1536,15 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.14" @@ -1467,16 +1596,18 @@ dependencies = [ [[package]] name = "jsonwebtoken" -version = "9.3.1" +version = "10.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" +checksum = "c76e1c7d7df3e34443b3621b459b066a7b79644f059fc8b2db7070c825fd417e" dependencies = [ + "aws-lc-rs", "base64", + "getrandom 0.2.15", "js-sys", "pem", - "ring", "serde", "serde_json", + "signature", "simple_asn1", ] @@ -1506,12 +1637,28 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "libc" version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.0", +] + [[package]] name = "libmimalloc-sys" version = "0.1.44" @@ -1538,6 +1685,12 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + [[package]] name = "linux-raw-sys" version = "0.9.4" @@ -1574,9 +1727,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "lru" @@ -1800,6 +1953,21 @@ dependencies = [ "autocfg", ] +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + [[package]] name = "object" version = "0.36.7" @@ -2050,7 +2218,7 @@ dependencies = [ "serde", "serde_yaml 0.8.26", "sfv", - "socket2 0.6.0", + "socket2", "strum", "strum_macros", "tokio", @@ -2263,6 +2431,16 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prettyplease" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6837b9e10d61f45f987d50808f83d1ee3d206c66acf650c3e4ae2e1f6ddedf55" +dependencies = [ + "proc-macro2", + "syn 2.0.100", +] + [[package]] name = "privdrop" version = "0.5.6" @@ -2378,18 +2556,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.1", + "rand_chacha", "rand_core 0.6.4", ] [[package]] name = "rand" -version = "0.9.2" +version = "0.10.0-rc.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "be866deebbade98028b705499827ad6967c8bb1e21f96a2609913c8c076e9307" dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", + "chacha20", + "getrandom 0.3.1", + "rand_core 0.10.0-rc-2", ] [[package]] @@ -2402,16 +2581,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - [[package]] name = "rand_core" version = "0.6.4" @@ -2423,12 +2592,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.9.3" +version = "0.10.0-rc-2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.1", -] +checksum = "104a23e4e8b77312a823b6b5613edbac78397e2f34320bc7ac4277013ec4478e" [[package]] name = "redox_syscall" @@ -2470,9 +2636,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.23" +version = "0.12.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +checksum = "b6eff9328d40131d43bd911d42d79eb6a47312002a4daefc9e37f17e74a7701a" dependencies = [ "base64", "bytes", @@ -2521,7 +2687,7 @@ dependencies = [ "cfg-if", "getrandom 0.2.15", "libc", - "untrusted", + "untrusted 0.9.0", "windows-sys 0.52.0", ] @@ -2563,6 +2729,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rusticata-macros" version = "4.1.0" @@ -2572,6 +2744,19 @@ dependencies = [ "nom", ] +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.8.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.52.0", +] + [[package]] name = "rustix" version = "1.0.7" @@ -2581,7 +2766,7 @@ dependencies = [ "bitflags 2.8.0", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.9.4", "windows-sys 0.59.0", ] @@ -2621,7 +2806,7 @@ checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ "ring", "rustls-pki-types", - "untrusted", + "untrusted 0.9.0", ] [[package]] @@ -2685,18 +2870,28 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -2775,13 +2970,13 @@ dependencies = [ [[package]] name = "sha2" -version = "0.11.0-rc.2" +version = "0.11.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1e3878ab0f98e35b2df35fe53201d088299b41a6bb63e3e34dada2ac4abd924" +checksum = "19d43dc0354d88b791216bb5c1bfbb60c0814460cc653ae0ebd71f286d0bd927" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.11.0-rc.2", + "digest 0.11.0-rc.4", ] [[package]] @@ -2799,6 +2994,15 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "simple_asn1" version = "0.6.3" @@ -2826,16 +3030,6 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - [[package]] name = "socket2" version = "0.6.0" @@ -2958,7 +3152,7 @@ dependencies = [ "fastrand", "getrandom 0.3.1", "once_cell", - "rustix", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -3080,27 +3274,26 @@ dependencies = [ [[package]] name = "tokio" -version = "1.45.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.10", + "socket2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.61.0", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", @@ -3194,7 +3387,7 @@ dependencies = [ "hyper-util", "percent-encoding", "pin-project", - "socket2 0.6.0", + "socket2", "sync_wrapper", "tokio", "tokio-stream", @@ -3225,9 +3418,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ "bitflags 2.8.0", "bytes", @@ -3344,6 +3537,12 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + [[package]] name = "untrusted" version = "0.9.0" @@ -3525,6 +3724,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.44", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index 3557a85..b3b9329 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,9 +11,9 @@ panic = "abort" strip = true [dependencies] -tokio = { version = "1.45.1", features = ["full"] } +tokio = { version = "1.48.0", features = ["full"] } pingora = { version = "0.6.0", features = ["lb", "openssl"] } # openssl, rustls, boringssl -serde = { version = "1.0.219", features = ["derive"] } +serde = { version = "1.0.228", features = ["derive"] } dashmap = "7.0.0-rc2" pingora-core = "0.6.0" pingora-proxy = "0.6.0" @@ -21,21 +21,21 @@ pingora-http = "0.6.0" pingora-limits = "0.6.0" async-trait = "0.1.89" env_logger = "0.11.8" -log = "0.4.28" +log = "0.4.29" futures = "0.3.31" notify = "8.2.0" -axum = { version = "0.8.4" } -axum-server = { version = "0.7.2", features = ["tls-openssl"] } -reqwest = { version = "0.12.23", features = ["json", "native-tls-alpn", "stream"] } +axum = { version = "0.8.7" } +axum-server = { version = "0.8.0", features = ["tls-openssl"] } +reqwest = { version = "0.12.25", features = ["json", "native-tls-alpn", "stream"] } #reqwest = { version = "0.12.15", features = ["json", "rustls-tls"] } #reqwest = { version = "0.12.15", default-features = false, features = ["rustls-tls", "json"] } serde_yaml = "0.9.34-deprecated" -rand = "0.9.2" +rand = "0.10.0-rc.5" base64 = "0.22.1" -jsonwebtoken = "9.3.1" +jsonwebtoken = { version = "10.2.0", features = ["aws_lc_rs"] } tonic = "0.14.2" -sha2 = { version = "0.11.0-rc.2", default-features = false } +sha2 = { version = "0.11.0-rc.3", default-features = false } base16ct = { version = "0.3.0", features = ["alloc"] } urlencoding = "2.1.3" arc-swap = "1.7.1" @@ -44,10 +44,10 @@ prometheus = "0.14.0" lazy_static = "1.5.0" x509-parser = "0.18.0" rustls-pemfile = "2.2.0" -tower-http = { version = "0.6.6", features = ["fs"] } +tower-http = { version = "0.6.8", features = ["fs"] } once_cell = "1.21.3" privdrop = "0.5.6" -ctrlc = "3.5.0" +ctrlc = "3.5.1" port_check = "0.3.0" #moka = { version = "0.12.10", features = ["sync"] } #rustls = { version = "0.23.27", features = ["ring"] } diff --git a/src/utils/filewatch.rs b/src/utils/filewatch.rs index 1e923e7..ce2ddcf 100644 --- a/src/utils/filewatch.rs +++ b/src/utils/filewatch.rs @@ -41,7 +41,7 @@ pub async fn start(fp: String, mut toreturn: Sender) { if start.elapsed() > Duration::from_secs(2) { start = Instant::now(); // info!("Config File changed :=> {:?}", e); - let snd = load_configuration(file_path, "filepath").await; + let snd = load_configuration(file_path, "filepath").await.0; match snd { Some(snd) => { toreturn.send(snd).await.unwrap(); diff --git a/src/utils/httpclient.rs b/src/utils/httpclient.rs index 2f890fa..12c9b53 100644 --- a/src/utils/httpclient.rs +++ b/src/utils/httpclient.rs @@ -51,7 +51,34 @@ pub async fn for_kuber(url: &str, token: &str, conf: &ServiceMapping) -> Option< return None; } let endpoints: KubeEndpoints = resp.json().await.ok()?; + // let endpoints: KubeEndpointsList = resp.json().await.ok()?; + let upstreams: DashMap>, AtomicUsize)> = DashMap::new(); + // for endpoints in endpoints.items { + // if let Some(subsets) = endpoints.subsets { + // for subset in subsets { + // if let (Some(addresses), Some(ports)) = (subset.addresses, subset.ports) { + // let mut inner_vec = Vec::new(); + // for addr in addresses { + // for port in &ports { + // let to_add = Arc::from(InnerMap { + // address: addr.ip.parse().unwrap(), + // port: port.port.clone(), + // is_ssl: false, + // is_http2: false, + // to_https: conf.to_https.unwrap_or(false), + // rate_limit: conf.rate_limit, + // healthcheck: None, + // }); + // inner_vec.push(to_add); + // } + // } + // match_path(&conf, &upstreams, inner_vec.clone()); + // } + // } + // } + // } + if let Some(subsets) = endpoints.subsets { for subset in subsets { if let (Some(addresses), Some(ports)) = (subset.addresses, subset.ports) { diff --git a/src/utils/kuberconsul.rs b/src/utils/kuberconsul.rs index 0cf1713..6a08ccc 100644 --- a/src/utils/kuberconsul.rs +++ b/src/utils/kuberconsul.rs @@ -19,6 +19,10 @@ use std::time::Duration; use tokio::fs::File; use tokio::io::AsyncReadExt; +// #[derive(Debug, Deserialize)] +// pub struct KubeEndpointsList { +// pub items: Vec, +// } #[derive(Debug, serde::Deserialize)] pub struct KubeEndpoints { pub subsets: Option>, @@ -114,12 +118,12 @@ impl ServiceDiscovery for KubernetesDiscovery { let upstreams = UpstreamsDashMap::new(); if let Some(kuber) = config.kubernetes.clone() { if let Some(svc) = kuber.services { - for i in svc { + for service in svc { let header_list: DashMap, Vec<(Arc, Arc)>> = DashMap::new(); let mut hl = Vec::new(); - build_headers(&i.client_headers, config.as_ref(), &mut hl); + build_headers(&service.client_headers, config.as_ref(), &mut hl); if !hl.is_empty() { - match i.path.clone() { + match service.path.clone() { Some(path) => { header_list.insert(Arc::from(path.as_str()), hl); } @@ -130,11 +134,13 @@ impl ServiceDiscovery for KubernetesDiscovery { // header_list.insert(Arc::from(path.as_str()), hl); // header_list.insert(Arc::from(i.path).unwrap_or(Arc::from("/")).as_str(), hl); - config.client_headers.insert(i.hostname.clone(), header_list); + config.client_headers.insert(service.hostname.clone(), header_list); } - let url = format!("https://{}/api/v1/namespaces/{}/endpoints/{}", server, namespace, i.hostname); - let list = httpclient::for_kuber(&*url, &*token, &i).await; - list_to_upstreams(list, &upstreams, &i); + let url = format!("https://{}/api/v1/namespaces/{}/endpoints/{}", server, namespace, service.hostname); + // let url = format!("https://{}/api/v1/namespaces/{}/endpoints?labelSelector=app", server, namespace); + let list = httpclient::for_kuber(&*url, &*token, &service).await; + // println!("{:?}", list); + list_to_upstreams(list, &upstreams, &service); } } if let Some(lt) = clone_compare(&upstreams, &prev_upstreams, &config).await { diff --git a/src/utils/parceyaml.rs b/src/utils/parceyaml.rs index 2a47a41..4776790 100644 --- a/src/utils/parceyaml.rs +++ b/src/utils/parceyaml.rs @@ -10,7 +10,7 @@ use std::sync::Arc; use std::{env, fs}; // use tokio::sync::oneshot::{Receiver, Sender}; -pub async fn load_configuration(d: &str, kind: &str) -> Option { +pub async fn load_configuration(d: &str, kind: &str) -> (Option, String) { let yaml_data = match kind { "filepath" => match fs::read_to_string(d) { Ok(data) => { @@ -20,7 +20,7 @@ pub async fn load_configuration(d: &str, kind: &str) -> Option { Err(e) => { error!("Reading: {}: {:?}", d, e); warn!("Running with empty upstreams list, update it via API"); - return None; + return (None, e.to_string()); } }, "content" => { @@ -29,7 +29,7 @@ pub async fn load_configuration(d: &str, kind: &str) -> Option { } _ => { error!("Mismatched parameter, only filepath|content is allowed"); - return None; + return (None, "Mismatched parameter, only filepath|content is allowed".to_string()); } }; @@ -37,7 +37,7 @@ pub async fn load_configuration(d: &str, kind: &str) -> Option { Ok(cfg) => cfg, Err(e) => { error!("Failed to parse upstreams file: {}", e); - return None; + return (None, e.to_string()); } }; @@ -49,19 +49,19 @@ pub async fn load_configuration(d: &str, kind: &str) -> Option { match parsed.provider.as_str() { "file" => { populate_file_upstreams(&mut toreturn, &parsed).await; - Some(toreturn) + (Some(toreturn), "Ok".to_string()) } "consul" => { toreturn.consul = parsed.consul; - toreturn.consul.is_some().then_some(toreturn) + (toreturn.consul.is_some().then_some(toreturn), "Ok".to_string()) } "kubernetes" => { toreturn.kubernetes = parsed.kubernetes; - toreturn.kubernetes.is_some().then_some(toreturn) + (toreturn.kubernetes.is_some().then_some(toreturn), "Ok".to_string()) } _ => { warn!("Unknown provider {}", parsed.provider); - None + (None, "Unknown provider".to_string()) } } } diff --git a/src/web/bgservice.rs b/src/web/bgservice.rs index 7bb5b9c..a57ab04 100644 --- a/src/web/bgservice.rs +++ b/src/web/bgservice.rs @@ -21,6 +21,7 @@ impl BackgroundService for LB { let tx_api = tx.clone(); let config = load_configuration(self.config.upstreams_conf.clone().as_str(), "filepath") .await + .0 .expect("Failed to load configuration"); match config.typecfg.as_str() { diff --git a/src/web/webserver.rs b/src/web/webserver.rs index 64bca66..553fb64 100644 --- a/src/web/webserver.rs +++ b/src/web/webserver.rs @@ -92,11 +92,21 @@ async fn conf(State(mut st): State, Query(params): Query { + return Response::builder().status(StatusCode::OK).body(Body::from("Config, conf file, updated!\n")).unwrap(); + } + Err(e) => { + let error_msg = format!("Failed to send configuration: {}\n", e); + return Response::builder().status(StatusCode::INTERNAL_SERVER_ERROR).body(Body::from(error_msg)).unwrap(); + } + } } else { - return Response::builder().status(StatusCode::BAD_GATEWAY).body(Body::from("Failed to parse config!\n")).unwrap(); + let err: String = "Error parsing config file: ".to_owned() + sl.1.as_str() + "\n"; + return Response::builder().status(StatusCode::BAD_GATEWAY).body(Body::from(err)).unwrap(); }; } }