roa-checker


Nameroa-checker JSON
Version 1.1.4 PyPI version JSON
download
home_page
SummaryFast prefix origin pair lookups
upload_time2024-03-17 20:50:56
maintainer
docs_urlNone
author
requires_python>=3.10
licenseCopyright 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 No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [![Python 3.10](https://img.shields.io/badge/python-3.10-blue.svg)](https://www.python.org/downloads/release/python-3100/)
[![Python 3.11](https://img.shields.io/badge/python-3.11-blue.svg)](https://www.python.org/downloads/release/python-3110/)
[![Python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)](https://www.python.org/downloads/release/python-3120/)
![Tests](https://github.com/jfuruness/bgpy/actions/workflows/tests.yml/badge.svg)
[![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/)

# roa\_checker
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)

```python
from ipaddress import ip_network

from roa_checker import ROAChecker, ROARouted, ROAValidity


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, routed_origin, cidr.prefixlen)
    for cidr in cidrs:
        assert trie.get_roa(cidr, routed_origin).prefix == cidr
        validity, routed = trie.get_validity(cidr, routed_origin)
        assert validity, routed == (ROAValidity.VALID, ROARouted.ROUTED,)
        assert ROAValidity.is_unknown(validity) is False
        assert ROAValidity.is_invalid(validity) is False
        assert ROAValidity.is_valid(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, non_routed_origin, cidr.prefixlen)
    for cidr in non_routed_cidrs:
        assert trie.get_roa(cidr, non_routed_origin).prefix == cidr
        assert trie.get_validity(cidr, routed_origin) == (
            ROAValidity.INVALID_ORIGIN,
            ROARouted.NON_ROUTED,
        )

    validity, routed = trie.get_validity(ip_network("1.0.0.0/8"), routed_origin)
    assert validity == ROAValidity.UNKNOWN
    assert routed == ROARouted.UNKNOWN
    validity, routed = trie.get_validity(ip_network("255.255.255.255"), routed_origin)
    assert validity == ROAValidity.UNKNOWN
    assert routed == ROARouted.UNKNOWN
    assert ROAValidity.is_unknown(validity) is True
    assert ROAValidity.is_invalid(validity) is False
    assert ROAValidity.is_valid(validity) is False
    validity, routed = trie.get_validity(ip_network("1.2.4.0/24"), routed_origin)
    assert validity == ROAValidity.INVALID_LENGTH
    assert routed == ROARouted.ROUTED
    assert ROAValidity.is_unknown(validity) is False
    assert ROAValidity.is_invalid(validity) is True
    assert ROAValidity.is_valid(validity) is False
    validity, routed = trie.get_validity(ip_network("1.2.3.0/24"), routed_origin + 1)
    assert validity == ROAValidity.INVALID_ORIGIN
    assert routed == ROARouted.ROUTED
    assert ROAValidity.is_unknown(validity) is False
    assert ROAValidity.is_invalid(validity) is True
    assert ROAValidity.is_valid(validity) is False
    validity, routed = trie.get_validity(ip_network("1.2.4.0/24"), routed_origin + 1)
    assert validity == ROAValidity.INVALID_LENGTH_AND_ORIGIN
    assert routed == ROARouted.ROUTED
    assert ROAValidity.is_unknown(validity) is False
    assert ROAValidity.is_invalid(validity) is True
    assert ROAValidity.is_valid(validity) is False
    validity, routed = trie.get_validity(ip_network("1.2.0.255"), routed_origin)
    assert validity == ROAValidity.INVALID_LENGTH
    assert routed == ROARouted.ROUTED
    validity, routed = trie.get_validity(ip_network("1.3.0.0/16"), routed_origin)
    assert validity == ROAValidity.UNKNOWN
    assert routed == ROARouted.UNKNOWN
    validity, routed = trie.get_validity(ip_network("1.2.0.255"), routed_origin)
    assert validity == ROAValidity.INVALID_LENGTH
    assert routed == 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
```

To run all tests:

```bash
tox
```

## 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)
* 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": "",
    "name": "roa-checker",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": "",
    "keywords": "Furuness,prefix,cidr,inet,trie,cidr-trie,roas,roas-trie,ROAs,ROAs-trie,BGP,Hijack,ROA,ROV",
    "author": "",
    "author_email": "Justin Furuness <jfuruness@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/dc/52/a90228dc11c63584f92498eb8136e3cd6fcdda0751e7678e2db8b37968d8/roa_checker-1.1.4.tar.gz",
    "platform": null,
    "description": "[![Python 3.10](https://img.shields.io/badge/python-3.10-blue.svg)](https://www.python.org/downloads/release/python-3100/)\n[![Python 3.11](https://img.shields.io/badge/python-3.11-blue.svg)](https://www.python.org/downloads/release/python-3110/)\n[![Python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)](https://www.python.org/downloads/release/python-3120/)\n![Tests](https://github.com/jfuruness/bgpy/actions/workflows/tests.yml/badge.svg)\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\n# roa\\_checker\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```python\nfrom ipaddress import ip_network\n\nfrom roa_checker import ROAChecker, ROARouted, ROAValidity\n\n\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, routed_origin, cidr.prefixlen)\n    for cidr in cidrs:\n        assert trie.get_roa(cidr, routed_origin).prefix == cidr\n        validity, routed = trie.get_validity(cidr, routed_origin)\n        assert validity, routed == (ROAValidity.VALID, ROARouted.ROUTED,)\n        assert ROAValidity.is_unknown(validity) is False\n        assert ROAValidity.is_invalid(validity) is False\n        assert ROAValidity.is_valid(validity) is True\n\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, non_routed_origin, cidr.prefixlen)\n    for cidr in non_routed_cidrs:\n        assert trie.get_roa(cidr, non_routed_origin).prefix == cidr\n        assert trie.get_validity(cidr, routed_origin) == (\n            ROAValidity.INVALID_ORIGIN,\n            ROARouted.NON_ROUTED,\n        )\n\n    validity, routed = trie.get_validity(ip_network(\"1.0.0.0/8\"), routed_origin)\n    assert validity == ROAValidity.UNKNOWN\n    assert routed == ROARouted.UNKNOWN\n    validity, routed = trie.get_validity(ip_network(\"255.255.255.255\"), routed_origin)\n    assert validity == ROAValidity.UNKNOWN\n    assert routed == ROARouted.UNKNOWN\n    assert ROAValidity.is_unknown(validity) is True\n    assert ROAValidity.is_invalid(validity) is False\n    assert ROAValidity.is_valid(validity) is False\n    validity, routed = trie.get_validity(ip_network(\"1.2.4.0/24\"), routed_origin)\n    assert validity == ROAValidity.INVALID_LENGTH\n    assert routed == ROARouted.ROUTED\n    assert ROAValidity.is_unknown(validity) is False\n    assert ROAValidity.is_invalid(validity) is True\n    assert ROAValidity.is_valid(validity) is False\n    validity, routed = trie.get_validity(ip_network(\"1.2.3.0/24\"), routed_origin + 1)\n    assert validity == ROAValidity.INVALID_ORIGIN\n    assert routed == ROARouted.ROUTED\n    assert ROAValidity.is_unknown(validity) is False\n    assert ROAValidity.is_invalid(validity) is True\n    assert ROAValidity.is_valid(validity) is False\n    validity, routed = trie.get_validity(ip_network(\"1.2.4.0/24\"), routed_origin + 1)\n    assert validity == ROAValidity.INVALID_LENGTH_AND_ORIGIN\n    assert routed == ROARouted.ROUTED\n    assert ROAValidity.is_unknown(validity) is False\n    assert ROAValidity.is_invalid(validity) is True\n    assert ROAValidity.is_valid(validity) is False\n    validity, routed = trie.get_validity(ip_network(\"1.2.0.255\"), routed_origin)\n    assert validity == ROAValidity.INVALID_LENGTH\n    assert routed == ROARouted.ROUTED\n    validity, routed = trie.get_validity(ip_network(\"1.3.0.0/16\"), routed_origin)\n    assert validity == ROAValidity.UNKNOWN\n    assert routed == ROARouted.UNKNOWN\n    validity, routed = trie.get_validity(ip_network(\"1.2.0.255\"), routed_origin)\n    assert validity == ROAValidity.INVALID_LENGTH\n    assert routed == 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\n```\n\nTo run all tests:\n\n```bash\ntox\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* 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": "1.1.4",
    "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": "f7663f3397fe4cbe547043af9be4ec17d4154efc586def5813829c94661b421a",
                "md5": "e5fce3f74c395afe3dd268ce4f38be3e",
                "sha256": "8e654908e901f11b01136635fac3a88b8dc88457b8eb6c3d9095c71f01d03006"
            },
            "downloads": -1,
            "filename": "roa_checker-1.1.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "e5fce3f74c395afe3dd268ce4f38be3e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 10278,
            "upload_time": "2024-03-17T20:50:55",
            "upload_time_iso_8601": "2024-03-17T20:50:55.633834Z",
            "url": "https://files.pythonhosted.org/packages/f7/66/3f3397fe4cbe547043af9be4ec17d4154efc586def5813829c94661b421a/roa_checker-1.1.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "dc52a90228dc11c63584f92498eb8136e3cd6fcdda0751e7678e2db8b37968d8",
                "md5": "27b0a985487ee6d0593650c5946cc5a3",
                "sha256": "89c663083675004e7ad36e85d47acd84edb9a22bd54e003c34c4a4a183ac2910"
            },
            "downloads": -1,
            "filename": "roa_checker-1.1.4.tar.gz",
            "has_sig": false,
            "md5_digest": "27b0a985487ee6d0593650c5946cc5a3",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 10262,
            "upload_time": "2024-03-17T20:50:56",
            "upload_time_iso_8601": "2024-03-17T20:50:56.806843Z",
            "url": "https://files.pythonhosted.org/packages/dc/52/a90228dc11c63584f92498eb8136e3cd6fcdda0751e7678e2db8b37968d8/roa_checker-1.1.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-17 20:50:56",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "jfuruness",
    "github_project": "roa_checker",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "tox": true,
    "lcname": "roa-checker"
}
        
Elapsed time: 0.21272s