vpnetbox
=========
Python package to work with Netbox using REST API.
Facilitates low-level calls to Netbox and data parsing.
- NbApi: Requests data from the Netbox REST API using filter parameters identical to those in the web interface filter form.
- NbParser: Extracts a value from a Netbox object using a long chain of keys.
- NbHandler: Retrieves and caches a bulk of data from the Netbox to local system.
- NbData: Sets of Netbox objects, like aggregates, prefixes, etc., are joined together.
`./docs/NbHandler_diagram.rst`_
.. contents::
Introduction
------------
I am a network engineer and my scripts are designed to resolve network issues when the network is down.
I am facing some coding challenges where the speed and stability of my script are crucial, which is why I decided to stop using Pynetbox and start this project.
So, what is the utility of this tool? In short, I aim to make my scripts easier, more stable and faster.
In detail:
- Filtering. The 'get' methods provide filter parameters that are similar to those in the Netbox Web UI (for example, 'tenant' instead of 'tenant_id'). With 'get' parameters, you can implement filtering similar 'AND' and 'OR' operators.
- Tests. Code based on the REST API is much easier to cover with tests, because the Netbox returns a simple dictionary, which is easy to mock (testing code based on Pynetbox presents a challenge).
- Cache. Vpnetbox can save Netbox objects to a pickle file and work with them locally. Your script can work with Netbox data when the Netbox API is unreachable.
- Speed. Using Vpnetbox you can retrieve a bulk of data faster than when using Pynetbox (it maintains a connection with Netbox and downloads additional data during processing, which makes the script run veeeery slowly). Typically, I download a large amount of data to my local system, save it to cache and then start processing.
Requirements
------------
Python >=3.8
Installation
------------
Install the package from pypi.org release
.. code:: bash
pip install vpnetbox
or install the package from github.com release
.. code:: bash
pip install https://github.com/vladimirs-git/vpnetbox/archive/refs/tags/2.5.11.tar.gz
or install the package from github.com repository
.. code:: bash
pip install git+https://github.com/vladimirs-git/vpnetbox
Usage
-----
For more details, please refer to the `./examples`_ directory where you will find numerous examples.
To get started, use the following example.
.. code:: python
HOST = "demo.netbox.dev"
TOKEN = "*****"
nb = NbApi(host=HOST, token=TOKEN)
# Create addresses
response = nb.ip_addresses.create(address="10.1.1.1/24", tags=[1], status="reserved")
print(response) # <Response [201]>
response = nb.ip_addresses.create(address="10.1.1.1/24", tags=[2], vrf=2)
print(response) # <Response [201]>
# Get all addresses
addresses = nb.ip_addresses.get()
print(len(addresses)) # 181
# Simple filter
addresses = nb.ip_addresses.get(vrf="none")
print(len(addresses)) # 30
addresses = nb.ip_addresses.get(tag=["alpha", "bravo"])
print(len(addresses)) # 4
# Complex filter. Get addresses that do not have VRF and have either the tag 'alpha' or 'brave'
# and have a status of either active or reserved.
addresses = nb.ip_addresses.get(vrf="none", tag=["alpha", "bravo"], status=["active", "reserved"])
print(len(addresses)) # 1
addresses = nb.ip_addresses.get(address="10.1.1.1/24")
for address in addresses:
# Update
id_ = address["id"]
response = nb.ip_addresses.update(id=id_, description="text")
print(response) # <Response [200]>
print(nb.ip_addresses.get(id=id_)[0]["description"]) # text
# Delete
response = nb.ip_addresses.delete(id=id_)
print(response) # <Response [204]>
Example of threading mode.
.. code:: python
import logging
from datetime import datetime
from vpnetbox import NbApi
# Enable DEBUG mode to demonstrate the speed of requests to the Netbox API
logging.getLogger().setLevel(logging.DEBUG)
logging.getLogger().addHandler(logging.StreamHandler())
HOST = "demo.netbox.dev"
TOKEN = "*****"
# Get a lot of data in threading mode.
start = datetime.now()
nb = NbApi(host=HOST, token=TOKEN, threads=10, interval=0.1)
objects = nb.ip_addresses.get()
seconds = (datetime.now() - start).seconds
print([d["address"] for d in objects])
print(f"{len(objects)=} {seconds=}")
# DEBUG https://demo.netbox.dev:443 "GET /api/ipam/addresses/?brief=1&limit=1 ...
# DEBUG Starting new HTTPS connection (2): demo.netbox.dev:443
# DEBUG Starting new HTTPS connection (3): demo.netbox.dev:443
# DEBUG Starting new HTTPS connection (4): demo.netbox.dev:443
# DEBUG Starting new HTTPS connection (5): demo.netbox.dev:443
# DEBUG https://demo.netbox.dev:443 "GET /api/ipam/addresses/? ...
# DEBUG https://demo.netbox.dev:443 "GET /api/ipam/addresses/? ...
# DEBUG https://demo.netbox.dev:443 "GET /api/ipam/addresses/? ...
# DEBUG https://demo.netbox.dev:443 "GET /api/ipam/addresses/? ...
# DEBUG https://demo.netbox.dev:443 "GET /api/ipam/addresses/? ...
# len(objects)=4153 seconds=3
NbApi
=====
NbApi, Python wrapper of Netbox REST API. Requests data from the Netbox REST API using filter parameters.
* Multithreading is used to request a bulk of data in fast mode.
* In 'get' method you can use multiple filter parameters. Different parameters work like 'AND' operator, while multiple values in the same parameter work like an 'OR' operator.
* Retries the request multiple times if the Netbox API responds with a timed-out. This is useful for scheduled scripts in cron jobs, when the connection to Netbox server is not stable.
* Slices the query to multiple requests if the URL length exceeds 4000 characters (due to a long list of GET parameters).
* Replaces an error-400 response with an empty result. For example, when querying addresses by tag, if there are no address objects with this tag in Netbox, the default Netbox API response is error-400. This package logs a warning and returns an ok-200 response with an empty list.
All connectors (ipam.ip_addresses, dcim.devices, etc.) have 'get', 'create', 'update' and 'delete' methods.
The 'create', 'update' and 'delete' methods are identical for all connectors,
but the parameters for the 'get' method are different for each connector.
Only 'ipam.ip_addresses' is fully described in the README, but other connectors are implemented in a similar manner.
To find available filter parameters for other connectors, you can use the Netbox Web UI filter page,
code docstrings, `./examples`_ or simply try your luck and experiment.
NbApi Parameters
----------------
=========== ======= ================================================================================
Parameter Type Description
=========== ======= ================================================================================
host *str* Netbox host name.
token *str* Netbox token.
scheme *str* Access method: https or http. Default https.
verify *bool* Transport Layer Security. True - A TLS certificate required, False - Requests will accept any TLS certificate.
limit *int* Split the query to multiple requests if the response exceeds the limit. Default 1000.
threads *int* Threads count. Default 1, loop mode.
interval *int* Wait this time between requests (seconds). Default 0. Useful for request speed shaping.
max_items *int* Stop the request if received items reach this value. Default unlimited. Useful if you need many objects but not all.
timeout *float* Request timeout (seconds). Default 60.
max_retries *int* Retry the request multiple times if it receives a 500 error or timed-out. Default 3.
sleep *float* Interval before the next retry after receiving a 500 error (seconds). Default 10.
url_max_len *int* Split the query to multiple requests if the URL length exceeds this value. Default ~3900.
=========== ======= ================================================================================
NbApi Methods
-------------
create(\*\*params)
------------------
Create object in Netbox.
=========== ====== =================================================================================
Parameter Type Description
=========== ====== =================================================================================
params *dict* Parameters of new object.
=========== ====== =================================================================================
Return
*Response* Session response. *<Response [201]>* Object successfully created, *<Response [400]>* Object already exist.
create_d(\*\*params)
--------------------
Create object in Netbox.
=========== ====== =================================================================================
Parameter Type Description
=========== ====== =================================================================================
params *dict* Parameters of new object.
=========== ====== =================================================================================
Return
*DAny* Dictionary of crated object.
update(\*\*params)
------------------
Update object in Netbox.
=========== ====== =================================================================================
Parameter Type Description
=========== ====== =================================================================================
params *dict* Parameters to update object in Netbox, id is required.
=========== ====== =================================================================================
Return
*Response* Session response. *<Response [200]>* Object successfully updated, *<Response [400]>* Invalid data.
update_d(\*\*params)
--------------------
Update object in Netbox.
=========== ====== =========================================================================================
Parameter Type Description
=========== ====== =========================================================================================
params *dict* Parameters to update object in Netbox, id is required.
=========== ====== =========================================================================================
Return
*DAny* Dictionary of updated object.
delete(id)
----------
Delete object in Netbox.
=========== ====== =================================================================================
Parameter Type Description
=========== ====== =================================================================================
id *int* Object unique identifier.
=========== ====== =================================================================================
Return
*Response* Session response. *<Response [204]>* Object successfully deleted, *<Response [404]>* Object not found.
ip_address.get(\*\*params)
--------------------------
Get ipam/ip-addresses/ objects. Each filter parameter can be either a single value or a list of
values. Different parameters work like 'AND' operator, while multiple values in the same parameter
work like an 'OR' operator. Not all filter parameters are documented. Please refer to the Netbox API
documentation for more details.
===================== ==================== =========================================================
Parameter Type Description
===================== ==================== =========================================================
**WEB UI FILTERS** - - - - - - - - - - - - - - -
q *str* or *List[str]* IP address substring.
tag *str* or *List[str]* Tag.
parent *str* or *List[str]* Parent Prefix. Addresses that are part of this prefix.
family *int* or *List[int]* Address family. IP version.
status *str* or *List[str]* Status.
role *str* or *List[str]* Role.
mask_length *int* or *List[int]* Mask length.
assigned_to_interface *bool* Assigned to an interface.
vrf *str* or *List[str]* VRF.
vrf_id *int* or *List[int]* VRF object ID.
present_in_vrf *str* or *List[str]* Present in VRF.
present_in_vrf_id *int* or *List[int]* Present in VRF object ID.
tenant_group *str* or *List[str]* Tenant group.
tenant_group_id *int* or *List[int]* Tenant group object ID.
tenant *str* or *List[str]* Tenant.
tenant_id *int* or *List[int]* Tenant object ID.
device *str* or *List[str]* Assigned Device.
device_id *int* or *List[int]* Assigned Device object ID.
virtual_machine *str* or *List[str]* Assigned virtual machine.
virtual_machine_id *int* or *List[int]* Assigned virtual machine object ID.
**DATA FILTERS** - - - - - - - - - - - - - - -
id *int* or *List[int]* Object ID.
address *str* or *List[str]* IP Address.
dns_name *str* or *List[str]* DNS name.
description *str* or *List[str]* Description.
created *str* or *List[str]* Datetime when the object was created.
last_updated *str* or *List[str]* Datetime when the object was updated.
===================== ==================== =========================================================
Return
*List[dict]* List of found objects.
NbParser
========
`./docs/NbParser.rst`_
Extracts the values from a Netbox object using a chain of keys.
NbHandler
=========
`./docs/NbHandler.rst`_
Retrieves and caches a bulk of data from the Netbox to local system.
Collects sets of aggregates, prefixes, addresses, devices, sites data from Netbox by scenarios.
(This handler is not yet finished, and I plan to improve it.)
.. _`./docs/NbHandler.rst`: ./docs/NbHandler.rst
.. _`./docs/NbHandler_diagram.rst`: ./docs_/NbHandler_diagram.rst
.. _`./docs/NbParser.rst`: ./docs/NbParser.rst
.. _`./examples`: ./examples
Raw data
{
"_id": null,
"home_page": "https://github.com/vladimirs-git/vpnetbox",
"name": "vpnetbox",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8,<4.0",
"maintainer_email": "",
"keywords": "netbox",
"author": "Vladimirs Prusakovs",
"author_email": "vladimir.prusakovs@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/53/94/ff2ad4e571229bd3a4ac65d8490ccdacf0683f0f2d8051173fbca1ae4104/vpnetbox-2.5.11.tar.gz",
"platform": null,
"description": "\nvpnetbox\n=========\n\nPython package to work with Netbox using REST API.\nFacilitates low-level calls to Netbox and data parsing.\n\n- NbApi: Requests data from the Netbox REST API using filter parameters identical to those in the web interface filter form.\n- NbParser: Extracts a value from a Netbox object using a long chain of keys.\n- NbHandler: Retrieves and caches a bulk of data from the Netbox to local system.\n- NbData: Sets of Netbox objects, like aggregates, prefixes, etc., are joined together.\n\n`./docs/NbHandler_diagram.rst`_\n\n.. contents::\n\n\nIntroduction\n------------\nI am a network engineer and my scripts are designed to resolve network issues when the network is down.\nI am facing some coding challenges where the speed and stability of my script are crucial, which is why I decided to stop using Pynetbox and start this project.\nSo, what is the utility of this tool? In short, I aim to make my scripts easier, more stable and faster.\nIn detail:\n\n- Filtering. The 'get' methods provide filter parameters that are similar to those in the Netbox Web UI (for example, 'tenant' instead of 'tenant_id'). With 'get' parameters, you can implement filtering similar 'AND' and 'OR' operators.\n- Tests. Code based on the REST API is much easier to cover with tests, because the Netbox returns a simple dictionary, which is easy to mock (testing code based on Pynetbox presents a challenge).\n- Cache. Vpnetbox can save Netbox objects to a pickle file and work with them locally. Your script can work with Netbox data when the Netbox API is unreachable.\n- Speed. Using Vpnetbox you can retrieve a bulk of data faster than when using Pynetbox (it maintains a connection with Netbox and downloads additional data during processing, which makes the script run veeeery slowly). Typically, I download a large amount of data to my local system, save it to cache and then start processing.\n\n\nRequirements\n------------\n\nPython >=3.8\n\n\nInstallation\n------------\n\nInstall the package from pypi.org release\n\n.. code:: bash\n\n pip install vpnetbox\n\nor install the package from github.com release\n\n.. code:: bash\n\n pip install https://github.com/vladimirs-git/vpnetbox/archive/refs/tags/2.5.11.tar.gz\n\nor install the package from github.com repository\n\n.. code:: bash\n\n pip install git+https://github.com/vladimirs-git/vpnetbox\n\n\nUsage\n-----\nFor more details, please refer to the `./examples`_ directory where you will find numerous examples.\n\nTo get started, use the following example.\n\n.. code:: python\n\n HOST = \"demo.netbox.dev\"\n TOKEN = \"*****\"\n nb = NbApi(host=HOST, token=TOKEN)\n\n # Create addresses\n response = nb.ip_addresses.create(address=\"10.1.1.1/24\", tags=[1], status=\"reserved\")\n print(response) # <Response [201]>\n response = nb.ip_addresses.create(address=\"10.1.1.1/24\", tags=[2], vrf=2)\n print(response) # <Response [201]>\n\n # Get all addresses\n addresses = nb.ip_addresses.get()\n print(len(addresses)) # 181\n\n # Simple filter\n addresses = nb.ip_addresses.get(vrf=\"none\")\n print(len(addresses)) # 30\n addresses = nb.ip_addresses.get(tag=[\"alpha\", \"bravo\"])\n print(len(addresses)) # 4\n\n # Complex filter. Get addresses that do not have VRF and have either the tag 'alpha' or 'brave'\n # and have a status of either active or reserved.\n addresses = nb.ip_addresses.get(vrf=\"none\", tag=[\"alpha\", \"bravo\"], status=[\"active\", \"reserved\"])\n print(len(addresses)) # 1\n\n addresses = nb.ip_addresses.get(address=\"10.1.1.1/24\")\n for address in addresses:\n # Update\n id_ = address[\"id\"]\n response = nb.ip_addresses.update(id=id_, description=\"text\")\n print(response) # <Response [200]>\n print(nb.ip_addresses.get(id=id_)[0][\"description\"]) # text\n\n # Delete\n response = nb.ip_addresses.delete(id=id_)\n print(response) # <Response [204]>\n\nExample of threading mode.\n\n.. code:: python\n\n import logging\n from datetime import datetime\n from vpnetbox import NbApi\n\n # Enable DEBUG mode to demonstrate the speed of requests to the Netbox API\n logging.getLogger().setLevel(logging.DEBUG)\n logging.getLogger().addHandler(logging.StreamHandler())\n\n HOST = \"demo.netbox.dev\"\n TOKEN = \"*****\"\n\n # Get a lot of data in threading mode.\n start = datetime.now()\n nb = NbApi(host=HOST, token=TOKEN, threads=10, interval=0.1)\n objects = nb.ip_addresses.get()\n seconds = (datetime.now() - start).seconds\n print([d[\"address\"] for d in objects])\n print(f\"{len(objects)=} {seconds=}\")\n # DEBUG https://demo.netbox.dev:443 \"GET /api/ipam/addresses/?brief=1&limit=1 ...\n # DEBUG Starting new HTTPS connection (2): demo.netbox.dev:443\n # DEBUG Starting new HTTPS connection (3): demo.netbox.dev:443\n # DEBUG Starting new HTTPS connection (4): demo.netbox.dev:443\n # DEBUG Starting new HTTPS connection (5): demo.netbox.dev:443\n # DEBUG https://demo.netbox.dev:443 \"GET /api/ipam/addresses/? ...\n # DEBUG https://demo.netbox.dev:443 \"GET /api/ipam/addresses/? ...\n # DEBUG https://demo.netbox.dev:443 \"GET /api/ipam/addresses/? ...\n # DEBUG https://demo.netbox.dev:443 \"GET /api/ipam/addresses/? ...\n # DEBUG https://demo.netbox.dev:443 \"GET /api/ipam/addresses/? ...\n # len(objects)=4153 seconds=3\n\n\nNbApi\n=====\nNbApi, Python wrapper of Netbox REST API. Requests data from the Netbox REST API using filter parameters.\n\n* Multithreading is used to request a bulk of data in fast mode.\n* In 'get' method you can use multiple filter parameters. Different parameters work like 'AND' operator, while multiple values in the same parameter work like an 'OR' operator.\n* Retries the request multiple times if the Netbox API responds with a timed-out. This is useful for scheduled scripts in cron jobs, when the connection to Netbox server is not stable.\n* Slices the query to multiple requests if the URL length exceeds 4000 characters (due to a long list of GET parameters).\n* Replaces an error-400 response with an empty result. For example, when querying addresses by tag, if there are no address objects with this tag in Netbox, the default Netbox API response is error-400. This package logs a warning and returns an ok-200 response with an empty list.\n\nAll connectors (ipam.ip_addresses, dcim.devices, etc.) have 'get', 'create', 'update' and 'delete' methods.\nThe 'create', 'update' and 'delete' methods are identical for all connectors,\nbut the parameters for the 'get' method are different for each connector.\nOnly 'ipam.ip_addresses' is fully described in the README, but other connectors are implemented in a similar manner.\nTo find available filter parameters for other connectors, you can use the Netbox Web UI filter page,\ncode docstrings, `./examples`_ or simply try your luck and experiment.\n\n\nNbApi Parameters\n----------------\n\n=========== ======= ================================================================================\nParameter Type Description\n=========== ======= ================================================================================\nhost *str* Netbox host name.\ntoken *str* Netbox token.\nscheme *str* Access method: https or http. Default https.\nverify *bool* Transport Layer Security. True - A TLS certificate required, False - Requests will accept any TLS certificate.\nlimit *int* Split the query to multiple requests if the response exceeds the limit. Default 1000.\nthreads *int* Threads count. Default 1, loop mode.\ninterval *int* Wait this time between requests (seconds). Default 0. Useful for request speed shaping.\nmax_items *int* Stop the request if received items reach this value. Default unlimited. Useful if you need many objects but not all.\ntimeout *float* Request timeout (seconds). Default 60.\nmax_retries *int* Retry the request multiple times if it receives a 500 error or timed-out. Default 3.\nsleep *float* Interval before the next retry after receiving a 500 error (seconds). Default 10.\nurl_max_len *int* Split the query to multiple requests if the URL length exceeds this value. Default ~3900.\n=========== ======= ================================================================================\n\n\nNbApi Methods\n-------------\n\n\ncreate(\\*\\*params)\n------------------\nCreate object in Netbox.\n\n=========== ====== =================================================================================\nParameter Type Description\n=========== ====== =================================================================================\nparams *dict* Parameters of new object.\n=========== ====== =================================================================================\n\nReturn\n *Response* Session response. *<Response [201]>* Object successfully created, *<Response [400]>* Object already exist.\n\n\ncreate_d(\\*\\*params)\n--------------------\nCreate object in Netbox.\n\n=========== ====== =================================================================================\nParameter Type Description\n=========== ====== =================================================================================\nparams *dict* Parameters of new object.\n=========== ====== =================================================================================\n\nReturn\n *DAny* Dictionary of crated object.\n\n\nupdate(\\*\\*params)\n------------------\nUpdate object in Netbox.\n\n=========== ====== =================================================================================\nParameter Type Description\n=========== ====== =================================================================================\nparams *dict* Parameters to update object in Netbox, id is required.\n=========== ====== =================================================================================\n\nReturn\n *Response* Session response. *<Response [200]>* Object successfully updated, *<Response [400]>* Invalid data.\n\n\nupdate_d(\\*\\*params)\n--------------------\nUpdate object in Netbox.\n\n=========== ====== =========================================================================================\nParameter Type Description\n=========== ====== =========================================================================================\nparams *dict* Parameters to update object in Netbox, id is required.\n=========== ====== =========================================================================================\n\nReturn\n *DAny* Dictionary of updated object.\n\n\ndelete(id)\n----------\nDelete object in Netbox.\n\n=========== ====== =================================================================================\nParameter Type Description\n=========== ====== =================================================================================\nid *int* Object unique identifier.\n=========== ====== =================================================================================\n\nReturn\n *Response* Session response. *<Response [204]>* Object successfully deleted, *<Response [404]>* Object not found.\n\n\nip_address.get(\\*\\*params)\n--------------------------\nGet ipam/ip-addresses/ objects. Each filter parameter can be either a single value or a list of\nvalues. Different parameters work like 'AND' operator, while multiple values in the same parameter\nwork like an 'OR' operator. Not all filter parameters are documented. Please refer to the Netbox API\ndocumentation for more details.\n\n\n===================== ==================== =========================================================\nParameter Type Description\n===================== ==================== =========================================================\n**WEB UI FILTERS** - - - - - - - - - - - - - - -\nq *str* or *List[str]* IP address substring.\ntag *str* or *List[str]* Tag.\nparent *str* or *List[str]* Parent Prefix. Addresses that are part of this prefix.\nfamily *int* or *List[int]* Address family. IP version.\nstatus *str* or *List[str]* Status.\nrole *str* or *List[str]* Role.\nmask_length *int* or *List[int]* Mask length.\nassigned_to_interface *bool* Assigned to an interface.\nvrf *str* or *List[str]* VRF.\nvrf_id *int* or *List[int]* VRF object ID.\npresent_in_vrf *str* or *List[str]* Present in VRF.\npresent_in_vrf_id *int* or *List[int]* Present in VRF object ID.\ntenant_group *str* or *List[str]* Tenant group.\ntenant_group_id *int* or *List[int]* Tenant group object ID.\ntenant *str* or *List[str]* Tenant.\ntenant_id *int* or *List[int]* Tenant object ID.\ndevice *str* or *List[str]* Assigned Device.\ndevice_id *int* or *List[int]* Assigned Device object ID.\nvirtual_machine *str* or *List[str]* Assigned virtual machine.\nvirtual_machine_id *int* or *List[int]* Assigned virtual machine object ID.\n**DATA FILTERS** - - - - - - - - - - - - - - -\nid *int* or *List[int]* Object ID.\naddress *str* or *List[str]* IP Address.\ndns_name *str* or *List[str]* DNS name.\ndescription *str* or *List[str]* Description.\ncreated *str* or *List[str]* Datetime when the object was created.\nlast_updated *str* or *List[str]* Datetime when the object was updated.\n===================== ==================== =========================================================\n\nReturn\n *List[dict]* List of found objects.\n\n\nNbParser\n========\n`./docs/NbParser.rst`_\nExtracts the values from a Netbox object using a chain of keys.\n\n\nNbHandler\n=========\n`./docs/NbHandler.rst`_\nRetrieves and caches a bulk of data from the Netbox to local system.\nCollects sets of aggregates, prefixes, addresses, devices, sites data from Netbox by scenarios.\n(This handler is not yet finished, and I plan to improve it.)\n\n\n.. _`./docs/NbHandler.rst`: ./docs/NbHandler.rst\n.. _`./docs/NbHandler_diagram.rst`: ./docs_/NbHandler_diagram.rst\n.. _`./docs/NbParser.rst`: ./docs/NbParser.rst\n.. _`./examples`: ./examples\n\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "Python package to work with Netbox using REST API",
"version": "2.5.11",
"project_urls": {
"Bug Tracker": "https://github.com/vladimirs-git/vpnetbox/issues",
"Download URL": "https://github.com/vladimirs-git/vpnetbox/archive/refs/tags/2.5.11.tar.gz",
"Homepage": "https://github.com/vladimirs-git/vpnetbox",
"Repository": "https://github.com/vladimirs-git/vpnetbox"
},
"split_keywords": [
"netbox"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "0de9fc5a907b46d47a8a11bc3c39bc0a6ccddad875506b65e517419c16eb8cf8",
"md5": "46d491f91ad5fc59eaebf996812547f7",
"sha256": "c771eb7f3c0556bdfe7648e3fa83bf7e7182dd2d04d85c777820f027cafb7efe"
},
"downloads": -1,
"filename": "vpnetbox-2.5.11-py3-none-any.whl",
"has_sig": false,
"md5_digest": "46d491f91ad5fc59eaebf996812547f7",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8,<4.0",
"size": 40407,
"upload_time": "2023-11-02T06:16:36",
"upload_time_iso_8601": "2023-11-02T06:16:36.912563Z",
"url": "https://files.pythonhosted.org/packages/0d/e9/fc5a907b46d47a8a11bc3c39bc0a6ccddad875506b65e517419c16eb8cf8/vpnetbox-2.5.11-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5394ff2ad4e571229bd3a4ac65d8490ccdacf0683f0f2d8051173fbca1ae4104",
"md5": "408b80005068778c885014e57bfc9c44",
"sha256": "ab9988ba93546d20975bcdac8b983a67f274d70f34532782729501d568f881ec"
},
"downloads": -1,
"filename": "vpnetbox-2.5.11.tar.gz",
"has_sig": false,
"md5_digest": "408b80005068778c885014e57bfc9c44",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8,<4.0",
"size": 35516,
"upload_time": "2023-11-02T06:16:38",
"upload_time_iso_8601": "2023-11-02T06:16:38.859046Z",
"url": "https://files.pythonhosted.org/packages/53/94/ff2ad4e571229bd3a4ac65d8490ccdacf0683f0f2d8051173fbca1ae4104/vpnetbox-2.5.11.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-11-02 06:16:38",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "vladimirs-git",
"github_project": "vpnetbox",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "vpnetbox"
}