diff --git a/.woodpecker.yml b/.woodpecker.yml index 51b543c..f5a125f 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -6,11 +6,14 @@ when: steps: - name: fmt - image: rust:1.94-bookworm + image: rust:1.95-bookworm environment: GIT_AUTH_TOKEN: from_secret: git_auth_token + RUSTC_WRAPPER: sccache + SCCACHE_REDIS: "redis://100.92.54.45:6380" commands: + - curl -sSfL "https://github.com/mozilla/sccache/releases/download/v0.8.2/sccache-v0.8.2-x86_64-unknown-linux-musl.tar.gz" | tar -xz -C /tmp && mv /tmp/sccache-v0.8.2-x86_64-unknown-linux-musl/sccache /usr/local/bin/sccache - git config --global url."http://x-access-token:$GIT_AUTH_TOKEN@100.92.54.45:3002/".insteadOf "http://100.92.54.45:3002/" - printf '[registries.forgejo]\nindex = "sparse+https://repo.indexarr.net/api/packages/indexarr/cargo/"\ncredential-provider = "cargo:token"\n\n[registry]\ndefault = "forgejo"\n' > $CARGO_HOME/config.toml - printf '[registries.forgejo]\ntoken = "Bearer %s"\n' "$GIT_AUTH_TOKEN" > $CARGO_HOME/credentials.toml @@ -18,33 +21,42 @@ steps: - cargo fmt --all -- --check - name: check - image: rust:1.94-bookworm + image: rust:1.95-bookworm environment: GIT_AUTH_TOKEN: from_secret: git_auth_token + RUSTC_WRAPPER: sccache + SCCACHE_REDIS: "redis://100.92.54.45:6380" commands: + - curl -sSfL "https://github.com/mozilla/sccache/releases/download/v0.8.2/sccache-v0.8.2-x86_64-unknown-linux-musl.tar.gz" | tar -xz -C /tmp && mv /tmp/sccache-v0.8.2-x86_64-unknown-linux-musl/sccache /usr/local/bin/sccache - git config --global url."http://x-access-token:$GIT_AUTH_TOKEN@100.92.54.45:3002/".insteadOf "http://100.92.54.45:3002/" - printf '[registries.forgejo]\nindex = "sparse+https://repo.indexarr.net/api/packages/indexarr/cargo/"\ncredential-provider = "cargo:token"\n\n[registry]\ndefault = "forgejo"\n' > $CARGO_HOME/config.toml - printf '[registries.forgejo]\ntoken = "Bearer %s"\n' "$GIT_AUTH_TOKEN" > $CARGO_HOME/credentials.toml - cargo check --workspace - name: test - image: rust:1.94-bookworm + image: rust:1.95-bookworm environment: GIT_AUTH_TOKEN: from_secret: git_auth_token + RUSTC_WRAPPER: sccache + SCCACHE_REDIS: "redis://100.92.54.45:6380" commands: + - curl -sSfL "https://github.com/mozilla/sccache/releases/download/v0.8.2/sccache-v0.8.2-x86_64-unknown-linux-musl.tar.gz" | tar -xz -C /tmp && mv /tmp/sccache-v0.8.2-x86_64-unknown-linux-musl/sccache /usr/local/bin/sccache - git config --global url."http://x-access-token:$GIT_AUTH_TOKEN@100.92.54.45:3002/".insteadOf "http://100.92.54.45:3002/" - printf '[registries.forgejo]\nindex = "sparse+https://repo.indexarr.net/api/packages/indexarr/cargo/"\ncredential-provider = "cargo:token"\n\n[registry]\ndefault = "forgejo"\n' > $CARGO_HOME/config.toml - printf '[registries.forgejo]\ntoken = "Bearer %s"\n' "$GIT_AUTH_TOKEN" > $CARGO_HOME/credentials.toml - cargo test --workspace - name: clippy - image: rust:1.94-bookworm + image: rust:1.95-bookworm environment: GIT_AUTH_TOKEN: from_secret: git_auth_token + RUSTC_WRAPPER: sccache + SCCACHE_REDIS: "redis://100.92.54.45:6380" commands: + - curl -sSfL "https://github.com/mozilla/sccache/releases/download/v0.8.2/sccache-v0.8.2-x86_64-unknown-linux-musl.tar.gz" | tar -xz -C /tmp && mv /tmp/sccache-v0.8.2-x86_64-unknown-linux-musl/sccache /usr/local/bin/sccache - git config --global url."http://x-access-token:$GIT_AUTH_TOKEN@100.92.54.45:3002/".insteadOf "http://100.92.54.45:3002/" - printf '[registries.forgejo]\nindex = "sparse+https://repo.indexarr.net/api/packages/indexarr/cargo/"\ncredential-provider = "cargo:token"\n\n[registry]\ndefault = "forgejo"\n' > $CARGO_HOME/config.toml - printf '[registries.forgejo]\ntoken = "Bearer %s"\n' "$GIT_AUTH_TOKEN" > $CARGO_HOME/credentials.toml @@ -52,7 +64,7 @@ steps: - cargo clippy --workspace -- -D warnings - name: publish - image: rust:1.94-bookworm + image: rust:1.95-bookworm environment: GIT_AUTH_TOKEN: from_secret: git_auth_token @@ -64,22 +76,6 @@ steps: - event: push branch: main - - name: trigger-renovate - image: alpine/curl - environment: - WOODPECKER_TOKEN: - from_secret: woodpecker_token - commands: - - | - curl -sf -X POST \ - "https://ci.indexarr.net/api/repos/indexarr/renovate/pipelines" \ - -H "Authorization: Bearer $WOODPECKER_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{"branch":"main"}' - when: - - event: push - branch: main - - name: discord-success image: alpine/curl environment: @@ -89,7 +85,7 @@ steps: - | curl -s -X POST "$DISCORD_WEBHOOK_URL" \ -H "Content-Type: application/json" \ - -d "{\"embeds\":[{\"title\":\"librtbit-dht published\",\"description\":\"Published to Forgejo registry. Renovate scan triggered.\",\"color\":3066993}]}" + -d "{\"embeds\":[{\"title\":\"librtbit-dht published\",\"description\":\"Published to Forgejo registry.\",\"color\":3066993}]}" when: - event: push branch: main diff --git a/Cargo.lock b/Cargo.lock index e44ed1f..525777b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -779,7 +779,7 @@ dependencies = [ [[package]] name = "librtbit-dht" -version = "0.1.1" +version = "0.1.4" dependencies = [ "anyhow", "aws-lc-rs", diff --git a/Cargo.toml b/Cargo.toml index 0771645..80533da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "librtbit-dht" -version = "0.1.1" +version = "0.1.4" edition = "2024" description = "Kademlia DHT implementation for the rtbit BitTorrent client" license = "MIT" @@ -26,7 +26,7 @@ sha1w = { git = "https://github.com/TheDancingDeveloper-org/librtbit-sha1-wrappe anyhow = "1" parking_lot = "0.12" tracing = "0.1" -backon = { version = "1.5", features = ["tokio-sleep"] } +backon = { version = "1.6", features = ["tokio-sleep"] } futures = "0.3" rand = "0.10" indexmap = "2" @@ -36,7 +36,7 @@ tokio-util = "0.7" bytes = "1" librqbit-dualstack-sockets = "0.7" thiserror = "2" -aws-lc-rs = "1.12" +aws-lc-rs = "1.17" [dev-dependencies] tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] } diff --git a/src/dht.rs b/src/dht.rs index d92d265..4c50ea0 100644 --- a/src/dht.rs +++ b/src/dht.rs @@ -1446,6 +1446,11 @@ impl DhtState { self.listen_addr } + /// Ping a node learned from a BEP 5 peer-wire PORT message. + pub async fn ping(&self, addr: SocketAddr) -> crate::Result<()> { + self.request(Request::Ping, addr).await.map(|_| ()) + } + pub fn stats(&self) -> DhtStats { self.get_stats() } diff --git a/src/lib.rs b/src/lib.rs index cd42a86..261fcd4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,6 +18,11 @@ pub use crate::dht::{DhtConfig, DhtState, RequestPeersStream}; pub use librtbit_core::hash_id::Id20; pub use persistence::{PersistentDht, PersistentDhtConfig}; +/// Parse a bencoded DHT packet. Exposed for parser hardening and fuzzing. +pub fn deserialize_message(buf: &[u8]) -> anyhow::Result<()> { + bprotocol::deserialize_message::>(buf).map(|_| ()) +} + pub type Dht = Arc; // How long do we wait for a response from a DHT node.