move logging to tracing
This commit is contained in:
parent
6b698ae869
commit
e17547ad83
302
Cargo.lock
generated
302
Cargo.lock
generated
@ -17,15 +17,6 @@ version = "1.0.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
|
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "android_system_properties"
|
|
||||||
version = "0.1.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
|
|
||||||
dependencies = [
|
|
||||||
"libc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anyhow"
|
name = "anyhow"
|
||||||
version = "1.0.69"
|
version = "1.0.69"
|
||||||
@ -146,12 +137,6 @@ version = "1.3.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bumpalo"
|
|
||||||
version = "3.12.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bytemuck"
|
name = "bytemuck"
|
||||||
version = "1.13.1"
|
version = "1.13.1"
|
||||||
@ -196,13 +181,15 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"chrono",
|
|
||||||
"console-subscriber",
|
"console-subscriber",
|
||||||
"futures",
|
"futures",
|
||||||
"hyper",
|
"hyper",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
"time",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"tracing",
|
||||||
|
"tracing-subscriber",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -211,31 +198,6 @@ version = "1.0.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "chrono"
|
|
||||||
version = "0.4.24"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b"
|
|
||||||
dependencies = [
|
|
||||||
"iana-time-zone",
|
|
||||||
"js-sys",
|
|
||||||
"num-integer",
|
|
||||||
"num-traits",
|
|
||||||
"time",
|
|
||||||
"wasm-bindgen",
|
|
||||||
"winapi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "codespan-reporting"
|
|
||||||
version = "0.11.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
|
|
||||||
dependencies = [
|
|
||||||
"termcolor",
|
|
||||||
"unicode-width",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "console-api"
|
name = "console-api"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
@ -272,12 +234,6 @@ dependencies = [
|
|||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "core-foundation-sys"
|
|
||||||
version = "0.8.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crc32fast"
|
name = "crc32fast"
|
||||||
version = "1.3.2"
|
version = "1.3.2"
|
||||||
@ -306,50 +262,6 @@ dependencies = [
|
|||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cxx"
|
|
||||||
version = "1.0.92"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9a140f260e6f3f79013b8bfc65e7ce630c9ab4388c6a89c71e07226f49487b72"
|
|
||||||
dependencies = [
|
|
||||||
"cc",
|
|
||||||
"cxxbridge-flags",
|
|
||||||
"cxxbridge-macro",
|
|
||||||
"link-cplusplus",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cxx-build"
|
|
||||||
version = "1.0.92"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "da6383f459341ea689374bf0a42979739dc421874f112ff26f829b8040b8e613"
|
|
||||||
dependencies = [
|
|
||||||
"cc",
|
|
||||||
"codespan-reporting",
|
|
||||||
"once_cell",
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"scratch",
|
|
||||||
"syn 1.0.109",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cxxbridge-flags"
|
|
||||||
version = "1.0.92"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "90201c1a650e95ccff1c8c0bb5a343213bdd317c6e600a93075bca2eff54ec97"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cxxbridge-macro"
|
|
||||||
version = "1.0.92"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0b75aed41bb2e6367cae39e6326ef817a851db13c13e4f3263714ca3cfb8de56"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn 1.0.109",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "either"
|
name = "either"
|
||||||
version = "1.8.1"
|
version = "1.8.1"
|
||||||
@ -445,7 +357,7 @@ checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"libc",
|
"libc",
|
||||||
"wasi 0.11.0+wasi-snapshot-preview1",
|
"wasi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -577,30 +489,6 @@ dependencies = [
|
|||||||
"tokio-io-timeout",
|
"tokio-io-timeout",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "iana-time-zone"
|
|
||||||
version = "0.1.53"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765"
|
|
||||||
dependencies = [
|
|
||||||
"android_system_properties",
|
|
||||||
"core-foundation-sys",
|
|
||||||
"iana-time-zone-haiku",
|
|
||||||
"js-sys",
|
|
||||||
"wasm-bindgen",
|
|
||||||
"winapi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "iana-time-zone-haiku"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca"
|
|
||||||
dependencies = [
|
|
||||||
"cxx",
|
|
||||||
"cxx-build",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "1.9.2"
|
version = "1.9.2"
|
||||||
@ -626,15 +514,6 @@ version = "1.0.6"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
|
checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "js-sys"
|
|
||||||
version = "0.3.61"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730"
|
|
||||||
dependencies = [
|
|
||||||
"wasm-bindgen",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lazy_static"
|
name = "lazy_static"
|
||||||
version = "1.4.0"
|
version = "1.4.0"
|
||||||
@ -647,15 +526,6 @@ version = "0.2.140"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c"
|
checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "link-cplusplus"
|
|
||||||
version = "1.0.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5"
|
|
||||||
dependencies = [
|
|
||||||
"cc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.4.17"
|
version = "0.4.17"
|
||||||
@ -715,7 +585,7 @@ checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
"wasi 0.11.0+wasi-snapshot-preview1",
|
"wasi",
|
||||||
"windows-sys",
|
"windows-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -730,13 +600,13 @@ dependencies = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-integer"
|
name = "nu-ansi-term"
|
||||||
version = "0.1.45"
|
version = "0.46.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
|
checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg",
|
"overload",
|
||||||
"num-traits",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -758,6 +628,15 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num_threads"
|
||||||
|
version = "0.1.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "object"
|
name = "object"
|
||||||
version = "0.30.3"
|
version = "0.30.3"
|
||||||
@ -773,6 +652,12 @@ version = "1.17.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
|
checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "overload"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "percent-encoding"
|
name = "percent-encoding"
|
||||||
version = "2.2.0"
|
version = "2.2.0"
|
||||||
@ -939,12 +824,6 @@ version = "1.0.13"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
|
checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "scratch"
|
|
||||||
version = "1.0.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.156"
|
version = "1.0.156"
|
||||||
@ -994,6 +873,12 @@ dependencies = [
|
|||||||
"autocfg",
|
"autocfg",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "smallvec"
|
||||||
|
version = "1.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "socket2"
|
name = "socket2"
|
||||||
version = "0.4.9"
|
version = "0.4.9"
|
||||||
@ -1032,15 +917,6 @@ version = "0.1.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
|
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "termcolor"
|
|
||||||
version = "1.2.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
|
|
||||||
dependencies = [
|
|
||||||
"winapi-util",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thread_local"
|
name = "thread_local"
|
||||||
version = "1.1.7"
|
version = "1.1.7"
|
||||||
@ -1053,13 +929,31 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "time"
|
name = "time"
|
||||||
version = "0.1.45"
|
version = "0.3.20"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
|
checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"itoa",
|
||||||
"libc",
|
"libc",
|
||||||
"wasi 0.10.0+wasi-snapshot-preview1",
|
"num_threads",
|
||||||
"winapi",
|
"serde",
|
||||||
|
"time-core",
|
||||||
|
"time-macros",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "time-core"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "time-macros"
|
||||||
|
version = "0.2.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36"
|
||||||
|
dependencies = [
|
||||||
|
"time-core",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1234,6 +1128,17 @@ dependencies = [
|
|||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tracing-log"
|
||||||
|
version = "0.1.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
|
||||||
|
dependencies = [
|
||||||
|
"lazy_static",
|
||||||
|
"log",
|
||||||
|
"tracing-core",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing-subscriber"
|
name = "tracing-subscriber"
|
||||||
version = "0.3.16"
|
version = "0.3.16"
|
||||||
@ -1241,12 +1146,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
|
checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"matchers",
|
"matchers",
|
||||||
|
"nu-ansi-term",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"regex",
|
"regex",
|
||||||
"sharded-slab",
|
"sharded-slab",
|
||||||
|
"smallvec",
|
||||||
"thread_local",
|
"thread_local",
|
||||||
|
"time",
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-core",
|
"tracing-core",
|
||||||
|
"tracing-log",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1261,12 +1170,6 @@ version = "1.0.8"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
|
checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicode-width"
|
|
||||||
version = "0.1.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "valuable"
|
name = "valuable"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@ -1283,72 +1186,12 @@ dependencies = [
|
|||||||
"try-lock",
|
"try-lock",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasi"
|
|
||||||
version = "0.10.0+wasi-snapshot-preview1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasi"
|
name = "wasi"
|
||||||
version = "0.11.0+wasi-snapshot-preview1"
|
version = "0.11.0+wasi-snapshot-preview1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasm-bindgen"
|
|
||||||
version = "0.2.84"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if",
|
|
||||||
"wasm-bindgen-macro",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasm-bindgen-backend"
|
|
||||||
version = "0.2.84"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9"
|
|
||||||
dependencies = [
|
|
||||||
"bumpalo",
|
|
||||||
"log",
|
|
||||||
"once_cell",
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn 1.0.109",
|
|
||||||
"wasm-bindgen-shared",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasm-bindgen-macro"
|
|
||||||
version = "0.2.84"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5"
|
|
||||||
dependencies = [
|
|
||||||
"quote",
|
|
||||||
"wasm-bindgen-macro-support",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasm-bindgen-macro-support"
|
|
||||||
version = "0.2.84"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn 1.0.109",
|
|
||||||
"wasm-bindgen-backend",
|
|
||||||
"wasm-bindgen-shared",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasm-bindgen-shared"
|
|
||||||
version = "0.2.84"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi"
|
name = "winapi"
|
||||||
version = "0.3.9"
|
version = "0.3.9"
|
||||||
@ -1365,15 +1208,6 @@ version = "0.4.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi-util"
|
|
||||||
version = "0.1.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
|
|
||||||
dependencies = [
|
|
||||||
"winapi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi-x86_64-pc-windows-gnu"
|
name = "winapi-x86_64-pc-windows-gnu"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
|
@ -12,12 +12,13 @@ bytemuck = { version = "1.13.0", features = ["derive"] }
|
|||||||
serde = { version = "1.0.152", features = ["derive"] }
|
serde = { version = "1.0.152", features = ["derive"] }
|
||||||
serde_json = "1.0.91"
|
serde_json = "1.0.91"
|
||||||
hyper = { version = "0.14.24", optional = true, features = ["server", "http1", "tcp"] }
|
hyper = { version = "0.14.24", optional = true, features = ["server", "http1", "tcp"] }
|
||||||
chrono = { version = "0.4.23", optional = true }
|
|
||||||
futures = { version = "0.3.27", default-features = false, features = ["std"] }
|
futures = { version = "0.3.27", default-features = false, features = ["std"] }
|
||||||
console-subscriber = { version = "0.1.8", optional = true }
|
console-subscriber = { version = "0.1.8", optional = true }
|
||||||
|
tracing = "0.1.37"
|
||||||
|
tracing-subscriber = { version = "0.3.16", features = ["time"] }
|
||||||
|
time = { version = "0.3.20", features = ["local-offset", "macros"] }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["debug_server", "chrono"]
|
default = ["debug_server"]
|
||||||
chrono = ["dep:chrono"]
|
|
||||||
debug_server = ["dep:hyper"]
|
debug_server = ["dep:hyper"]
|
||||||
tokio_console = ["dep:console-subscriber"]
|
tokio_console = ["dep:console-subscriber"]
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
{
|
{
|
||||||
|
"time_format": "[year]:[month]:[day] [hour]:[minute]:[second]",
|
||||||
|
"log_level": "info",
|
||||||
"dyn_ip_server": "127.0.0.1:11811",
|
"dyn_ip_server": "127.0.0.1:11811",
|
||||||
"listen_addr": "0.0.0.0:11820",
|
"listen_addr": "0.0.0.0:11820",
|
||||||
"debug_server_addr": "0.0.0.0:4885",
|
"debug_server_addr": "0.0.0.0:4885",
|
||||||
|
@ -6,6 +6,7 @@ use std::convert::Infallible;
|
|||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
|
use tracing::error;
|
||||||
|
|
||||||
use crate::ports::PortHandler;
|
use crate::ports::PortHandler;
|
||||||
use crate::spawn;
|
use crate::spawn;
|
||||||
@ -36,7 +37,7 @@ pub async fn debug_server(addr: SocketAddr, port_handler: Arc<Mutex<PortHandler>
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
// Run this server for... forever!
|
// Run this server for... forever!
|
||||||
if let Err(e) = server.await {
|
if let Err(error) = server.await {
|
||||||
eprintln!("server error: {}", e);
|
error!(%error, "debug server error");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
331
src/main.rs
331
src/main.rs
@ -13,6 +13,7 @@ use debug_server::debug_server;
|
|||||||
use futures::Future;
|
use futures::Future;
|
||||||
use packets::{Header, Packet, RemConnect};
|
use packets::{Header, Packet, RemConnect};
|
||||||
use serde::{Deserialize, Deserializer};
|
use serde::{Deserialize, Deserializer};
|
||||||
|
use time::format_description::OwnedFormatItem;
|
||||||
use tokio::{
|
use tokio::{
|
||||||
io::AsyncWriteExt,
|
io::AsyncWriteExt,
|
||||||
net::{TcpListener, TcpStream},
|
net::{TcpListener, TcpStream},
|
||||||
@ -20,6 +21,7 @@ use tokio::{
|
|||||||
sync::Mutex,
|
sync::Mutex,
|
||||||
time::{sleep, timeout, Instant},
|
time::{sleep, timeout, Instant},
|
||||||
};
|
};
|
||||||
|
use tracing::{debug, error, info, warn, Level};
|
||||||
|
|
||||||
use crate::packets::{dyn_ip_update, PacketKind, REJECT_OOP, REJECT_TIMEOUT};
|
use crate::packets::{dyn_ip_update, PacketKind, REJECT_OOP, REJECT_TIMEOUT};
|
||||||
use crate::ports::{AllowedPorts, PortHandler, PortStatus};
|
use crate::ports::{AllowedPorts, PortHandler, PortStatus};
|
||||||
@ -54,6 +56,29 @@ pub struct Config {
|
|||||||
#[serde(deserialize_with = "maybe_parse_socket_addr")]
|
#[serde(deserialize_with = "maybe_parse_socket_addr")]
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
debug_server_addr: Option<SocketAddr>,
|
debug_server_addr: Option<SocketAddr>,
|
||||||
|
|
||||||
|
#[serde(deserialize_with = "parse_time_format")]
|
||||||
|
time_format: OwnedFormatItem,
|
||||||
|
|
||||||
|
#[serde(deserialize_with = "parse_log_level")]
|
||||||
|
log_level: Level,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_log_level<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Level, D::Error> {
|
||||||
|
use serde::de::Error;
|
||||||
|
|
||||||
|
String::deserialize(deserializer)?
|
||||||
|
.parse()
|
||||||
|
.map_err(|err| D::Error::custom(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_time_format<'de, D: Deserializer<'de>>(
|
||||||
|
deserializer: D,
|
||||||
|
) -> Result<OwnedFormatItem, D::Error> {
|
||||||
|
use serde::de::Error;
|
||||||
|
|
||||||
|
time::format_description::parse_owned::<2>(&String::deserialize(deserializer)?)
|
||||||
|
.map_err(|err| D::Error::custom(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn maybe_parse_socket_addr<'de, D: Deserializer<'de>>(
|
fn maybe_parse_socket_addr<'de, D: Deserializer<'de>>(
|
||||||
@ -87,7 +112,7 @@ fn parse_socket_addr<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Socke
|
|||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
fn load(path: impl AsRef<Path>) -> std::io::Result<Self> {
|
fn load(path: impl AsRef<Path>) -> std::io::Result<Self> {
|
||||||
println!("loading config");
|
info!("loading config");
|
||||||
Ok(serde_json::from_reader(BufReader::new(File::open(path)?))?)
|
Ok(serde_json::from_reader(BufReader::new(File::open(path)?))?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -113,154 +138,182 @@ fn spawn<T: Send + 'static>(
|
|||||||
.unwrap_or_else(|err| panic!("failed to spawn {name:?}: {err:?}"))
|
.unwrap_or_else(|err| panic!("failed to spawn {name:?}: {err:?}"))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
fn main() -> anyhow::Result<()> {
|
||||||
async fn main() -> anyhow::Result<()> {
|
|
||||||
#[cfg(feature = "tokio_console")]
|
|
||||||
console_subscriber::init();
|
|
||||||
|
|
||||||
let config = Arc::new(Config::load("config.json")?);
|
let config = Arc::new(Config::load("config.json")?);
|
||||||
|
|
||||||
if config.allowed_ports.is_empty() {
|
if config.allowed_ports.is_empty() {
|
||||||
panic!("no allowed ports");
|
panic!("no allowed ports");
|
||||||
}
|
}
|
||||||
|
|
||||||
let cache_path = PathBuf::from("cache.json");
|
let local_offset = time::UtcOffset::local_offset_at(time::OffsetDateTime::UNIX_EPOCH)?;
|
||||||
|
|
||||||
let (change_sender, mut change_receiver) = tokio::sync::watch::channel(Instant::now());
|
tokio::runtime::Builder::new_multi_thread()
|
||||||
|
.enable_all()
|
||||||
|
.build()?
|
||||||
|
.block_on(async move {
|
||||||
|
{
|
||||||
|
use tracing_subscriber::prelude::*;
|
||||||
|
use tracing_subscriber::*;
|
||||||
|
|
||||||
let mut port_handler = PortHandler::load_or_default(&cache_path, change_sender);
|
// build a `Subscriber` by combining layers with a
|
||||||
port_handler.update_allowed_ports(&config.allowed_ports);
|
// `tracing_subscriber::Registry`:
|
||||||
|
let registry = tracing_subscriber::registry();
|
||||||
|
|
||||||
let port_handler = Arc::new(Mutex::new(port_handler));
|
#[cfg(feature = "tokio_console")]
|
||||||
|
let registry = registry.with(console_subscriber::spawn());
|
||||||
|
|
||||||
{
|
registry
|
||||||
let port_handler = port_handler.clone();
|
.with(
|
||||||
spawn("cache daemon", async move {
|
fmt::layer()
|
||||||
let mut last_store = Instant::now() - 2 * CACHE_STORE_INTERVAL;
|
.with_target(false)
|
||||||
let mut change_timeout = None;
|
.with_timer(fmt::time::OffsetTime::new(
|
||||||
loop {
|
local_offset,
|
||||||
if let Some(change_timeout) = change_timeout.take() {
|
config.time_format.clone(),
|
||||||
tokio::time::timeout(change_timeout, change_receiver.changed())
|
))
|
||||||
.await
|
.with_filter(filter::LevelFilter::from_level(config.log_level)),
|
||||||
.unwrap_or(Ok(()))
|
)
|
||||||
} else {
|
.init();
|
||||||
change_receiver.changed().await
|
}
|
||||||
}
|
|
||||||
.expect("failed to wait for cache changes");
|
|
||||||
|
|
||||||
let time_since_last_store = last_store.elapsed();
|
let cache_path = PathBuf::from("cache.json");
|
||||||
|
|
||||||
if time_since_last_store > CACHE_STORE_INTERVAL {
|
let (change_sender, mut change_receiver) = tokio::sync::watch::channel(Instant::now());
|
||||||
let port_handler = port_handler.lock().await;
|
|
||||||
|
|
||||||
last_store = Instant::now();
|
let mut port_handler = PortHandler::load_or_default(&cache_path, change_sender);
|
||||||
if let Err(err) = port_handler.store(&cache_path) {
|
port_handler.update_allowed_ports(&config.allowed_ports);
|
||||||
println!("failed to store cache: {err:?}");
|
|
||||||
|
let port_handler = Arc::new(Mutex::new(port_handler));
|
||||||
|
|
||||||
|
{
|
||||||
|
let port_handler = port_handler.clone();
|
||||||
|
spawn("cache daemon", async move {
|
||||||
|
let mut last_store = Instant::now() - 2 * CACHE_STORE_INTERVAL;
|
||||||
|
let mut change_timeout = None;
|
||||||
|
loop {
|
||||||
|
if let Some(change_timeout) = change_timeout.take() {
|
||||||
|
tokio::time::timeout(change_timeout, change_receiver.changed())
|
||||||
|
.await
|
||||||
|
.unwrap_or(Ok(()))
|
||||||
|
} else {
|
||||||
|
change_receiver.changed().await
|
||||||
|
}
|
||||||
|
.expect("failed to wait for cache changes");
|
||||||
|
|
||||||
|
let time_since_last_store = last_store.elapsed();
|
||||||
|
|
||||||
|
if time_since_last_store > CACHE_STORE_INTERVAL {
|
||||||
|
let port_handler = port_handler.lock().await;
|
||||||
|
|
||||||
|
last_store = Instant::now();
|
||||||
|
if let Err(err) = port_handler.store(&cache_path) {
|
||||||
|
error!("failed to store cache: {err:?}");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
change_timeout = Some(CACHE_STORE_INTERVAL - time_since_last_store);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
});
|
||||||
change_timeout = Some(CACHE_STORE_INTERVAL - time_since_last_store);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "debug_server")]
|
|
||||||
if let Some(debug_server_addr) = config.debug_server_addr {
|
|
||||||
println!("starting debug server on {debug_server_addr:?}");
|
|
||||||
spawn(
|
|
||||||
"debug server",
|
|
||||||
debug_server(debug_server_addr, port_handler.clone()),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
let listener = TcpListener::bind(config.listen_addr).await?;
|
|
||||||
println!("listening on {}", config.listen_addr);
|
|
||||||
|
|
||||||
while let Ok((mut stream, addr)) = listener.accept().await {
|
|
||||||
println!("connection from {addr}");
|
|
||||||
|
|
||||||
let port_handler = port_handler.clone();
|
|
||||||
let config = config.clone();
|
|
||||||
|
|
||||||
let mut handler_metadata = HandlerMetadata::default();
|
|
||||||
|
|
||||||
spawn(&format!("connection to {addr}"), async move {
|
|
||||||
use futures::future::FutureExt;
|
|
||||||
|
|
||||||
let res = std::panic::AssertUnwindSafe(connection_handler(
|
|
||||||
&config,
|
|
||||||
&mut handler_metadata,
|
|
||||||
&port_handler,
|
|
||||||
&mut stream,
|
|
||||||
))
|
|
||||||
.catch_unwind()
|
|
||||||
.await;
|
|
||||||
|
|
||||||
let error = match res {
|
|
||||||
Err(err) => {
|
|
||||||
let err = err
|
|
||||||
.downcast::<String>()
|
|
||||||
.map(|err| *err)
|
|
||||||
.unwrap_or_else(|_| "?".to_owned());
|
|
||||||
|
|
||||||
Some(format!("panic at: {err}"))
|
|
||||||
}
|
|
||||||
Ok(Err(err)) => Some(err.to_string()),
|
|
||||||
Ok(Ok(())) => None,
|
|
||||||
};
|
|
||||||
|
|
||||||
if let Some(err) = error {
|
|
||||||
println!("client at {addr} had an error: {err}");
|
|
||||||
|
|
||||||
let mut packet = Packet::default();
|
|
||||||
|
|
||||||
packet.data.extend_from_slice(err.as_bytes());
|
|
||||||
packet.data.truncate((u8::MAX - 1) as usize);
|
|
||||||
packet.data.push(0);
|
|
||||||
packet.header = Header {
|
|
||||||
kind: PacketKind::Error.raw(),
|
|
||||||
length: packet.data.len() as u8,
|
|
||||||
};
|
|
||||||
|
|
||||||
let (_, mut writer) = stream.split();
|
|
||||||
let _ = packet.send(&mut writer).await;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(port) = handler_metadata.port {
|
#[cfg(feature = "debug_server")]
|
||||||
let mut port_handler = port_handler.lock().await;
|
if let Some(listen_addr) = config.debug_server_addr {
|
||||||
|
warn!(%listen_addr, "debug server listening");
|
||||||
|
spawn(
|
||||||
|
"debug server",
|
||||||
|
debug_server(listen_addr, port_handler.clone()),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(port_state) = port_handler.port_state.get_mut(&port) {
|
let listener = TcpListener::bind(config.listen_addr).await?;
|
||||||
port_state.new_state(PortStatus::Disconnected);
|
warn!(
|
||||||
port_handler.register_update();
|
listen_addr = %config.listen_addr,
|
||||||
}
|
"centralex server listening"
|
||||||
|
);
|
||||||
|
|
||||||
if let Some(listener) = handler_metadata.listener.take() {
|
while let Ok((mut stream, addr)) = listener.accept().await {
|
||||||
let res = port_handler.start_rejector(
|
info!(%addr, "new connection");
|
||||||
port,
|
|
||||||
listener,
|
|
||||||
Packet {
|
|
||||||
header: Header {
|
|
||||||
kind: PacketKind::Reject.raw(),
|
|
||||||
length: 3,
|
|
||||||
},
|
|
||||||
data: b"nc\0".to_vec(),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
if let Err(err) = res {
|
let port_handler = port_handler.clone();
|
||||||
println!(
|
let config = config.clone();
|
||||||
"failed to start rejector on port {port} after client error: {err}"
|
|
||||||
);
|
let mut handler_metadata = HandlerMetadata::default();
|
||||||
|
|
||||||
|
spawn(&format!("connection to {addr}"), async move {
|
||||||
|
use futures::future::FutureExt;
|
||||||
|
|
||||||
|
let res = std::panic::AssertUnwindSafe(connection_handler(
|
||||||
|
&config,
|
||||||
|
&mut handler_metadata,
|
||||||
|
&port_handler,
|
||||||
|
&mut stream,
|
||||||
|
))
|
||||||
|
.catch_unwind()
|
||||||
|
.await;
|
||||||
|
|
||||||
|
let error = match res {
|
||||||
|
Err(err) => {
|
||||||
|
let err = err
|
||||||
|
.downcast::<String>()
|
||||||
|
.map(|err| *err)
|
||||||
|
.unwrap_or_else(|_| "?".to_owned());
|
||||||
|
|
||||||
|
Some(format!("panic at: {err}"))
|
||||||
|
}
|
||||||
|
Ok(Err(err)) => Some(err.to_string()),
|
||||||
|
Ok(Ok(())) => None,
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(error) = error {
|
||||||
|
error!(%addr, %error, "Client had an error");
|
||||||
|
|
||||||
|
let mut packet = Packet::default();
|
||||||
|
|
||||||
|
packet.data.extend_from_slice(error.as_bytes());
|
||||||
|
packet.data.truncate((u8::MAX - 1) as usize);
|
||||||
|
packet.data.push(0);
|
||||||
|
packet.header = Header {
|
||||||
|
kind: PacketKind::Error.raw(),
|
||||||
|
length: packet.data.len() as u8,
|
||||||
|
};
|
||||||
|
|
||||||
|
let (_, mut writer) = stream.split();
|
||||||
|
let _ = packet.send(&mut writer).await;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
if let Some(port) = handler_metadata.port {
|
||||||
|
let mut port_handler = port_handler.lock().await;
|
||||||
|
|
||||||
|
if let Some(port_state) = port_handler.port_state.get_mut(&port) {
|
||||||
|
port_state.new_state(PortStatus::Disconnected);
|
||||||
|
port_handler.register_update();
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(listener) = handler_metadata.listener.take() {
|
||||||
|
let res = port_handler.start_rejector(
|
||||||
|
port,
|
||||||
|
listener,
|
||||||
|
Packet {
|
||||||
|
header: Header {
|
||||||
|
kind: PacketKind::Reject.raw(),
|
||||||
|
length: 3,
|
||||||
|
},
|
||||||
|
data: b"nc\0".to_vec(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
if let Err(error) = res {
|
||||||
|
error!(%port, %error, "failed to start rejector");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sleep(Duration::from_secs(3)).await;
|
||||||
|
let _ = stream.shutdown().await;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
sleep(Duration::from_secs(3)).await;
|
Ok(())
|
||||||
let _ = stream.shutdown().await;
|
})
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
@ -301,7 +354,7 @@ async fn connection_handler(
|
|||||||
.await
|
.await
|
||||||
.allocate_port_for_number(config, number);
|
.allocate_port_for_number(config, number);
|
||||||
|
|
||||||
println!("allocated port: {:?}", port);
|
info!(port, "allocated port");
|
||||||
|
|
||||||
let Some(port) = port else {
|
let Some(port) = port else {
|
||||||
writer.write_all(REJECT_OOP).await?;
|
writer.write_all(REJECT_OOP).await?;
|
||||||
@ -383,8 +436,18 @@ async fn connection_handler(
|
|||||||
let mut last_ping_received_at = Instant::now();
|
let mut last_ping_received_at = Instant::now();
|
||||||
|
|
||||||
let result = loop {
|
let result = loop {
|
||||||
// println!("next ping in {:?}s", SEND_PING_INTERVAL.saturating_sub(now.saturating_duration_since(last_ping_sent_at)).as_secs());
|
debug!(
|
||||||
// println!("will timeout in in {:?}s", PING_TIMEOUT.saturating_sub(now.saturating_duration_since(last_ping_received_at)).as_secs());
|
seconds = SEND_PING_INTERVAL
|
||||||
|
.saturating_sub(last_ping_sent_at.elapsed())
|
||||||
|
.as_secs(),
|
||||||
|
"next ping in"
|
||||||
|
);
|
||||||
|
debug!(
|
||||||
|
seconds = PING_TIMEOUT
|
||||||
|
.saturating_sub(last_ping_received_at.elapsed())
|
||||||
|
.as_secs(),
|
||||||
|
"timeout in",
|
||||||
|
);
|
||||||
|
|
||||||
let send_next_ping_in = SEND_PING_INTERVAL.saturating_sub(last_ping_sent_at.elapsed());
|
let send_next_ping_in = SEND_PING_INTERVAL.saturating_sub(last_ping_sent_at.elapsed());
|
||||||
let next_ping_expected_in = PING_TIMEOUT.saturating_sub(last_ping_received_at.elapsed());
|
let next_ping_expected_in = PING_TIMEOUT.saturating_sub(last_ping_received_at.elapsed());
|
||||||
@ -398,14 +461,14 @@ async fn connection_handler(
|
|||||||
packet.recv_into(&mut reader).await?;
|
packet.recv_into(&mut reader).await?;
|
||||||
|
|
||||||
if packet.kind() == PacketKind::Ping {
|
if packet.kind() == PacketKind::Ping {
|
||||||
// println!("received ping");
|
debug!("received ping");
|
||||||
last_ping_received_at = Instant::now();
|
last_ping_received_at = Instant::now();
|
||||||
} else {
|
} else {
|
||||||
break Result::Packet { packet }
|
break Result::Packet { packet }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
_ = sleep(send_next_ping_in) => {
|
_ = sleep(send_next_ping_in) => {
|
||||||
// println!("sending ping");
|
debug!("sending ping");
|
||||||
writer.write_all(bytemuck::bytes_of(& Header { kind: PacketKind::Ping.raw(), length: 0 })).await?;
|
writer.write_all(bytemuck::bytes_of(& Header { kind: PacketKind::Ping.raw(), length: 0 })).await?;
|
||||||
last_ping_sent_at = Instant::now();
|
last_ping_sent_at = Instant::now();
|
||||||
}
|
}
|
||||||
@ -422,7 +485,7 @@ async fn connection_handler(
|
|||||||
packet.kind(),
|
packet.kind(),
|
||||||
packets::PacketKind::End | packets::PacketKind::Reject
|
packets::PacketKind::End | packets::PacketKind::Reject
|
||||||
) {
|
) {
|
||||||
println!("got disconnect packet: {packet:?}");
|
info!(?packet, "got disconnect packet");
|
||||||
|
|
||||||
if packet.kind() == packets::PacketKind::End {
|
if packet.kind() == packets::PacketKind::End {
|
||||||
packet.header.kind = packets::PacketKind::Reject.raw();
|
packet.header.kind = packets::PacketKind::Reject.raw();
|
||||||
@ -449,7 +512,7 @@ async fn connection_handler(
|
|||||||
stream,
|
stream,
|
||||||
addr,
|
addr,
|
||||||
} => {
|
} => {
|
||||||
println!("got caller from: {addr}");
|
info!(%addr, "got caller from");
|
||||||
|
|
||||||
packet.data.clear();
|
packet.data.clear();
|
||||||
/* The I-Telex Clients can't handle data in this packet due to a bug
|
/* The I-Telex Clients can't handle data in this packet due to a bug
|
||||||
|
@ -6,6 +6,7 @@ use tokio::{
|
|||||||
io::{AsyncReadExt, AsyncWriteExt},
|
io::{AsyncReadExt, AsyncWriteExt},
|
||||||
net::tcp::{ReadHalf, WriteHalf},
|
net::tcp::{ReadHalf, WriteHalf},
|
||||||
};
|
};
|
||||||
|
use tracing::info;
|
||||||
|
|
||||||
pub const REJECT_OOP: &[u8; 6] = b"\x04\x04oop\x00";
|
pub const REJECT_OOP: &[u8; 6] = b"\x04\x04oop\x00";
|
||||||
pub const REJECT_TIMEOUT: &[u8; 10] = b"\x04\x08timeout\x00";
|
pub const REJECT_TIMEOUT: &[u8; 10] = b"\x04\x08timeout\x00";
|
||||||
@ -183,7 +184,7 @@ pub async fn dyn_ip_update(
|
|||||||
pin: u16,
|
pin: u16,
|
||||||
port: u16,
|
port: u16,
|
||||||
) -> anyhow::Result<std::net::Ipv4Addr> {
|
) -> anyhow::Result<std::net::Ipv4Addr> {
|
||||||
println!("starting dyn ip update for number={number} port={port}...");
|
info!(%number, %port, "starting dyn ip update");
|
||||||
|
|
||||||
let mut packet = Packet::default();
|
let mut packet = Packet::default();
|
||||||
packet.header = Header {
|
packet.header = Header {
|
||||||
@ -205,7 +206,7 @@ pub async fn dyn_ip_update(
|
|||||||
|
|
||||||
packet.recv_into(&mut reader).await?;
|
packet.recv_into(&mut reader).await?;
|
||||||
|
|
||||||
let res = match packet.kind() {
|
let result = match packet.kind() {
|
||||||
PacketKind::DynIpUpdateResponse => Ok(<[u8; 4]>::try_from(packet.data)
|
PacketKind::DynIpUpdateResponse => Ok(<[u8; 4]>::try_from(packet.data)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
anyhow::anyhow!(
|
anyhow::anyhow!(
|
||||||
@ -234,7 +235,7 @@ pub async fn dyn_ip_update(
|
|||||||
_ => bail!("server returned unexpected packet"),
|
_ => bail!("server returned unexpected packet"),
|
||||||
};
|
};
|
||||||
|
|
||||||
println!("finished dyn ip update result: {res:?}");
|
info!(?result, "finished dyn ip update");
|
||||||
|
|
||||||
res
|
result
|
||||||
}
|
}
|
||||||
|
39
src/ports.rs
39
src/ports.rs
@ -13,6 +13,7 @@ use std::{
|
|||||||
use anyhow::anyhow;
|
use anyhow::anyhow;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use tokio::{net::TcpListener, sync::Mutex, task::JoinHandle, time::Instant};
|
use tokio::{net::TcpListener, sync::Mutex, task::JoinHandle, time::Instant};
|
||||||
|
use tracing::{error, info, warn};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
packets::Packet, spawn, Config, Number, Port, UnixTimestamp, PORT_OWNERSHIP_TIMEOUT,
|
packets::Packet, spawn, Config, Number, Port, UnixTimestamp, PORT_OWNERSHIP_TIMEOUT,
|
||||||
@ -65,6 +66,8 @@ fn duration_in_hours(duration: Duration) -> String {
|
|||||||
fn format_instant(instant: Instant) -> String {
|
fn format_instant(instant: Instant) -> String {
|
||||||
let when = duration_in_hours(instant.elapsed()) + " ago";
|
let when = duration_in_hours(instant.elapsed()) + " ago";
|
||||||
|
|
||||||
|
todo!();
|
||||||
|
|
||||||
#[cfg(feature = "chrono")]
|
#[cfg(feature = "chrono")]
|
||||||
let when = (|| -> anyhow::Result<_> {
|
let when = (|| -> anyhow::Result<_> {
|
||||||
use chrono::{Local, TimeZone};
|
use chrono::{Local, TimeZone};
|
||||||
@ -208,7 +211,7 @@ impl PortHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn store(&self, cache: &Path) -> anyhow::Result<()> {
|
pub fn store(&self, cache: &Path) -> anyhow::Result<()> {
|
||||||
println!("storing cache");
|
info!("storing cache");
|
||||||
let temp_file = cache.with_extension(".temp");
|
let temp_file = cache.with_extension(".temp");
|
||||||
|
|
||||||
serde_json::to_writer(BufWriter::new(File::create(&temp_file)?), self)?;
|
serde_json::to_writer(BufWriter::new(File::create(&temp_file)?), self)?;
|
||||||
@ -221,18 +224,18 @@ impl PortHandler {
|
|||||||
cache: &Path,
|
cache: &Path,
|
||||||
change_sender: tokio::sync::watch::Sender<Instant>,
|
change_sender: tokio::sync::watch::Sender<Instant>,
|
||||||
) -> std::io::Result<Self> {
|
) -> std::io::Result<Self> {
|
||||||
println!("loading cache");
|
info!("loading cache");
|
||||||
let mut cache: Self = serde_json::from_reader(BufReader::new(File::open(cache)?))?;
|
let mut cache: Self = serde_json::from_reader(BufReader::new(File::open(cache)?))?;
|
||||||
cache.change_sender = Some(change_sender);
|
cache.change_sender = Some(change_sender);
|
||||||
Ok(cache)
|
Ok(cache)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_or_default(
|
pub fn load_or_default(
|
||||||
cache: &Path,
|
path: &Path,
|
||||||
change_sender: tokio::sync::watch::Sender<Instant>,
|
change_sender: tokio::sync::watch::Sender<Instant>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self::load(cache, change_sender).unwrap_or_else(|err| {
|
Self::load(path, change_sender).unwrap_or_else(|error| {
|
||||||
println!("failed to parse cache file at {cache:?} using empty cache. error: {err}");
|
error!(?path, %error, "failed to parse cache file");
|
||||||
Self::default()
|
Self::default()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -280,7 +283,7 @@ impl PortHandler {
|
|||||||
listener: TcpListener,
|
listener: TcpListener,
|
||||||
packet: Packet,
|
packet: Packet,
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
println!("starting rejector: for port {port} with {packet:?}");
|
info!(port, ?packet, "starting rejector");
|
||||||
|
|
||||||
let port_guard = Rejector::start(listener, packet);
|
let port_guard = Rejector::start(listener, packet);
|
||||||
|
|
||||||
@ -293,7 +296,7 @@ impl PortHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn stop_rejector(&mut self, port: Port) -> Option<(TcpListener, Packet)> {
|
pub async fn stop_rejector(&mut self, port: Port) -> Option<(TcpListener, Packet)> {
|
||||||
println!("stopping rejector: for port {port}");
|
info!(port, "stopping rejector");
|
||||||
|
|
||||||
Some(self.port_guards.remove(&port)?.stop().await)
|
Some(self.port_guards.remove(&port)?.stop().await)
|
||||||
}
|
}
|
||||||
@ -394,10 +397,10 @@ impl PortHandler {
|
|||||||
if recovered_port.is_none()
|
if recovered_port.is_none()
|
||||||
&& now.saturating_sub(Duration::from_secs(timestamp)) >= PORT_RETRY_TIME
|
&& now.saturating_sub(Duration::from_secs(timestamp)) >= PORT_RETRY_TIME
|
||||||
{
|
{
|
||||||
println!(
|
info!(
|
||||||
" trying port: {port} at -{:?}",
|
port,
|
||||||
Duration::from_secs(now.as_secs())
|
last_try = ?Duration::from_secs(now.as_secs()).saturating_sub(Duration::from_secs(timestamp)),
|
||||||
.saturating_sub(Duration::from_secs(timestamp))
|
"retrying errored port",
|
||||||
);
|
);
|
||||||
|
|
||||||
match std::net::TcpListener::bind((config.listen_addr.ip(), port)) {
|
match std::net::TcpListener::bind((config.listen_addr.ip(), port)) {
|
||||||
@ -408,10 +411,10 @@ impl PortHandler {
|
|||||||
Err(_) => timestamp = now.as_secs(),
|
Err(_) => timestamp = now.as_secs(),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
println!(
|
info!(
|
||||||
"skipped port: {port} at -{:?}",
|
port,
|
||||||
Duration::from_secs(now.as_secs())
|
last_try = ?Duration::from_secs(now.as_secs()).saturating_sub(Duration::from_secs(timestamp)),
|
||||||
.saturating_sub(Duration::from_secs(timestamp))
|
"skipped retrying errored port",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -421,7 +424,7 @@ impl PortHandler {
|
|||||||
|
|
||||||
if let Some((_, port)) = recovered_port {
|
if let Some((_, port)) = recovered_port {
|
||||||
self.register_update();
|
self.register_update();
|
||||||
println!("recovered_port: {port}");
|
info!(port, "recovered port");
|
||||||
return Some(port);
|
return Some(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -440,7 +443,7 @@ impl PortHandler {
|
|||||||
|
|
||||||
if let Some((&old_number, &port)) = removable_entry {
|
if let Some((&old_number, &port)) = removable_entry {
|
||||||
self.register_update();
|
self.register_update();
|
||||||
println!("reused port {port} which used to be allocated to {old_number} which wasn't connected in a long time");
|
info!(port, old_number, "reused port");
|
||||||
assert!(self.allocated_ports.remove(&old_number).is_some());
|
assert!(self.allocated_ports.remove(&old_number).is_some());
|
||||||
return Some(port);
|
return Some(port);
|
||||||
}
|
}
|
||||||
@ -449,7 +452,7 @@ impl PortHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn mark_port_error(&mut self, number: Number, port: Port) {
|
pub fn mark_port_error(&mut self, number: Number, port: Port) {
|
||||||
println!("registering an error on port {port} for number {number}");
|
warn!(port, number, "registering an error on");
|
||||||
self.register_update();
|
self.register_update();
|
||||||
|
|
||||||
self.errored_ports.insert((
|
self.errored_ports.insert((
|
||||||
|
Loading…
Reference in New Issue
Block a user