Skip to main content

NetBox IP History

English | Türkçe

Documentation: GitHub Wiki

PyPI PyPI - Python Version CI License

NetBox IP History icon

NetBox plugin 0.3.1 provides a canonical-IP timeline combining native NetBox core.ObjectChange records with immutable, plugin-owned GestioIP, phpIPAM, CSV, and JSON history. External records retain their source ID, source user, import job, timestamp, normalized scope, and complete raw_data snapshot.

License: Apache-2.0

Screenshots

IP Timeline and Lifecycle Search

Multi-Source IP Comparison

Multi-Source IP Comparison

Historical Data Import (CSV / JSON / JSONL)

Historical Data Import

Import Jobs & Safe Rollback Management

Import Jobs and Rollback

Data Source Support Matrix

Source Support Matrix

Compatibility

Plugin NetBox Python Status
0.3.x 4.4.x (v4.4.10) 3.11 Verified in CI
0.3.x 4.5.x (v4.5.10) 3.12 Verified in CI
0.3.x 4.6.x (v4.6.8) 3.12, 3.14 Verified in CI; 3.14 is the priority-verified combination

These are target ranges and verified environments. See COMPATIBILITY.md for the evidence matrix.

Dependencies

Additional mandatory Python dependencies: None beyond NetBox's runtime. NetBox supplies Django, PostgreSQL, and Redis requirements. External IPAM connectivity is optional and currently uses administrator-supplied file exports; vendor API/SQL clients are not bundled.

Installation

PyPI

source /opt/netbox/venv/bin/activate
pip install netbox-ip-history

GitHub

cd /opt && git clone https://github.com/muratbulat/netbox-ip-history.git
cd netbox-ip-history && pip install -e .

Full installation, upgrade, disable, and uninstall instructions (including NetBox configuration, migrations, and verification): docs/INSTALLATION.md — Turkish version: docs/INSTALLATION_TR.md.

The plugin will be available under /plugins/ip-history/ and directly accessible from NetBox IP Address (ipam.ipaddress) detail pages.

Configuration and security

All web views and API endpoints enforce strict Django model permissions with raise_exception=True (denying unauthenticated or unauthorized access with HTTP 403 Forbidden):

  • view_historicalipevent: Access timeline search (/plugins/ip-history/), event details, multi-source comparison, and IP address page extension panels.
  • add_historicalipevent: Access import data UI (/plugins/ip-history/import/).
  • delete_historicalipevent: Execute safe rollback of import jobs (/plugins/ip-history/import-jobs/<pk>/rollback/).
  • view_importjob: View import job audit logs and details (/plugins/ip-history/import-jobs/).
  • view_importsource: View source matrix and adapter capabilities (/plugins/ip-history/sources/support/).

ImportSource records store source metadata, timezone, field mapping, support level, capabilities, and authority. Credentials, tokens, and passwords belong in PLUGINS_CONFIG or environment variables, never in database model records or logs.

Formats and workflow

GestioIP and phpIPAM adapters accept CSV/JSON exports and preserve unknown columns. phpIPAM JSON supports arrays and JSON Lines. Generic CSV supports UTF-8/BOM, delimiters, quoting, and source mappings stored on ImportSource; generic JSON supports arrays of objects and JSON Lines. Every upload creates an analyzed job; dry run is optional and performs no historical-event writes. The result and error details are visible under /plugins/ip-history/import-jobs/.

Management Commands

Large imports and native synchronization use CLI commands:

# Import external IPAM history (file export)
python netbox/manage.py import_ip_history --source gestioip --file /data/history.csv --history-only --dry-run
python netbox/manage.py import_ip_history --source phpipam --file /data/export.json --history-only

# Synchronize past native NetBox IP changes from core.ObjectChange into HistoricalIPEvent
python netbox/manage.py sync_netbox_ip_history --dry-run
python netbox/manage.py sync_netbox_ip_history

Repeat imports are idempotent through SHA-256 fingerprint deduplication. A permitted administrator can remove only events belonging to a selected job; native NetBox audit data and live inventory are never rolled back.

Supported source adapters

Adapters are independent registry entries. The support matrix at /plugins/ip-history/sources/support/ is generated from declarations and inspection results:

Source Level Notes
GestioIP, phpIPAM EXPORT CSV/JSON inventory/history normalization
RackTables, NIPAP, TeemIP, Microsoft IPAM, Ralph EXPORT Use reviewed exports or read-only source views
GLPI, Device42, Infoblox, BlueCat, Micetro, EfficientIP EXPERIMENTAL File/API capability is source-version dependent and must be inspected
SolarWinds, ManageEngine, Nautobot EXPERIMENTAL Inventory/observation data; do not equate discovery with assignment
Another NetBox instance EXPERIMENTAL REST/export contract; source ObjectChange provenance is retained when retrieved
Generic SQL / Other IPAM EXPERIMENTAL / EXPORT Administrator-defined mappings; read-only SQL only

REST API Endpoints

NetBox REST API endpoints are available under /api/plugins/ip-history/ (secured by standard NetBox model permissions):

  • GET /api/plugins/ip-history/events/: List and filter historical IP events.
  • GET /api/plugins/ip-history/jobs/: List and monitor import jobs.
  • GET /api/plugins/ip-history/sources/: List configured import source profiles.

Portable exchange format

Unsupported products can use the stable exchange format without a new adapter:

{
	"format": "netbox-ip-history",
	"version": 1,
	"source": {"type": "other", "name": "Legacy IPAM"},
	"records": [
		{"ip": "10.222.1.33", "timestamp": "2024-01-01T10:00:00+03:00", "owner_name": "APP01", "event_type": "assigned"}
	]
}

The same records may be supplied as JSON Lines for large migrations. Map source-native fields in the source profile; unknown fields remain in raw_data. Source scopes such as Infoblox network views, Device42 VRF groups, BlueCat configurations, and Micetro address spaces must be explicitly mapped to NetBox VRFs rather than merged by IP alone.

Timeline and features

Search /plugins/ip-history/?ip=10.222.1.33 or access the IP History menu directly from the NetBox sidebar. Scope is separated by VRF name/RD, and missing scope is shown as Global / Unknown. Native records are resolved from snapshots by canonical IP so deleted and recreated IP objects can share one timeline; historical owner/interface strings do not depend on live objects.

The plugin provides:

  • Dedicated NetBox sidebar navigation menu (IP History) with sub-items for Timeline & Search, Source Comparison, Import Data, Import Jobs, and Source Matrix (without cluttering the generic Plugins menu).
  • Direct NetBox IP Address integration: Action button and quick history widget panel on the NetBox ipam.ipaddress detail page (template_content.py).
  • NetBox 4.x Global Search integration indexing IP addresses, hostnames, DNS names, and sources.
  • Modern Bootstrap 5 UI with tabbed sub-navigation, stat summary metrics cards, colored event badges, and raw snapshot inspectors.

Project status

The core historical model, canonical-IP timeline, registry architecture, generic file workflow, and conservative provenance/rollback behavior are implemented. GestioIP, phpIPAM, generic CSV/JSON/JSONL, and portable exchange imports are the validated paths. Vendor modules are deliberately EXPORT or EXPERIMENTAL until tested against a specific product version; they do not invent API endpoints or audit support.

Development and testing

Install the plugin into a NetBox development environment, run python netbox/manage.py migrate, and execute python -m unittest discover -s tests -v. Build with python -m pip wheel . --no-deps --wheel-dir dist. New adapters should declare capabilities, return SourceInspection, normalize into the DTO contract, preserve raw_data, and add sanitized fixtures/tests.

Support

Bugs and feature requests: GitHub Issues. General questions: GitHub Discussions. Security reports: SECURITY.md and GitHub Security Advisories.

Contributing and license

See CONTRIBUTING.md, SECURITY.md, and LICENSE. This project is licensed under Apache-2.0.

Uninstall

Export required history, disable the plugin, run python netbox/manage.py migrate netbox_ip_history zero only after confirming retention requirements, remove the package, and restart NetBox services. Native NetBox tables are not modified by this plugin.

Metadata

Release files for netbox-ip-history 0.3.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for netbox-ip-history 0.3.2
File Size Uploaded
netbox_ip_history-0.3.2.tar.gz 97.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for netbox-ip-history 0.3.2
File Interpreter ABI Platform
netbox_ip_history-0.3.2-py3-none-any.whl Python 3 none any Details

Total release size: 204.7 kB

Release files / netbox_ip_history-0.3.2.tar.gz

Download URL netbox_ip_history-0.3.2.tar.gz
Size 97.8 kB
Tags Source
SHA-256 checksum
How to use checksums
2870cdeedbaf5868e0dd9ffcc6f218d63d4e5de5612cc1af5ef789123a4dd257
BLAKE2b-256 checksum
How to use checksums
de54026effe6ab48e8845bb2ff0e93cb2cdaad44c6f48eb37b40bb290077de45
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.

Transparency log

Release files / netbox_ip_history-0.3.2-py3-none-any.whl

Download URL netbox_ip_history-0.3.2-py3-none-any.whl
Size 106.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
37d3619f8a9c7ec213d659f021b991e537fdca5570f13647bb96806cfd52eab7
BLAKE2b-256 checksum
How to use checksums
695676d2e265bf5cfc9df9b2c2a34b40c0084e881eef32dea290c37254fa173e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.2 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page