Name | roa-checker JSON |
Version |
3.1.2
JSON |
| download |
home_page | None |
Summary | Fast prefix origin pair lookups |
upload_time | 2024-11-23 11:30:27 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.10 |
license | Copyright 2020 Justin Furuness Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
keywords |
furuness
prefix
cidr
inet
trie
cidr-trie
roas
roas-trie
roas
roas-trie
bgp
hijack
roa
rov
|
VCS |
|
bugtrack_url |
|
requirements |
lib_cidr_trie
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
Informational Badges:
[![PyPI version](https://badge.fury.io/py/roa_checker.svg)](https://badge.fury.io/py/roa_checker)
![PyPy](https://img.shields.io/badge/PyPy-7.3.17-blue)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/roa_checker)](https://pypi.org/project/roa_checker/)
![Tests](https://github.com/jfuruness/roa_checker/actions/workflows/tests.yml/badge.svg)
![Linux](https://img.shields.io/badge/os-Linux-blue.svg)
![macOS Intel](https://img.shields.io/badge/os-macOS_Intel-lightgrey.svg)
![macOS ARM](https://img.shields.io/badge/os-macOS_ARM-lightgrey.svg)
Some Linting Badges (Where I could find them):
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![Checked with mypy](https://img.shields.io/badge/mypy-checked-2A6DBA.svg)](http://mypy-lang.org/)
[![Imports: isort](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336)](https://pycqa.github.io/isort/)
[![Pylint](https://img.shields.io/badge/linting-pylint-yellowgreen)](https://github.com/pylint-dev/pylint/tree/main)
[![try/except style: tryceratops](https://img.shields.io/badge/try%2Fexcept%20style-tryceratops%20%F0%9F%A6%96%E2%9C%A8-black)](https://github.com/guilatrova/tryceratops)
# roa\_checker
### If you like the repo, it would be awesome if you could add a star to it! It really helps out the visibility. Also for any questions at all we'd love to hear from you at jfuruness@gmail.com
This package contains a trie of ROAs for fast prefix-origin pair lookups
* [Usage](#usage)
* [Installation](#installation)
* [Testing](#testing)
* [Development/Contributing](#developmentcontributing)
* [History](#history)
* [Licence](#license)
## Usage
* [roa\_checker](#roa_checker)
I can expand these if anyone actually uses this repo (lmk @ jfuruness@gmail.com)
```python
def test_tree():
# TODO: Break up into unit tests
trie = ROAChecker()
cidrs = [ip_network(x) for x in ["1.2.0.0/16", "1.2.3.0/24", "1.2.3.4"]]
routed_origin = 1
for cidr in cidrs:
trie.insert(cidr, ROA(cidr, routed_origin, cidr.prefixlen))
for cidr in cidrs:
outcome = trie.get_roa_outcome(cidr, routed_origin)
assert outcome == ROAOutcome(ROAValidity.VALID, ROARouted.ROUTED)
assert ROAValidity.is_unknown(outcome.validity) is False
assert ROAValidity.is_invalid(outcome.validity) is False
assert ROAValidity.is_valid(outcome.validity) is True
non_routed_cidrs = [ip_network(x) for x in ["2.2.0.0/16", "2.2.3.0/24", "2.2.3.4"]]
non_routed_origin = 0
for cidr in non_routed_cidrs:
trie.insert(cidr, ROA(cidr, non_routed_origin, cidr.prefixlen))
for cidr in non_routed_cidrs:
outcome = trie.get_roa_outcome(cidr, routed_origin)
assert outcome == ROAOutcome(ROAValidity.INVALID_ORIGIN, ROARouted.NON_ROUTED)
outcome = trie.get_roa_outcome(ip_network("1.0.0.0/8"), routed_origin)
assert outcome.validity == ROAValidity.UNKNOWN
assert outcome.routed_status == ROARouted.UNKNOWN
outcome = trie.get_roa_outcome(ip_network("255.255.255.255"), routed_origin)
assert outcome.validity == ROAValidity.UNKNOWN
assert outcome.routed_status == ROARouted.UNKNOWN
assert ROAValidity.is_unknown(outcome.validity) is True
assert ROAValidity.is_invalid(outcome.validity) is False
assert ROAValidity.is_valid(outcome.validity) is False
outcome = trie.get_roa_outcome(ip_network("1.2.4.0/24"), routed_origin)
assert outcome.validity == ROAValidity.INVALID_LENGTH
assert outcome.routed_status == ROARouted.ROUTED
assert ROAValidity.is_unknown(outcome.validity) is False
assert ROAValidity.is_invalid(outcome.validity) is True
assert ROAValidity.is_valid(outcome.validity) is False
outcome = trie.get_roa_outcome(ip_network("1.2.3.0/24"), routed_origin + 1)
assert outcome.validity == ROAValidity.INVALID_ORIGIN
assert outcome.routed_status == ROARouted.ROUTED
assert ROAValidity.is_unknown(outcome.validity) is False
assert ROAValidity.is_invalid(outcome.validity) is True
assert ROAValidity.is_valid(outcome.validity) is False
outcome = trie.get_roa_outcome(ip_network("1.2.4.0/24"), routed_origin + 1)
assert outcome.validity == ROAValidity.INVALID_LENGTH_AND_ORIGIN
assert outcome.routed_status == ROARouted.ROUTED
assert ROAValidity.is_unknown(outcome.validity) is False
assert ROAValidity.is_invalid(outcome.validity) is True
assert ROAValidity.is_valid(outcome.validity) is False
outcome = trie.get_roa_outcome(ip_network("1.2.0.255"), routed_origin)
assert outcome.validity == ROAValidity.INVALID_LENGTH
assert outcome.routed_status == ROARouted.ROUTED
outcome = trie.get_roa_outcome(ip_network("1.3.0.0/16"), routed_origin)
assert outcome.validity == ROAValidity.UNKNOWN
assert outcome.routed_status == ROARouted.UNKNOWN
outcome = trie.get_roa_outcome(ip_network("1.2.0.255"), routed_origin)
assert outcome.validity == ROAValidity.INVALID_LENGTH
assert outcome.routed_status == ROARouted.ROUTED
```
## Installation
* [roa\_checker](#roa_checker)
Install python and pip if you have not already. Then run:
```bash
pip3 install roa_checker
```
This will install the package and all of it's python dependencies.
If you want to install the project for development:
```bash
git clone https://github.com/jfuruness/roa_checker.git
cd roa_checker
pip3 install -e .[test]
pre-commit install
```
To test the development package: [Testing](#testing)
## Testing
* [roa\_checker](#roa_checker)
After installation for development:
```bash
cd roa_checker
python3 -m pytest roa_checker
ruff check roa_checker
ruff format roa_checker
```
To run all tests:
```bash
cd roa_checker
tox --skip-missing-interpreters
```
## Development/Contributing
* [roa\_checker](#roa_checker)
1. Fork it!
2. Create your feature branch: `git checkout -b my-new-feature`
3. Commit your changes: `git commit -am 'Add some feature'`
4. Push to the branch: `git push origin my-new-feature`
5. Submit a pull request
6. Email me at jfuruness@gmail.com if I don't see it after a while
## History
* [roa\_checker](#roa_checker)
* 3.1.2 Removed windows from the classifiers in pyproject.toml
* 3.1.1 Updated dependencies and ruff settings and removed official windows support (since matplotlib doesn't work on windows with pypy in CI/CD)
* 3.1.0 Added get_roa_outcome_w_prefix_str_cached. It caches everything, don't cause a mem err!
* 3.0.2 Updated deps, testing, gh actions, etc
* 3.0.1 Updated dependencies for testing only
* 3.0.0 Added ta attribute to ROAs for the ROACollector, modified properties in the ROA for BGPy compatibility
* 2.0.0
* Previously the ROA checker would only look at the ROAs that were the most specific prefix (and then would check all of those ROAs)
* This is a problem because if there were two ROAs, one that is less specific and valid, and one that is more specific and invalid, the announcements would be considered invalid incorrectly.
* Fixing this unfortunately causes some of the public methods to change (they were wrong before anyways) like get_roa (you can't get a ROA for a prefix, you need to get all ROAs for that prefix)
* 1.1.4 Bug fix for multiple ROA case where multiple ROAs would result in the least valid ROA being selected, rather than the most valid ROA being selected. Thanks for finding this Cameron Morris!
* 1.1.3 Dependency updates
* 1.1.2 Added ROA to top level import
* 1.1.1 mypy and linter fixes
* 1.1.0 Updated test deps
* 1.0.0 Updated package structure, typing, linters, etc, made ROAValidity contains multiple invalid types
* 0.0.1 First working version
## License
* [roa\_checker](#roa_checker)
BSD License (see license file)
Raw data
{
"_id": null,
"home_page": null,
"name": "roa-checker",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "Furuness, prefix, cidr, inet, trie, cidr-trie, roas, roas-trie, ROAs, ROAs-trie, BGP, Hijack, ROA, ROV",
"author": null,
"author_email": "Justin Furuness <jfuruness@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/43/eb/271d8e82c3abd5bbe95f48b3537d6e1bb637f8bd6e636c19a489d77994d1/roa_checker-3.1.2.tar.gz",
"platform": null,
"description": "Informational Badges:\n\n[![PyPI version](https://badge.fury.io/py/roa_checker.svg)](https://badge.fury.io/py/roa_checker)\n![PyPy](https://img.shields.io/badge/PyPy-7.3.17-blue)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/roa_checker)](https://pypi.org/project/roa_checker/)\n![Tests](https://github.com/jfuruness/roa_checker/actions/workflows/tests.yml/badge.svg)\n![Linux](https://img.shields.io/badge/os-Linux-blue.svg)\n![macOS Intel](https://img.shields.io/badge/os-macOS_Intel-lightgrey.svg)\n![macOS ARM](https://img.shields.io/badge/os-macOS_ARM-lightgrey.svg)\n\nSome Linting Badges (Where I could find them):\n\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![Checked with mypy](https://img.shields.io/badge/mypy-checked-2A6DBA.svg)](http://mypy-lang.org/)\n[![Imports: isort](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336)](https://pycqa.github.io/isort/)\n[![Pylint](https://img.shields.io/badge/linting-pylint-yellowgreen)](https://github.com/pylint-dev/pylint/tree/main)\n[![try/except style: tryceratops](https://img.shields.io/badge/try%2Fexcept%20style-tryceratops%20%F0%9F%A6%96%E2%9C%A8-black)](https://github.com/guilatrova/tryceratops)\n\n# roa\\_checker\n\n\n### If you like the repo, it would be awesome if you could add a star to it! It really helps out the visibility. Also for any questions at all we'd love to hear from you at jfuruness@gmail.com\n\nThis package contains a trie of ROAs for fast prefix-origin pair lookups\n\n* [Usage](#usage)\n* [Installation](#installation)\n* [Testing](#testing)\n* [Development/Contributing](#developmentcontributing)\n* [History](#history)\n* [Licence](#license)\n\n## Usage\n* [roa\\_checker](#roa_checker)\n\n\nI can expand these if anyone actually uses this repo (lmk @ jfuruness@gmail.com)\n\n```python\ndef test_tree():\n # TODO: Break up into unit tests\n trie = ROAChecker()\n cidrs = [ip_network(x) for x in [\"1.2.0.0/16\", \"1.2.3.0/24\", \"1.2.3.4\"]]\n routed_origin = 1\n for cidr in cidrs:\n trie.insert(cidr, ROA(cidr, routed_origin, cidr.prefixlen))\n for cidr in cidrs:\n outcome = trie.get_roa_outcome(cidr, routed_origin)\n assert outcome == ROAOutcome(ROAValidity.VALID, ROARouted.ROUTED)\n assert ROAValidity.is_unknown(outcome.validity) is False\n assert ROAValidity.is_invalid(outcome.validity) is False\n assert ROAValidity.is_valid(outcome.validity) is True\n\n non_routed_cidrs = [ip_network(x) for x in [\"2.2.0.0/16\", \"2.2.3.0/24\", \"2.2.3.4\"]]\n non_routed_origin = 0\n for cidr in non_routed_cidrs:\n trie.insert(cidr, ROA(cidr, non_routed_origin, cidr.prefixlen))\n for cidr in non_routed_cidrs:\n outcome = trie.get_roa_outcome(cidr, routed_origin)\n assert outcome == ROAOutcome(ROAValidity.INVALID_ORIGIN, ROARouted.NON_ROUTED)\n\n outcome = trie.get_roa_outcome(ip_network(\"1.0.0.0/8\"), routed_origin)\n assert outcome.validity == ROAValidity.UNKNOWN\n assert outcome.routed_status == ROARouted.UNKNOWN\n outcome = trie.get_roa_outcome(ip_network(\"255.255.255.255\"), routed_origin)\n assert outcome.validity == ROAValidity.UNKNOWN\n assert outcome.routed_status == ROARouted.UNKNOWN\n assert ROAValidity.is_unknown(outcome.validity) is True\n assert ROAValidity.is_invalid(outcome.validity) is False\n assert ROAValidity.is_valid(outcome.validity) is False\n outcome = trie.get_roa_outcome(ip_network(\"1.2.4.0/24\"), routed_origin)\n assert outcome.validity == ROAValidity.INVALID_LENGTH\n assert outcome.routed_status == ROARouted.ROUTED\n assert ROAValidity.is_unknown(outcome.validity) is False\n assert ROAValidity.is_invalid(outcome.validity) is True\n assert ROAValidity.is_valid(outcome.validity) is False\n outcome = trie.get_roa_outcome(ip_network(\"1.2.3.0/24\"), routed_origin + 1)\n assert outcome.validity == ROAValidity.INVALID_ORIGIN\n assert outcome.routed_status == ROARouted.ROUTED\n assert ROAValidity.is_unknown(outcome.validity) is False\n assert ROAValidity.is_invalid(outcome.validity) is True\n assert ROAValidity.is_valid(outcome.validity) is False\n outcome = trie.get_roa_outcome(ip_network(\"1.2.4.0/24\"), routed_origin + 1)\n assert outcome.validity == ROAValidity.INVALID_LENGTH_AND_ORIGIN\n assert outcome.routed_status == ROARouted.ROUTED\n assert ROAValidity.is_unknown(outcome.validity) is False\n assert ROAValidity.is_invalid(outcome.validity) is True\n assert ROAValidity.is_valid(outcome.validity) is False\n outcome = trie.get_roa_outcome(ip_network(\"1.2.0.255\"), routed_origin)\n assert outcome.validity == ROAValidity.INVALID_LENGTH\n assert outcome.routed_status == ROARouted.ROUTED\n outcome = trie.get_roa_outcome(ip_network(\"1.3.0.0/16\"), routed_origin)\n assert outcome.validity == ROAValidity.UNKNOWN\n assert outcome.routed_status == ROARouted.UNKNOWN\n outcome = trie.get_roa_outcome(ip_network(\"1.2.0.255\"), routed_origin)\n assert outcome.validity == ROAValidity.INVALID_LENGTH\n assert outcome.routed_status == ROARouted.ROUTED\n```\n\n## Installation\n* [roa\\_checker](#roa_checker)\n\nInstall python and pip if you have not already. Then run:\n\n```bash\npip3 install roa_checker\n```\n\nThis will install the package and all of it's python dependencies.\n\nIf you want to install the project for development:\n```bash\ngit clone https://github.com/jfuruness/roa_checker.git\ncd roa_checker\npip3 install -e .[test]\npre-commit install\n```\n\nTo test the development package: [Testing](#testing)\n\n\n## Testing\n* [roa\\_checker](#roa_checker)\n\nAfter installation for development:\n\n```bash\ncd roa_checker\npython3 -m pytest roa_checker\nruff check roa_checker\nruff format roa_checker\n```\n\nTo run all tests:\n\n```bash\ncd roa_checker\ntox --skip-missing-interpreters\n```\n\n## Development/Contributing\n* [roa\\_checker](#roa_checker)\n\n1. Fork it!\n2. Create your feature branch: `git checkout -b my-new-feature`\n3. Commit your changes: `git commit -am 'Add some feature'`\n4. Push to the branch: `git push origin my-new-feature`\n5. Submit a pull request\n6. Email me at jfuruness@gmail.com if I don't see it after a while\n\n## History\n* [roa\\_checker](#roa_checker)\n\n* 3.1.2 Removed windows from the classifiers in pyproject.toml\n* 3.1.1 Updated dependencies and ruff settings and removed official windows support (since matplotlib doesn't work on windows with pypy in CI/CD)\n* 3.1.0 Added get_roa_outcome_w_prefix_str_cached. It caches everything, don't cause a mem err!\n* 3.0.2 Updated deps, testing, gh actions, etc\n* 3.0.1 Updated dependencies for testing only\n* 3.0.0 Added ta attribute to ROAs for the ROACollector, modified properties in the ROA for BGPy compatibility\n* 2.0.0\n * Previously the ROA checker would only look at the ROAs that were the most specific prefix (and then would check all of those ROAs)\n * This is a problem because if there were two ROAs, one that is less specific and valid, and one that is more specific and invalid, the announcements would be considered invalid incorrectly.\n * Fixing this unfortunately causes some of the public methods to change (they were wrong before anyways) like get_roa (you can't get a ROA for a prefix, you need to get all ROAs for that prefix)\n* 1.1.4 Bug fix for multiple ROA case where multiple ROAs would result in the least valid ROA being selected, rather than the most valid ROA being selected. Thanks for finding this Cameron Morris!\n* 1.1.3 Dependency updates\n* 1.1.2 Added ROA to top level import\n* 1.1.1 mypy and linter fixes\n* 1.1.0 Updated test deps\n* 1.0.0 Updated package structure, typing, linters, etc, made ROAValidity contains multiple invalid types\n* 0.0.1 First working version\n\n\n## License\n* [roa\\_checker](#roa_checker)\n\nBSD License (see license file)\n",
"bugtrack_url": null,
"license": "Copyright 2020 Justin Furuness Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ",
"summary": "Fast prefix origin pair lookups",
"version": "3.1.2",
"project_urls": {
"homepage": "https://github.com/jfuruness/roa_checker.git"
},
"split_keywords": [
"furuness",
" prefix",
" cidr",
" inet",
" trie",
" cidr-trie",
" roas",
" roas-trie",
" roas",
" roas-trie",
" bgp",
" hijack",
" roa",
" rov"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "7c3d9c53ff1d3acc398f214ad6ebb64042cb6313e33d35efefba91feb86deba2",
"md5": "9453f22fab479406a229609db0126c2b",
"sha256": "5a64fcdddb767f84b6076d5c8a6ebdcb38bf7e387e918948f0b8eda8666af0a8"
},
"downloads": -1,
"filename": "roa_checker-3.1.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9453f22fab479406a229609db0126c2b",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 12547,
"upload_time": "2024-11-23T11:30:24",
"upload_time_iso_8601": "2024-11-23T11:30:24.974763Z",
"url": "https://files.pythonhosted.org/packages/7c/3d/9c53ff1d3acc398f214ad6ebb64042cb6313e33d35efefba91feb86deba2/roa_checker-3.1.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "43eb271d8e82c3abd5bbe95f48b3537d6e1bb637f8bd6e636c19a489d77994d1",
"md5": "8322e0597ee82f3a55ddf2bb81c64b2f",
"sha256": "0a4273110e2714c77b3c9f074424c74e108519f10803750d2a0c7c62b8f330e4"
},
"downloads": -1,
"filename": "roa_checker-3.1.2.tar.gz",
"has_sig": false,
"md5_digest": "8322e0597ee82f3a55ddf2bb81c64b2f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 15983,
"upload_time": "2024-11-23T11:30:27",
"upload_time_iso_8601": "2024-11-23T11:30:27.824689Z",
"url": "https://files.pythonhosted.org/packages/43/eb/271d8e82c3abd5bbe95f48b3537d6e1bb637f8bd6e636c19a489d77994d1/roa_checker-3.1.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-23 11:30:27",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "jfuruness",
"github_project": "roa_checker",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "lib_cidr_trie",
"specs": [
[
"~=",
"1.0"
]
]
}
],
"tox": true,
"lcname": "roa-checker"
}