From d1e32989e362b3e7fca7e19b72fe5932f5cc3637 Mon Sep 17 00:00:00 2001 From: mbecker20 Date: Fri, 26 Sep 2025 19:05:53 -0700 Subject: [PATCH] allow any number of simultaneous inbound / outbound connections (to different Cores) --- Cargo.lock | 183 +++++++++--------- Cargo.toml | 18 +- bin/periphery/src/config.rs | 9 +- bin/periphery/src/connection/client.rs | 7 - bin/periphery/src/connection/mod.rs | 2 +- bin/periphery/src/connection/server.rs | 15 +- bin/periphery/src/main.rs | 55 +++++- .../core/rs/src/entities/config/periphery.rs | 44 +++-- 8 files changed, 199 insertions(+), 134 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 76e7070d0..57750249c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -147,9 +147,9 @@ checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "async-compression" -version = "0.4.30" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "977eb15ea9efd848bb8a4a1a2500347ed7f0bf794edf0dc3ddcf439f43d36b23" +checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" dependencies = [ "compression-codecs", "compression-core", @@ -249,9 +249,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b8ff6c09cd57b16da53641caa860168b88c172a5ee163b0288d3d6eea12786" +checksum = "879b6c89592deb404ba4dc0ae6b58ffd1795c78991cbb5b8bc441c48a070440d" dependencies = [ "aws-lc-sys", "zeroize", @@ -259,15 +259,16 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.31.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e44d16778acaf6a9ec9899b92cebd65580b83f685446bf2e1f5d3d732f99dcd" +checksum = "1ba2e2516bdf37af57fc6ff047855f54abad0066e5c4fdaaeb76dabb2e05bcf5" dependencies = [ "bindgen", "cc", "cmake", "dunce", "fs_extra", + "libloading", ] [[package]] @@ -296,9 +297,9 @@ dependencies = [ [[package]] name = "aws-sdk-ec2" -version = "1.170.0" +version = "1.170.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c2d25783bbe5577c6b67cb019e3890174fedc4ee436bbb7cc0256ccbeebfd63" +checksum = "a10d20db0a1e3d6ccaca95529911f186010cb6475087d881c4647a883ed66613" dependencies = [ "aws-credential-types", "aws-runtime", @@ -462,7 +463,7 @@ dependencies = [ "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.3", + "tokio-rustls 0.26.4", "tower", "tracing", ] @@ -695,15 +696,15 @@ dependencies = [ "rustls-pemfile 2.2.0", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.3", + "tokio-rustls 0.26.4", "tower-service", ] [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -711,7 +712,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link 0.2.0", ] [[package]] @@ -992,9 +993,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.38" +version = "1.2.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" +checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" dependencies = [ "find-msvc-tools", "jobserver", @@ -1229,9 +1230,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.30" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "485abf41ac0c8047c07c87c72c8fb3eb5197f6e9d7ded615dfd1a00ae00a0f64" +checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" dependencies = [ "compression-core", "flate2", @@ -1648,12 +1649,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] @@ -2052,7 +2053,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -2331,9 +2332,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "git" @@ -2739,7 +2740,7 @@ dependencies = [ "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.3", + "tokio-rustls 0.26.4", "tower-service", "webpki-roots 1.0.2", ] @@ -2810,7 +2811,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.0", + "windows-core 0.62.1", ] [[package]] @@ -3131,9 +3132,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.80" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -3296,7 +3297,7 @@ dependencies = [ "strum 0.27.2", "thiserror 2.0.16", "tokio", - "tokio-tungstenite 0.27.0", + "tokio-tungstenite 0.28.0", "tokio-util", "tracing", "typeshare", @@ -3408,7 +3409,7 @@ dependencies = [ "slack_client_rs", "svi", "tokio", - "tokio-tungstenite 0.27.0", + "tokio-tungstenite 0.28.0", "tokio-util", "toml", "toml_pretty", @@ -3508,7 +3509,7 @@ dependencies = [ "sysinfo", "tokio", "tokio-stream", - "tokio-tungstenite 0.27.0", + "tokio-tungstenite 0.28.0", "tokio-util", "tracing", "transport", @@ -3533,12 +3534,12 @@ checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libloading" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-link 0.2.0", + "windows-targets 0.53.4", ] [[package]] @@ -3730,9 +3731,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "mime" @@ -3860,7 +3861,7 @@ dependencies = [ "take_mut", "thiserror 1.0.69", "tokio", - "tokio-rustls 0.26.3", + "tokio-rustls 0.26.4", "tokio-util", "typed-builder", "uuid", @@ -4066,9 +4067,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -4824,9 +4825,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.2" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -4836,9 +4837,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", @@ -4891,7 +4892,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-rustls 0.26.3", + "tokio-rustls 0.26.4", "tokio-util", "tower", "tower-http", @@ -5153,7 +5154,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -5276,7 +5277,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -5405,9 +5406,9 @@ checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.226" +version = "1.0.227" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" +checksum = "80ece43fc6fbed4eb5392ab50c07334d3e577cbf40997ee896fe7af40bba4245" dependencies = [ "serde_core", "serde_derive", @@ -5435,18 +5436,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.226" +version = "1.0.227" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" +checksum = "7a576275b607a2c86ea29e410193df32bc680303c82f31e275bbfcafe8b33be5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.226" +version = "1.0.227" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" +checksum = "51e694923b8824cf0e9b382adf0f60d4e05f348f357b38833a3fa5ed7c2ede04" dependencies = [ "proc-macro2", "quote", @@ -5896,9 +5897,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.37.0" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07cec4dc2d2e357ca1e610cfb07de2fa7a10fc3e9fe89f72545f3d244ea87753" +checksum = "3bddd368fda2f82ead69c03d46d351987cfa0c2a57abfa37a017f3aa3e9bf69a" dependencies = [ "libc", "memchr", @@ -6098,9 +6099,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f63835928ca123f1bef57abbcd23bb2ba0ac9ae1235f1e65bda0d06e7786bd" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls 0.23.32", "tokio", @@ -6132,9 +6133,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489a59b6730eda1b0171fcfda8b121f4bee2b35cba8645ca35c5f7ba3eb736c1" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" dependencies = [ "futures-util", "log", @@ -6142,8 +6143,8 @@ dependencies = [ "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.3", - "tungstenite 0.27.0", + "tokio-rustls 0.26.4", + "tungstenite 0.28.0", ] [[package]] @@ -6231,7 +6232,7 @@ dependencies = [ "prost", "rustls-native-certs 0.8.1", "tokio", - "tokio-rustls 0.26.3", + "tokio-rustls 0.26.4", "tokio-stream", "tower", "tower-layer", @@ -6403,7 +6404,7 @@ dependencies = [ "sha1", "sha2", "tokio", - "tokio-tungstenite 0.27.0", + "tokio-tungstenite 0.28.0", "tracing", "url", "uuid", @@ -6434,9 +6435,9 @@ dependencies = [ [[package]] name = "tungstenite" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadc29d668c91fcc564941132e17b28a7ceb2f3ebf0b9dae3e03fd7a6748eb0d" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" dependencies = [ "bytes", "data-encoding", @@ -6674,9 +6675,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", @@ -6687,9 +6688,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", @@ -6701,9 +6702,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.53" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -6714,9 +6715,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6724,9 +6725,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", @@ -6737,9 +6738,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] @@ -6774,9 +6775,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.80" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -6884,9 +6885,9 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.62.0" +version = "0.62.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" +checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" dependencies = [ "windows-implement", "windows-interface", @@ -6908,9 +6909,9 @@ dependencies = [ [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" dependencies = [ "proc-macro2", "quote", @@ -6919,9 +6920,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" dependencies = [ "proc-macro2", "quote", @@ -7030,14 +7031,14 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.4", ] [[package]] name = "windows-sys" -version = "0.61.0" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" dependencies = [ "windows-link 0.2.0", ] @@ -7075,11 +7076,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" dependencies = [ - "windows-link 0.1.3", + "windows-link 0.2.0", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", diff --git a/Cargo.toml b/Cargo.toml index ba09c383b..3724a33f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,7 +62,7 @@ futures-util = "0.3.31" arc-swap = "1.7.1" # SERVER -tokio-tungstenite = { version = "0.27.0", features = ["rustls-tls-native-roots"] } +tokio-tungstenite = { version = "0.28.0", features = ["rustls-tls-native-roots"] } axum-extra = { version = "0.10.1", features = ["typed-header"] } tower-http = { version = "0.6.6", features = ["fs", "cors"] } axum-server = { version = "0.7.2", features = ["tls-rustls"] } @@ -71,17 +71,17 @@ axum = { version = "0.8.4", features = ["ws", "json", "macros"] } # SER/DE ipnetwork = { version = "0.21.1", features = ["serde"] } indexmap = { version = "2.11.4", features = ["serde"] } -serde = { version = "1.0.219", features = ["derive"] } +serde = { version = "1.0.227", features = ["derive"] } strum = { version = "0.27.2", features = ["derive"] } bson = { version = "2.15.0" } # must keep in sync with mongodb version serde_yaml_ng = "0.10.0" serde_json = "1.0.145" serde_qs = "0.15.0" -toml = "0.9.6" +toml = "0.9.7" url = "2.5.7" # ERROR -anyhow = "1.0.99" +anyhow = "1.0.100" thiserror = "2.0.16" # LOGGING @@ -94,7 +94,7 @@ opentelemetry = "0.30.0" tracing = "0.1.41" # CONFIG -clap = { version = "4.5.47", features = ["derive"] } +clap = { version = "4.5.48", features = ["derive"] } dotenvy = "0.15.7" envy = "0.4.2" @@ -117,11 +117,11 @@ hex = "0.4.3" # SYSTEM portable-pty = "0.9.0" bollard = "0.19.2" -sysinfo = "0.37.0" +sysinfo = "0.37.1" # CLOUD aws-config = "1.8.6" -aws-sdk-ec2 = "1.167.0" +aws-sdk-ec2 = "1.170.1" aws-credential-types = "1.2.6" ## CRON @@ -131,7 +131,7 @@ chrono = "0.4.42" croner = "3.0.0" # MISC -async-compression = { version = "0.4.30", features = ["tokio", "gzip"] } +async-compression = { version = "0.4.32", features = ["tokio", "gzip"] } derive_builder = "0.20.2" shell-escape = "0.1.5" comfy-table = "7.2.1" @@ -140,5 +140,5 @@ octorust = "0.10.0" dashmap = "6.1.0" wildcard = "0.3.0" colored = "3.0.0" -regex = "1.11.2" +regex = "1.11.3" bytes = "1.10.1" \ No newline at end of file diff --git a/bin/periphery/src/config.rs b/bin/periphery/src/config.rs index b73b67c15..9d12238f1 100644 --- a/bin/periphery/src/config.rs +++ b/bin/periphery/src/config.rs @@ -81,10 +81,13 @@ pub fn periphery_config() -> &'static PeripheryConfig { env.periphery_passkeys, ) .or(config.passkeys), - core_address: env - .periphery_core_address - .or(config.core_address), + core_addresses: env + .periphery_core_addresses + .or(config.core_addresses), connect_as: env.periphery_connect_as.or(config.connect_as), + server_enabled: env + .periphery_server_enabled + .unwrap_or(config.server_enabled), port: env.periphery_port.unwrap_or(config.port), bind_ip: env.periphery_bind_ip.unwrap_or(config.bind_ip), root_directory: env diff --git a/bin/periphery/src/connection/client.rs b/bin/periphery/src/connection/client.rs index 98cdc008a..3b62282cc 100644 --- a/bin/periphery/src/connection/client.rs +++ b/bin/periphery/src/connection/client.rs @@ -15,13 +15,6 @@ pub async fn handler( address: &str, connect_as: &str, ) -> anyhow::Result<()> { - if let Err(e) = - rustls::crypto::aws_lc_rs::default_provider().install_default() - { - error!("Failed to install default crypto provider | {e:?}"); - std::process::exit(1); - }; - let address = fix_ws_address(address); let identifiers = AddressConnectionIdentifiers::extract(&address)?; let query = format!("server={}", urlencoding::encode(connect_as)); diff --git a/bin/periphery/src/connection/mod.rs b/bin/periphery/src/connection/mod.rs index fbda7572b..b40a2733a 100644 --- a/bin/periphery/src/connection/mod.rs +++ b/bin/periphery/src/connection/mod.rs @@ -111,7 +111,7 @@ async fn handle( info!( "Logged in to Komodo Core {} websocket{}", args.core, - if config.core_address.is_some() + if config.core_addresses.is_some() && let Some(connect_as) = &config.connect_as { format!(" as Server {connect_as}") diff --git a/bin/periphery/src/connection/server.rs b/bin/periphery/src/connection/server.rs index ce585296a..9c8e9da42 100644 --- a/bin/periphery/src/connection/server.rs +++ b/bin/periphery/src/connection/server.rs @@ -51,9 +51,6 @@ pub async fn run() -> anyhow::Result<()> { if config.ssl_enabled { info!("🔒 Periphery SSL Enabled"); - rustls::crypto::ring::default_provider() - .install_default() - .expect("failed to install default rustls CryptoProvider"); crate::helpers::ensure_ssl_certs().await; info!("Komodo Periphery starting on wss://{}", socket_addr); let ssl_config = RustlsConfig::from_pem_file( @@ -92,6 +89,18 @@ async fn handler( let channel = channels().get_or_insert_default(&args.core).await; + // Ensure the receiver is free before upgrading connection. + // Due to ownership, it needs to be re-locked inside the ws handler, + // opening up a possible timing edge case, but should be good enough. + drop( + channel + .receiver() + .with_context(|| { + format!("Connection for {} is already connected", args.core) + }) + .inspect_err(|e| warn!("{e:#}"))?, + ); + Ok(ws.on_upgrade(|socket| async move { let mut socket = AxumWebsocket(socket); diff --git a/bin/periphery/src/main.rs b/bin/periphery/src/main.rs index b9507da47..65dc6ed05 100644 --- a/bin/periphery/src/main.rs +++ b/bin/periphery/src/main.rs @@ -1,4 +1,4 @@ -use anyhow::anyhow; +use futures::{StreamExt, stream::FuturesUnordered}; use crate::config::periphery_public_key; @@ -28,18 +28,48 @@ async fn app() -> anyhow::Result<()> { info!("{:?}", config.sanitized()); } + install_crypto_provider(); stats::spawn_polling_thread(); docker::stats::spawn_polling_thread(); - match (&config.core_address, &config.connect_as) { - (Some(core_host), Some(connect_as)) => { - connection::client::handler(core_host, connect_as).await + let mut handles = FuturesUnordered::new(); + + // Spawn client side connections + match (&config.core_addresses, &config.connect_as) { + (Some(addresses), Some(connect_as)) => { + for address in addresses { + handles.push(tokio::spawn(connection::client::handler( + address, connect_as, + ))); + } } - (None, _) => connection::server::run().await, - (Some(_), None) => Err(anyhow!( - "Must provide 'connect_as' (PERIPHERY_CONNECT_AS) for outbound connection." - )), + (Some(_), None) => { + warn!( + "'core_addresses' are defined for outbound connection, but missing 'connect_as' (PERIPHERY_CONNECT_AS)" + ); + } + _ => {} } + + // Spawn server connection handler + if config.server_enabled { + handles.push(tokio::spawn(connection::server::run())); + } + + // Watch the threads + while let Some(res) = handles.next().await { + match res { + Ok(Err(e)) => { + error!("CONNECTION ERROR: {e:#}"); + } + Err(e) => { + error!("SPAWN ERROR: {e:#}"); + } + Ok(Ok(())) => {} + } + } + + Ok(()) } #[tokio::main] @@ -60,3 +90,12 @@ async fn main() -> anyhow::Result<()> { Ok(()) } + +fn install_crypto_provider() { + if let Err(e) = + rustls::crypto::aws_lc_rs::default_provider().install_default() + { + error!("Failed to install default crypto provider | {e:?}"); + std::process::exit(1); + }; +} diff --git a/client/core/rs/src/entities/config/periphery.rs b/client/core/rs/src/entities/config/periphery.rs index 8c41e7592..41c367e55 100644 --- a/client/core/rs/src/entities/config/periphery.rs +++ b/client/core/rs/src/entities/config/periphery.rs @@ -132,10 +132,13 @@ pub struct Env { pub periphery_passkeys: Option>, /// Override `passkeys` from file pub periphery_passkeys_file: Option, - /// Override `core_address` - pub periphery_core_address: Option, + /// Override `core_addresses` + #[serde(alias = "periphery_core_address")] + pub periphery_core_addresses: Option>, /// Override `connect_as` pub periphery_connect_as: Option, + /// Override `server_enabled` + pub periphery_server_enabled: Option, /// Override `port` pub periphery_port: Option, /// Override `bind_ip` @@ -202,6 +205,7 @@ pub struct PeripheryConfig { /// Optionally pin a specific Core public key /// for additional trust. #[serde( + default, alias = "core_public_key", deserialize_with = "option_string_list_deserializer", skip_serializing_if = "Option::is_none" @@ -209,23 +213,33 @@ pub struct PeripheryConfig { pub core_public_keys: Option>, /// Deprecated. Legacy v1 compatibility. /// Users should upgrade to private / public key authentication. + /// Can only be used with Core -> Periphery connection. #[serde(skip_serializing_if = "Option::is_none")] pub passkeys: Option>, - // ============================ - // = OUTBOUND CONNECTION MODE = - // ============================ + // ======================= + // = OUTBOUND CONNECTION = + // ======================= /// Address of Komodo Core when connecting outbound - #[serde(skip_serializing_if = "Option::is_none")] - pub core_address: Option, + #[serde( + default, + alias = "core_address", + deserialize_with = "option_string_list_deserializer", + skip_serializing_if = "Option::is_none" + )] + pub core_addresses: Option>, /// Server name / id to connect as #[serde(skip_serializing_if = "Option::is_none")] pub connect_as: Option, - // =========================== - // = INBOUND CONNECTION MODE = - // =========================== + // ====================== + // = INBOUND CONNECTION = + // ====================== + /// Enable the inbound connection server + #[serde(default = "default_server_enabled")] + pub server_enabled: bool, + /// The port periphery will run on. /// Default: `8120` #[serde(default = "default_periphery_port")] @@ -379,6 +393,10 @@ fn default_container_stats_polling_rate() -> Timelength { Timelength::ThirtySeconds } +fn default_server_enabled() -> bool { + true +} + fn default_ssl_enabled() -> bool { true } @@ -389,8 +407,9 @@ impl Default for PeripheryConfig { private_key: default_private_key(), core_public_keys: None, passkeys: None, - core_address: None, + core_addresses: None, connect_as: None, + server_enabled: default_server_enabled(), port: default_periphery_port(), bind_ip: default_periphery_bind_ip(), root_directory: default_root_directory(), @@ -426,8 +445,9 @@ impl PeripheryConfig { passkeys: self.passkeys.as_ref().map(|passkeys| { passkeys.iter().map(|p| empty_or_redacted(p)).collect() }), - core_address: self.core_address.clone(), + core_addresses: self.core_addresses.clone(), connect_as: self.connect_as.clone(), + server_enabled: self.server_enabled, port: self.port, bind_ip: self.bind_ip.clone(), root_directory: self.root_directory.clone(),