├── .gitignore ├── .github ├── pics │ ├── pic.png │ └── prev.png ├── dependabot.yml ├── workflows │ ├── latest-deploy.yml │ └── build.yml └── dash.json ├── src ├── support │ ├── mod.rs │ └── tokiort.rs ├── web_server.rs └── main.rs ├── Cargo.toml ├── Dockerfile ├── README.md ├── LICENSE └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | db.sqlite3 3 | db.sqlite3-shm 4 | db.sqlite3-wal -------------------------------------------------------------------------------- /.github/pics/pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tricked-dev/vwmetrics/HEAD/.github/pics/pic.png -------------------------------------------------------------------------------- /.github/pics/prev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tricked-dev/vwmetrics/HEAD/.github/pics/prev.png -------------------------------------------------------------------------------- /src/support/mod.rs: -------------------------------------------------------------------------------- 1 | mod tokiort; 2 | #[allow(unused)] 3 | pub use tokiort::{TokioExecutor, TokioIo, TokioTimer}; 4 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "cargo" 4 | directory: "/" 5 | schedule: 6 | interval: monthly 7 | groups: 8 | all-updates: 9 | patterns: 10 | - "*" 11 | - package-ecosystem: "github-actions" 12 | directory: "/" 13 | schedule: 14 | interval: monthly 15 | groups: 16 | all-updates: 17 | patterns: 18 | - "*" -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "vwmetrics" 3 | version = "0.1.1" 4 | edition = "2021" 5 | license = "Apache-2.0" 6 | description = "Turn your Vaultwarden database into Prometheus metrics" 7 | 8 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 9 | [dependencies] 10 | clap = { version = "4.5.53", features = ["derive", "cargo", "env"] } 11 | hyper = { version = "1", features = ["server", "http1", "http2"] } 12 | once_cell = "1.21.3" 13 | tokio = { version = "1.48.0", features = [ 14 | "rt", 15 | "macros", 16 | "sync", 17 | "parking_lot", 18 | ] } 19 | sqlx = { version = "0.8", features = [ 20 | "runtime-tokio-rustls", 21 | "any", 22 | "sqlite", 23 | "postgres", 24 | "mysql", 25 | "tls-rustls", 26 | ], default-features = false } 27 | tracing = "0.1.43" 28 | tracing-subscriber = { version = "0.3.22", features = [ 29 | "parking_lot", 30 | "once_cell", 31 | "tracing", 32 | "env-filter", 33 | ] } 34 | pin-project-lite = "0.2.16" 35 | http-body-util = "0.1.3" 36 | anyhow = "1.0.100" 37 | 38 | [profile.release] 39 | opt-level = "z" 40 | lto = true 41 | debug = false 42 | debug-assertions = false 43 | codegen-units = 1 44 | panic = "abort" 45 | overflow-checks = true 46 | strip = true 47 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM rust:1-slim AS builder 2 | 3 | WORKDIR /usr/src/vwmetrics 4 | 5 | COPY ./src /usr/src/vwmetrics/src 6 | COPY Cargo.toml /usr/src/vwmetrics/Cargo.toml 7 | COPY Cargo.lock /usr/src/vwmetrics/Cargo.lock 8 | 9 | RUN cargo build --release 10 | 11 | # hadolint ignore=DL3007 12 | FROM gcr.io/distroless/cc-debian12:latest AS production 13 | 14 | ARG BUILD_VERSION 15 | ARG BUILD_DATE 16 | ARG BUILD_COMMIT_SHA 17 | 18 | LABEL org.opencontainers.image.title="VWMetrics" \ 19 | org.opencontainers.image.version="${BUILD_VERSION}" \ 20 | org.opencontainers.image.created="${BUILD_DATE}" \ 21 | org.opencontainers.image.revision="${BUILD_COMMIT_SHA}" \ 22 | org.opencontainers.image.description="Turn your Vaultwarden database into Prometheus metrics." \ 23 | org.opencontainers.image.documentation="https://github.com/Tricked-dev/vwmetrics" \ 24 | org.opencontainers.image.base.name="gcr.io/distroless/cc-debian12:latest" \ 25 | org.opencontainers.image.licenses="Apache-2.0" \ 26 | org.opencontainers.image.source="https://github.com/Tricked-dev/vwmetrics" 27 | 28 | COPY --from=builder --chown=nobody:nogroup /usr/src/vwmetrics/target/release/vwmetrics /usr/local/bin/vwmetrics 29 | 30 | USER nobody 31 | 32 | ENV HOST=0.0.0.0 PORT=3040 33 | 34 | EXPOSE 3040/tcp 35 | 36 | ENTRYPOINT ["/usr/local/bin/vwmetrics"] 37 | #CMD ["--help"] -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VWMetrics 2 | 3 | Turn your Vaultwarden database into Prometheus metrics. 4 | 5 | ## Usage 6 | 7 | Build the binary from source or download the arm build from the releases page. 8 | 9 | ``` 10 | Turn your vaultwarden database into a api endpoint 11 | github: https://github.com/Tricked-dev/vwmetrics 12 | license: Apache-2.0 13 | 14 | Usage: vwmetrics [OPTIONS] --database-url 15 | 16 | Options: 17 | -d, --database-url 18 | the database url to connect to `sqlite://db.sqlite3?mode=ro` for sqlite, `postgres://user:pass@localhost/db` for postgres or `mysql://user:pass@localhost/db` for mysql/mariadb 19 | 20 | [env: DATABASE_URL=] 21 | 22 | -p, --port 23 | the port to listen on 24 | 25 | [env: PORT=] 26 | [default: 3040] 27 | 28 | -b, --host 29 | the host to bind to 30 | 31 | [env: HOST=] 32 | [default: 127.0.0.1] 33 | 34 | -u, --update-seconds 35 | Time between connecting and updating the metrics 36 | 37 | [env: UPDATE_SECONDS=] 38 | [default: 60] 39 | 40 | -h, --help 41 | Print help information (use `-h` for a summary) 42 | 43 | -V, --version 44 | Print version information 45 | ``` 46 | 47 | The metrics endpoint gets started on `127.0.0.1:3040/metrics` by default. 48 | 49 | ### systemd 50 | 51 | ```init 52 | # /home//.config/systemd/user/vwmetrics.service 53 | [Unit] 54 | Description=vwmetrics 55 | After=network.target 56 | 57 | [Service] 58 | ExecStart=/home//vwmetrics/vwmetrics 59 | Environment="UPDATE_SECS=7200" 60 | Environment="DATABASE_URL=query string" 61 | Type=simple 62 | Restart=always 63 | WorkingDirectory=/home//vwmetrics 64 | 65 | [Install] 66 | WantedBy=default.target 67 | RequiredBy=network.target 68 | ``` 69 | 70 | ## Example output 71 | 72 | ![](.github/pics/pic.png) 73 | 74 | [![](.github/pics/prev.png)](./.github/dash.json) 75 | -------------------------------------------------------------------------------- /.github/workflows/latest-deploy.yml: -------------------------------------------------------------------------------- 1 | name: Latest deploy 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | #- main 8 | #- 'v*.*.*' 9 | workflow_dispatch: 10 | schedule: 11 | - cron: '00 4 01 * *' # At 04:00 on day-of-month 01. 12 | 13 | jobs: 14 | docker: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v6 19 | 20 | - name: Script 21 | shell: bash 22 | run: | 23 | echo "github_repo=${GITHUB_REPOSITORY,,}" >> "$GITHUB_ENV" 24 | echo "build_branch=$(echo ${GITHUB_REF#refs/heads/})" >> "$GITHUB_ENV" 25 | echo "build_date=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> "$GITHUB_ENV" 26 | #echo "build_commit_sha=$(git rev-parse --short "$GITHUB_SHA")" >> "$GITHUB_ENV" 27 | echo "build_commit_sha=${GITHUB_SHA::7}" >> "$GITHUB_ENV" 28 | 29 | - name: Set up QEMU 30 | uses: docker/setup-qemu-action@v3 31 | with: 32 | image: tonistiigi/binfmt:latest 33 | platforms: all 34 | 35 | - name: Set up Docker Buildx 36 | uses: docker/setup-buildx-action@v3 37 | 38 | - name: Login to GitHub Container Registry 39 | uses: docker/login-action@v3 40 | with: 41 | registry: ghcr.io 42 | username: ${{ github.repository_owner }} 43 | password: ${{ secrets.GITHUB_TOKEN }} 44 | 45 | - name: Build containers 46 | uses: docker/build-push-action@v6 47 | with: 48 | context: . 49 | file: ./Dockerfile 50 | platforms: linux/amd64,linux/arm64 51 | push: true 52 | build-args: | 53 | BUILD_VERSION=${{ env.build_branch }} 54 | BUILD_DATE=${{ env.build_date }} 55 | BUILD_COMMIT_SHA=${{ env.build_commit_sha }} 56 | tags: | 57 | ghcr.io/${{ env.github_repo }}:latest 58 | ghcr.io/${{ env.github_repo }}:${{ env.build_commit_sha }} 59 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | on: 3 | push: 4 | workflow_dispatch: 5 | inputs: 6 | debug_enabled: 7 | description: "Run the build with tmate debugging enabled" 8 | required: false 9 | default: false 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | strategy: 15 | matrix: 16 | job: 17 | # - { target: x86_64-unknown-linux-musl, pretty: x86_64 } 18 | # - { target: arm-unknown-linux-musleabihf, pretty: armv6l } 19 | # - { target: armv7-unknown-linux-musleabihf, pretty: armv7l } 20 | # - { target: aarch64-unknown-linux-musl, pretty: aarch64 } 21 | # - { 22 | # target: x86_64-unknown-linux-musl, 23 | # pretty: x86_64-backend, 24 | # args: --features rusqlite/bundled, 25 | # } 26 | # - { 27 | # target: arm-unknown-linux-musleabihf, 28 | # pretty: armv6l-backend, 29 | # args: --features rusqlite/bundled, 30 | # } 31 | # - { 32 | # target: armv7-unknown-linux-gnueabihf, 33 | # pretty: armv7l-backend, 34 | # args: --features rusqlite/bundled, 35 | # } 36 | - { 37 | target: aarch64-unknown-linux-gnu, 38 | pretty: aarch64-backend, 39 | args: "", 40 | } 41 | steps: 42 | - uses: actions/checkout@v6 43 | with: 44 | fetch-depth: 0 45 | - run: | 46 | sudo apt-get update 47 | sudo apt-get install -y -qq libasound2-dev libudev-dev pkg-config libssl-dev libxcb1-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev 48 | - name: Install rust toolchain 49 | uses: actions-rs/toolchain@v1 50 | with: 51 | toolchain: stable 52 | profile: minimal 53 | target: ${{ matrix.job.target }} 54 | - uses: Swatinem/rust-cache@v2 55 | with: 56 | key: ${{ matrix.job.pretty }} 57 | - name: Build vwmetrics 58 | uses: actions-rs/cargo@v1 59 | with: 60 | use-cross: true 61 | command: build 62 | args: --release --target ${{ matrix.job.target }} ${{ matrix.job.args }} 63 | - name: Upload binary 64 | uses: actions/upload-artifact@v5 65 | with: 66 | name: vwmetrics-${{ matrix.job.pretty }} 67 | path: target/${{ matrix.job.target }}/release/vwmetrics 68 | 69 | docker: 70 | runs-on: ubuntu-latest 71 | steps: 72 | - uses: actions/checkout@v6 73 | 74 | - name: Set up Docker Buildx 75 | uses: docker/setup-buildx-action@v3 76 | 77 | - name: Build containers 78 | uses: docker/build-push-action@v6 79 | with: 80 | load: true 81 | tags: vwmetrics:latest 82 | 83 | - name: Show image info 84 | run: docker images 85 | -------------------------------------------------------------------------------- /src/web_server.rs: -------------------------------------------------------------------------------- 1 | use hyper::header::{HeaderValue, CONTENT_TYPE}; 2 | use std::net::SocketAddr; 3 | use tokio::net::TcpListener; 4 | 5 | use hyper::body::{Body as HttpBody, Bytes, Frame}; 6 | use hyper::service::service_fn; 7 | use hyper::{Error, Response}; 8 | use std::marker::PhantomData; 9 | use std::pin::Pin; 10 | use std::task::{Context, Poll}; 11 | use tokio::net::TcpStream; 12 | use tracing::{debug, info}; 13 | 14 | use crate::support::TokioIo; 15 | 16 | use crate::METRICS; 17 | 18 | struct Body { 19 | // Our Body type is !Send and !Sync: 20 | _marker: PhantomData<*const ()>, 21 | data: Option, 22 | } 23 | 24 | impl From for Body { 25 | fn from(a: String) -> Self { 26 | Body { 27 | _marker: PhantomData, 28 | data: Some(a.into()), 29 | } 30 | } 31 | } 32 | 33 | impl HttpBody for Body { 34 | type Data = Bytes; 35 | type Error = Error; 36 | 37 | fn poll_frame( 38 | self: Pin<&mut Self>, 39 | _: &mut Context<'_>, 40 | ) -> Poll, Self::Error>>> { 41 | Poll::Ready(self.get_mut().data.take().map(|d| Ok(Frame::data(d)))) 42 | } 43 | } 44 | 45 | pub async fn http1_server(addr: SocketAddr) -> Result<(), Box> { 46 | let listener = TcpListener::bind(addr).await?; 47 | tracing::info!("Listening on http://{}:{}", addr.ip(), addr.port()); 48 | loop { 49 | let (stream, _) = listener.accept().await?; 50 | 51 | let io = IOTypeNotSend::new(TokioIo::new(stream)); 52 | 53 | let service = service_fn(move |req| { 54 | info!( 55 | target: "request", 56 | method = ?req.method(), 57 | uri = ?req.uri(), 58 | user_agent = ?req.headers().get("user-agent"), 59 | ); 60 | 61 | let mut response = Response::new(Body::from(METRICS.lock().unwrap().clone())); 62 | response.headers_mut().insert( 63 | CONTENT_TYPE, 64 | HeaderValue::from_static("text/plain; version=0.0.4"), 65 | ); 66 | 67 | async move { Ok::<_, Error>(response) } 68 | }); 69 | 70 | tokio::task::spawn_local(async move { 71 | if let Err(err) = hyper::server::conn::http1::Builder::new() 72 | .serve_connection(io, service) 73 | .await 74 | { 75 | debug!("Error serving connection: {:?}", err); 76 | } 77 | }); 78 | } 79 | } 80 | 81 | struct IOTypeNotSend { 82 | _marker: PhantomData<*const ()>, 83 | stream: TokioIo, 84 | } 85 | 86 | impl IOTypeNotSend { 87 | fn new(stream: TokioIo) -> Self { 88 | Self { 89 | _marker: PhantomData, 90 | stream, 91 | } 92 | } 93 | } 94 | 95 | impl hyper::rt::Write for IOTypeNotSend { 96 | fn poll_write( 97 | mut self: Pin<&mut Self>, 98 | cx: &mut Context<'_>, 99 | buf: &[u8], 100 | ) -> Poll> { 101 | Pin::new(&mut self.stream).poll_write(cx, buf) 102 | } 103 | 104 | fn poll_flush( 105 | mut self: Pin<&mut Self>, 106 | cx: &mut Context<'_>, 107 | ) -> Poll> { 108 | Pin::new(&mut self.stream).poll_flush(cx) 109 | } 110 | 111 | fn poll_shutdown( 112 | mut self: Pin<&mut Self>, 113 | cx: &mut Context<'_>, 114 | ) -> Poll> { 115 | Pin::new(&mut self.stream).poll_shutdown(cx) 116 | } 117 | } 118 | 119 | impl hyper::rt::Read for IOTypeNotSend { 120 | fn poll_read( 121 | mut self: Pin<&mut Self>, 122 | cx: &mut Context<'_>, 123 | buf: hyper::rt::ReadBufCursor<'_>, 124 | ) -> Poll> { 125 | Pin::new(&mut self.stream).poll_read(cx, buf) 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::{collections::BTreeMap, sync::Mutex}; 2 | 3 | use anyhow::Result; 4 | use clap::Parser; 5 | use once_cell::sync::Lazy; 6 | use sqlx::{Any, AnyPool, Pool}; 7 | use tokio::task; 8 | use tracing::debug; 9 | use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; 10 | use web_server::http1_server; 11 | 12 | pub mod support; 13 | mod web_server; 14 | 15 | static METRICS: Lazy> = Lazy::new(|| Mutex::new(String::new())); 16 | 17 | #[derive(Parser, Debug)] 18 | #[command( 19 | author, 20 | version, 21 | about, 22 | long_about = "Turn your vaultwarden database into a api endpoint\ngithub: https://github.com/Tricked-dev/vwmetrics\nlicense: Apache-2.0" 23 | )] 24 | struct Cli { 25 | /// the database url to connect to `sqlite://db.sqlite3?mode=ro` for sqlite, `postgres://user:pass@localhost/db` for postgres or `mysql://user:pass@localhost/db` for mysql/mariadb 26 | #[clap(short, long, env)] 27 | database_url: String, 28 | /// the port to listen on 29 | #[clap(short, long, env, default_value = "3040")] 30 | port: u16, 31 | /// the host to bind to 32 | #[clap(short = 'b', long, env, default_value = "127.0.0.1")] 33 | host: String, 34 | /// Time between connecting and updating the metrics 35 | #[clap(short, long, env, default_value = "60")] 36 | update_seconds: u64, 37 | } 38 | 39 | #[tokio::main(flavor = "current_thread")] 40 | #[allow(clippy::needless_return)] 41 | async fn main() -> Result<()> { 42 | tracing_subscriber::registry() 43 | .with(tracing_subscriber::EnvFilter::new( 44 | std::env::var("RUST_LOG") 45 | .unwrap_or_else(|_| "error,vwmetrics=warn,debug,info,sqlx=warn".into()), 46 | )) 47 | .with(tracing_subscriber::fmt::layer()) 48 | .init(); 49 | 50 | let cli = Cli::parse(); 51 | let db_url = match cli.database_url.clone() { 52 | url if url.starts_with("sqlite://") && !url.contains("?mode=ro") => { 53 | format!("{url}?mode=ro") 54 | } 55 | url if !url.contains("://") => { 56 | format!("sqlite://{url}?mode=ro") 57 | } 58 | url => url, 59 | }; 60 | 61 | sqlx::any::install_default_drivers(); 62 | let local = task::LocalSet::new(); 63 | 64 | local.spawn_local(async move { 65 | let mut interval = 66 | tokio::time::interval(std::time::Duration::from_secs(cli.update_seconds)); 67 | loop { 68 | interval.tick().await; 69 | if let Err(e) = update_metrics(&db_url).await { 70 | tracing::error!("Error updating metrics: {}", e); 71 | panic!("Exiting program due to panic!") 72 | } 73 | } 74 | }); 75 | 76 | let addr = format!("{}:{}", cli.host, cli.port).parse()?; 77 | local 78 | .run_until(async move { 79 | let output = http1_server(addr).await; 80 | if let Err(e) = output { 81 | tracing::error!("Error in http server: {}", e); 82 | panic!("Exiting program due to panic!") 83 | } 84 | }) 85 | .await; 86 | Ok(()) 87 | } 88 | 89 | async fn update_metrics(db_url: &str) -> Result<()> { 90 | // reconnect every time to make sqlite work when the database has been overwritten by another program. 91 | let pool = AnyPool::connect(db_url).await?; 92 | 93 | let data = get_data(&pool).await?; 94 | 95 | let mut metrics = String::new(); 96 | for (key, value) in data { 97 | metrics.push_str(&prometheus_stat( 98 | &format!("The number of {key}"), 99 | &format!("vaultwarden_{key}_count"), 100 | value, 101 | )); 102 | } 103 | 104 | *METRICS.lock().unwrap() = metrics; 105 | Ok(()) 106 | } 107 | 108 | pub fn prometheus_stat(help: &str, name: &str, value: T) -> String 109 | where 110 | T: std::fmt::Display, 111 | { 112 | format!("# HELP {name} {help}\n# TYPE {name} gauge\n{name} {value}\n") 113 | } 114 | type CountInt = i32; 115 | async fn get_data(pool: &Pool) -> Result, anyhow::Error> { 116 | let mut res = BTreeMap::new(); 117 | 118 | debug!("Getting data from database"); 119 | macro_rules! method_new { 120 | ($($ret:ident),*) => { 121 | $( 122 | // does not work without casting on postgresql 123 | let result = sqlx::query_as::<_, (CountInt,)>(stringify!(SELECT CAST(count(*) as integer) FROM $ret)) 124 | .fetch_one(pool) 125 | .await; 126 | 127 | match result { 128 | Ok(data) => { 129 | res.insert( 130 | stringify!($ret).to_string(), 131 | data.0 132 | ); 133 | }, 134 | Err(e) => tracing::error!("Error while fetching data {e:?}") 135 | } 136 | )* 137 | }; 138 | } 139 | 140 | method_new!( 141 | attachments, 142 | ciphers, 143 | ciphers_collections, 144 | collections, 145 | devices, 146 | emergency_access, 147 | favorites, 148 | folders, 149 | folders_ciphers, 150 | groups, 151 | groups_users, 152 | invitations, 153 | org_policies, 154 | organization_api_key, 155 | organizations, 156 | sends, 157 | twofactor, 158 | twofactor_incomplete, 159 | users, 160 | users_collections, 161 | users_organizations 162 | ); 163 | debug!("Got data from database"); 164 | Ok(res) 165 | } 166 | -------------------------------------------------------------------------------- /src/support/tokiort.rs: -------------------------------------------------------------------------------- 1 | #![allow(dead_code)] 2 | //! Various runtimes for hyper 3 | use std::{ 4 | future::Future, 5 | pin::Pin, 6 | task::{Context, Poll}, 7 | time::{Duration, Instant}, 8 | }; 9 | 10 | use hyper::rt::{Sleep, Timer}; 11 | use pin_project_lite::pin_project; 12 | 13 | #[derive(Clone)] 14 | /// An Executor that uses the tokio runtime. 15 | pub struct TokioExecutor; 16 | 17 | impl hyper::rt::Executor for TokioExecutor 18 | where 19 | F: std::future::Future + Send + 'static, 20 | F::Output: Send + 'static, 21 | { 22 | fn execute(&self, fut: F) { 23 | tokio::task::spawn(fut); 24 | } 25 | } 26 | 27 | /// A Timer that uses the tokio runtime. 28 | 29 | #[derive(Clone, Debug, Default)] 30 | pub struct TokioTimer; 31 | 32 | impl Timer for TokioTimer { 33 | fn sleep(&self, duration: Duration) -> Pin> { 34 | Box::pin(TokioSleep { 35 | inner: tokio::time::sleep(duration), 36 | }) 37 | } 38 | 39 | fn sleep_until(&self, deadline: Instant) -> Pin> { 40 | Box::pin(TokioSleep { 41 | inner: tokio::time::sleep_until(deadline.into()), 42 | }) 43 | } 44 | 45 | fn reset(&self, sleep: &mut Pin>, new_deadline: Instant) { 46 | if let Some(sleep) = sleep.as_mut().downcast_mut_pin::() { 47 | sleep.reset(new_deadline) 48 | } 49 | } 50 | } 51 | 52 | // Use TokioSleep to get tokio::time::Sleep to implement Unpin. 53 | // see https://docs.rs/tokio/latest/tokio/time/struct.Sleep.html 54 | pin_project! { 55 | pub(crate) struct TokioSleep { 56 | #[pin] 57 | pub(crate) inner: tokio::time::Sleep, 58 | } 59 | } 60 | 61 | impl Future for TokioSleep { 62 | type Output = (); 63 | 64 | fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { 65 | self.project().inner.poll(cx) 66 | } 67 | } 68 | 69 | impl Sleep for TokioSleep {} 70 | 71 | impl TokioSleep { 72 | pub fn reset(self: Pin<&mut Self>, deadline: Instant) { 73 | self.project().inner.as_mut().reset(deadline.into()); 74 | } 75 | } 76 | 77 | pin_project! { 78 | #[derive(Debug)] 79 | pub struct TokioIo { 80 | #[pin] 81 | inner: T, 82 | } 83 | } 84 | 85 | impl TokioIo { 86 | pub fn new(inner: T) -> Self { 87 | Self { inner } 88 | } 89 | 90 | pub fn inner(self) -> T { 91 | self.inner 92 | } 93 | } 94 | 95 | impl hyper::rt::Read for TokioIo 96 | where 97 | T: tokio::io::AsyncRead, 98 | { 99 | fn poll_read( 100 | self: Pin<&mut Self>, 101 | cx: &mut Context<'_>, 102 | mut buf: hyper::rt::ReadBufCursor<'_>, 103 | ) -> Poll> { 104 | let n = unsafe { 105 | let mut tbuf = tokio::io::ReadBuf::uninit(buf.as_mut()); 106 | match tokio::io::AsyncRead::poll_read(self.project().inner, cx, &mut tbuf) { 107 | Poll::Ready(Ok(())) => tbuf.filled().len(), 108 | other => return other, 109 | } 110 | }; 111 | 112 | unsafe { 113 | buf.advance(n); 114 | } 115 | Poll::Ready(Ok(())) 116 | } 117 | } 118 | 119 | impl hyper::rt::Write for TokioIo 120 | where 121 | T: tokio::io::AsyncWrite, 122 | { 123 | fn poll_write( 124 | self: Pin<&mut Self>, 125 | cx: &mut Context<'_>, 126 | buf: &[u8], 127 | ) -> Poll> { 128 | tokio::io::AsyncWrite::poll_write(self.project().inner, cx, buf) 129 | } 130 | 131 | fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { 132 | tokio::io::AsyncWrite::poll_flush(self.project().inner, cx) 133 | } 134 | 135 | fn poll_shutdown( 136 | self: Pin<&mut Self>, 137 | cx: &mut Context<'_>, 138 | ) -> Poll> { 139 | tokio::io::AsyncWrite::poll_shutdown(self.project().inner, cx) 140 | } 141 | 142 | fn is_write_vectored(&self) -> bool { 143 | tokio::io::AsyncWrite::is_write_vectored(&self.inner) 144 | } 145 | 146 | fn poll_write_vectored( 147 | self: Pin<&mut Self>, 148 | cx: &mut Context<'_>, 149 | bufs: &[std::io::IoSlice<'_>], 150 | ) -> Poll> { 151 | tokio::io::AsyncWrite::poll_write_vectored(self.project().inner, cx, bufs) 152 | } 153 | } 154 | 155 | impl tokio::io::AsyncRead for TokioIo 156 | where 157 | T: hyper::rt::Read, 158 | { 159 | fn poll_read( 160 | self: Pin<&mut Self>, 161 | cx: &mut Context<'_>, 162 | tbuf: &mut tokio::io::ReadBuf<'_>, 163 | ) -> Poll> { 164 | //let init = tbuf.initialized().len(); 165 | let filled = tbuf.filled().len(); 166 | let sub_filled = unsafe { 167 | let mut buf = hyper::rt::ReadBuf::uninit(tbuf.unfilled_mut()); 168 | 169 | match hyper::rt::Read::poll_read(self.project().inner, cx, buf.unfilled()) { 170 | Poll::Ready(Ok(())) => buf.filled().len(), 171 | other => return other, 172 | } 173 | }; 174 | 175 | let n_filled = filled + sub_filled; 176 | // At least sub_filled bytes had to have been initialized. 177 | let n_init = sub_filled; 178 | unsafe { 179 | tbuf.assume_init(n_init); 180 | tbuf.set_filled(n_filled); 181 | } 182 | 183 | Poll::Ready(Ok(())) 184 | } 185 | } 186 | 187 | impl tokio::io::AsyncWrite for TokioIo 188 | where 189 | T: hyper::rt::Write, 190 | { 191 | fn poll_write( 192 | self: Pin<&mut Self>, 193 | cx: &mut Context<'_>, 194 | buf: &[u8], 195 | ) -> Poll> { 196 | hyper::rt::Write::poll_write(self.project().inner, cx, buf) 197 | } 198 | 199 | fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { 200 | hyper::rt::Write::poll_flush(self.project().inner, cx) 201 | } 202 | 203 | fn poll_shutdown( 204 | self: Pin<&mut Self>, 205 | cx: &mut Context<'_>, 206 | ) -> Poll> { 207 | hyper::rt::Write::poll_shutdown(self.project().inner, cx) 208 | } 209 | 210 | fn is_write_vectored(&self) -> bool { 211 | hyper::rt::Write::is_write_vectored(&self.inner) 212 | } 213 | 214 | fn poll_write_vectored( 215 | self: Pin<&mut Self>, 216 | cx: &mut Context<'_>, 217 | bufs: &[std::io::IoSlice<'_>], 218 | ) -> Poll> { 219 | hyper::rt::Write::poll_write_vectored(self.project().inner, cx, bufs) 220 | } 221 | } 222 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /.github/dash.json: -------------------------------------------------------------------------------- 1 | { 2 | "__inputs": [ 3 | { 4 | "name": "DS_PROMETHEUS", 5 | "label": "Prometheus", 6 | "description": "", 7 | "type": "datasource", 8 | "pluginId": "prometheus", 9 | "pluginName": "Prometheus" 10 | } 11 | ], 12 | "__elements": {}, 13 | "__requires": [ 14 | { 15 | "type": "grafana", 16 | "id": "grafana", 17 | "name": "Grafana", 18 | "version": "9.3.1" 19 | }, 20 | { 21 | "type": "datasource", 22 | "id": "prometheus", 23 | "name": "Prometheus", 24 | "version": "1.0.0" 25 | }, 26 | { 27 | "type": "panel", 28 | "id": "stat", 29 | "name": "Stat", 30 | "version": "" 31 | } 32 | ], 33 | "annotations": { 34 | "list": [ 35 | { 36 | "builtIn": 1, 37 | "datasource": { 38 | "type": "grafana", 39 | "uid": "-- Grafana --" 40 | }, 41 | "enable": true, 42 | "hide": true, 43 | "iconColor": "rgba(0, 211, 255, 1)", 44 | "name": "Annotations & Alerts", 45 | "target": { 46 | "limit": 100, 47 | "matchAny": false, 48 | "tags": [], 49 | "type": "dashboard" 50 | }, 51 | "type": "dashboard" 52 | } 53 | ] 54 | }, 55 | "editable": true, 56 | "fiscalYearStartMonth": 0, 57 | "graphTooltip": 0, 58 | "id": null, 59 | "links": [ 60 | { 61 | "asDropdown": false, 62 | "icon": "external link", 63 | "includeVars": false, 64 | "keepTime": false, 65 | "tags": [], 66 | "targetBlank": true, 67 | "title": "Github", 68 | "tooltip": "Github", 69 | "type": "link", 70 | "url": "https://github.com/Tricked-dev/vwmetrics" 71 | } 72 | ], 73 | "liveNow": false, 74 | "panels": [ 75 | { 76 | "datasource": { 77 | "type": "prometheus", 78 | "uid": "${DS_PROMETHEUS}" 79 | }, 80 | "fieldConfig": { 81 | "defaults": { 82 | "color": { 83 | "mode": "thresholds" 84 | }, 85 | "mappings": [], 86 | "thresholds": { 87 | "mode": "absolute", 88 | "steps": [ 89 | { 90 | "color": "green", 91 | "value": null 92 | } 93 | ] 94 | } 95 | }, 96 | "overrides": [] 97 | }, 98 | "gridPos": { 99 | "h": 5, 100 | "w": 4, 101 | "x": 0, 102 | "y": 0 103 | }, 104 | "id": 2, 105 | "options": { 106 | "colorMode": "value", 107 | "graphMode": "area", 108 | "justifyMode": "auto", 109 | "orientation": "auto", 110 | "reduceOptions": { 111 | "calcs": [ 112 | "lastNotNull" 113 | ], 114 | "fields": "", 115 | "values": false 116 | }, 117 | "textMode": "auto" 118 | }, 119 | "pluginVersion": "9.3.1", 120 | "targets": [ 121 | { 122 | "datasource": { 123 | "type": "prometheus", 124 | "uid": "${DS_PROMETHEUS}" 125 | }, 126 | "editorMode": "builder", 127 | "expr": "vaultwarden_ciphers_count", 128 | "legendFormat": "__auto", 129 | "range": true, 130 | "refId": "A" 131 | } 132 | ], 133 | "title": "Passwords", 134 | "type": "stat" 135 | }, 136 | { 137 | "datasource": { 138 | "type": "prometheus", 139 | "uid": "${DS_PROMETHEUS}" 140 | }, 141 | "fieldConfig": { 142 | "defaults": { 143 | "color": { 144 | "mode": "thresholds" 145 | }, 146 | "mappings": [], 147 | "thresholds": { 148 | "mode": "absolute", 149 | "steps": [ 150 | { 151 | "color": "green", 152 | "value": null 153 | } 154 | ] 155 | } 156 | }, 157 | "overrides": [] 158 | }, 159 | "gridPos": { 160 | "h": 5, 161 | "w": 4, 162 | "x": 4, 163 | "y": 0 164 | }, 165 | "id": 6, 166 | "options": { 167 | "colorMode": "value", 168 | "graphMode": "area", 169 | "justifyMode": "auto", 170 | "orientation": "auto", 171 | "reduceOptions": { 172 | "calcs": [ 173 | "lastNotNull" 174 | ], 175 | "fields": "", 176 | "values": false 177 | }, 178 | "textMode": "auto" 179 | }, 180 | "pluginVersion": "9.3.1", 181 | "targets": [ 182 | { 183 | "datasource": { 184 | "type": "prometheus", 185 | "uid": "${DS_PROMETHEUS}" 186 | }, 187 | "editorMode": "builder", 188 | "expr": "vaultwarden_sends_count", 189 | "legendFormat": "__auto", 190 | "range": true, 191 | "refId": "A" 192 | } 193 | ], 194 | "title": "Sends", 195 | "type": "stat" 196 | }, 197 | { 198 | "datasource": { 199 | "type": "prometheus", 200 | "uid": "${DS_PROMETHEUS}" 201 | }, 202 | "fieldConfig": { 203 | "defaults": { 204 | "color": { 205 | "mode": "thresholds" 206 | }, 207 | "mappings": [], 208 | "thresholds": { 209 | "mode": "absolute", 210 | "steps": [ 211 | { 212 | "color": "green", 213 | "value": null 214 | } 215 | ] 216 | } 217 | }, 218 | "overrides": [] 219 | }, 220 | "gridPos": { 221 | "h": 5, 222 | "w": 4, 223 | "x": 8, 224 | "y": 0 225 | }, 226 | "id": 7, 227 | "options": { 228 | "colorMode": "value", 229 | "graphMode": "area", 230 | "justifyMode": "auto", 231 | "orientation": "auto", 232 | "reduceOptions": { 233 | "calcs": [ 234 | "lastNotNull" 235 | ], 236 | "fields": "", 237 | "values": false 238 | }, 239 | "textMode": "auto" 240 | }, 241 | "pluginVersion": "9.3.1", 242 | "targets": [ 243 | { 244 | "datasource": { 245 | "type": "prometheus", 246 | "uid": "${DS_PROMETHEUS}" 247 | }, 248 | "editorMode": "builder", 249 | "expr": "vaultwarden_attachments_count", 250 | "legendFormat": "__auto", 251 | "range": true, 252 | "refId": "A" 253 | } 254 | ], 255 | "title": "Attachments", 256 | "type": "stat" 257 | }, 258 | { 259 | "datasource": { 260 | "type": "prometheus", 261 | "uid": "${DS_PROMETHEUS}" 262 | }, 263 | "fieldConfig": { 264 | "defaults": { 265 | "color": { 266 | "mode": "thresholds" 267 | }, 268 | "mappings": [], 269 | "thresholds": { 270 | "mode": "absolute", 271 | "steps": [ 272 | { 273 | "color": "green", 274 | "value": null 275 | }, 276 | { 277 | "color": "red", 278 | "value": 80 279 | } 280 | ] 281 | } 282 | }, 283 | "overrides": [] 284 | }, 285 | "gridPos": { 286 | "h": 5, 287 | "w": 4, 288 | "x": 12, 289 | "y": 0 290 | }, 291 | "id": 4, 292 | "options": { 293 | "colorMode": "value", 294 | "graphMode": "area", 295 | "justifyMode": "auto", 296 | "orientation": "auto", 297 | "reduceOptions": { 298 | "calcs": [ 299 | "lastNotNull" 300 | ], 301 | "fields": "", 302 | "values": false 303 | }, 304 | "textMode": "auto" 305 | }, 306 | "pluginVersion": "9.3.1", 307 | "targets": [ 308 | { 309 | "datasource": { 310 | "type": "prometheus", 311 | "uid": "${DS_PROMETHEUS}" 312 | }, 313 | "editorMode": "builder", 314 | "expr": "vaultwarden_devices_count", 315 | "legendFormat": "__auto", 316 | "range": true, 317 | "refId": "A" 318 | } 319 | ], 320 | "title": "Connected devices", 321 | "type": "stat" 322 | }, 323 | { 324 | "datasource": { 325 | "type": "prometheus", 326 | "uid": "${DS_PROMETHEUS}" 327 | }, 328 | "fieldConfig": { 329 | "defaults": { 330 | "color": { 331 | "mode": "thresholds" 332 | }, 333 | "mappings": [], 334 | "thresholds": { 335 | "mode": "absolute", 336 | "steps": [ 337 | { 338 | "color": "green", 339 | "value": null 340 | }, 341 | { 342 | "color": "red", 343 | "value": 80 344 | } 345 | ] 346 | } 347 | }, 348 | "overrides": [] 349 | }, 350 | "gridPos": { 351 | "h": 5, 352 | "w": 4, 353 | "x": 16, 354 | "y": 0 355 | }, 356 | "id": 5, 357 | "options": { 358 | "colorMode": "value", 359 | "graphMode": "area", 360 | "justifyMode": "auto", 361 | "orientation": "auto", 362 | "reduceOptions": { 363 | "calcs": [ 364 | "lastNotNull" 365 | ], 366 | "fields": "", 367 | "values": false 368 | }, 369 | "textMode": "auto" 370 | }, 371 | "pluginVersion": "9.3.1", 372 | "targets": [ 373 | { 374 | "datasource": { 375 | "type": "prometheus", 376 | "uid": "${DS_PROMETHEUS}" 377 | }, 378 | "editorMode": "builder", 379 | "expr": "vaultwarden_users_count", 380 | "legendFormat": "__auto", 381 | "range": true, 382 | "refId": "A" 383 | } 384 | ], 385 | "title": "Users", 386 | "type": "stat" 387 | }, 388 | { 389 | "datasource": { 390 | "type": "prometheus", 391 | "uid": "${DS_PROMETHEUS}" 392 | }, 393 | "fieldConfig": { 394 | "defaults": { 395 | "color": { 396 | "mode": "thresholds" 397 | }, 398 | "mappings": [], 399 | "thresholds": { 400 | "mode": "absolute", 401 | "steps": [ 402 | { 403 | "color": "green", 404 | "value": null 405 | }, 406 | { 407 | "color": "red", 408 | "value": 80 409 | } 410 | ] 411 | } 412 | }, 413 | "overrides": [] 414 | }, 415 | "gridPos": { 416 | "h": 5, 417 | "w": 4, 418 | "x": 20, 419 | "y": 0 420 | }, 421 | "id": 8, 422 | "options": { 423 | "colorMode": "value", 424 | "graphMode": "area", 425 | "justifyMode": "auto", 426 | "orientation": "auto", 427 | "reduceOptions": { 428 | "calcs": [ 429 | "lastNotNull" 430 | ], 431 | "fields": "", 432 | "values": false 433 | }, 434 | "textMode": "auto" 435 | }, 436 | "pluginVersion": "9.3.1", 437 | "targets": [ 438 | { 439 | "datasource": { 440 | "type": "prometheus", 441 | "uid": "${DS_PROMETHEUS}" 442 | }, 443 | "editorMode": "builder", 444 | "expr": "vaultwarden_organizations_count", 445 | "legendFormat": "__auto", 446 | "range": true, 447 | "refId": "A" 448 | } 449 | ], 450 | "title": "Organizations", 451 | "type": "stat" 452 | } 453 | ], 454 | "schemaVersion": 37, 455 | "style": "dark", 456 | "tags": [], 457 | "templating": { 458 | "list": [] 459 | }, 460 | "time": { 461 | "from": "now-6h", 462 | "to": "now" 463 | }, 464 | "timepicker": {}, 465 | "timezone": "", 466 | "title": "Vaultwarden stats", 467 | "uid": "RO6mG1F4k", 468 | "version": 3, 469 | "weekStart": "" 470 | } 471 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "aho-corasick" 7 | version = "1.1.3" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "allocator-api2" 16 | version = "0.2.21" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 19 | 20 | [[package]] 21 | name = "anstream" 22 | version = "0.6.18" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 25 | dependencies = [ 26 | "anstyle", 27 | "anstyle-parse", 28 | "anstyle-query", 29 | "anstyle-wincon", 30 | "colorchoice", 31 | "is_terminal_polyfill", 32 | "utf8parse", 33 | ] 34 | 35 | [[package]] 36 | name = "anstyle" 37 | version = "1.0.10" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 40 | 41 | [[package]] 42 | name = "anstyle-parse" 43 | version = "0.2.6" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 46 | dependencies = [ 47 | "utf8parse", 48 | ] 49 | 50 | [[package]] 51 | name = "anstyle-query" 52 | version = "1.1.2" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 55 | dependencies = [ 56 | "windows-sys 0.59.0", 57 | ] 58 | 59 | [[package]] 60 | name = "anstyle-wincon" 61 | version = "3.0.7" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 64 | dependencies = [ 65 | "anstyle", 66 | "once_cell", 67 | "windows-sys 0.59.0", 68 | ] 69 | 70 | [[package]] 71 | name = "anyhow" 72 | version = "1.0.100" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 75 | 76 | [[package]] 77 | name = "atoi" 78 | version = "2.0.0" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 81 | dependencies = [ 82 | "num-traits", 83 | ] 84 | 85 | [[package]] 86 | name = "atomic-waker" 87 | version = "1.1.2" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 90 | 91 | [[package]] 92 | name = "autocfg" 93 | version = "1.4.0" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 96 | 97 | [[package]] 98 | name = "base64" 99 | version = "0.22.1" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 102 | 103 | [[package]] 104 | name = "base64ct" 105 | version = "1.6.0" 106 | source = "registry+https://github.com/rust-lang/crates.io-index" 107 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 108 | 109 | [[package]] 110 | name = "bitflags" 111 | version = "2.8.0" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 114 | dependencies = [ 115 | "serde", 116 | ] 117 | 118 | [[package]] 119 | name = "block-buffer" 120 | version = "0.10.4" 121 | source = "registry+https://github.com/rust-lang/crates.io-index" 122 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 123 | dependencies = [ 124 | "generic-array", 125 | ] 126 | 127 | [[package]] 128 | name = "byteorder" 129 | version = "1.5.0" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 132 | 133 | [[package]] 134 | name = "bytes" 135 | version = "1.10.0" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" 138 | 139 | [[package]] 140 | name = "cc" 141 | version = "1.2.15" 142 | source = "registry+https://github.com/rust-lang/crates.io-index" 143 | checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" 144 | dependencies = [ 145 | "shlex", 146 | ] 147 | 148 | [[package]] 149 | name = "cfg-if" 150 | version = "1.0.0" 151 | source = "registry+https://github.com/rust-lang/crates.io-index" 152 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 153 | 154 | [[package]] 155 | name = "clap" 156 | version = "4.5.53" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" 159 | dependencies = [ 160 | "clap_builder", 161 | "clap_derive", 162 | ] 163 | 164 | [[package]] 165 | name = "clap_builder" 166 | version = "4.5.53" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" 169 | dependencies = [ 170 | "anstream", 171 | "anstyle", 172 | "clap_lex", 173 | "strsim", 174 | ] 175 | 176 | [[package]] 177 | name = "clap_derive" 178 | version = "4.5.49" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" 181 | dependencies = [ 182 | "heck", 183 | "proc-macro2", 184 | "quote", 185 | "syn", 186 | ] 187 | 188 | [[package]] 189 | name = "clap_lex" 190 | version = "0.7.4" 191 | source = "registry+https://github.com/rust-lang/crates.io-index" 192 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 193 | 194 | [[package]] 195 | name = "colorchoice" 196 | version = "1.0.3" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 199 | 200 | [[package]] 201 | name = "concurrent-queue" 202 | version = "2.5.0" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 205 | dependencies = [ 206 | "crossbeam-utils", 207 | ] 208 | 209 | [[package]] 210 | name = "const-oid" 211 | version = "0.9.6" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 214 | 215 | [[package]] 216 | name = "cpufeatures" 217 | version = "0.2.17" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 220 | dependencies = [ 221 | "libc", 222 | ] 223 | 224 | [[package]] 225 | name = "crc" 226 | version = "3.2.1" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" 229 | dependencies = [ 230 | "crc-catalog", 231 | ] 232 | 233 | [[package]] 234 | name = "crc-catalog" 235 | version = "2.4.0" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 238 | 239 | [[package]] 240 | name = "crossbeam-queue" 241 | version = "0.3.12" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 244 | dependencies = [ 245 | "crossbeam-utils", 246 | ] 247 | 248 | [[package]] 249 | name = "crossbeam-utils" 250 | version = "0.8.21" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 253 | 254 | [[package]] 255 | name = "crypto-common" 256 | version = "0.1.6" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 259 | dependencies = [ 260 | "generic-array", 261 | "typenum", 262 | ] 263 | 264 | [[package]] 265 | name = "der" 266 | version = "0.7.9" 267 | source = "registry+https://github.com/rust-lang/crates.io-index" 268 | checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" 269 | dependencies = [ 270 | "const-oid", 271 | "pem-rfc7468", 272 | "zeroize", 273 | ] 274 | 275 | [[package]] 276 | name = "digest" 277 | version = "0.10.7" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 280 | dependencies = [ 281 | "block-buffer", 282 | "const-oid", 283 | "crypto-common", 284 | "subtle", 285 | ] 286 | 287 | [[package]] 288 | name = "displaydoc" 289 | version = "0.2.5" 290 | source = "registry+https://github.com/rust-lang/crates.io-index" 291 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 292 | dependencies = [ 293 | "proc-macro2", 294 | "quote", 295 | "syn", 296 | ] 297 | 298 | [[package]] 299 | name = "dotenvy" 300 | version = "0.15.7" 301 | source = "registry+https://github.com/rust-lang/crates.io-index" 302 | checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 303 | 304 | [[package]] 305 | name = "either" 306 | version = "1.14.0" 307 | source = "registry+https://github.com/rust-lang/crates.io-index" 308 | checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" 309 | dependencies = [ 310 | "serde", 311 | ] 312 | 313 | [[package]] 314 | name = "equivalent" 315 | version = "1.0.2" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 318 | 319 | [[package]] 320 | name = "etcetera" 321 | version = "0.8.0" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" 324 | dependencies = [ 325 | "cfg-if", 326 | "home", 327 | "windows-sys 0.48.0", 328 | ] 329 | 330 | [[package]] 331 | name = "event-listener" 332 | version = "5.4.0" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 335 | dependencies = [ 336 | "concurrent-queue", 337 | "parking", 338 | "pin-project-lite", 339 | ] 340 | 341 | [[package]] 342 | name = "flume" 343 | version = "0.11.1" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" 346 | dependencies = [ 347 | "futures-core", 348 | "futures-sink", 349 | "spin", 350 | ] 351 | 352 | [[package]] 353 | name = "fnv" 354 | version = "1.0.7" 355 | source = "registry+https://github.com/rust-lang/crates.io-index" 356 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 357 | 358 | [[package]] 359 | name = "foldhash" 360 | version = "0.1.4" 361 | source = "registry+https://github.com/rust-lang/crates.io-index" 362 | checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" 363 | 364 | [[package]] 365 | name = "form_urlencoded" 366 | version = "1.2.1" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 369 | dependencies = [ 370 | "percent-encoding", 371 | ] 372 | 373 | [[package]] 374 | name = "futures-channel" 375 | version = "0.3.31" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 378 | dependencies = [ 379 | "futures-core", 380 | "futures-sink", 381 | ] 382 | 383 | [[package]] 384 | name = "futures-core" 385 | version = "0.3.31" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 388 | 389 | [[package]] 390 | name = "futures-executor" 391 | version = "0.3.31" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 394 | dependencies = [ 395 | "futures-core", 396 | "futures-task", 397 | "futures-util", 398 | ] 399 | 400 | [[package]] 401 | name = "futures-intrusive" 402 | version = "0.5.0" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" 405 | dependencies = [ 406 | "futures-core", 407 | "lock_api", 408 | "parking_lot", 409 | ] 410 | 411 | [[package]] 412 | name = "futures-io" 413 | version = "0.3.31" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 416 | 417 | [[package]] 418 | name = "futures-sink" 419 | version = "0.3.31" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 422 | 423 | [[package]] 424 | name = "futures-task" 425 | version = "0.3.31" 426 | source = "registry+https://github.com/rust-lang/crates.io-index" 427 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 428 | 429 | [[package]] 430 | name = "futures-util" 431 | version = "0.3.31" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 434 | dependencies = [ 435 | "futures-core", 436 | "futures-io", 437 | "futures-sink", 438 | "futures-task", 439 | "memchr", 440 | "pin-project-lite", 441 | "pin-utils", 442 | "slab", 443 | ] 444 | 445 | [[package]] 446 | name = "generic-array" 447 | version = "0.14.7" 448 | source = "registry+https://github.com/rust-lang/crates.io-index" 449 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 450 | dependencies = [ 451 | "typenum", 452 | "version_check", 453 | ] 454 | 455 | [[package]] 456 | name = "getrandom" 457 | version = "0.2.15" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 460 | dependencies = [ 461 | "cfg-if", 462 | "libc", 463 | "wasi", 464 | ] 465 | 466 | [[package]] 467 | name = "h2" 468 | version = "0.4.8" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" 471 | dependencies = [ 472 | "atomic-waker", 473 | "bytes", 474 | "fnv", 475 | "futures-core", 476 | "futures-sink", 477 | "http", 478 | "indexmap", 479 | "slab", 480 | "tokio", 481 | "tokio-util", 482 | "tracing", 483 | ] 484 | 485 | [[package]] 486 | name = "hashbrown" 487 | version = "0.15.2" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 490 | dependencies = [ 491 | "allocator-api2", 492 | "equivalent", 493 | "foldhash", 494 | ] 495 | 496 | [[package]] 497 | name = "hashlink" 498 | version = "0.10.0" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" 501 | dependencies = [ 502 | "hashbrown", 503 | ] 504 | 505 | [[package]] 506 | name = "heck" 507 | version = "0.5.0" 508 | source = "registry+https://github.com/rust-lang/crates.io-index" 509 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 510 | 511 | [[package]] 512 | name = "hex" 513 | version = "0.4.3" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 516 | 517 | [[package]] 518 | name = "hkdf" 519 | version = "0.12.4" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 522 | dependencies = [ 523 | "hmac", 524 | ] 525 | 526 | [[package]] 527 | name = "hmac" 528 | version = "0.12.1" 529 | source = "registry+https://github.com/rust-lang/crates.io-index" 530 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 531 | dependencies = [ 532 | "digest", 533 | ] 534 | 535 | [[package]] 536 | name = "home" 537 | version = "0.5.11" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 540 | dependencies = [ 541 | "windows-sys 0.59.0", 542 | ] 543 | 544 | [[package]] 545 | name = "http" 546 | version = "1.2.0" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" 549 | dependencies = [ 550 | "bytes", 551 | "fnv", 552 | "itoa", 553 | ] 554 | 555 | [[package]] 556 | name = "http-body" 557 | version = "1.0.1" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 560 | dependencies = [ 561 | "bytes", 562 | "http", 563 | ] 564 | 565 | [[package]] 566 | name = "http-body-util" 567 | version = "0.1.3" 568 | source = "registry+https://github.com/rust-lang/crates.io-index" 569 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 570 | dependencies = [ 571 | "bytes", 572 | "futures-core", 573 | "http", 574 | "http-body", 575 | "pin-project-lite", 576 | ] 577 | 578 | [[package]] 579 | name = "httparse" 580 | version = "1.10.0" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" 583 | 584 | [[package]] 585 | name = "httpdate" 586 | version = "1.0.3" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 589 | 590 | [[package]] 591 | name = "hyper" 592 | version = "1.8.1" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" 595 | dependencies = [ 596 | "atomic-waker", 597 | "bytes", 598 | "futures-channel", 599 | "futures-core", 600 | "h2", 601 | "http", 602 | "http-body", 603 | "httparse", 604 | "httpdate", 605 | "itoa", 606 | "pin-project-lite", 607 | "pin-utils", 608 | "smallvec", 609 | "tokio", 610 | ] 611 | 612 | [[package]] 613 | name = "icu_collections" 614 | version = "1.5.0" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 617 | dependencies = [ 618 | "displaydoc", 619 | "yoke", 620 | "zerofrom", 621 | "zerovec", 622 | ] 623 | 624 | [[package]] 625 | name = "icu_locid" 626 | version = "1.5.0" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 629 | dependencies = [ 630 | "displaydoc", 631 | "litemap", 632 | "tinystr", 633 | "writeable", 634 | "zerovec", 635 | ] 636 | 637 | [[package]] 638 | name = "icu_locid_transform" 639 | version = "1.5.0" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 642 | dependencies = [ 643 | "displaydoc", 644 | "icu_locid", 645 | "icu_locid_transform_data", 646 | "icu_provider", 647 | "tinystr", 648 | "zerovec", 649 | ] 650 | 651 | [[package]] 652 | name = "icu_locid_transform_data" 653 | version = "1.5.0" 654 | source = "registry+https://github.com/rust-lang/crates.io-index" 655 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 656 | 657 | [[package]] 658 | name = "icu_normalizer" 659 | version = "1.5.0" 660 | source = "registry+https://github.com/rust-lang/crates.io-index" 661 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 662 | dependencies = [ 663 | "displaydoc", 664 | "icu_collections", 665 | "icu_normalizer_data", 666 | "icu_properties", 667 | "icu_provider", 668 | "smallvec", 669 | "utf16_iter", 670 | "utf8_iter", 671 | "write16", 672 | "zerovec", 673 | ] 674 | 675 | [[package]] 676 | name = "icu_normalizer_data" 677 | version = "1.5.0" 678 | source = "registry+https://github.com/rust-lang/crates.io-index" 679 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 680 | 681 | [[package]] 682 | name = "icu_properties" 683 | version = "1.5.1" 684 | source = "registry+https://github.com/rust-lang/crates.io-index" 685 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 686 | dependencies = [ 687 | "displaydoc", 688 | "icu_collections", 689 | "icu_locid_transform", 690 | "icu_properties_data", 691 | "icu_provider", 692 | "tinystr", 693 | "zerovec", 694 | ] 695 | 696 | [[package]] 697 | name = "icu_properties_data" 698 | version = "1.5.0" 699 | source = "registry+https://github.com/rust-lang/crates.io-index" 700 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 701 | 702 | [[package]] 703 | name = "icu_provider" 704 | version = "1.5.0" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 707 | dependencies = [ 708 | "displaydoc", 709 | "icu_locid", 710 | "icu_provider_macros", 711 | "stable_deref_trait", 712 | "tinystr", 713 | "writeable", 714 | "yoke", 715 | "zerofrom", 716 | "zerovec", 717 | ] 718 | 719 | [[package]] 720 | name = "icu_provider_macros" 721 | version = "1.5.0" 722 | source = "registry+https://github.com/rust-lang/crates.io-index" 723 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 724 | dependencies = [ 725 | "proc-macro2", 726 | "quote", 727 | "syn", 728 | ] 729 | 730 | [[package]] 731 | name = "idna" 732 | version = "1.0.3" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 735 | dependencies = [ 736 | "idna_adapter", 737 | "smallvec", 738 | "utf8_iter", 739 | ] 740 | 741 | [[package]] 742 | name = "idna_adapter" 743 | version = "1.2.0" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 746 | dependencies = [ 747 | "icu_normalizer", 748 | "icu_properties", 749 | ] 750 | 751 | [[package]] 752 | name = "indexmap" 753 | version = "2.7.1" 754 | source = "registry+https://github.com/rust-lang/crates.io-index" 755 | checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" 756 | dependencies = [ 757 | "equivalent", 758 | "hashbrown", 759 | ] 760 | 761 | [[package]] 762 | name = "is_terminal_polyfill" 763 | version = "1.70.1" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 766 | 767 | [[package]] 768 | name = "itoa" 769 | version = "1.0.14" 770 | source = "registry+https://github.com/rust-lang/crates.io-index" 771 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 772 | 773 | [[package]] 774 | name = "lazy_static" 775 | version = "1.5.0" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 778 | dependencies = [ 779 | "spin", 780 | ] 781 | 782 | [[package]] 783 | name = "libc" 784 | version = "0.2.174" 785 | source = "registry+https://github.com/rust-lang/crates.io-index" 786 | checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" 787 | 788 | [[package]] 789 | name = "libm" 790 | version = "0.2.11" 791 | source = "registry+https://github.com/rust-lang/crates.io-index" 792 | checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" 793 | 794 | [[package]] 795 | name = "libsqlite3-sys" 796 | version = "0.30.1" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" 799 | dependencies = [ 800 | "cc", 801 | "pkg-config", 802 | "vcpkg", 803 | ] 804 | 805 | [[package]] 806 | name = "litemap" 807 | version = "0.7.5" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" 810 | 811 | [[package]] 812 | name = "lock_api" 813 | version = "0.4.12" 814 | source = "registry+https://github.com/rust-lang/crates.io-index" 815 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 816 | dependencies = [ 817 | "autocfg", 818 | "scopeguard", 819 | ] 820 | 821 | [[package]] 822 | name = "log" 823 | version = "0.4.26" 824 | source = "registry+https://github.com/rust-lang/crates.io-index" 825 | checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" 826 | 827 | [[package]] 828 | name = "matchers" 829 | version = "0.2.0" 830 | source = "registry+https://github.com/rust-lang/crates.io-index" 831 | checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" 832 | dependencies = [ 833 | "regex-automata", 834 | ] 835 | 836 | [[package]] 837 | name = "md-5" 838 | version = "0.10.6" 839 | source = "registry+https://github.com/rust-lang/crates.io-index" 840 | checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 841 | dependencies = [ 842 | "cfg-if", 843 | "digest", 844 | ] 845 | 846 | [[package]] 847 | name = "memchr" 848 | version = "2.7.4" 849 | source = "registry+https://github.com/rust-lang/crates.io-index" 850 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 851 | 852 | [[package]] 853 | name = "mio" 854 | version = "1.0.3" 855 | source = "registry+https://github.com/rust-lang/crates.io-index" 856 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 857 | dependencies = [ 858 | "libc", 859 | "wasi", 860 | "windows-sys 0.52.0", 861 | ] 862 | 863 | [[package]] 864 | name = "nu-ansi-term" 865 | version = "0.50.1" 866 | source = "registry+https://github.com/rust-lang/crates.io-index" 867 | checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" 868 | dependencies = [ 869 | "windows-sys 0.52.0", 870 | ] 871 | 872 | [[package]] 873 | name = "num-bigint-dig" 874 | version = "0.8.4" 875 | source = "registry+https://github.com/rust-lang/crates.io-index" 876 | checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 877 | dependencies = [ 878 | "byteorder", 879 | "lazy_static", 880 | "libm", 881 | "num-integer", 882 | "num-iter", 883 | "num-traits", 884 | "rand", 885 | "smallvec", 886 | "zeroize", 887 | ] 888 | 889 | [[package]] 890 | name = "num-integer" 891 | version = "0.1.46" 892 | source = "registry+https://github.com/rust-lang/crates.io-index" 893 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 894 | dependencies = [ 895 | "num-traits", 896 | ] 897 | 898 | [[package]] 899 | name = "num-iter" 900 | version = "0.1.45" 901 | source = "registry+https://github.com/rust-lang/crates.io-index" 902 | checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 903 | dependencies = [ 904 | "autocfg", 905 | "num-integer", 906 | "num-traits", 907 | ] 908 | 909 | [[package]] 910 | name = "num-traits" 911 | version = "0.2.19" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 914 | dependencies = [ 915 | "autocfg", 916 | "libm", 917 | ] 918 | 919 | [[package]] 920 | name = "once_cell" 921 | version = "1.21.3" 922 | source = "registry+https://github.com/rust-lang/crates.io-index" 923 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 924 | 925 | [[package]] 926 | name = "parking" 927 | version = "2.2.1" 928 | source = "registry+https://github.com/rust-lang/crates.io-index" 929 | checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 930 | 931 | [[package]] 932 | name = "parking_lot" 933 | version = "0.12.3" 934 | source = "registry+https://github.com/rust-lang/crates.io-index" 935 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 936 | dependencies = [ 937 | "lock_api", 938 | "parking_lot_core", 939 | ] 940 | 941 | [[package]] 942 | name = "parking_lot_core" 943 | version = "0.9.10" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 946 | dependencies = [ 947 | "cfg-if", 948 | "libc", 949 | "redox_syscall", 950 | "smallvec", 951 | "windows-targets 0.52.6", 952 | ] 953 | 954 | [[package]] 955 | name = "pem-rfc7468" 956 | version = "0.7.0" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 959 | dependencies = [ 960 | "base64ct", 961 | ] 962 | 963 | [[package]] 964 | name = "percent-encoding" 965 | version = "2.3.1" 966 | source = "registry+https://github.com/rust-lang/crates.io-index" 967 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 968 | 969 | [[package]] 970 | name = "pin-project-lite" 971 | version = "0.2.16" 972 | source = "registry+https://github.com/rust-lang/crates.io-index" 973 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 974 | 975 | [[package]] 976 | name = "pin-utils" 977 | version = "0.1.0" 978 | source = "registry+https://github.com/rust-lang/crates.io-index" 979 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 980 | 981 | [[package]] 982 | name = "pkcs1" 983 | version = "0.7.5" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 986 | dependencies = [ 987 | "der", 988 | "pkcs8", 989 | "spki", 990 | ] 991 | 992 | [[package]] 993 | name = "pkcs8" 994 | version = "0.10.2" 995 | source = "registry+https://github.com/rust-lang/crates.io-index" 996 | checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 997 | dependencies = [ 998 | "der", 999 | "spki", 1000 | ] 1001 | 1002 | [[package]] 1003 | name = "pkg-config" 1004 | version = "0.3.31" 1005 | source = "registry+https://github.com/rust-lang/crates.io-index" 1006 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 1007 | 1008 | [[package]] 1009 | name = "ppv-lite86" 1010 | version = "0.2.20" 1011 | source = "registry+https://github.com/rust-lang/crates.io-index" 1012 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1013 | dependencies = [ 1014 | "zerocopy", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "proc-macro2" 1019 | version = "1.0.93" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 1022 | dependencies = [ 1023 | "unicode-ident", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "quote" 1028 | version = "1.0.38" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 1031 | dependencies = [ 1032 | "proc-macro2", 1033 | ] 1034 | 1035 | [[package]] 1036 | name = "rand" 1037 | version = "0.8.5" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1040 | dependencies = [ 1041 | "libc", 1042 | "rand_chacha", 1043 | "rand_core", 1044 | ] 1045 | 1046 | [[package]] 1047 | name = "rand_chacha" 1048 | version = "0.3.1" 1049 | source = "registry+https://github.com/rust-lang/crates.io-index" 1050 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1051 | dependencies = [ 1052 | "ppv-lite86", 1053 | "rand_core", 1054 | ] 1055 | 1056 | [[package]] 1057 | name = "rand_core" 1058 | version = "0.6.4" 1059 | source = "registry+https://github.com/rust-lang/crates.io-index" 1060 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1061 | dependencies = [ 1062 | "getrandom", 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "redox_syscall" 1067 | version = "0.5.9" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" 1070 | dependencies = [ 1071 | "bitflags", 1072 | ] 1073 | 1074 | [[package]] 1075 | name = "regex-automata" 1076 | version = "0.4.9" 1077 | source = "registry+https://github.com/rust-lang/crates.io-index" 1078 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1079 | dependencies = [ 1080 | "aho-corasick", 1081 | "memchr", 1082 | "regex-syntax", 1083 | ] 1084 | 1085 | [[package]] 1086 | name = "regex-syntax" 1087 | version = "0.8.5" 1088 | source = "registry+https://github.com/rust-lang/crates.io-index" 1089 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1090 | 1091 | [[package]] 1092 | name = "ring" 1093 | version = "0.17.11" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" 1096 | dependencies = [ 1097 | "cc", 1098 | "cfg-if", 1099 | "getrandom", 1100 | "libc", 1101 | "untrusted", 1102 | "windows-sys 0.52.0", 1103 | ] 1104 | 1105 | [[package]] 1106 | name = "rsa" 1107 | version = "0.9.7" 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" 1109 | checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" 1110 | dependencies = [ 1111 | "const-oid", 1112 | "digest", 1113 | "num-bigint-dig", 1114 | "num-integer", 1115 | "num-traits", 1116 | "pkcs1", 1117 | "pkcs8", 1118 | "rand_core", 1119 | "signature", 1120 | "spki", 1121 | "subtle", 1122 | "zeroize", 1123 | ] 1124 | 1125 | [[package]] 1126 | name = "rustls" 1127 | version = "0.23.23" 1128 | source = "registry+https://github.com/rust-lang/crates.io-index" 1129 | checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" 1130 | dependencies = [ 1131 | "once_cell", 1132 | "ring", 1133 | "rustls-pki-types", 1134 | "rustls-webpki", 1135 | "subtle", 1136 | "zeroize", 1137 | ] 1138 | 1139 | [[package]] 1140 | name = "rustls-pki-types" 1141 | version = "1.11.0" 1142 | source = "registry+https://github.com/rust-lang/crates.io-index" 1143 | checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" 1144 | 1145 | [[package]] 1146 | name = "rustls-webpki" 1147 | version = "0.102.8" 1148 | source = "registry+https://github.com/rust-lang/crates.io-index" 1149 | checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" 1150 | dependencies = [ 1151 | "ring", 1152 | "rustls-pki-types", 1153 | "untrusted", 1154 | ] 1155 | 1156 | [[package]] 1157 | name = "ryu" 1158 | version = "1.0.19" 1159 | source = "registry+https://github.com/rust-lang/crates.io-index" 1160 | checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" 1161 | 1162 | [[package]] 1163 | name = "scopeguard" 1164 | version = "1.2.0" 1165 | source = "registry+https://github.com/rust-lang/crates.io-index" 1166 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1167 | 1168 | [[package]] 1169 | name = "serde" 1170 | version = "1.0.218" 1171 | source = "registry+https://github.com/rust-lang/crates.io-index" 1172 | checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" 1173 | dependencies = [ 1174 | "serde_derive", 1175 | ] 1176 | 1177 | [[package]] 1178 | name = "serde_derive" 1179 | version = "1.0.218" 1180 | source = "registry+https://github.com/rust-lang/crates.io-index" 1181 | checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" 1182 | dependencies = [ 1183 | "proc-macro2", 1184 | "quote", 1185 | "syn", 1186 | ] 1187 | 1188 | [[package]] 1189 | name = "serde_json" 1190 | version = "1.0.139" 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" 1192 | checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" 1193 | dependencies = [ 1194 | "itoa", 1195 | "memchr", 1196 | "ryu", 1197 | "serde", 1198 | ] 1199 | 1200 | [[package]] 1201 | name = "serde_urlencoded" 1202 | version = "0.7.1" 1203 | source = "registry+https://github.com/rust-lang/crates.io-index" 1204 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1205 | dependencies = [ 1206 | "form_urlencoded", 1207 | "itoa", 1208 | "ryu", 1209 | "serde", 1210 | ] 1211 | 1212 | [[package]] 1213 | name = "sha1" 1214 | version = "0.10.6" 1215 | source = "registry+https://github.com/rust-lang/crates.io-index" 1216 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1217 | dependencies = [ 1218 | "cfg-if", 1219 | "cpufeatures", 1220 | "digest", 1221 | ] 1222 | 1223 | [[package]] 1224 | name = "sha2" 1225 | version = "0.10.8" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1228 | dependencies = [ 1229 | "cfg-if", 1230 | "cpufeatures", 1231 | "digest", 1232 | ] 1233 | 1234 | [[package]] 1235 | name = "sharded-slab" 1236 | version = "0.1.7" 1237 | source = "registry+https://github.com/rust-lang/crates.io-index" 1238 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1239 | dependencies = [ 1240 | "lazy_static", 1241 | ] 1242 | 1243 | [[package]] 1244 | name = "shlex" 1245 | version = "1.3.0" 1246 | source = "registry+https://github.com/rust-lang/crates.io-index" 1247 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1248 | 1249 | [[package]] 1250 | name = "signature" 1251 | version = "2.2.0" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 1254 | dependencies = [ 1255 | "digest", 1256 | "rand_core", 1257 | ] 1258 | 1259 | [[package]] 1260 | name = "slab" 1261 | version = "0.4.9" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1264 | dependencies = [ 1265 | "autocfg", 1266 | ] 1267 | 1268 | [[package]] 1269 | name = "smallvec" 1270 | version = "1.14.0" 1271 | source = "registry+https://github.com/rust-lang/crates.io-index" 1272 | checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" 1273 | dependencies = [ 1274 | "serde", 1275 | ] 1276 | 1277 | [[package]] 1278 | name = "socket2" 1279 | version = "0.6.0" 1280 | source = "registry+https://github.com/rust-lang/crates.io-index" 1281 | checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 1282 | dependencies = [ 1283 | "libc", 1284 | "windows-sys 0.59.0", 1285 | ] 1286 | 1287 | [[package]] 1288 | name = "spin" 1289 | version = "0.9.8" 1290 | source = "registry+https://github.com/rust-lang/crates.io-index" 1291 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1292 | dependencies = [ 1293 | "lock_api", 1294 | ] 1295 | 1296 | [[package]] 1297 | name = "spki" 1298 | version = "0.7.3" 1299 | source = "registry+https://github.com/rust-lang/crates.io-index" 1300 | checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 1301 | dependencies = [ 1302 | "base64ct", 1303 | "der", 1304 | ] 1305 | 1306 | [[package]] 1307 | name = "sqlx" 1308 | version = "0.8.6" 1309 | source = "registry+https://github.com/rust-lang/crates.io-index" 1310 | checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" 1311 | dependencies = [ 1312 | "sqlx-core", 1313 | "sqlx-macros", 1314 | "sqlx-mysql", 1315 | "sqlx-postgres", 1316 | "sqlx-sqlite", 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "sqlx-core" 1321 | version = "0.8.6" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" 1324 | dependencies = [ 1325 | "base64", 1326 | "bytes", 1327 | "crc", 1328 | "crossbeam-queue", 1329 | "either", 1330 | "event-listener", 1331 | "futures-core", 1332 | "futures-intrusive", 1333 | "futures-io", 1334 | "futures-util", 1335 | "hashbrown", 1336 | "hashlink", 1337 | "indexmap", 1338 | "log", 1339 | "memchr", 1340 | "once_cell", 1341 | "percent-encoding", 1342 | "rustls", 1343 | "serde", 1344 | "serde_json", 1345 | "sha2", 1346 | "smallvec", 1347 | "thiserror", 1348 | "tokio", 1349 | "tokio-stream", 1350 | "tracing", 1351 | "url", 1352 | "webpki-roots", 1353 | ] 1354 | 1355 | [[package]] 1356 | name = "sqlx-macros" 1357 | version = "0.8.6" 1358 | source = "registry+https://github.com/rust-lang/crates.io-index" 1359 | checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" 1360 | dependencies = [ 1361 | "proc-macro2", 1362 | "quote", 1363 | "sqlx-core", 1364 | "sqlx-macros-core", 1365 | "syn", 1366 | ] 1367 | 1368 | [[package]] 1369 | name = "sqlx-macros-core" 1370 | version = "0.8.6" 1371 | source = "registry+https://github.com/rust-lang/crates.io-index" 1372 | checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" 1373 | dependencies = [ 1374 | "dotenvy", 1375 | "either", 1376 | "heck", 1377 | "hex", 1378 | "once_cell", 1379 | "proc-macro2", 1380 | "quote", 1381 | "serde", 1382 | "serde_json", 1383 | "sha2", 1384 | "sqlx-core", 1385 | "sqlx-mysql", 1386 | "sqlx-postgres", 1387 | "sqlx-sqlite", 1388 | "syn", 1389 | "tokio", 1390 | "url", 1391 | ] 1392 | 1393 | [[package]] 1394 | name = "sqlx-mysql" 1395 | version = "0.8.6" 1396 | source = "registry+https://github.com/rust-lang/crates.io-index" 1397 | checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" 1398 | dependencies = [ 1399 | "atoi", 1400 | "base64", 1401 | "bitflags", 1402 | "byteorder", 1403 | "bytes", 1404 | "crc", 1405 | "digest", 1406 | "dotenvy", 1407 | "either", 1408 | "futures-channel", 1409 | "futures-core", 1410 | "futures-io", 1411 | "futures-util", 1412 | "generic-array", 1413 | "hex", 1414 | "hkdf", 1415 | "hmac", 1416 | "itoa", 1417 | "log", 1418 | "md-5", 1419 | "memchr", 1420 | "once_cell", 1421 | "percent-encoding", 1422 | "rand", 1423 | "rsa", 1424 | "serde", 1425 | "sha1", 1426 | "sha2", 1427 | "smallvec", 1428 | "sqlx-core", 1429 | "stringprep", 1430 | "thiserror", 1431 | "tracing", 1432 | "whoami", 1433 | ] 1434 | 1435 | [[package]] 1436 | name = "sqlx-postgres" 1437 | version = "0.8.6" 1438 | source = "registry+https://github.com/rust-lang/crates.io-index" 1439 | checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" 1440 | dependencies = [ 1441 | "atoi", 1442 | "base64", 1443 | "bitflags", 1444 | "byteorder", 1445 | "crc", 1446 | "dotenvy", 1447 | "etcetera", 1448 | "futures-channel", 1449 | "futures-core", 1450 | "futures-util", 1451 | "hex", 1452 | "hkdf", 1453 | "hmac", 1454 | "home", 1455 | "itoa", 1456 | "log", 1457 | "md-5", 1458 | "memchr", 1459 | "once_cell", 1460 | "rand", 1461 | "serde", 1462 | "serde_json", 1463 | "sha2", 1464 | "smallvec", 1465 | "sqlx-core", 1466 | "stringprep", 1467 | "thiserror", 1468 | "tracing", 1469 | "whoami", 1470 | ] 1471 | 1472 | [[package]] 1473 | name = "sqlx-sqlite" 1474 | version = "0.8.6" 1475 | source = "registry+https://github.com/rust-lang/crates.io-index" 1476 | checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" 1477 | dependencies = [ 1478 | "atoi", 1479 | "flume", 1480 | "futures-channel", 1481 | "futures-core", 1482 | "futures-executor", 1483 | "futures-intrusive", 1484 | "futures-util", 1485 | "libsqlite3-sys", 1486 | "log", 1487 | "percent-encoding", 1488 | "serde", 1489 | "serde_urlencoded", 1490 | "sqlx-core", 1491 | "thiserror", 1492 | "tracing", 1493 | "url", 1494 | ] 1495 | 1496 | [[package]] 1497 | name = "stable_deref_trait" 1498 | version = "1.2.0" 1499 | source = "registry+https://github.com/rust-lang/crates.io-index" 1500 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1501 | 1502 | [[package]] 1503 | name = "stringprep" 1504 | version = "0.1.5" 1505 | source = "registry+https://github.com/rust-lang/crates.io-index" 1506 | checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 1507 | dependencies = [ 1508 | "unicode-bidi", 1509 | "unicode-normalization", 1510 | "unicode-properties", 1511 | ] 1512 | 1513 | [[package]] 1514 | name = "strsim" 1515 | version = "0.11.1" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1518 | 1519 | [[package]] 1520 | name = "subtle" 1521 | version = "2.6.1" 1522 | source = "registry+https://github.com/rust-lang/crates.io-index" 1523 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1524 | 1525 | [[package]] 1526 | name = "syn" 1527 | version = "2.0.98" 1528 | source = "registry+https://github.com/rust-lang/crates.io-index" 1529 | checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" 1530 | dependencies = [ 1531 | "proc-macro2", 1532 | "quote", 1533 | "unicode-ident", 1534 | ] 1535 | 1536 | [[package]] 1537 | name = "synstructure" 1538 | version = "0.13.1" 1539 | source = "registry+https://github.com/rust-lang/crates.io-index" 1540 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1541 | dependencies = [ 1542 | "proc-macro2", 1543 | "quote", 1544 | "syn", 1545 | ] 1546 | 1547 | [[package]] 1548 | name = "thiserror" 1549 | version = "2.0.11" 1550 | source = "registry+https://github.com/rust-lang/crates.io-index" 1551 | checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" 1552 | dependencies = [ 1553 | "thiserror-impl", 1554 | ] 1555 | 1556 | [[package]] 1557 | name = "thiserror-impl" 1558 | version = "2.0.11" 1559 | source = "registry+https://github.com/rust-lang/crates.io-index" 1560 | checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" 1561 | dependencies = [ 1562 | "proc-macro2", 1563 | "quote", 1564 | "syn", 1565 | ] 1566 | 1567 | [[package]] 1568 | name = "thread_local" 1569 | version = "1.1.8" 1570 | source = "registry+https://github.com/rust-lang/crates.io-index" 1571 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 1572 | dependencies = [ 1573 | "cfg-if", 1574 | "once_cell", 1575 | ] 1576 | 1577 | [[package]] 1578 | name = "tinystr" 1579 | version = "0.7.6" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 1582 | dependencies = [ 1583 | "displaydoc", 1584 | "zerovec", 1585 | ] 1586 | 1587 | [[package]] 1588 | name = "tinyvec" 1589 | version = "1.8.1" 1590 | source = "registry+https://github.com/rust-lang/crates.io-index" 1591 | checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" 1592 | dependencies = [ 1593 | "tinyvec_macros", 1594 | ] 1595 | 1596 | [[package]] 1597 | name = "tinyvec_macros" 1598 | version = "0.1.1" 1599 | source = "registry+https://github.com/rust-lang/crates.io-index" 1600 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1601 | 1602 | [[package]] 1603 | name = "tokio" 1604 | version = "1.48.0" 1605 | source = "registry+https://github.com/rust-lang/crates.io-index" 1606 | checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" 1607 | dependencies = [ 1608 | "bytes", 1609 | "libc", 1610 | "mio", 1611 | "parking_lot", 1612 | "pin-project-lite", 1613 | "socket2", 1614 | "tokio-macros", 1615 | "windows-sys 0.61.2", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "tokio-macros" 1620 | version = "2.6.0" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 1623 | dependencies = [ 1624 | "proc-macro2", 1625 | "quote", 1626 | "syn", 1627 | ] 1628 | 1629 | [[package]] 1630 | name = "tokio-stream" 1631 | version = "0.1.17" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 1634 | dependencies = [ 1635 | "futures-core", 1636 | "pin-project-lite", 1637 | "tokio", 1638 | ] 1639 | 1640 | [[package]] 1641 | name = "tokio-util" 1642 | version = "0.7.13" 1643 | source = "registry+https://github.com/rust-lang/crates.io-index" 1644 | checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" 1645 | dependencies = [ 1646 | "bytes", 1647 | "futures-core", 1648 | "futures-sink", 1649 | "pin-project-lite", 1650 | "tokio", 1651 | ] 1652 | 1653 | [[package]] 1654 | name = "tracing" 1655 | version = "0.1.43" 1656 | source = "registry+https://github.com/rust-lang/crates.io-index" 1657 | checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" 1658 | dependencies = [ 1659 | "log", 1660 | "pin-project-lite", 1661 | "tracing-attributes", 1662 | "tracing-core", 1663 | ] 1664 | 1665 | [[package]] 1666 | name = "tracing-attributes" 1667 | version = "0.1.31" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" 1670 | dependencies = [ 1671 | "proc-macro2", 1672 | "quote", 1673 | "syn", 1674 | ] 1675 | 1676 | [[package]] 1677 | name = "tracing-core" 1678 | version = "0.1.35" 1679 | source = "registry+https://github.com/rust-lang/crates.io-index" 1680 | checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" 1681 | dependencies = [ 1682 | "once_cell", 1683 | "valuable", 1684 | ] 1685 | 1686 | [[package]] 1687 | name = "tracing-log" 1688 | version = "0.2.0" 1689 | source = "registry+https://github.com/rust-lang/crates.io-index" 1690 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 1691 | dependencies = [ 1692 | "log", 1693 | "once_cell", 1694 | "tracing-core", 1695 | ] 1696 | 1697 | [[package]] 1698 | name = "tracing-subscriber" 1699 | version = "0.3.22" 1700 | source = "registry+https://github.com/rust-lang/crates.io-index" 1701 | checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" 1702 | dependencies = [ 1703 | "matchers", 1704 | "nu-ansi-term", 1705 | "once_cell", 1706 | "parking_lot", 1707 | "regex-automata", 1708 | "sharded-slab", 1709 | "smallvec", 1710 | "thread_local", 1711 | "tracing", 1712 | "tracing-core", 1713 | "tracing-log", 1714 | ] 1715 | 1716 | [[package]] 1717 | name = "typenum" 1718 | version = "1.18.0" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 1721 | 1722 | [[package]] 1723 | name = "unicode-bidi" 1724 | version = "0.3.18" 1725 | source = "registry+https://github.com/rust-lang/crates.io-index" 1726 | checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 1727 | 1728 | [[package]] 1729 | name = "unicode-ident" 1730 | version = "1.0.17" 1731 | source = "registry+https://github.com/rust-lang/crates.io-index" 1732 | checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" 1733 | 1734 | [[package]] 1735 | name = "unicode-normalization" 1736 | version = "0.1.24" 1737 | source = "registry+https://github.com/rust-lang/crates.io-index" 1738 | checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 1739 | dependencies = [ 1740 | "tinyvec", 1741 | ] 1742 | 1743 | [[package]] 1744 | name = "unicode-properties" 1745 | version = "0.1.3" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 1748 | 1749 | [[package]] 1750 | name = "untrusted" 1751 | version = "0.9.0" 1752 | source = "registry+https://github.com/rust-lang/crates.io-index" 1753 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1754 | 1755 | [[package]] 1756 | name = "url" 1757 | version = "2.5.4" 1758 | source = "registry+https://github.com/rust-lang/crates.io-index" 1759 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 1760 | dependencies = [ 1761 | "form_urlencoded", 1762 | "idna", 1763 | "percent-encoding", 1764 | ] 1765 | 1766 | [[package]] 1767 | name = "utf16_iter" 1768 | version = "1.0.5" 1769 | source = "registry+https://github.com/rust-lang/crates.io-index" 1770 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 1771 | 1772 | [[package]] 1773 | name = "utf8_iter" 1774 | version = "1.0.4" 1775 | source = "registry+https://github.com/rust-lang/crates.io-index" 1776 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1777 | 1778 | [[package]] 1779 | name = "utf8parse" 1780 | version = "0.2.2" 1781 | source = "registry+https://github.com/rust-lang/crates.io-index" 1782 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1783 | 1784 | [[package]] 1785 | name = "valuable" 1786 | version = "0.1.1" 1787 | source = "registry+https://github.com/rust-lang/crates.io-index" 1788 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 1789 | 1790 | [[package]] 1791 | name = "vcpkg" 1792 | version = "0.2.15" 1793 | source = "registry+https://github.com/rust-lang/crates.io-index" 1794 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1795 | 1796 | [[package]] 1797 | name = "version_check" 1798 | version = "0.9.5" 1799 | source = "registry+https://github.com/rust-lang/crates.io-index" 1800 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1801 | 1802 | [[package]] 1803 | name = "vwmetrics" 1804 | version = "0.1.1" 1805 | dependencies = [ 1806 | "anyhow", 1807 | "clap", 1808 | "http-body-util", 1809 | "hyper", 1810 | "once_cell", 1811 | "pin-project-lite", 1812 | "sqlx", 1813 | "tokio", 1814 | "tracing", 1815 | "tracing-subscriber", 1816 | ] 1817 | 1818 | [[package]] 1819 | name = "wasi" 1820 | version = "0.11.0+wasi-snapshot-preview1" 1821 | source = "registry+https://github.com/rust-lang/crates.io-index" 1822 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1823 | 1824 | [[package]] 1825 | name = "wasite" 1826 | version = "0.1.0" 1827 | source = "registry+https://github.com/rust-lang/crates.io-index" 1828 | checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" 1829 | 1830 | [[package]] 1831 | name = "webpki-roots" 1832 | version = "0.26.8" 1833 | source = "registry+https://github.com/rust-lang/crates.io-index" 1834 | checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" 1835 | dependencies = [ 1836 | "rustls-pki-types", 1837 | ] 1838 | 1839 | [[package]] 1840 | name = "whoami" 1841 | version = "1.5.2" 1842 | source = "registry+https://github.com/rust-lang/crates.io-index" 1843 | checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" 1844 | dependencies = [ 1845 | "redox_syscall", 1846 | "wasite", 1847 | ] 1848 | 1849 | [[package]] 1850 | name = "windows-link" 1851 | version = "0.2.1" 1852 | source = "registry+https://github.com/rust-lang/crates.io-index" 1853 | checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 1854 | 1855 | [[package]] 1856 | name = "windows-sys" 1857 | version = "0.48.0" 1858 | source = "registry+https://github.com/rust-lang/crates.io-index" 1859 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1860 | dependencies = [ 1861 | "windows-targets 0.48.5", 1862 | ] 1863 | 1864 | [[package]] 1865 | name = "windows-sys" 1866 | version = "0.52.0" 1867 | source = "registry+https://github.com/rust-lang/crates.io-index" 1868 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1869 | dependencies = [ 1870 | "windows-targets 0.52.6", 1871 | ] 1872 | 1873 | [[package]] 1874 | name = "windows-sys" 1875 | version = "0.59.0" 1876 | source = "registry+https://github.com/rust-lang/crates.io-index" 1877 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1878 | dependencies = [ 1879 | "windows-targets 0.52.6", 1880 | ] 1881 | 1882 | [[package]] 1883 | name = "windows-sys" 1884 | version = "0.61.2" 1885 | source = "registry+https://github.com/rust-lang/crates.io-index" 1886 | checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 1887 | dependencies = [ 1888 | "windows-link", 1889 | ] 1890 | 1891 | [[package]] 1892 | name = "windows-targets" 1893 | version = "0.48.5" 1894 | source = "registry+https://github.com/rust-lang/crates.io-index" 1895 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1896 | dependencies = [ 1897 | "windows_aarch64_gnullvm 0.48.5", 1898 | "windows_aarch64_msvc 0.48.5", 1899 | "windows_i686_gnu 0.48.5", 1900 | "windows_i686_msvc 0.48.5", 1901 | "windows_x86_64_gnu 0.48.5", 1902 | "windows_x86_64_gnullvm 0.48.5", 1903 | "windows_x86_64_msvc 0.48.5", 1904 | ] 1905 | 1906 | [[package]] 1907 | name = "windows-targets" 1908 | version = "0.52.6" 1909 | source = "registry+https://github.com/rust-lang/crates.io-index" 1910 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1911 | dependencies = [ 1912 | "windows_aarch64_gnullvm 0.52.6", 1913 | "windows_aarch64_msvc 0.52.6", 1914 | "windows_i686_gnu 0.52.6", 1915 | "windows_i686_gnullvm", 1916 | "windows_i686_msvc 0.52.6", 1917 | "windows_x86_64_gnu 0.52.6", 1918 | "windows_x86_64_gnullvm 0.52.6", 1919 | "windows_x86_64_msvc 0.52.6", 1920 | ] 1921 | 1922 | [[package]] 1923 | name = "windows_aarch64_gnullvm" 1924 | version = "0.48.5" 1925 | source = "registry+https://github.com/rust-lang/crates.io-index" 1926 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1927 | 1928 | [[package]] 1929 | name = "windows_aarch64_gnullvm" 1930 | version = "0.52.6" 1931 | source = "registry+https://github.com/rust-lang/crates.io-index" 1932 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1933 | 1934 | [[package]] 1935 | name = "windows_aarch64_msvc" 1936 | version = "0.48.5" 1937 | source = "registry+https://github.com/rust-lang/crates.io-index" 1938 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1939 | 1940 | [[package]] 1941 | name = "windows_aarch64_msvc" 1942 | version = "0.52.6" 1943 | source = "registry+https://github.com/rust-lang/crates.io-index" 1944 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1945 | 1946 | [[package]] 1947 | name = "windows_i686_gnu" 1948 | version = "0.48.5" 1949 | source = "registry+https://github.com/rust-lang/crates.io-index" 1950 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 1951 | 1952 | [[package]] 1953 | name = "windows_i686_gnu" 1954 | version = "0.52.6" 1955 | source = "registry+https://github.com/rust-lang/crates.io-index" 1956 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1957 | 1958 | [[package]] 1959 | name = "windows_i686_gnullvm" 1960 | version = "0.52.6" 1961 | source = "registry+https://github.com/rust-lang/crates.io-index" 1962 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1963 | 1964 | [[package]] 1965 | name = "windows_i686_msvc" 1966 | version = "0.48.5" 1967 | source = "registry+https://github.com/rust-lang/crates.io-index" 1968 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 1969 | 1970 | [[package]] 1971 | name = "windows_i686_msvc" 1972 | version = "0.52.6" 1973 | source = "registry+https://github.com/rust-lang/crates.io-index" 1974 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1975 | 1976 | [[package]] 1977 | name = "windows_x86_64_gnu" 1978 | version = "0.48.5" 1979 | source = "registry+https://github.com/rust-lang/crates.io-index" 1980 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 1981 | 1982 | [[package]] 1983 | name = "windows_x86_64_gnu" 1984 | version = "0.52.6" 1985 | source = "registry+https://github.com/rust-lang/crates.io-index" 1986 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1987 | 1988 | [[package]] 1989 | name = "windows_x86_64_gnullvm" 1990 | version = "0.48.5" 1991 | source = "registry+https://github.com/rust-lang/crates.io-index" 1992 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 1993 | 1994 | [[package]] 1995 | name = "windows_x86_64_gnullvm" 1996 | version = "0.52.6" 1997 | source = "registry+https://github.com/rust-lang/crates.io-index" 1998 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1999 | 2000 | [[package]] 2001 | name = "windows_x86_64_msvc" 2002 | version = "0.48.5" 2003 | source = "registry+https://github.com/rust-lang/crates.io-index" 2004 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2005 | 2006 | [[package]] 2007 | name = "windows_x86_64_msvc" 2008 | version = "0.52.6" 2009 | source = "registry+https://github.com/rust-lang/crates.io-index" 2010 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2011 | 2012 | [[package]] 2013 | name = "write16" 2014 | version = "1.0.0" 2015 | source = "registry+https://github.com/rust-lang/crates.io-index" 2016 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 2017 | 2018 | [[package]] 2019 | name = "writeable" 2020 | version = "0.5.5" 2021 | source = "registry+https://github.com/rust-lang/crates.io-index" 2022 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 2023 | 2024 | [[package]] 2025 | name = "yoke" 2026 | version = "0.7.5" 2027 | source = "registry+https://github.com/rust-lang/crates.io-index" 2028 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 2029 | dependencies = [ 2030 | "serde", 2031 | "stable_deref_trait", 2032 | "yoke-derive", 2033 | "zerofrom", 2034 | ] 2035 | 2036 | [[package]] 2037 | name = "yoke-derive" 2038 | version = "0.7.5" 2039 | source = "registry+https://github.com/rust-lang/crates.io-index" 2040 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 2041 | dependencies = [ 2042 | "proc-macro2", 2043 | "quote", 2044 | "syn", 2045 | "synstructure", 2046 | ] 2047 | 2048 | [[package]] 2049 | name = "zerocopy" 2050 | version = "0.7.35" 2051 | source = "registry+https://github.com/rust-lang/crates.io-index" 2052 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2053 | dependencies = [ 2054 | "byteorder", 2055 | "zerocopy-derive", 2056 | ] 2057 | 2058 | [[package]] 2059 | name = "zerocopy-derive" 2060 | version = "0.7.35" 2061 | source = "registry+https://github.com/rust-lang/crates.io-index" 2062 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2063 | dependencies = [ 2064 | "proc-macro2", 2065 | "quote", 2066 | "syn", 2067 | ] 2068 | 2069 | [[package]] 2070 | name = "zerofrom" 2071 | version = "0.1.6" 2072 | source = "registry+https://github.com/rust-lang/crates.io-index" 2073 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2074 | dependencies = [ 2075 | "zerofrom-derive", 2076 | ] 2077 | 2078 | [[package]] 2079 | name = "zerofrom-derive" 2080 | version = "0.1.6" 2081 | source = "registry+https://github.com/rust-lang/crates.io-index" 2082 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2083 | dependencies = [ 2084 | "proc-macro2", 2085 | "quote", 2086 | "syn", 2087 | "synstructure", 2088 | ] 2089 | 2090 | [[package]] 2091 | name = "zeroize" 2092 | version = "1.8.1" 2093 | source = "registry+https://github.com/rust-lang/crates.io-index" 2094 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2095 | 2096 | [[package]] 2097 | name = "zerovec" 2098 | version = "0.10.4" 2099 | source = "registry+https://github.com/rust-lang/crates.io-index" 2100 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 2101 | dependencies = [ 2102 | "yoke", 2103 | "zerofrom", 2104 | "zerovec-derive", 2105 | ] 2106 | 2107 | [[package]] 2108 | name = "zerovec-derive" 2109 | version = "0.10.3" 2110 | source = "registry+https://github.com/rust-lang/crates.io-index" 2111 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 2112 | dependencies = [ 2113 | "proc-macro2", 2114 | "quote", 2115 | "syn", 2116 | ] 2117 | --------------------------------------------------------------------------------