Skip to main content

High-performance network discovery and subnet analysis suite with native Rust speed.

Project description

⚡ NetPulse

Python Version Rust FastAPI License Build and Publish Wheels

NetPulse is a high-performance, modern network discovery and analysis suite. It marries the speed and safety of low-level Rust raw-socket packet crafting with the developer ergonomics of Python, FastAPI, and Typer.

Designed as a modern monorepo, NetPulse is optimized for rapid Layer 2 (ARP) and Layer 3 (ICMP) network sweeps.


📐 System Architecture

NetPulse is structured as a modular monorepo that separates high-speed systems execution (Rust) from orchestration, validation, and delivery interfaces (CLI, REST API).

graph TD
    A[Client Interfaces] --> B[CLI: apps/cli]
    A --> C[REST API: apps/api]
    B --> D[Core Service: packages/core]
    C --> D
    D --> E[Engine Interface: packages/engine]
    E --> F[Rust Core Extension: rust/src/lib.rs]
    F -->|Raw L2 ARP Frames| G[Network Interface Card]
    F -->|Raw L3 ICMP Sweeps| G

📂 Monorepo Layout

Component Path Language Description
rust/ Rust High-speed native core utilizing raw sockets (pnet, socket2) for ARP framing and ICMP sweeps.
packages/core/ Python Central orchestration layer (netpulse_core). Defines domain Pydantic V2 models, handles service coordination, and powers the Subnetting & VLSM calculation engine.
packages/engine/ Python Loader package (netpulse_engine) exposing compiled Rust bindings to Python, featuring a zero-privilege mock fallback.
apps/cli/ Python Premium CLI tool (netpulse_cli) powered by Typer and Rich for beautiful terminal data representation.
apps/api/ Python Production-ready FastAPI service (netpulse_api) featuring custom rate-limiters, security headers, and CORS restrictions.
tests/ Python Complete automated test suite verifying models, mock engine interfaces, CLI, and API layers.

🔒 Security & Elevated Privileges

Because L2 ARP (ethernet frames) and L3 ICMP (ping) sweeps open and read from raw network sockets, they require systems-level privileges under Linux.

🛡️ Local Testing (Mock Mode)

To build and test NetPulse locally without needing root privileges, you can activate Forced Mock Mode by exporting the environment variable:

export NETPULSE_MOCK=1

In mock mode, the Python engine will bypass the Rust raw socket layer and return simulated subnets instantly, preserving full layout, validation, and API testing capabilities.

⚡ Running in Native Production Mode

When executing real scans on a network interface card, you must provide the python interpreter with standard Linux network capabilities or run with superuser rights:

  • Option A (Recommended): Grant capabilities to the virtualenv Python binary
    sudo setcap cap_net_raw,cap_net_admin+eip $(readlink -f .venv/bin/python)
    
  • Option B: Execute via superuser (sudo)
    sudo .venv/bin/python apps/cli/netpulse_cli/main.py discover 192.168.1.0/24
    

🚀 Installation & Build

NetPulse uses uv to manage its dependencies, and compiles its Rust engine inline using maturin.

Prerequisites

Ensure you have Rust, cargo, and python installed on your system.

Steps

  1. Clone the workspace and navigate to the project directory:
    cd netpulse
    
  2. Sync workspace dependencies using uv:
    uv sync
    
  3. Compile and register the Rust engine inside the virtual environment:
    cd rust
    ../.venv/bin/maturin develop --release
    cd ..
    

🖥️ Command Line Interface (CLI)

The CLI offers stunning console aesthetics with dynamic loading states, table outputs, and detailed error instructions.

Subcommands

  • version: Shows package and CLI version details.
  • discover [target]: Sweeps the target CIDR network and automatically stores the result in history.
  • discover-history [network]: Queries all past discovery scan summaries from local SQLite storage.
  • discover-drift [target]: Sweeps the network target and instantly computes status drift against baseline history.
  • discover-compare [old_scan_uuid] [new_scan_uuid]: Compares two specific past sweeps in database history.
  • subnet info [ip_or_cidr]: Calculates network boundaries and displays bitwise binary alignments.
  • subnet split [parent_network]: Partitions a parent CIDR into equal-sized subnets (FLSM) by count (--subnets) or host capacity (--hosts).
  • subnet vlsm [parent_network]: Calculates optimal subnets using Variable-Length Subnet Masking (VLSM) for varying host size requirements.
  • subnet discover [ip]: Finds which containing CIDR subnet block from a candidate list contains the given IP address.

Execution Examples

# Standard interactive table sweep (requires root or setcap permissions)
sudo .venv/bin/python apps/cli/netpulse_cli/main.py discover 172.19.57.0/24

# Output results directly in formatted JSON
NETPULSE_MOCK=1 .venv/bin/python apps/cli/netpulse_cli/main.py discover 172.19.57.0/24 --format json

# Subnet bitwise alignment calculator
.venv/bin/python apps/cli/netpulse_cli/main.py subnet info 192.168.1.50/24

# Perform VLSM allocation for varying departmental size requirements
.venv/bin/python apps/cli/netpulse_cli/main.py subnet vlsm 192.168.1.0/24 --req "HR=120,Dev=50,Sales=20,Links=2"

🌐 REST API Service

The REST API is a secure, production-grade FastAPI web service.

API Security Features

  1. Strict Bind Address: Exclusively listens on localhost (127.0.0.1:8000) for development, avoiding open exposures (0.0.0.0).
  2. Sliding Window Rate Limiter: Limits clients to 5 scans per minute per IP, returning structured 429 Too Many Requests responses with retry_after_seconds retry bounds.
  3. Security Headers: Emits strict headers on every response:
    • X-Content-Type-Options: nosniff
    • X-Frame-Options: DENY
    • Content-Security-Policy: default-src 'self';
  4. CORS Restrictions: Rejects wildcards (*) and explicitly boundaries access to localhost:3000 developers.
  5. Structured Error Translation: Safe handling of raw socket PermissionError codes, translating them into helpful instructions.

Start the REST Server

# Run in Mock Mode (Unprivileged)
PYTHONPATH=apps/api NETPULSE_MOCK=1 .venv/bin/python -m uvicorn netpulse_api.main:app --host 127.0.0.1 --port 8000

# Run in Production Mode (Requires raw socket capabilities)
sudo PYTHONPATH=apps/api .venv/bin/python -m uvicorn netpulse_api.main:app --host 127.0.0.1 --port 8000

Endpoint Reference

GET /health

Validates server reachability and responds with compliancy metadata.

  • Response (200):
    {
      "status": "healthy",
      "service": "netpulse-api",
      "timestamp": 1779482308.33
    }
    

POST /api/v1/discover

Orchestrates a discovery scan.

  • Request Payload:
    {
      "target_network": "172.19.57.0/24",
      "methods": ["icmp"],
      "timeout_ms": 1000
    }
    
  • Response (200):
    {
      "id": "7b86da45-ad65-4b55-b200-92a41a71a998",
      "network": "172.19.57.0/24",
      "methods": ["icmp"],
      "status": "completed",
      "errors": [],
      "devices": [
        {
          "id": "e38d70be-71fa-4677-962a-62bbb3685394",
          "ip": "172.19.57.1",
          "mac": null,
          "hostname": null,
          "vendor": null,
          "status": "up",
          "rtt_ms": 0.35
        }
      ],
      "started_at": "2026-05-22T20:47:32.256Z",
      "finished_at": "2026-05-22T20:47:32.257Z",
      "stats": {
        "scanned": 256,
        "responsive": 1
      },
      "metadata": {}
    }
    

POST /api/v1/subnet/info

Acts as a subnet calculator. Computes detailed boundary configurations.

  • Request Payload:
    {
      "ip": "192.168.1.50",
      "mask_or_prefix": "24"
    }
    

POST /api/v1/subnet/split

Partitions a parent CIDR into equal-sized subnets (FLSM).

  • Request Payload:
    {
      "parent_network": "192.168.1.0/24",
      "subnets_count": 4
    }
    

POST /api/v1/subnet/vlsm

Calculates optimal Variable-Length Subnet Masking (VLSM) allocations.

  • Request Payload:
    {
      "parent_network": "192.168.1.0/24",
      "requirements": [
        {"name": "HR", "hosts": 120},
        {"name": "Dev", "hosts": 50}
      ]
    }
    

POST /api/v1/subnet/discover

Matches a target IP against candidate subnets to locate its container.

  • Request Payload:
    {
      "ip": "192.168.1.45",
      "subnets": ["192.168.1.0/26", "192.168.1.64/26"]
    }
    

🧪 Running Automated Tests

NetPulse comes with 69 automated unit and integration tests built on top of pytest and httpx.

Tests run securely inside the local sandbox using mock overrides without needing root/sudo permissions:

PYTHONPATH=apps/api:apps/cli:packages/core:packages/engine NETPULSE_MOCK=1 .venv/bin/pytest tests/ -v

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

netpulse-0.1.0.2.tar.gz (45.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

netpulse-0.1.0.2-cp38-abi3-win_amd64.whl (196.8 kB view details)

Uploaded CPython 3.8+Windows x86-64

netpulse-0.1.0.2-cp38-abi3-manylinux_2_34_x86_64.whl (339.1 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.34+ x86-64

netpulse-0.1.0.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (335.1 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

netpulse-0.1.0.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (550.8 kB view details)

Uploaded CPython 3.8+macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file netpulse-0.1.0.2.tar.gz.

File metadata

  • Download URL: netpulse-0.1.0.2.tar.gz
  • Upload date:
  • Size: 45.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for netpulse-0.1.0.2.tar.gz
Algorithm Hash digest
SHA256 d7c0e42a530bfba96918ba92b85f3739f09850449419e1ffb640a42ed1f615b8
MD5 89381e37cb01be4d9086e51a16d85b8b
BLAKE2b-256 33d361af1fb4bb525d1af0cc6a2980547caf7f8f461e0097150b5609f66b11cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for netpulse-0.1.0.2.tar.gz:

Publisher: release.yml on bonheurNE07/netpulse

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file netpulse-0.1.0.2-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: netpulse-0.1.0.2-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 196.8 kB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for netpulse-0.1.0.2-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 f622b5f6f845124cb8613969d29b10e38f30c3cbad14cb268dd833b54d5f01b6
MD5 d8644a2f277d4d47a7b80166ea8e751a
BLAKE2b-256 be3bf0b4f791ed30d01435e846a4533dc6fe5a754481a277d799facb0ae50b7e

See more details on using hashes here.

Provenance

The following attestation bundles were made for netpulse-0.1.0.2-cp38-abi3-win_amd64.whl:

Publisher: release.yml on bonheurNE07/netpulse

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file netpulse-0.1.0.2-cp38-abi3-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for netpulse-0.1.0.2-cp38-abi3-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 b3ba32fba4c32292fdc298a355a50a7bbcd3805531dd52e2eb84f6e27a767003
MD5 38a6ed63064663a816d9d6ca92d4a131
BLAKE2b-256 4bd15662558c87c095fc6feda9bf4ad911b9d137dc1467345a2e8d743418b6d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for netpulse-0.1.0.2-cp38-abi3-manylinux_2_34_x86_64.whl:

Publisher: release.yml on bonheurNE07/netpulse

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file netpulse-0.1.0.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for netpulse-0.1.0.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 36bf247e5b73a19b7e471320fe7b7b37f29f9664be70be902c2e73879bbcac39
MD5 1f6bf3f98cbe4b01626eb2eb5d8ca3a9
BLAKE2b-256 d4ff030521dd4e41752f2bd030ea375529f38b668d66e19a721bcea723a53955

See more details on using hashes here.

Provenance

The following attestation bundles were made for netpulse-0.1.0.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on bonheurNE07/netpulse

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file netpulse-0.1.0.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for netpulse-0.1.0.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 6d7620b1264806c121e8f816cef5dff61a9f9f814c8f2083309fcd59cce0698b
MD5 420d61961fc41a39ef6a58c1dddd24ee
BLAKE2b-256 d07821e6b7007cf0ed19db7652e419b72c69493e91a6c801168cc9c3ed098682

See more details on using hashes here.

Provenance

The following attestation bundles were made for netpulse-0.1.0.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: release.yml on bonheurNE07/netpulse

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page