From 8cd8596a43e12fa4096ff05d687886f757e8e303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Niemier?= Date: Mon, 4 Jul 2022 10:19:36 +0200 Subject: [PATCH] ft: add dashboard scaffold --- .gitattributes | 1 + .gitignore | 2 + Cargo.lock | 905 ++++++++++++++++++++++++++++------- Cargo.toml | 18 +- config.conf | 1 + flake.lock | 41 ++ flake.nix | 31 ++ shell.nix | 20 - src/cli/gen_cert.rs | 53 ++ src/cli/mod.rs | 11 +- src/cli/run.rs | 2 +- src/cli/serve.rs | 83 ++-- src/cli/status.rs | 2 +- src/dashboard/handlers.rs | 65 +++ src/dashboard/mod.rs | 85 ++++ src/lib.rs | 2 + src/proxy/tls_terminating.rs | 22 + src/proxy/transparent.rs | 4 + src/registry.rs | 10 +- src/service.rs | 3 +- templates/hello.html | 11 + templates/layout.html | 9 + 22 files changed, 1123 insertions(+), 258 deletions(-) create mode 100644 .gitattributes create mode 100644 config.conf create mode 100644 flake.lock create mode 100644 flake.nix delete mode 100644 shell.nix create mode 100644 src/cli/gen_cert.rs create mode 100644 src/dashboard/handlers.rs create mode 100644 src/dashboard/mod.rs create mode 100644 templates/hello.html create mode 100644 templates/layout.html diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8d93c93 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +Cargo.lock merge=binary diff --git a/.gitignore b/.gitignore index ea8c4bf..cda5ae2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /target +dolores.crt +dolores.key diff --git a/Cargo.lock b/Cargo.lock index bab99bb..9788f8c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,11 +26,119 @@ dependencies = [ "winapi", ] +[[package]] +name = "askama" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb98f10f371286b177db5eeb9a6e5396609555686a35e1d4f7b9a9c6d8af0139" +dependencies = [ + "askama_derive", + "askama_escape", + "askama_shared", +] + +[[package]] +name = "askama_derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87bf87e6e8b47264efa9bde63d6225c6276a52e05e91bf37eaa8afd0032d6b71" +dependencies = [ + "askama_shared", + "proc-macro2", + "syn", +] + +[[package]] +name = "askama_escape" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" + +[[package]] +name = "askama_shared" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf722b94118a07fcbc6640190f247334027685d4e218b794dbfe17c32bf38ed0" +dependencies = [ + "askama_escape", + "humansize", + "mime", + "mime_guess", + "nom", + "num-traits", + "percent-encoding", + "proc-macro2", + "quote", + "serde", + "syn", + "toml", +] + +[[package]] +name = "asn1-rs" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ff05a702273012438132f449575dbc804e27b2f3cbe3069aa237d26c98fa33" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8b7511298d5b7784b40b092d9e9dcd3a627a5707e4b5e507931ab0d44eeebf" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e" +dependencies = [ + "async-stream-impl", + "futures-core", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "async-trait" -version = "0.1.52" +version = "0.1.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3" +checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" dependencies = [ "proc-macro2", "quote", @@ -50,15 +158,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.63" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321629d8ba6513061f26707241fa9bc89524ff1cd7a915a97ef0c62c666ce1b6" +checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" dependencies = [ "addr2line", "cc", @@ -92,9 +200,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bumpalo" -version = "3.8.0" +version = "3.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" [[package]] name = "bytes" @@ -104,9 +212,9 @@ checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" [[package]] name = "cc" -version = "1.0.72" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" [[package]] name = "cfg-if" @@ -114,36 +222,50 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "chrono" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" -dependencies = [ - "num-integer", - "num-traits", -] - [[package]] name = "clap" -version = "2.34.0" +version = "3.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +checksum = "3124f3f75ce09e22d1410043e1e24f2ecc44fad3afe4f08408f1f7663d68da2b" dependencies = [ - "ansi_term", "atty", "bitflags", + "clap_derive", + "clap_lex", + "indexmap", + "lazy_static", "strsim", + "termcolor", "textwrap", - "unicode-width", - "vec_map", +] + +[[package]] +name = "clap_derive" +version = "3.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189ddd3b5d32a70b35e7686054371742a937b0d99128e76dde6340210e966669" +dependencies = [ + "os_str_bytes", ] [[package]] name = "color-eyre" -version = "0.5.11" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f1885697ee8a177096d42f158922251a41973117f6d8a234cee94b9509157b7" +checksum = "8ebf286c900a6d5867aeff75cfee3192857bb7f24b547d4f0df2ed6baa812c90" dependencies = [ "backtrace", "color-spantrace", @@ -156,9 +278,9 @@ dependencies = [ [[package]] name = "color-spantrace" -version = "0.1.6" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6eee477a4a8a72f4addd4de416eb56d54bc307b284d6601bafdee1f4ea462d1" +checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" dependencies = [ "once_cell", "owo-colors", @@ -166,45 +288,127 @@ dependencies = [ "tracing-error", ] +[[package]] +name = "data-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" + +[[package]] +name = "der-parser" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe398ac75057914d7d07307bf67dc7f3f574a26783b4fc7805a20ffa9f506e82" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "displaydoc" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "dolores" version = "0.1.0" dependencies = [ + "askama", + "async-stream", "async-trait", "bincode", + "clap", "color-eyre", + "http", + "hyper", + "matchit", "nix", + "once_cell", "rand", "rcgen", "rustls", "serde", - "structopt", "strum", "tokio", "tokio-rustls", "tracing", - "tracing-subscriber 0.3.5", + "tracing-subscriber", ] [[package]] name = "eyre" -version = "0.6.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "221239d1d5ea86bf5d6f91c9d6bc3646ffe471b08ff9b0f91c44f115ac969d2b" +checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" dependencies = [ "indenter", "once_cell", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures-channel" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "futures-task" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" + +[[package]] +name = "futures-util" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -214,14 +418,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" [[package]] -name = "heck" -version = "0.3.3" +name = "h2" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ - "unicode-segmentation", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", ] +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -231,6 +457,70 @@ dependencies = [ "libc", ] +[[package]] +name = "http" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6330e8a36bd8c859f3fa6d9382911fbb7147ec39807f63b923933a247240b9ba" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "humansize" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02296996cb8796d7c6e3bc2d9211b7802812d36999a51bb754123ead7d37d026" + +[[package]] +name = "hyper" +version = "0.14.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + [[package]] name = "indenter" version = "0.3.3" @@ -238,19 +528,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] -name = "instant" -version = "0.1.12" +name = "indexmap" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" dependencies = [ - "cfg-if", + "autocfg", + "hashbrown", ] +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" dependencies = [ "wasm-bindgen", ] @@ -263,28 +560,35 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.112" +version = "0.2.124" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" +checksum = "21a41fed9d98f27ab1c6d161da622a4fa35e8a54a8adc24bbf3ddd0ef70b0e50" [[package]] name = "lock_api" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" dependencies = [ "cfg-if", ] +[[package]] +name = "matchit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" + [[package]] name = "memchr" version = "2.4.1" @@ -300,26 +604,48 @@ dependencies = [ "autocfg", ] +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" dependencies = [ "adler", - "autocfg", ] [[package]] name = "mio" -version = "0.7.14" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" dependencies = [ "libc", "log", "miow", "ntapi", + "wasi 0.11.0+wasi-snapshot-preview1", "winapi", ] @@ -345,15 +671,36 @@ dependencies = [ "memoffset", ] +[[package]] +name = "nom" +version = "7.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "ntapi" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-integer" version = "0.1.44" @@ -383,50 +730,72 @@ dependencies = [ "libc", ] +[[package]] +name = "num_threads" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aba1801fb138d8e85e11d0fc70baf4fe1cdfffda7c6cd34a854905df588e5ed0" +dependencies = [ + "libc", +] + [[package]] name = "object" -version = "0.27.1" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" +checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" dependencies = [ "memchr", ] +[[package]] +name = "oid-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e20717fa0541f39bd146692035c37bedfa532b3e5071b35761082407546b2a" +dependencies = [ + "asn1-rs", +] + [[package]] name = "once_cell" -version = "1.9.0" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" + +[[package]] +name = "os_str_bytes" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" +checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" [[package]] name = "owo-colors" -version = "1.3.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2386b4ebe91c2f7f51082d4cefa145d030e33a1842a96b12e4885cc3c01f7a55" +checksum = "5e72e30578e0d0993c8ae20823dd9cff2bc5517d2f586a8aef462a581e8a03eb" [[package]] name = "parking_lot" -version = "0.11.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" dependencies = [ - "instant", "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" -version = "0.8.5" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +checksum = "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37" dependencies = [ "cfg-if", - "instant", "libc", "redox_syscall", "smallvec", - "winapi", + "windows-sys", ] [[package]] @@ -438,12 +807,24 @@ dependencies = [ "base64", ] +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + [[package]] name = "pin-project-lite" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "ppv-lite86" version = "0.2.16" @@ -476,32 +857,31 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" dependencies = [ "unicode-xid", ] [[package]] name = "quote" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ "proc-macro2", ] [[package]] name = "rand" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", - "rand_hc", ] [[package]] @@ -523,32 +903,24 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core", -] - [[package]] name = "rcgen" -version = "0.8.14" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5911d1403f4143c9d56a702069d593e8d0f3fab880a85e103604d0893ea31ba7" +checksum = "d7fa2d386df8533b02184941c76ae2e0d0c1d053f5d43339169d80f21275fc5e" dependencies = [ - "chrono", "pem", "ring", + "time", + "x509-parser", "yasna", ] [[package]] name = "redox_syscall" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] @@ -574,11 +946,20 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + [[package]] name = "rustls" -version = "0.20.2" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37e5e2290f3e040b594b1a9e04377c2c671f1a1cfd9bfdef82106ac1c113f84" +checksum = "4fbfeb8d0ddb84706bc597a5574ab8912817c52a397f819e5b614e2265206921" dependencies = [ "log", "ring", @@ -610,18 +991,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.133" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97565067517b60e2d1ea8b268e59ce036de907ac523ad83a0475da04e818989a" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.133" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed201699328568d8d08208fdd080e3ff594e6c422e438b6705905da01005d537" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" dependencies = [ "proc-macro2", "quote", @@ -646,11 +1027,27 @@ dependencies = [ "libc", ] +[[package]] +name = "slab" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" + [[package]] name = "smallvec" -version = "1.7.0" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" + +[[package]] +name = "socket2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] [[package]] name = "spin" @@ -660,90 +1057,122 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "strsim" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] -name = "structopt" -version = "0.3.25" +name = "strum" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b9788f4202aa75c240ecc9c15c65185e6a39ccdeb0fd5d008b98825464c87c" +checksum = "e96acfc1b70604b8b2f1ffa4c57e59176c7dbb05d556c71ecd2f5498a1dee7f8" dependencies = [ - "clap", - "lazy_static", - "structopt-derive", + "strum_macros", ] [[package]] -name = "structopt-derive" -version = "0.4.18" +name = "strum_macros" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" +checksum = "6878079b17446e4d3eba6192bb0a2950d5b14f0ed8424b852310e5a94345d0ef" dependencies = [ "heck", - "proc-macro-error", "proc-macro2", "quote", + "rustversion", "syn", ] [[package]] -name = "strum" -version = "0.23.0" +name = "syn" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cae14b91c7d11c9a851d3fbc80a963198998c2a64eec840477fa92d8ce9b70bb" +checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" dependencies = [ - "strum_macros", + "proc-macro2", + "quote", + "unicode-xid", ] [[package]] -name = "strum_macros" -version = "0.23.1" +name = "synstructure" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb0dc7ee9c15cea6199cde9a127fa16a4c5819af85395457ad72d68edc85a38" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "heck", "proc-macro2", "quote", - "rustversion", "syn", + "unicode-xid", ] [[package]] -name = "syn" -version = "1.0.84" +name = "termcolor" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecb2e6da8ee5eb9a61068762a32fa9619cc591ceb055b3687f4cd4051ec2e06b" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", + "winapi-util", ] [[package]] name = "textwrap" -version = "0.11.0" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" + +[[package]] +name = "thiserror" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" dependencies = [ - "unicode-width", + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] name = "thread_local" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" dependencies = [ "once_cell", ] +[[package]] +name = "time" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" +dependencies = [ + "itoa", + "libc", + "num_threads", + "time-macros", +] + +[[package]] +name = "time-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" + [[package]] name = "tokio" -version = "1.15.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbbf1c778ec206785635ce8ad57fe52b3009ae9e0c9f574a728f3049d3e55838" +checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" dependencies = [ "bytes", "libc", @@ -754,6 +1183,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", + "socket2", "tokio-macros", "winapi", ] @@ -771,20 +1201,49 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.23.2" +version = "0.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27d5f2b839802bd8267fa19b0530f5a08b9c08cd417976be2a65d130fe1c11b" +checksum = "4151fda0cf2798550ad0b34bcfc9b9dcc2a9d2471c895c68f3a8818e54f2389e" dependencies = [ "rustls", "tokio", "webpki", ] +[[package]] +name = "tokio-util" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + [[package]] name = "tracing" -version = "0.1.29" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" dependencies = [ "cfg-if", "pin-project-lite", @@ -794,9 +1253,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" +checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" dependencies = [ "proc-macro2", "quote", @@ -805,21 +1264,22 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.21" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" dependencies = [ "lazy_static", + "valuable", ] [[package]] name = "tracing-error" -version = "0.1.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4d7c0b83d4a500748fa5879461652b361edf5c9d51ede2a2ac03875ca185e24" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" dependencies = [ "tracing", - "tracing-subscriber 0.2.25", + "tracing-subscriber", ] [[package]] @@ -835,20 +1295,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "sharded-slab", - "thread_local", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.5" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d81bfa81424cc98cb034b837c985b7a290f592e5b4322f353f94a0ab0f9f594" +checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596" dependencies = [ "ansi_term", "sharded-slab", @@ -859,16 +1308,19 @@ dependencies = [ ] [[package]] -name = "unicode-segmentation" -version = "1.8.0" +name = "try-lock" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] -name = "unicode-width" -version = "0.1.9" +name = "unicase" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] [[package]] name = "unicode-xid" @@ -883,10 +1335,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] -name = "vec_map" -version = "0.8.2" +name = "valuable" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "version_check" @@ -894,17 +1346,33 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -912,9 +1380,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" dependencies = [ "bumpalo", "lazy_static", @@ -927,9 +1395,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -937,9 +1405,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" dependencies = [ "proc-macro2", "quote", @@ -950,15 +1418,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" [[package]] name = "web-sys" -version = "0.3.55" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" +checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" dependencies = [ "js-sys", "wasm-bindgen", @@ -990,17 +1458,88 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" 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]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" + +[[package]] +name = "windows_i686_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" + +[[package]] +name = "windows_i686_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" + +[[package]] +name = "x509-parser" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9bace5b5589ffead1afb76e43e34cff39cd0f3ce7e170ae0c29e53b88eb1c" +dependencies = [ + "asn1-rs", + "base64", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "ring", + "rusticata-macros", + "thiserror", + "time", +] + [[package]] name = "yasna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e262a29d0e61ccf2b6190d7050d4b237535fc76ce4c1210d9caa316f71dffa75" +checksum = "346d34a236c9d3e5f3b9b74563f238f955bbd05fa0b8b4efa53c130c43982f4c" dependencies = [ - "chrono", + "time", ] diff --git a/Cargo.toml b/Cargo.toml index 3e9874b..d1aa4c5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "dolores" version = "0.1.0" authors = ["Ɓukasz Niemier "] -edition = "2018" +edition = "2021" resolver = "2" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -14,17 +14,23 @@ split-debuginfo = "unpacked" lto = "thin" [dependencies] -color-eyre = "0.5.11" +askama = "0.11.1" +async-stream = "0.3" async-trait = "0.1" bincode = "1.3" +clap = { version = "3.0", features = ["derive", "env"] } +color-eyre = "0.6" +hyper = { version = "0.14", features = ["full"] } +matchit = "0.5.0" nix = "0.23" +once_cell = "1.10" rand = "0.8" -rcgen = "0.8" +rcgen = { version = "0.9", features = ["pem", "x509-parser"] } rustls = "0.20" -serde = { version = "1.0", features = ["derive"] } -structopt = "0.3.21" +serde = { version = "1", features = ["derive"] } +strum = { version = "0.24", features = ["derive"] } tokio = { version = "1", features = ["full"] } tokio-rustls = "0.23" tracing = "0.1.26" tracing-subscriber = "0.3" -strum = { version = "0.23", features = ["derive"] } +http = "0.2.6" diff --git a/config.conf b/config.conf new file mode 100644 index 0000000..77158d3 --- /dev/null +++ b/config.conf @@ -0,0 +1 @@ +subjectAltName=${ENV::SAN} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..0d007d6 --- /dev/null +++ b/flake.lock @@ -0,0 +1,41 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1650194139, + "narHash": "sha256-kurZsqeOw5fpqA/Ig+8tHvbjwzs5P9AE6WUKOX1m6qM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "bd4dffcdb7c577d74745bd1eff6230172bd176d5", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..cdac816 --- /dev/null +++ b/flake.nix @@ -0,0 +1,31 @@ +{ + description = "A very basic flake"; + + inputs.nixpkgs.url = "flake:nixpkgs"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + + outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: + let + pkgs = nixpkgs.legacyPackages.${system}; + in { + inherit self nixpkgs; + + devShell = pkgs.mkShell { + buildInputs = [ + pkgs.cargo + pkgs.cargo-bloat + pkgs.cargo-outdated + pkgs.clippy + pkgs.rustc + pkgs.rust-analyzer + pkgs.libiconv + pkgs.rustfmt + pkgs.socat + pkgs.openssl + ] ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ + pkgs.darwin.apple_sdk.frameworks.CoreFoundation + pkgs.darwin.apple_sdk.frameworks.CoreServices + ]; + }; + }); +} diff --git a/shell.nix b/shell.nix deleted file mode 100644 index 27e0b50..0000000 --- a/shell.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ pkgs ? import {}, ... }: - -with pkgs; -with pkgs.beam.packages.erlangR23; - -mkShell { - buildInputs = [ - cargo - cargo-bloat - cargo-outdated - clippy - rustc - libiconv - rustfmt - socat - ] ++ lib.optionals stdenv.isDarwin [ - darwin.apple_sdk.frameworks.CoreFoundation - darwin.apple_sdk.frameworks.CoreServices - ]; -} diff --git a/src/cli/gen_cert.rs b/src/cli/gen_cert.rs new file mode 100644 index 0000000..2422e45 --- /dev/null +++ b/src/cli/gen_cert.rs @@ -0,0 +1,53 @@ +use color_eyre::eyre::Result; + +use std::fs::File; +use std::io::prelude::*; +use std::path::PathBuf; + +use rcgen::{BasicConstraints::*, GeneralSubtree::DnsName, *}; + +#[derive(clap::Parser, Debug)] +/// Generate CA certificate and gey for usage with the server. +pub(crate) struct Command { + #[structopt(long, default_value = "dolores.crt")] + /// Filename for certificate file + cert: PathBuf, + #[structopt(long, default_value = "dolores.key")] + /// Filename for key file + key: PathBuf, + #[structopt(long = "domain", default_value = "localhost")] + /// Domains that will be supported by given certificate + domains: Vec, +} + +impl Command { + pub(crate) fn run(self) -> Result<()> { + let mut distinguished_name = DistinguishedName::new(); + distinguished_name.push(DnType::CommonName, "Dolores localhost certificate"); + let subtrees = self + .domains + .iter() + .map(|domain| format!(".{}", domain)) + .map(DnsName) + .collect(); + let name_constraints = NameConstraints { + permitted_subtrees: subtrees, + excluded_subtrees: vec![], + }; + + let mut params = CertificateParams::new(self.domains); + params.key_usages = vec![KeyUsagePurpose::KeyCertSign]; + params.is_ca = IsCa::Ca(Constrained(0)); + params.distinguished_name = distinguished_name; + params.name_constraints = Some(name_constraints); + + let cert = Certificate::from_params(params)?; + let cert_pem = cert.serialize_pem()?; + let key_pem = cert.serialize_private_key_pem(); + + File::create(self.cert)?.write_all(cert_pem.as_bytes())?; + File::create(self.key)?.write_all(key_pem.as_bytes())?; + + Ok(()) + } +} diff --git a/src/cli/mod.rs b/src/cli/mod.rs index f36dad1..a66bf92 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -1,11 +1,12 @@ -use structopt::StructOpt; use color_eyre::eyre::Result; +use clap::Parser; mod run; mod serve; mod status; +mod gen_cert; -#[derive(structopt::StructOpt, Debug)] +#[derive(clap::Parser, Debug)] pub struct App { #[structopt(short, long)] pub debug: bool, @@ -22,7 +23,7 @@ pub struct App { } impl App { - pub fn new() -> Self { Self::from_args() } + pub fn new() -> Self { Parser::parse() } pub fn run(self) -> Result<()> { tracing::debug!(?self); @@ -31,11 +32,12 @@ impl App { } } -#[derive(structopt::StructOpt, Debug)] +#[derive(Parser, Debug)] enum Command { Run(run::Command), Serve(serve::Command), Status(status::Command), + GenCert(gen_cert::Command), } impl Command { @@ -44,6 +46,7 @@ impl Command { Command::Run(cmd) => cmd.run(path), Command::Serve(cmd) => cmd.run(path), Command::Status(cmd) => cmd.run(path), + Command::GenCert(cmd) => cmd.run(), } } } diff --git a/src/cli/run.rs b/src/cli/run.rs index 6776edf..c230c6e 100644 --- a/src/cli/run.rs +++ b/src/cli/run.rs @@ -8,7 +8,7 @@ use nix::unistd::{dup2, fork, ForkResult, Pid}; use color_eyre::eyre::Result; /// Run given command and pass sockets to listen on incoming connections -#[derive(structopt::StructOpt, Debug)] +#[derive(clap::Parser, Debug)] pub(crate) struct Command { #[structopt(short, long)] name: Option, diff --git a/src/cli/serve.rs b/src/cli/serve.rs index 1f1c2d7..aabdade 100644 --- a/src/cli/serve.rs +++ b/src/cli/serve.rs @@ -1,27 +1,24 @@ -use std::collections::HashMap; use std::sync::Arc; use color_eyre::eyre::Result; use tokio::net::{TcpListener, TcpStream}; -use tokio::sync::RwLock; - -use crate::service::Service; - -type Registry = HashMap; /// Start master process listening for connections -#[derive(structopt::StructOpt, Debug)] +#[derive(clap::Parser, Debug)] pub(crate) struct Command { /// TLD that will be used for handling the applications #[structopt(short, long, default_value = "localhost")] domain: String, + /// Address which Dolores should listen at #[structopt(short, long, default_value = "0.0.0.0:443")] listen: std::net::SocketAddr, + /// Path to the PEM encoded Certificate Authority key #[structopt(long, requires("ca-key"))] ca_cert: Option, + /// Path to the PEM encoded Certificate Authority private certificate #[structopt(long, requires("ca-cert"))] ca_key: Option, } @@ -44,11 +41,13 @@ impl Command { let listener = TcpListener::bind(self.listen).await?; let registry = crate::registry::Registry::open(path, &self.domain)?; + // Use self signed certificate to make the `rustls` happy (it is not really used right + // now). In future it may be used for https://localhost or other pages to show list of the + // currently registered apps, metrics, etc. let cert = rcgen::generate_simple_self_signed(vec!["localhost".to_owned()]).unwrap(); let certs = vec![rustls::Certificate(cert.serialize_der().unwrap())]; let priv_key = rustls::PrivateKey(cert.serialize_private_key_der()); - // let config = Arc::new(rustls::ServerConfig::new(Arc::new(rustls::NoClientAuth))); let config = rustls::ServerConfig::builder() .with_safe_defaults() .with_no_client_auth() @@ -57,6 +56,11 @@ impl Command { let config = Arc::new(config); + let dashboard = Arc::new(crate::dashboard::Server::new( + registry.services.clone(), + config.clone(), + )); + tracing::info!(%self.listen, "TCP request"); tracing::info!(?path, "Controller"); @@ -72,7 +76,7 @@ impl Command { let connection = rustls::ServerConnection::new(config.clone())?; let services = registry.services.clone(); - let handler = Self::handle_request(services, stream, connection); + let handler = handle_request(services, stream, connection, dashboard.clone()); tokio::spawn(handler); } @@ -80,39 +84,42 @@ impl Command { } } } +} - async fn handle_request( - services: Arc>, - up: TcpStream, - mut connection: rustls::ServerConnection, - ) { - let mut buf = [0; 1024]; - let services = services.read(); - // Peek into the 1 MiB of the data and try to check if there is SNI information - let len = up.peek(&mut buf).await.unwrap(); - if let Some(sni) = crate::service::parse_handshake(&mut connection, &buf[..len]) { - let span = tracing::span!(tracing::Level::DEBUG, "Request", sni = %sni); - let _guard = span.enter(); - - tracing::info!("Request"); - - let service = match services.await.get(&*sni) { - Some(service) => service.clone(), - None => { - // TODO: Redirect to page for service selection - tracing::warn!("Unknown service"); - return; - } - }; +async fn handle_request( + services: crate::registry::RegistryStore, + up: TcpStream, + mut connection: rustls::ServerConnection, + dashboard: Arc, +) { + let mut buf = [0; 1024]; + // Peek into the 1 MiB of the data and try to check if there is SNI information + let len = up.peek(&mut buf).await.unwrap(); + if let Some(sni) = crate::service::parse_handshake(&mut connection, &buf[..len]) { + let span = tracing::span!(tracing::Level::DEBUG, "Request", sni = %sni); + let _guard = span.enter(); + + tracing::info!("Request"); + + let service = match services.read().await.get(&*sni) { + Some(service) => service.clone(), + None => { + // TODO: Redirect to page for service selection + tracing::warn!("Unknown service"); + return; + } + }; - tracing::debug!(%service.addr); + tracing::debug!(%service.addr); - let down = TcpStream::connect(service.addr).await.unwrap(); + let down = TcpStream::connect(service.addr).await.unwrap(); - let proxy = service.proxy.clone(); - proxy.run(up, down).await.unwrap(); - } else { - tracing::warn!("Cannot find SNI"); + let proxy = service.proxy.clone(); + proxy.run(up, down).await.unwrap(); + } else { + tracing::info!("Dashboard"); + if let Err(err) = dashboard.handle(up).await { + tracing::error!(%err); } } } diff --git a/src/cli/status.rs b/src/cli/status.rs index 4f2935b..352146c 100644 --- a/src/cli/status.rs +++ b/src/cli/status.rs @@ -1,7 +1,7 @@ use color_eyre::eyre::Result; /// Return status of the registered services -#[derive(structopt::StructOpt, Debug)] +#[derive(clap::Parser, Debug)] pub(crate) struct Command { #[structopt()] name: Option, diff --git a/src/dashboard/handlers.rs b/src/dashboard/handlers.rs new file mode 100644 index 0000000..6ee39b9 --- /dev/null +++ b/src/dashboard/handlers.rs @@ -0,0 +1,65 @@ +use color_eyre::eyre::Result; +use hyper::{Body, Request, Response, StatusCode}; +use askama::Template; + +use std::sync::Arc; +use std::collections::HashMap; + +#[derive(Clone, Copy)] +pub struct Home; + +#[derive(Template)] +#[allow(dead_code)] +#[template(path = "hello.html")] +struct HomeTemplate<'a> { + req: Request, + registry: &'a HashMap +} + +#[async_trait] +impl super::Handler for Home { + async fn handle( + self: Arc, + req: Request, + ctx: super::Context, + ) -> Result> { + let registry = ctx.registry.read().await; + + let view = HomeTemplate { req, registry: &*registry }; + + Ok(Response::builder() + .header("content-type", "text/html") + .body(Body::from(view.render()?))?) + } +} + +pub struct Health; + +#[async_trait] +impl super::Handler for Health { + async fn handle( + self: Arc, + _req: Request, + _ctx: super::Context, + ) -> Result> { + Ok(Response::new(Body::from("Ok\n"))) + } +} + +mod filters { + #![allow(dead_code)] + + use hyper::Request; + + pub fn debug(val: impl std::fmt::Debug) -> askama::Result { + Ok(format!("{val:?}")) + } + + pub fn domain_url(domain: &str, req: &Request) -> askama::Result { + let port = match req.uri().port_u16() { + Some(p) if p != 443 => format!(":{p}"), + _ => "".into() + }; + Ok(format!("https://{domain}{port}")) + } +} diff --git a/src/dashboard/mod.rs b/src/dashboard/mod.rs new file mode 100644 index 0000000..c8189c9 --- /dev/null +++ b/src/dashboard/mod.rs @@ -0,0 +1,85 @@ +use color_eyre::eyre::Result; +use hyper::server::conn::Http; +use hyper::service::service_fn; +use hyper::{Body, Request, Response, StatusCode}; + +use std::sync::Arc; +use std::collections::HashMap; + +use crate::registry::RegistryStore; + +mod handlers; + +#[async_trait] +trait Handler: Send + Sync { + async fn handle(self: Arc, req: Request, ctx: Context) -> Result>; +} + +#[derive(Debug, Clone, serde::Serialize)] +pub struct Data { + registry: HashMap +} + +#[derive(Clone)] +pub struct Context { + registry: RegistryStore, +} + +pub struct Server { + acceptor: tokio_rustls::TlsAcceptor, + router: Arc>>, + registry: RegistryStore, +} + +impl Server { + pub fn new(registry: RegistryStore, tls_config: Arc) -> Self { + let acceptor = tokio_rustls::TlsAcceptor::from(tls_config); + let mut router = matchit::Router::>::new(); + + router.insert("/", Arc::new(handlers::Home)).unwrap(); + router.insert("/health", Arc::new(handlers::Health)).unwrap(); + + Server { acceptor, registry, router: Arc::new(router) } + } + + pub async fn handle(&self, stream: tokio::net::TcpStream) -> std::io::Result<()> { + let tls_stream = self.acceptor.accept(stream).await?; + + let service_fn = service_fn(move |req| { + let req = add_host(req); + tracing::info!(?req); + let ctx = Context { + registry: self.registry.clone(), + }; + let router = self.router.clone(); + let route = router.at(req.uri().path()).unwrap(); + Handler::handle(route.value.clone(), req, ctx) + }); + + if let Err(http_err) = Http::new() + .serve_connection(tls_stream, service_fn) + .await + { + tracing::error!("Error while serving HTTP connection: {}", http_err); + } + + Ok(()) + } +} + +/// Add details to URI from `Host` header +fn add_host(mut req: Request) -> Request { + let host = req.headers().get("host").cloned(); + + tracing::info!(?host); + + let uri = req.uri_mut(); + let mut parts = uri.clone().into_parts(); + // We know that we are handling HTTPS connection + parts.scheme = Some(http::uri::Scheme::HTTPS); + parts.authority = host.and_then(|host| http::uri::Authority::from_maybe_shared(host).ok()); + + *uri = hyper::Uri::from_parts(parts).unwrap(); + + req +} diff --git a/src/lib.rs b/src/lib.rs index b4f2d64..30d8a45 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,5 +6,7 @@ pub mod proxy; pub mod registry; pub mod service; +mod dashboard; + pub use registry::Client; pub use service::Service; diff --git a/src/proxy/tls_terminating.rs b/src/proxy/tls_terminating.rs index 76a6d29..0b3a483 100644 --- a/src/proxy/tls_terminating.rs +++ b/src/proxy/tls_terminating.rs @@ -4,6 +4,14 @@ use std::sync::Arc; use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio_rustls::TlsAcceptor; +/// TLS terminating proxy +/// +/// This proxy will terminate TLS on the boundary and will pass raw TCP communication downstream. +/// It supports: +/// +/// - Self-signed certificates generated on demand +/// - Generated certificates that are signed by the given CA (WIP) +/// - Passed certificate (TODO) #[derive(Clone)] pub struct TlsTerminating { acceptor: TlsAcceptor, @@ -15,6 +23,20 @@ impl TlsTerminating { let certs = vec![rustls::Certificate(cert.serialize_der().unwrap())]; let priv_key = rustls::PrivateKey(cert.serialize_private_key_der()); + Self::build(certs, priv_key) + } + + pub fn from_ca(domain: super::Domain, ca_cert: &rcgen::Certificate) -> Self { + let cert = rcgen::generate_simple_self_signed(domain).unwrap(); + let certs = vec![rustls::Certificate( + cert.serialize_der_with_signer(ca_cert).unwrap(), + )]; + let priv_key = rustls::PrivateKey(cert.serialize_private_key_der()); + + Self::build(certs, priv_key) + } + + fn build(certs: Vec, priv_key: rustls::PrivateKey) -> Self { let config = rustls::ServerConfig::builder() .with_safe_defaults() .with_no_client_auth() diff --git a/src/proxy/transparent.rs b/src/proxy/transparent.rs index f24ab03..24857bc 100644 --- a/src/proxy/transparent.rs +++ b/src/proxy/transparent.rs @@ -1,6 +1,10 @@ use tokio::io; use tokio::io::AsyncWriteExt; +/// Transparent proxy +/// +/// This proxy will forward all data **as is** so it is the downstream responsibility to handle TLS +/// termination #[derive(Clone, Debug)] pub struct Transparent; diff --git a/src/registry.rs b/src/registry.rs index 2a6f6e1..1ca73f8 100644 --- a/src/registry.rs +++ b/src/registry.rs @@ -86,7 +86,7 @@ impl Drop for Client { } } -type RegistryStore = Arc>>; +pub type RegistryStore = Arc>>; #[derive(Debug)] pub struct Registry { @@ -156,16 +156,18 @@ impl Registry { } } Register { name, addr, proxy } => { - tracing::info!(%name, "Register"); let domain = format!("{}.{}", name, domain); + tracing::info!(%name, %domain, "Register"); services .write() .await .insert(domain, crate::service::Service::new(&name, addr, proxy)); } Deregister { name, .. } => { - tracing::info!(%name, "Deregister"); - services.write().await.remove(&*name); + let domain = format!("{}.{}", name, domain); + let mut services = services.write().await; + services.remove(&*domain).unwrap(); + tracing::info!(%name, %domain, "Deregistered"); } }; diff --git a/src/service.rs b/src/service.rs index cbb4312..8037be2 100644 --- a/src/service.rs +++ b/src/service.rs @@ -1,10 +1,11 @@ use std::net; use std::sync::Arc; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, serde::Serialize)] pub struct Service { pub domain: String, pub addr: net::SocketAddr, + #[serde(skip_serializing)] pub proxy: Arc, } diff --git a/templates/hello.html b/templates/hello.html new file mode 100644 index 0000000..b900f4d --- /dev/null +++ b/templates/hello.html @@ -0,0 +1,11 @@ +{% extends "layout.html" %} + +{% block content %} +

Hello world!

+ +
    + {% for (domain, _) in registry %} +
  • {{ domain }}
  • + {% endfor %} +
+{% endblock %} diff --git a/templates/layout.html b/templates/layout.html new file mode 100644 index 0000000..c553968 --- /dev/null +++ b/templates/layout.html @@ -0,0 +1,9 @@ + + + + Dolores + + + {% block content %}{% endblock %} + +