diff --git a/.gitignore b/.gitignore index ea8c4bf..2c4918c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +*.db diff --git a/Cargo.lock b/Cargo.lock index 26c3926..b5cadf6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,21 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aead" version = "0.5.1" @@ -57,12 +72,6 @@ dependencies = [ "libc", ] -[[package]] -name = "anyhow" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" - [[package]] name = "async-stream" version = "0.3.3" @@ -81,7 +90,7 @@ checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.103", ] [[package]] @@ -92,7 +101,7 @@ checksum = "1e805d94e6b5001b651426cf4cd446b1ab5f319d27bab5c644f61de0a804360c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.103", ] [[package]] @@ -119,7 +128,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi 0.3.9", ] @@ -130,12 +139,33 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +dependencies = [ + "addr2line", + "cc", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "binascii" version = "0.1.4" @@ -171,15 +201,18 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.2.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "cc" -version = "1.0.76" +version = "1.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a284da2e6fe2092f2353e51713435363112dfd60030e22add80be333fb928f" +checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -244,7 +277,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.103", ] [[package]] @@ -266,6 +299,33 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "color-eyre" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + [[package]] name = "cookie" version = "0.16.1" @@ -273,7 +333,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "344adc371239ef32293cb1c4fe519592fcf21206c79c02854320afcdf3ab4917" dependencies = [ "aes-gcm", - "base64", + "base64 0.13.1", "hkdf", "hmac", "percent-encoding", @@ -299,21 +359,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" - [[package]] name = "crossbeam-queue" version = "0.3.6" @@ -377,7 +422,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn", + "syn 1.0.103", ] [[package]] @@ -394,7 +439,7 @@ checksum = "b846f081361125bfc8dc9d3940c84e1fd83ba54bbca7b17cd29483c828be0704" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.103", ] [[package]] @@ -427,14 +472,14 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn", + "syn 1.0.103", ] [[package]] name = "digest" -version = "0.10.5" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -488,6 +533,16 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + [[package]] name = "fastrand" version = "1.8.0" @@ -520,19 +575,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "redox_syscall", - "windows-sys", -] - -[[package]] -name = "flume" -version = "0.10.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" -dependencies = [ - "futures-core", - "futures-sink", - "pin-project", - "spin 0.9.4", + "windows-sys 0.42.0", ] [[package]] @@ -543,9 +586,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -601,9 +644,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -611,20 +654,9 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" - -[[package]] -name = "futures-executor" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-intrusive" @@ -639,27 +671,27 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -716,6 +748,12 @@ dependencies = [ "polyval", ] +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + [[package]] name = "glob" version = "0.3.0" @@ -733,7 +771,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.8", "indexmap", "slab", "tokio", @@ -797,6 +835,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hex" version = "0.4.3" @@ -832,6 +876,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.5" @@ -839,7 +894,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", - "http", + "http 0.2.8", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", "pin-project-lite", ] @@ -866,32 +944,89 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", - "http-body", + "http 0.2.8", + "http-body 0.4.5", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.7", "tokio", "tower-service", "tracing", "want", ] +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac" dependencies = [ - "http", - "hyper", + "http 0.2.8", + "hyper 0.14.23", "rustls 0.20.7", "tokio", "tokio-rustls 0.23.4", ] +[[package]] +name = "hyper-rustls" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.4.1", + "hyper-util", + "rustls 0.23.13", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.0", + "tower-service", + "webpki-roots 0.26.6", +] + +[[package]] +name = "hyper-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.4.1", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.53" @@ -918,14 +1053,20 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", ] +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "indexmap" version = "1.9.1" @@ -1044,20 +1185,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.137" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" - -[[package]] -name = "libsqlite3-sys" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "link-cplusplus" @@ -1138,6 +1268,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + [[package]] name = "mio" version = "0.6.23" @@ -1159,14 +1298,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.5" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", - "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1202,7 +1341,7 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http", + "http 0.2.8", "httparse", "log", "memchr", @@ -1296,15 +1435,24 @@ version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", ] [[package]] -name = "once_cell" -version = "1.16.0" +name = "object" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -1324,6 +1472,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + [[package]] name = "parking_lot" version = "0.11.2" @@ -1369,7 +1523,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -1398,14 +1552,14 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn", + "syn 1.0.103", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" @@ -1437,7 +1591,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn", + "syn 1.0.103", ] [[package]] @@ -1453,29 +1607,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.0.12" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.12" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.77", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -1483,12 +1637,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkg-config" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" - [[package]] name = "polyval" version = "0.6.0" @@ -1516,7 +1664,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.103", "version_check", ] @@ -1533,9 +1681,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.47" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -1548,16 +1696,64 @@ checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.103", "version_check", "yansi", ] [[package]] -name = "quote" -version = "1.0.21" +name = "quinn" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.13", + "socket2 0.5.7", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +dependencies = [ + "bytes", + "rand", + "ring 0.17.3", + "rustc-hash", + "rustls 0.23.13", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +dependencies = [ + "libc", + "once_cell", + "socket2 0.5.7", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -1592,6 +1788,16 @@ dependencies = [ "getrandom", ] +[[package]] +name = "redb" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4760ad04a88ef77075ba86ba9ea79b919e6bab29c1764c5747237cd6eaedcaa" +dependencies = [ + "libc", + "log", +] + [[package]] name = "redox_syscall" version = "0.2.16" @@ -1629,7 +1835,7 @@ checksum = "abfa8511e9e94fd3de6585a3d3cd00e01ed556dc9814829280af0e8dc72a8f36" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.103", ] [[package]] @@ -1671,16 +1877,16 @@ version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "431949c384f4e2ae07605ccaa56d1d9d2ecdb5cadd4f9577ccfab29f2e5149fc" dependencies = [ - "base64", + "base64 0.13.1", "bytes", "encoding_rs", "futures-core", "futures-util", "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", + "http 0.2.8", + "http-body 0.4.5", + "hyper 0.14.23", + "hyper-rustls 0.23.0", "ipnet", "js-sys", "log", @@ -1689,7 +1895,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustls 0.20.7", - "rustls-pemfile", + "rustls-pemfile 1.0.1", "serde", "serde_json", "serde_urlencoded", @@ -1704,6 +1910,49 @@ dependencies = [ "winreg", ] +[[package]] +name = "reqwest" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-rustls 0.27.3", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.13", + "rustls-pemfile 2.1.3", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls 0.26.0", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.26.6", + "windows-registry", +] + [[package]] name = "ring" version = "0.16.20" @@ -1714,11 +1963,47 @@ dependencies = [ "libc", "once_cell", "spin 0.5.2", - "untrusted", + "untrusted 0.7.1", "web-sys", "winapi 0.3.9", ] +[[package]] +name = "ring" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babe80d5c16becf6594aa32ad2be8fe08498e7ae60b77de8df700e67f191d7e" +dependencies = [ + "cc", + "getrandom", + "libc", + "spin 0.9.4", + "untrusted 0.9.0", + "windows-sys 0.48.0", +] + +[[package]] +name = "rmp" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + [[package]] name = "rocket" version = "0.5.0-rc.2" @@ -1770,7 +2055,7 @@ dependencies = [ "proc-macro2", "quote", "rocket_http", - "syn", + "syn 1.0.103", "unicode-xid", ] @@ -1818,8 +2103,8 @@ dependencies = [ "cookie", "either", "futures", - "http", - "hyper", + "http 0.2.8", + "hyper 0.14.23", "indexmap", "log", "memchr", @@ -1836,15 +2121,27 @@ dependencies = [ "uncased", ] +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "rustls" version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" dependencies = [ - "base64", + "base64 0.13.1", "log", - "ring", + "ring 0.16.20", "sct 0.6.1", "webpki 0.21.4", ] @@ -1856,18 +2153,59 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "539a2bfe908f471bfa933876bd1eb6a19cf2176d375f82ef7f99530a40e48c2c" dependencies = [ "log", - "ring", + "ring 0.16.20", "sct 0.7.0", "webpki 0.22.0", ] +[[package]] +name = "rustls" +version = "0.23.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +dependencies = [ + "once_cell", + "ring 0.17.3", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" dependencies = [ - "base64", + "base64 0.13.1", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring 0.17.3", + "rustls-pki-types", + "untrusted 0.9.0", ] [[package]] @@ -1915,8 +2253,8 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] @@ -1925,37 +2263,38 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] name = "serde" -version = "1.0.147" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.147" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.77", ] [[package]] name = "serde_json" -version = "1.0.87" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce777b7b150d76b9cf60d28b55f5847135a003f7d7350c6be7a773508ce7d45" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -2014,6 +2353,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.0" @@ -2034,34 +2379,52 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "snitch" version = "1.0.0" dependencies = [ - "anyhow", "chrono", "clap", + "color-eyre", + "eyre", "log", + "reqwest 0.12.7", + "serde", + "serde_json", + "snitch-lib", +] + +[[package]] +name = "snitch-lib" +version = "1.0.0" +dependencies = [ + "chrono", + "eyre", + "log", + "reqwest 0.11.12", + "serde", +] + +[[package]] +name = "snitch-web" +version = "1.0.0" +dependencies = [ + "chrono", + "clap", + "color-eyre", + "eyre", + "log", + "redb", + "rmp-serde", "rocket", "rocket_db_pools", "rocket_dyn_templates", "serde", - "snitchlib", - "sqlx", -] - -[[package]] -name = "snitchlib" -version = "1.0.0" -dependencies = [ - "chrono", - "log", - "reqwest", - "serde", + "snitch-lib", ] [[package]] @@ -2074,6 +2437,16 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "spin" version = "0.5.2" @@ -2085,9 +2458,6 @@ name = "spin" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" -dependencies = [ - "lock_api", -] [[package]] name = "sqlformat" @@ -2118,20 +2488,16 @@ checksum = "e48c61941ccf5ddcada342cd59e3e5173b007c509e1e8e990dafc830294d9dc5" dependencies = [ "ahash", "atoi", - "base64", + "base64 0.13.1", "bitflags", "byteorder", "bytes", - "chrono", - "crc", "crossbeam-queue", "dirs", "either", "event-listener", - "flume", "futures-channel", "futures-core", - "futures-executor", "futures-intrusive", "futures-util", "hashlink", @@ -2141,7 +2507,6 @@ dependencies = [ "indexmap", "itoa", "libc", - "libsqlite3-sys", "log", "md-5", "memchr", @@ -2178,10 +2543,9 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "sha2", "sqlx-core", "sqlx-rt", - "syn", + "syn 1.0.103", "url", ] @@ -2232,9 +2596,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "subtle" -version = "2.4.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -2247,6 +2611,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] + [[package]] name = "tempfile" version = "3.3.0" @@ -2287,7 +2671,7 @@ checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.103", ] [[package]] @@ -2354,32 +2738,30 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.21.2" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", - "memchr", - "mio 0.8.5", - "num_cpus", + "mio 1.0.2", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.7", "tokio-macros", - "winapi 0.3.9", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "1.8.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.77", ] [[package]] @@ -2404,6 +2786,17 @@ dependencies = [ "webpki 0.22.0", ] +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls 0.23.13", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.11" @@ -2438,6 +2831,27 @@ dependencies = [ "serde", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.2" @@ -2464,7 +2878,7 @@ checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.103", ] [[package]] @@ -2477,6 +2891,16 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing", + "tracing-subscriber", +] + [[package]] name = "tracing-log" version = "0.1.3" @@ -2545,9 +2969,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -2590,9 +3014,9 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "universal-hash" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", "subtle", @@ -2605,10 +3029,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] -name = "url" -version = "2.3.1" +name = "untrusted" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -2621,12 +3051,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.4" @@ -2687,7 +3111,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.103", "wasm-bindgen-shared", ] @@ -2721,7 +3145,7 @@ checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.103", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2748,8 +3172,8 @@ version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] @@ -2758,8 +3182,8 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] @@ -2780,6 +3204,15 @@ dependencies = [ "webpki 0.22.0", ] +[[package]] +name = "webpki-roots" +version = "0.26.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "whoami" version = "1.2.3" @@ -2847,27 +3280,127 @@ dependencies = [ "windows_x86_64_msvc 0.32.0", ] +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ - "windows_aarch64_gnullvm", + "windows_aarch64_gnullvm 0.42.0", "windows_aarch64_msvc 0.42.0", "windows_i686_gnu 0.42.0", "windows_i686_msvc 0.42.0", "windows_x86_64_gnu 0.42.0", - "windows_x86_64_gnullvm", + "windows_x86_64_gnullvm 0.42.0", "windows_x86_64_msvc 0.42.0", ] +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + [[package]] name = "windows_aarch64_msvc" version = "0.32.0" @@ -2880,6 +3413,18 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + [[package]] name = "windows_i686_gnu" version = "0.32.0" @@ -2892,6 +3437,24 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + [[package]] name = "windows_i686_msvc" version = "0.32.0" @@ -2904,6 +3467,18 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + [[package]] name = "windows_x86_64_gnu" version = "0.32.0" @@ -2916,12 +3491,36 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + [[package]] name = "windows_x86_64_msvc" version = "0.32.0" @@ -2934,6 +3533,18 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "winreg" version = "0.10.1" @@ -2958,3 +3569,9 @@ name = "yansi" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/Cargo.toml b/Cargo.toml index 738dced..de78dc7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,2 +1,8 @@ [workspace] -members = ["snitch", "snitchlib"] +members = [ + "snitch-lib", + "snitch-web", + "snitch-cli", +] + +resolver = "2" diff --git a/snitch-cli/Cargo.toml b/snitch-cli/Cargo.toml new file mode 100644 index 0000000..53e48fa --- /dev/null +++ b/snitch-cli/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "snitch" +version = "1.0.0" +edition = "2021" + +[dependencies] +snitch-lib = { path = "../snitch-lib" } + +log = "0.4" +serde = { version = "1", features = ["derive"] } +chrono = { version = "0.4", features = ["serde"] } +clap = { version = "4.0.23", features = ["derive", "env"] } +eyre = "0.6.12" +color-eyre = "0.6.3" +reqwest = { version = "0.12.7", default-features = false, features = ["rustls-tls", "json", "blocking"] } +serde_json = "1.0.128" diff --git a/snitch-cli/src/main.rs b/snitch-cli/src/main.rs new file mode 100644 index 0000000..c538e93 --- /dev/null +++ b/snitch-cli/src/main.rs @@ -0,0 +1,54 @@ +use chrono::Local; +use clap::Parser; +use eyre::{eyre, WrapErr}; +use snitch_lib::{probe_hostname, LogMsg, Severity}; + +#[derive(Parser)] +struct Opt { + /// URL of snitch + #[clap(long, env = "SNITCH_URL")] + url: String, + + /// Name of this service + #[clap(long, env = "SNITCH_SERVICE")] + service: String, + + /// Name of this service + #[clap(short, long, env = "SNITCH_SEVERITY", default_value = "Error")] + severity: Severity, + + /// Name of this service + #[clap(env = "SNITCH_MESSAGE")] + message: String, +} + +fn main() { + if let Err(e) = run() { + eprintln!("snitch error: {e:?}"); + } +} +fn run() -> eyre::Result<()> { + let opt = Opt::parse(); + color_eyre::install()?; + + let message = LogMsg { + time: Some(Local::now()), + severity: opt.severity, + service: opt.service, + message: opt.message, + hostname: probe_hostname(), + file: None, + line: None, + }; + + let message = serde_json::to_string(&message).wrap_err("Failed to serialize log message")?; + + let client = reqwest::blocking::Client::new(); + client + .post(&opt.url) + .body(message) + .send() + .wrap_err(eyre!("Failed to upload log message to {:?}", opt.url))?; + + Ok(()) +} diff --git a/snitchlib/Cargo.toml b/snitch-lib/Cargo.toml similarity index 89% rename from snitchlib/Cargo.toml rename to snitch-lib/Cargo.toml index b44277e..e2b184c 100644 --- a/snitchlib/Cargo.toml +++ b/snitch-lib/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "snitchlib" +name = "snitch-lib" version = "1.0.0" edition = "2021" @@ -8,3 +8,4 @@ log = "0.4" serde = { version = "1", features = ["derive"] } chrono = { version = "0.4", features = ["serde"] } reqwest = { version = "0.11.12", default-features = false, features = ["rustls-tls", "serde_json", "blocking", "json"] } +eyre = "0.6.12" diff --git a/snitchlib/examples/log.rs b/snitch-lib/examples/log.rs similarity index 85% rename from snitchlib/examples/log.rs rename to snitch-lib/examples/log.rs index 2c75a65..bcb15d6 100644 --- a/snitchlib/examples/log.rs +++ b/snitch-lib/examples/log.rs @@ -1,5 +1,5 @@ -use log::{Level, LevelFilter, Log, Metadata, Record}; -use snitchlib::SnitchLogger; +use log::{Level, LevelFilter, Metadata, Record}; +use snitch_lib::SnitchLogger; struct SimpleLogger; @@ -18,7 +18,7 @@ impl log::Log for SimpleLogger { } fn main() { - let logger = SnitchLogger::new(SimpleLogger, "http://localhost:8000", "snitchlib_example"); + let logger = SnitchLogger::new(SimpleLogger, "http://localhost:8000", "snitch-lib-example"); let logger = Box::leak(Box::new(logger)); log::set_logger(logger).expect("set logger"); log::set_max_level(LevelFilter::Info); diff --git a/snitchlib/src/lib.rs b/snitch-lib/src/lib.rs similarity index 73% rename from snitchlib/src/lib.rs rename to snitch-lib/src/lib.rs index 17a09b9..5425a19 100644 --- a/snitchlib/src/lib.rs +++ b/snitch-lib/src/lib.rs @@ -1,3 +1,5 @@ +use std::process::Command; + use log::{Level, Log, Metadata, Record}; use reqwest::blocking; @@ -8,6 +10,7 @@ pub struct SnitchLogger { wrapped: L, url: String, service_name: String, + hostname: String, } impl SnitchLogger { @@ -16,6 +19,7 @@ impl SnitchLogger { wrapped, url: url.into(), service_name: service_name.into(), + hostname: probe_hostname(), } } } @@ -26,7 +30,6 @@ impl Log for SnitchLogger { } fn log(&self, record: &Record) { - eprintln!("log called"); self.wrapped.log(record); let severity = match record.metadata().level() { @@ -39,7 +42,11 @@ impl Log for SnitchLogger { severity, file: record.file().map(String::from), line: record.line(), - ..LogMsg::new(self.service_name.clone(), record.args().to_string()) + ..LogMsg::new( + self.service_name.clone(), + record.args().to_string(), + self.hostname.clone(), + ) }; let client = blocking::Client::new(); @@ -54,6 +61,16 @@ impl Log for SnitchLogger { } } +pub fn probe_hostname() -> String { + let output = Command::new("uname").arg("-n").output().ok(); + + output + .as_ref() + .and_then(|output| std::str::from_utf8(&output.stdout).ok()) + .unwrap_or("") + .to_string() +} + impl Drop for SnitchLogger { fn drop(&mut self) { self.flush(); diff --git a/snitch-lib/src/message.rs b/snitch-lib/src/message.rs new file mode 100644 index 0000000..e725f85 --- /dev/null +++ b/snitch-lib/src/message.rs @@ -0,0 +1,78 @@ +use std::str::FromStr; + +use chrono::{DateTime, Local}; +use eyre::{eyre, ContextCompat}; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub enum Severity { + Fatal, + Error, + Warning, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct LogMsg { + /// The time that the error was reported. + pub time: Option>, + + pub severity: Severity, + + /// The service which reported the error. + pub service: String, + + /// The log message. + pub message: String, + + /// The host that the service is running on. + pub hostname: String, + + pub file: Option, + pub line: Option, +} + +impl LogMsg { + pub fn new(service: String, message: String, hostname: String) -> Self { + Self { + time: Some(Local::now()), + severity: Severity::Error, + service, + message, + hostname, + file: None, + line: None, + } + } +} + +impl Severity { + pub fn as_str(&self) -> &'static str { + match self { + Severity::Fatal => "FATAL", + Severity::Error => "ERROR", + Severity::Warning => "WARNING", + } + } +} + +impl FromStr for Severity { + type Err = eyre::Report; + + fn from_str(s: &str) -> Result { + let err = || eyre!("{s:?} is not a valid severity level"); + + let first_char = s + .trim() + .chars() + .next() + .wrap_err_with(err)? + .to_ascii_lowercase(); + + Ok(match first_char { + 'f' => Severity::Fatal, + 'e' => Severity::Error, + 'w' => Severity::Warning, + _ => return Err(err()), + }) + } +} diff --git a/snitch/Cargo.toml b/snitch-web/Cargo.toml similarity index 70% rename from snitch/Cargo.toml rename to snitch-web/Cargo.toml index 2d27376..1df5df4 100644 --- a/snitch/Cargo.toml +++ b/snitch-web/Cargo.toml @@ -1,17 +1,19 @@ [package] -name = "snitch" +name = "snitch-web" version = "1.0.0" edition = "2021" [dependencies] -snitchlib = { path = "../snitchlib" } +snitch-lib = { path = "../snitch-lib" } -anyhow = "*" log = "0.4" serde = { version = "1", features = ["derive"] } chrono = { version = "0.4", features = ["serde"] } -sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "postgres", "sqlite", "migrate", "macros", "chrono"] } rocket_dyn_templates = { version = "0.1.0-rc.2", features = ["handlebars"] } rocket_db_pools = { version = "0.1.0-rc.2", features = ["sqlx_postgres"] } rocket = { version = "0.5.0-rc.2", features = ["json"] } clap = { version = "4.0.23", features = ["derive", "env"] } +eyre = "0.6.12" +color-eyre = "0.6.3" +redb = { version = "2.1.3", features = ["logging"] } +rmp-serde = "1.3.0" diff --git a/snitch/build.rs b/snitch-web/build.rs similarity index 100% rename from snitch/build.rs rename to snitch-web/build.rs diff --git a/snitch-web/src/api.rs b/snitch-web/src/api.rs new file mode 100644 index 0000000..7e10b7e --- /dev/null +++ b/snitch-web/src/api.rs @@ -0,0 +1,19 @@ +use chrono::Local; +use rocket::{http::Status, serde::json::Json, State}; +use snitch_lib::LogMsg; + +use crate::database::Database; + +#[post("/", data = "")] +pub async fn post_record(db: &State, record: Json) -> Status { + let mut record = record.into_inner(); + record.time.get_or_insert_with(Local::now); + + let result = db.write_log(&record); + if let Err(e) = result { + log::error!("failed to insert record: {e:?}"); + return Status::InternalServerError; + } + + Status::Ok +} diff --git a/snitch/src/dashboard.rs b/snitch-web/src/dashboard.rs similarity index 61% rename from snitch/src/dashboard.rs rename to snitch-web/src/dashboard.rs index ce79619..df7a037 100644 --- a/snitch/src/dashboard.rs +++ b/snitch-web/src/dashboard.rs @@ -1,37 +1,22 @@ -use chrono::{DateTime, Local}; use rocket::{http::Status, response::content::RawHtml, State}; use rocket_dyn_templates::{context, Template}; use serde::Serialize; -use sqlx::query; use crate::database::Database; #[get("/")] pub async fn index(db: &State) -> Result, Status> { - let mut conn = db.inner().acquire().await.map_err(|e| { - log::error!("failed to get db connection: {e}"); - Status::InternalServerError - })?; - // TODO: // maybe only show most recent error for each service in dashboard view, i.e.: // select distinct on (service) time, message from (select * from record order by time desc) as foo; - let messages = query!( - " -SELECT time, service, severity, message, file_path, file_line FROM record - ORDER BY time DESC; - " - ) - .fetch_all(&mut conn) - .await - .map_err(|e| { - log::error!("failed to query record: {e}"); + let messages = db.get_all_log_messages().map_err(|e| { + log::error!("failed to query database: {e}"); Status::InternalServerError })?; #[derive(Serialize)] struct Record { - time: DateTime, + time: String, severity: String, service: String, message: String, @@ -40,14 +25,14 @@ SELECT time, service, severity, message, file_path, file_line FROM record let messages: Vec<_> = messages .into_iter() - .map(|record| Record { - time: record.time.into(), - severity: record.severity, + .map(|(_id, record)| Record { + time: record.time.map(|time| time.to_string()).unwrap_or_default(), + severity: record.severity.as_str().to_string(), service: record.service, message: record.message, location: record - .file_path - .zip(record.file_line) + .file + .zip(record.line) .map(|(path, line)| format!("{path}:{line}")) .unwrap_or_default(), }) diff --git a/snitch-web/src/database.rs b/snitch-web/src/database.rs new file mode 100644 index 0000000..9859124 --- /dev/null +++ b/snitch-web/src/database.rs @@ -0,0 +1,136 @@ +use std::{ + fmt::Debug, + marker::PhantomData, + sync::atomic::{AtomicU64, Ordering}, +}; + +use eyre::{eyre, WrapErr}; +use redb::ReadableTable; +use serde::{de::DeserializeOwned, Serialize}; +use snitch_lib::LogMsg; + +use crate::Opt; + +pub struct Database { + inner: redb::Database, + next_log_id: AtomicU64, +} + +#[derive(Debug)] +struct Serialized { + packed: Vec, + _type: PhantomData, +} + +pub(crate) fn open(opt: &Opt) -> eyre::Result { + let inner = redb::Database::create(&opt.db) + .context(eyre!("Failed to open database at {}", opt.db.display()))?; + + let txn = inner.begin_write()?; + let next_log_id = txn + .open_table(table::LOG_MESSAGE)? + .range::(..)? + .next_back() + .transpose() + .ok() + .flatten() + .map(|(id, _)| id.value() + 1) + .unwrap_or_default(); + txn.commit()?; + + Ok(Database { + inner, + next_log_id: next_log_id.into(), + }) +} + +mod table { + use super::Serialized; + use redb::TableDefinition; + use snitch_lib::LogMsg; + + pub const LOG_MESSAGE: TableDefinition> = + TableDefinition::new("log_message"); +} + +impl Database { + pub fn write_log(&self, log: &LogMsg) -> eyre::Result { + let txn = self.inner.begin_write()?; + let id = self.next_log_id.fetch_add(1, Ordering::SeqCst); + txn.open_table(table::LOG_MESSAGE)? + .insert(id, Serialized::serialize(log))?; + txn.commit()?; + + Ok(id) + } + + pub fn get_all_log_messages(&self) -> eyre::Result> { + let txn = self.inner.begin_read()?; + txn.open_table(table::LOG_MESSAGE)? + .range::(..)? + .map(|result| { + let (id, msg) = result?; + let id = id.value(); + let msg = msg.value(); + + msg.deserialize().map(|msg| (id, msg)) + }) + .collect() + } +} + +impl Serialized +where + T: Debug + Serialize + DeserializeOwned, +{ + pub fn serialize(value: &T) -> Self { + let packed = rmp_serde::to_vec(&value).unwrap(); + Self { + packed, + _type: PhantomData, + } + } + + pub fn deserialize(&self) -> eyre::Result { + rmp_serde::from_slice(&self.packed).wrap_err("Failed to deserialize") + } +} + +impl redb::Value for Serialized +where + T: Debug + Serialize + DeserializeOwned, +{ + type SelfType<'a> = Self + where + Self: 'a; + + type AsBytes<'a> = &'a [u8] + where + Self: 'a; + + fn fixed_width() -> Option { + None + } + + fn from_bytes<'a>(data: &'a [u8]) -> Self::SelfType<'a> + where + Self: 'a, + { + Serialized { + packed: data.to_vec(), + _type: PhantomData, + } + } + + fn as_bytes<'a, 'b: 'a>(value: &'a Self::SelfType<'b>) -> Self::AsBytes<'a> + where + Self: 'a, + Self: 'b, + { + &value.packed + } + + fn type_name() -> redb::TypeName { + redb::TypeName::new(std::any::type_name::>()) + } +} diff --git a/snitch/src/main.rs b/snitch-web/src/main.rs similarity index 62% rename from snitch/src/main.rs rename to snitch-web/src/main.rs index 1abf481..11bbdab 100644 --- a/snitch/src/main.rs +++ b/snitch-web/src/main.rs @@ -5,27 +5,26 @@ mod api; mod dashboard; mod database; +use std::path::PathBuf; + use clap::Parser; use rocket_dyn_templates::Template; #[derive(Parser)] struct Opt { - /// PostgreSQL connect string + /// Filepath where snitch will store its database. /// /// e.g. postgresql://user:pass@localhost:5432/database - #[clap( - long, - env = "DATABASE_URL", - default_value = "postgresql://postgres@localhost:5432/postgres" - )] - db: String, + #[clap(long, env = "SNITCH_DB", default_value = "./snitch.db")] + db: PathBuf, } #[launch] async fn rocket() -> _ { let opt = Opt::parse(); + color_eyre::install().unwrap(); - let db = database::connect(&opt).await.expect("connect to database"); + let db = database::open(&opt).expect("open database"); rocket::build() .manage(db) diff --git a/snitch/templates/index.hbs b/snitch-web/templates/index.hbs similarity index 100% rename from snitch/templates/index.hbs rename to snitch-web/templates/index.hbs diff --git a/snitch/migrations/2022-11-11T22:56.down.sql b/snitch/migrations/2022-11-11T22:56.down.sql deleted file mode 100644 index 9fe98c5..0000000 --- a/snitch/migrations/2022-11-11T22:56.down.sql +++ /dev/null @@ -1 +0,0 @@ -DROP TABLE record; diff --git a/snitch/migrations/2022-11-11T22:56.up.sql b/snitch/migrations/2022-11-11T22:56.up.sql deleted file mode 100644 index eef156c..0000000 --- a/snitch/migrations/2022-11-11T22:56.up.sql +++ /dev/null @@ -1,10 +0,0 @@ -CREATE TABLE record ( - id SERIAL PRIMARY KEY, - time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), - service VARCHAR(255) NOT NULL, - severity VARCHAR(16) NOT NULL, - message TEXT NOT NULL, - file_path TEXT, - file_line INTEGER - -); diff --git a/snitch/src/api.rs b/snitch/src/api.rs deleted file mode 100644 index 45df247..0000000 --- a/snitch/src/api.rs +++ /dev/null @@ -1,49 +0,0 @@ -use rocket::{http::Status, serde::json::Json, State}; -use snitchlib::LogMsg; -use sqlx::query; - -use crate::database::Database; - -#[post("/", data = "")] -pub async fn post_record(db: &State, record: Json) -> Status { - let mut conn = match db.inner().acquire().await { - Ok(conn) => conn, - Err(e) => { - log::error!("failed to get db connection: {e}"); - return Status::InternalServerError; - } - }; - - let LogMsg { - time: _, - severity, - service, - message, - file, - line, - } = record.into_inner(); - - let result = query!( - " -INSERT INTO record(service, - severity, - message, - file_path, - file_line) -VALUES ($1, $2, $3, $4, $5); - ", - service, - format!("{:?}", severity), - message, - file, - line.map(|line| line as i32), - ) - .execute(&mut conn) - .await; - - if let Err(e) = result { - log::error!("failed to insert record: {e:?}"); - } - - Status::Ok -} diff --git a/snitch/src/database.rs b/snitch/src/database.rs deleted file mode 100644 index 1230c21..0000000 --- a/snitch/src/database.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::Opt; -use sqlx::PgPool; - -pub type Database = PgPool; - -pub(crate) async fn connect(opt: &Opt) -> anyhow::Result { - let pool = PgPool::connect(&opt.db).await?; - - sqlx::migrate!().run(&pool).await?; - - Ok(pool) -} diff --git a/snitchlib/src/message.rs b/snitchlib/src/message.rs deleted file mode 100644 index 07f345f..0000000 --- a/snitchlib/src/message.rs +++ /dev/null @@ -1,39 +0,0 @@ -use chrono::{DateTime, Local}; -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub enum Severity { - Fatal, - Error, - Warning, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct LogMsg { - /// The time that the error was reported. - pub time: DateTime, - - pub severity: Severity, - - /// The service which reported the error. - pub service: String, - - /// The log message. - pub message: String, - - pub file: Option, - pub line: Option, -} - -impl LogMsg { - pub fn new(service: String, message: String) -> Self { - Self { - time: Local::now(), - severity: Severity::Error, - service, - message, - file: None, - line: None, - } - } -}