0

List IP Addresses

by
Published today

List IP addresses, filtered by address, parent prefix, VRF, status, device, interface or DNS name.

Script netbox Verified

The script

Submitted by hugo989 Python3
Verified 5 hours ago
1
# py312
2
# requirements:
3
# pynetbox==7.9.0
4

5

6
from typing import List, Literal, Optional, TypedDict
7

8
import pynetbox
9

10

11
class netbox(TypedDict):
12
    url: str
13
    token: str
14

15

16
def api(auth: netbox):
17
    # pynetbox adds /api itself; the resource URL may already end with it.
18
    return pynetbox.api(
19
        auth["url"].rstrip("/").removesuffix("/api"), token=auth["token"]
20
    )
21

22

23
def keep(**fields):
24
    # The run form sends "" / [] / {} for untouched fields: drop them.
25
    return {k: v for k, v in fields.items() if v not in (None, "", [], {})}
26

27

28
def page(records):
29
    # One page (limit/offset), as NetBox's count plus the raw records.
30
    results = [dict(r) for r in records]
31
    return {"count": len(records), "results": results}
32

33

34
def main(
35
    auth: netbox,
36
    q: Optional[str] = None,
37
    address: Optional[str] = None,
38
    parent: Optional[str] = None,
39
    vrf_id: Optional[int] = None,
40
    status: Optional[
41
        List[Literal["active", "reserved", "deprecated", "dhcp", "slaac"]]
42
    ] = None,
43
    device_id: Optional[int] = None,
44
    interface_id: Optional[int] = None,
45
    dns_name: Optional[str] = None,
46
    tag: Optional[List[str]] = None,
47
    limit: Optional[int] = None,
48
    offset: Optional[int] = None,
49
):
50
    """
51
    List IP Addresses
52
    List IP addresses, filtered by address, parent prefix, VRF, status, device, interface or DNS name.
53
    """
54
    records = api(auth).ipam.ip_addresses.filter(
55
        **keep(
56
            q=q,
57
            address=address,
58
            parent=parent,
59
            vrf_id=vrf_id,
60
            status=status,
61
            device_id=device_id,
62
            interface_id=interface_id,
63
            dns_name=dns_name,
64
            tag=tag,
65
        ),
66
        # limit=0 means NetBox's MAX_PAGE_SIZE, which also caps an explicit 1000.
67
        limit=50 if limit is None else limit or 1000,
68
        offset=offset or 0,
69
    )
70
    return page(records)
71