# py312
# requirements:
# pynetbox==7.9.0
from typing import List, Literal, Optional, TypedDict
import pynetbox
class netbox(TypedDict):
url: str
token: str
def api(auth: netbox):
# pynetbox adds /api itself; the resource URL may already end with it.
return pynetbox.api(
auth["url"].rstrip("/").removesuffix("/api"), token=auth["token"]
)
def keep(**fields):
# The run form sends "" / [] / {} for untouched fields: drop them.
return {k: v for k, v in fields.items() if v not in (None, "", [], {})}
def page(records):
# One page (limit/offset), as NetBox's count plus the raw records.
results = [dict(r) for r in records]
return {"count": len(records), "results": results}
def main(
auth: netbox,
q: Optional[str] = None,
address: Optional[str] = None,
parent: Optional[str] = None,
vrf_id: Optional[int] = None,
status: Optional[
List[Literal["active", "reserved", "deprecated", "dhcp", "slaac"]]
] = None,
device_id: Optional[int] = None,
interface_id: Optional[int] = None,
dns_name: Optional[str] = None,
tag: Optional[List[str]] = None,
limit: Optional[int] = None,
offset: Optional[int] = None,
):
"""
List IP Addresses
List IP addresses, filtered by address, parent prefix, VRF, status, device, interface or DNS name.
"""
records = api(auth).ipam.ip_addresses.filter(
**keep(
q=q,
address=address,
parent=parent,
vrf_id=vrf_id,
status=status,
device_id=device_id,
interface_id=interface_id,
dns_name=dns_name,
tag=tag,
),
# limit=0 means NetBox's MAX_PAGE_SIZE, which also caps an explicit 1000.
limit=50 if limit is None else limit or 1000,
offset=offset or 0,
)
return page(records)
Submitted by hugo989 3 hours ago