From a03f223765bd3a2c2063cc40516ff131b5d0d2f6 Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Tue, 3 Feb 2026 11:22:45 -0500 Subject: [PATCH 1/5] readme --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b43edfa..06e9e1f 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,14 @@ [![Pipeline Tests](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/pipeline-tests.yml/badge.svg?branch=stable)](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/pipeline-tests.yml) [![Docker Tests](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/docker-tests.yml/badge.svg?branch=stable)](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/docker-tests.yml) -### UPDATE 01-2026: Now supports REST API! +> [!TIP] +> **UPDATE 01-2026:** Now supports REST API! -### UPDATE 12-2025: Now supports government agencies (DoD, FBI, UK MoD, RU FSO)! +> [!NOTE] +> **UPDATE 12-2025:** Now supports government agencies (DoD, FBI, UK MoD, RU FSO)! -### UPDATE 12-2025: Now rewritten in Rust! +> [!IMPORTANT] +> **UPDATE 12-2025:** Now rewritten in Rust! CloudCheck is a simple Rust tool to check whether an IP address or hostname belongs to a cloud provider. It includes: From b13be64de83600e01282a1cff9694b8c75705e72 Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Tue, 3 Feb 2026 11:32:09 -0500 Subject: [PATCH 2/5] daily signature update --- .github/workflows/daily-update.yml | 68 ++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 .github/workflows/daily-update.yml diff --git a/.github/workflows/daily-update.yml b/.github/workflows/daily-update.yml new file mode 100644 index 0000000..d7e0c38 --- /dev/null +++ b/.github/workflows/daily-update.yml @@ -0,0 +1,68 @@ +name: Daily Signature Update + +on: + schedule: + # Run daily at 6:00 UTC + - cron: '0 6 * * *' + workflow_dispatch: # Allow manual trigger + +# Prevent concurrent runs from racing to commit/merge +# cancel-in-progress: false means new runs wait instead of canceling in-progress ones +concurrency: + group: daily-update + cancel-in-progress: false + +jobs: + update: + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout dev branch + uses: actions/checkout@v6 + with: + ref: dev + fetch-depth: 0 # Fetch all history for merge + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.12" + + - name: Set up uv + uses: astral-sh/setup-uv@v7 + + - name: Install dependencies + run: uv sync + + - name: Update signatures + run: uv run python -m cloudcheck_update.cli + + - name: Update README table + run: uv run python scripts/update_readme_table.py + + - name: Check for changes + id: changes + run: | + if git diff --quiet; then + echo "has_changes=false" >> $GITHUB_OUTPUT + else + echo "has_changes=true" >> $GITHUB_OUTPUT + fi + + - name: Commit changes to dev + if: steps.changes.outputs.has_changes == 'true' + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add cloud_providers_v2.json README.md + git commit -m "chore: daily signature update $(date -u +%Y-%m-%d)" + git push origin dev + + - name: Merge dev into stable + if: steps.changes.outputs.has_changes == 'true' + run: | + git checkout stable + git merge dev --no-edit -m "chore: merge daily update from dev" + git push origin stable From efcd00e64d25c162849f5bdf559cd0b3094cfb8c Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Tue, 3 Feb 2026 11:44:49 -0500 Subject: [PATCH 3/5] daily workflows --- .github/workflows/daily-update.yml | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/.github/workflows/daily-update.yml b/.github/workflows/daily-update.yml index d7e0c38..00fd34e 100644 --- a/.github/workflows/daily-update.yml +++ b/.github/workflows/daily-update.yml @@ -19,11 +19,14 @@ jobs: contents: write steps: - - name: Checkout dev branch + - name: Checkout stable branch uses: actions/checkout@v6 with: - ref: dev - fetch-depth: 0 # Fetch all history for merge + ref: stable + + - name: Create temporary update branch + run: | + git checkout -b update/daily-$(date -u +%Y-%m-%d) - name: Set up Python uses: actions/setup-python@v6 @@ -51,18 +54,16 @@ jobs: echo "has_changes=true" >> $GITHUB_OUTPUT fi - - name: Commit changes to dev + - name: Commit and merge changes if: steps.changes.outputs.has_changes == 'true' run: | + BRANCH="update/daily-$(date -u +%Y-%m-%d)" git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git add cloud_providers_v2.json README.md git commit -m "chore: daily signature update $(date -u +%Y-%m-%d)" - git push origin dev - - - name: Merge dev into stable - if: steps.changes.outputs.has_changes == 'true' - run: | + git push origin "$BRANCH" git checkout stable - git merge dev --no-edit -m "chore: merge daily update from dev" + git merge "$BRANCH" --no-edit -m "chore: merge daily signature update" git push origin stable + git push origin --delete "$BRANCH" From e98d9156778e814619d1b12f1d8fb00bd8ded820 Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Tue, 3 Feb 2026 11:50:11 -0500 Subject: [PATCH 4/5] api key --- .github/workflows/daily-update.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/daily-update.yml b/.github/workflows/daily-update.yml index 00fd34e..85ab5bb 100644 --- a/.github/workflows/daily-update.yml +++ b/.github/workflows/daily-update.yml @@ -40,6 +40,8 @@ jobs: run: uv sync - name: Update signatures + env: + BBOT_IO_API_KEY: ${{ secrets.BBOT_IO_API_KEY }} run: uv run python -m cloudcheck_update.cli - name: Update README table From fe2d45bdb2ac2ce39e5368fa1b908d3025a3d30a Mon Sep 17 00:00:00 2001 From: TheTechromancer Date: Tue, 3 Feb 2026 12:01:05 -0500 Subject: [PATCH 5/5] bump version --- Cargo.lock | 72 ++++++++++++++++++++++++-------------------------- Cargo.toml | 2 +- README.md | 3 ++- pyproject.toml | 2 +- uv.lock | 2 +- 5 files changed, 40 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f84e27c..c7bc914 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -169,15 +169,15 @@ checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" -version = "1.2.54" +version = "1.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583" +checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" dependencies = [ "find-msvc-tools", "shlex", @@ -191,9 +191,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "clap" -version = "4.5.54" +version = "4.5.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" +checksum = "6899ea499e3fb9305a65d5ebf6e3d2248c5fab291f300ad0a704fbe142eae31a" dependencies = [ "clap_builder", "clap_derive", @@ -201,9 +201,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.54" +version = "4.5.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" +checksum = "7b12c8b680195a62a8364d16b8447b01b6c2c8f9aaf68bee653be34d4245e238" dependencies = [ "anstream", "anstyle", @@ -213,9 +213,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" dependencies = [ "heck", "proc-macro2", @@ -231,7 +231,7 @@ checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" [[package]] name = "cloudcheck" -version = "9.2.0" +version = "9.3.0" dependencies = [ "axum", "clap", @@ -378,17 +378,16 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "find-msvc-tools" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "flate2" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ - "crc32fast", "miniz_oxide", "zlib-rs", ] @@ -678,14 +677,13 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ "base64", "bytes", "futures-channel", - "futures-core", "futures-util", "http", "http-body", @@ -1039,9 +1037,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "300.5.4+3.5.4" +version = "300.5.5+3.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507b3792995dae9b0df8a1c1e3771e8418b7c2d9f0baeba32e6fe8b06c7cb72" +checksum = "3f1787d533e03597a7934fd0a765f0d28e94ecc5fb7789f8053b1e699a56f709" dependencies = [ "cc", ] @@ -1108,15 +1106,15 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "portable-atomic" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" dependencies = [ "portable-atomic", ] @@ -1250,9 +1248,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -1262,9 +1260,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -1273,9 +1271,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" [[package]] name = "reqwest" @@ -1574,9 +1572,9 @@ checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" @@ -2298,15 +2296,15 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.5.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3" +checksum = "a7948af682ccbc3342b6e9420e8c51c1fe5d7bf7756002b4a3c6cabfe96a7e3c" [[package]] name = "zmij" -version = "1.0.17" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02aae0f83f69aafc94776e879363e9771d7ecbffe2c7fbb6c14c5e00dfe88439" +checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445" [[package]] name = "zopfli" diff --git a/Cargo.toml b/Cargo.toml index 9b7e475..3e404ef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cloudcheck" -version = "9.2.0" +version = "9.3.0" edition = "2024" description = "CloudCheck is a simple Rust tool to check whether an IP address or hostname belongs to a cloud provider." license = "GPL-3.0" diff --git a/README.md b/README.md index 06e9e1f..394bf75 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ [![Python Tests](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/python-tests.yml/badge.svg?branch=stable)](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/python-tests.yml) [![Pipeline Tests](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/pipeline-tests.yml/badge.svg?branch=stable)](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/pipeline-tests.yml) [![Docker Tests](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/docker-tests.yml/badge.svg?branch=stable)](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/docker-tests.yml) +[![Daily Update](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/daily-update.yml/badge.svg?branch=stable)](https://github.com/blacklanternsecurity/cloudcheck/actions/workflows/daily-update.yml) > [!TIP] > **UPDATE 01-2026:** Now supports REST API! @@ -28,7 +29,7 @@ CloudCheck is a simple Rust tool to check whether an IP address or hostname belo ## Cloud Provider Signatures -The latest cloud provider signatures are available in [`cloud_providers_v2.json`](https://github.com/blacklanternsecurity/cloudcheck/blob/master/cloud_providers_v2.json), which is updated daily via CI/CD. Domains associated with each cloud provider are fetched dynamically from the [v2fly community repository](https://github.com/v2fly/domain-list-community), and CIDRs are fetched from [ASNDB](https://asndb.api.bbot.io/). +The latest cloud provider signatures are available in [`cloud_providers_v2.json`](https://github.com/blacklanternsecurity/cloudcheck/blob/master/cloud_providers_v2.json), which is updated daily via [CI/CD](.github/workflows/daily-update.yml). Domains associated with each cloud provider are fetched dynamically from the [v2fly community repository](https://github.com/v2fly/domain-list-community), and CIDRs are fetched from [ASNDB](https://asndb.api.bbot.io/). Used by [BBOT](https://github.com/blacklanternsecurity/bbot) and [BBOT Server](https://github.com/blacklanternsecurity/bbot-server). diff --git a/pyproject.toml b/pyproject.toml index a5e18f7..f32c999 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "cloudcheck" -version = "9.2.0" +version = "9.3.0" description = "Detailed database of cloud providers. Instantly look up a domain or IP address" readme = "README.md" requires-python = ">=3.9" diff --git a/uv.lock b/uv.lock index 433f538..beccc16 100644 --- a/uv.lock +++ b/uv.lock @@ -49,7 +49,7 @@ wheels = [ [[package]] name = "cloudcheck" -version = "9.2.0" +version = "9.3.0" source = { editable = "." } [package.dev-dependencies]