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 |
|