Skip to main content

A collection of Python objects and functions for managing ranges of VLANs, TCP/UDP ports, IP protocol numbers, interfaces.

Project description

A collection of Python objects and functions for managing ranges of VLANs, TCP/UDP ports, IP protocol numbers, interfaces. Recommended for scripting in telecommunications networks.

1 Installation

Install the package from pypi.org release

pip install netports

or install the package from github.com release

pip install https://github.com/vladimirs-git/netports/archive/refs/tags/0.5.1.tar.gz

or install the package from github.com repository

pip install git+https://github.com/vladimirs-git/netports@0.5.1

2 TCP/UDP ports

2.1 itcp(items, verbose, all)

Integer TCP/UDP Ports - Sorting TCP/UDP ports and removing duplicates.

Parameter

Type

Description

items

str, List[int], List[str]

Range of TCP/UDP ports, can be unsorted and with duplicates

verbose

bool

True - all ports in verbose mode: [1, 2, …, 65535], False - all ports in brief mode: [-1] (reduces RAM usage), by default False

all

bool

True - Returns all TCP/UDP ports: [1, 2, …, 65535], or [-1] for verbose=False

Return

List[int] of unique sorted TCP/UDP ports

Raises

ValueError if TCP/UDP ports are outside valid range 1…65535

import netports

ports = netports.itcp("80,20,21-22")
print(ports)
# [20, 21, 22, 80]

ports = netports.itcp(["20-22", "80", 22])
print(ports)
# [20, 21, 22, 80]

ports = netports.itcp(all=True)
print(ports)
# [1, 2, ..., 65535]

try:
        netports.itcp("65536")
except ValueError as ex:
        print(ex)
# invalid_port=[65536], expected in range 1...65535

2.2 stcp(items, verbose, all)

String TCP/UDP ports - Sorting TCP/UDP ports and removing duplicates.

Parameter

Type

Description

items

str, List[int], List[str]

Range of TCP/UDP ports, can be unsorted and with duplicates

verbose

bool

True - all ports in verbose mode: [1, 2, …, 65535], False - all ports in brief mode: [-1] (reduces RAM usage), by default False

all

bool

True - Returns all TCP/UDP ports: “1-65535”

Return

str of unique sorted TCP/UDP ports

Raises

ValueError if TCP/UDP ports are outside valid range 1…65535

import netports

ports = netports.stcp("80,20-21,80")
print(ports)
# 20-21,80

ports = netports.stcp(["80", "20-21", "20"])
print(ports)
# 20-21,80

ports = netports.stcp([80, 80, 20, 21])
print(ports)
# 20-21,80

ports = netports.stcp(all=True)
print(ports)
# 1-65535

try:
        netports.stcp("65536")
except ValueError as ex:
        print(ex)
# invalid_port=[65536], expected in range 1...65535

3 VLAN IDs

3.1 ivlan(items, verbose, all, splitter, range_splitter, platform)

Integer VLAN IDs - Sorting VLANs and removing duplicates.

Parameter

Type

Description

items

str, List[int], List[str]

Range of VLANs, can be unsorted and with duplicates

verbose

bool

True - all VLAN IDs in verbose mode: [1, 2, …, 65535], False - all VLAN IDs in brief mode: [-1] (reduces RAM usage), by default False

all

bool

True - Returns all VLAN IDs: [1, 2, …, 4094], or [-1] for verbose=False

splitter

str

Separator character between items, by default “,”

range_splitter

str

Separator between min and max numbers in range, by default “-”

platform

str

Set splitter and range_splitter to platform specific values. Defined: “cisco” (Cisco IOS), “hpe” (Hewlett Packard Enterprise).

Return

List[int] of unique sorted VLANs

Raises

ValueError if VLANs are outside valid range 1…4094

import re
import netports

config = """
interface FastEthernet0/1
  switchport mode trunk
  switchport trunk allowed vlan 1,3-5
  end
"""
trunk = re.findall("vlan(.+)", config)[0]  # " 1,3-5"
vlans = netports.ivlan(trunk)
print(vlans)
# [1, 3, 4, 5]

vlans = netports.ivlan(["1", "3-4", "4-5"])
print(vlans)
# [1, 3, 4, 5]

ports = netports.ivlan(all=True)
print(ports)
# [1, 2, ..., 4094]

vlans = netports.ivlan("1 3 to 5", platform="hpe")
print(vlans)
# [1, 3, 4, 5]

vlans = netports.ivlan("1 3 to 5", splitter=" ", range_splitter=" to ")
print(vlans)
# [1, 3, 4, 5]

try:
        netports.ivlan("4095")
except ValueError as ex:
        print(ex)
# invalid_vlan=[4095], expected in range 1...4094

3.2 svlan(items, verbose, all, splitter, range_splitter, platform)

String VLAN IDs - Sorting VLANs and removing duplicates.

Parameter

Type

Description

items

str, List[int], List[str]

Range of VLANs, can be unsorted and with duplicates

verbose

bool

True - all VLAN IDs in verbose mode: [1, 2, …, 65535], False - all VLAN IDs in brief mode: [-1] (reduces RAM usage), by default False

all

bool

True - Returns all VLAN IDs: “1-4094”

splitter

str

Separator character between items, by default “,”

range_splitter

str

Separator between min and max numbers in range, by default “-”

platform

str

Set splitter and range_splitter to platform specific values. Defined: “cisco” (Cisco IOS), “hpe” (Hewlett Packard Enterprise).

Return

str of unique sorted VLANs

Raises

ValueError if VLANs are outside valid range 1…4094

import netports

vlans = netports.svlan("3-4,1,4-5")
print(vlans)
# 1,3-5

vlans = netports.svlan(["1", "3-5", "3-4", "4-5"])
print(vlans)
# 1,3-5

vlans = netports.svlan([1, 3, 4, 5])
print(vlans)
# 1,3-5

ports = netports.svlan(all=True)
print(ports)
# 1-4094

vlans = netports.svlan("1 3 to 5", platform="hpe")
print(vlans)
# 1 3 to 5

vlans = netports.svlan("1 3 to 5", splitter=" ", range_splitter=" to ")
print(vlans)
# 1 3 to 5

try:
        netports.svlan("4095")
except ValueError as ex:
        print(ex)
# invalid_vlan=[4095], expected in range 1...4094

4 IP protocols

4.1 IP_NAMES, IP_NUMBERS

Dictionary with known IP protocol names and IDs listed in https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers

from pprint import pprint
import netports

# IP_NAMES
pprint(netports.IP_NAMES)
#  'icmp': {'description': 'Internet Control Message Protocol, RFC 792',
#           'name': 'icmp',
#           'number': 1},
#  'tcp': {'description': 'Transmission Control Protocol, RFC 793',
#          'name': 'tcp',
#          'number': 6},
# ...

# IP_NUMBERS
pprint(netports.IP_NUMBERS)
# {0: {'description': 'IPv6 Hop-by-Hop Option, RFC 8200',
#      'name': 'hopopt',
#      'number': 0},
#  6: {'description': 'Transmission Control Protocol, RFC 793',
#      'name': 'tcp',
#      'number': 6},
# ...

4.2 iip(items, verbose, all, strict)

Integer IP protocol numbers - Sorts numbers and removes duplicates.

Parameter

Type

Description

items

str, List[int], List[str]

Range of IP protocol numbers, can be unsorted and with duplicates, “ip” - Return all IP protocol numbers: [0, 1, …, 255]

verbose

bool

True - all protocols in verbose mode: [0, 1, …, 255], False - all protocols in brief mode: [-1] (reduces RAM usage), by default False

strict

bool

True - Raises ValueError, if the protocol is unknown, False - Skips unknown protocols, by default - True

all

bool

True - Return all IP protocol numbers: [0, 1, …, 255]

Return

List[int] of unique sorted IP protocol numbers

Raises

ValueError if IP protocol numbers are outside valid range 0…255

import netports

ports = netports.iip("icmp,tcp,7,255")
print(ports)
# [1, 6, 7, 255]

ports = netports.iip(["icmp", "tcp,1", "6-7", 255])
print(ports)
# [1, 6, 7, 255]

ports = netports.iip(all=True)
print(ports)
# [0, 1, ..., 255]

try:
        netports.iip("265")
except ValueError as ex:
        print(ex)
# invalid_ip_numbers=[265], expected in range 0...255

4.3 sip(items, verbose, all)

String IP protocol numbers - Sorts numbers and removes duplicates.

Parameter

Type

Description

items

str, List[int], List[str]

Range of IP protocol numbers, can be unsorted and with duplicates. “ip” - mean all numbers in range 0…255.

verbose

bool

True - all protocols in verbose mode: [0, 1, …, 255], False - all protocols in brief mode: [-1] (reduces RAM usage), by default False

strict

bool

True - Raises ValueError, if the protocol is unknown, False - Skips unknown protocols, by default - True

all

bool

True - Return all IP protocol numbers: “0-255”

Return

str of unique sorted IP protocol numbers

Raises

ValueError if IP protocol numbers are outside valid range 0…255

import netports

ports = netports.sip("icmp,tcp,7,255")
print(ports)
# 1,6-7,255

ports = netports.sip(["icmp", "icmp,tcp,1", "6-7", 255])
print(ports)
# 1,6-7,255

ports = netports.sip([255, 255, 1, 6, 7])
print(ports)
# 1,6-7,255

ports = netports.sip(all=True)
print(ports)
# 0-255

try:
        netports.sip("265")
except ValueError as ex:
        print(ex)
# invalid_ip_numbers=[265], expected in range 0...255

4.4 ip_pairs(items, strict)

IP protocol Names and Numbers - Splits items to names and numbers and removes duplicates.

Parameter

Type

Description

items

str, List[int], List[str]

Range of IP protocol names and numbers, can be unsorted and with duplicates

verbose

bool

True - all protocols in verbose mode: [0, 1, …, 255], False - all protocols in brief mode: [-1] (reduces RAM usage), by default False

Return
List[Tuple[int, str]] Pairs of IP protocol number and name,

List[str] Undefined protocol names and invalid numbers

import netports

pairs, invalid = netports.ip_pairs("1,tcp,255,256,typo")
print("pairs", pairs)
print("invalid", invalid)
# pairs [(1, 'icmp'), (6, 'tcp'), (255, '')]
# invalid ['256', 'typo']

5 Objects

Range(items, splitter, range_splitter, strict)

Range - An object that converts items to object that represents range as str and as List[int]. Object implements most of the set and list methods that handle the Range.numbers attribute.

Parameter

Type

Description

items

str, List[int]

Range of numbers. Numbers can be unsorted and duplicated.

splitter

str

Separator character between items, by default “,”

range_splitter

str

Separator between min and max numbers in range, by default “-”

strict

bool

True - Raise ValueError, if in items is invalid item. False - Make Range without invalid items. By default True.

Attributes demonstration

from netports import Range

range_o = Range("1,3-5")
assert range_o.line == "1,3-5"
assert str(range_o) == "1,3-5"
assert range_o.numbers() == [1, 3, 4, 5]
assert list(range_o) == [1, 3, 4, 5]
assert Range("1,3-5") == Range([1, 3, 4, 5])

# Raise ValueError if one of item is invalid
try:
        Range("1,3-5,typo")
except ValueError as ex:
        print(ex)
# invalid item="typo" in line="1,3-5,typo"

# Make Range without invalid items (not raise ValueError)
range_o = Range("1,3-5,typo", strict=False)
assert range_o.line == "1,3-5"

Sorts numbers and removes duplicates

from netports import Range

ranges1 = Range("3-5,1")
print(ranges1)
# 1,3-5

ranges2 = Range("3-5,1,3-5,1,3-4,4-5")
print(ranges2)
# 1,3-5

assert ranges1 == ranges2

Range with custom splitters

from netports import Range

range_o = Range("1, 3-5, 7-9", splitter=", ")
assert range_o.line == "1, 3-5, 7-9"
assert range_o.numbers() == [1, 3, 4, 5, 7, 8, 9]

range_o = Range("1 3 to 5 7 to 9", splitter=" ", range_splitter=" to ")
assert range_o.line == "1 3 to 5 7 to 9"
assert range_o.numbers() == [1, 3, 4, 5, 7, 8, 9]

5.1 Range operators

Range object implements:

  • Arithmetic operators: +, -

  • Reference to numbers in range by index

Operator

Return

Description

Range(“1,4”) + Range(“3,5”)

Range(“1,3-5”)

Add two objects

Range(“1-5”) - Range(“2”)

Range(“1,3-5”)

Subtract two objects

Range(“1,3-5”)[1]

3

Get number by index

Range(“1,3-5”)[1:3]

[3, 4]

Get numbers by slice

from netports import Range

range_o = Range("1,3") + Range("3-5")
assert str(range_o) == "1,3-5"

range_o = Range("1-5") - Range("2")
assert str(range_o) == "1,3-5"

assert range_o[1] == 3
assert range_o[1:3] == [3, 4]

for number in Range("1,3-5"):
        print(number)
# 1
# 3
# 4
# 5

5.2 Range methods

Range object implements most of set and list methods.

Method

Description

add(other)

Adds other Range object to self

append(number)

Appends number to self

clear()

Removes all numbers from self

copy()

Returns a copy of self Range object

difference(other)

Returns the Range object of the difference between self and other Range

difference_update(other)

Removes other Range from self

discard(number)

Removes the specified number from self Range

extend(numbers)

Adds List[int] numbers to self

index(number)

Returns index of number, raises ValueError if the number is not present in range

intersection(other)

Returns Range which is the intersection of self and other Range

intersection_update(other)

Removes numbers of other Range in self, that are not present in other

isdisjoint(other)

Returns whether self numbers and other Range numbers have intersection or not

issubset(other)

Returns whether other Range numbers contains self numbers or not

issuperset(other)

Returns whether self Range numbers contains other Range numbers set or not

pop()

Removes and returns last number in Range, raises IndexError if list is empty or index is out of range

remove(number)

Removes the specified number from self Range, raises ValueError if the numbers is not present

symmetric_difference(other)

Returns Range object with the symmetric differences of self and other Range

symmetric_difference_update(other)

Inserts the symmetric differences from self Range and other Range

update(other)

Returns Range of the union of self Range and other Range

from netports import Range

range_o = Range("1,3") + Range("3-5")
print(range_o)
# 1,3-5

range_o.append(2)
print(range_o)
# 1-5

print(range_o.difference(Range("2,4")))
# 1,3,5

range_o.difference_update(Range("2,4"))
print(range_o)
# 1,3,5

range_o.discard(3)
print(range_o)
# 1,5

range_o.extend([3, 4])
print(range_o)
# 1,3-5

print(range_o.index(5))
# 3

print(range_o.intersection(Range("1-4")))
# 1,3-4

range_o.intersection_update(Range("1-4"))
print(range_o)
# 1,3-4

print(range_o.pop())
print(range_o)
# 4
# 1,3

range_o.remove(3)
print(range_o)
# 1

range_o.update(Range("3,4,5"))
print(range_o)
# 1,3-5

6 Numbers

6.1 parse_range(line, splitter, range_splitter)

Parse Range - Parses range from line. Removes white spaces considering splitters. Sorts numbers and removes duplicates.

Parameter

Type

Description

line

str

Range of numbers, can be unsorted and with duplicates

splitter

str

Separator character between items, by default “,”

range_splitter

str

Separator between min and max numbers in range, by default “-”

Return

Range object

Sorts numbers and removes duplicates

import netports

range_o = netports.parse_range("3\t- 5, 1 , 3-5\t,1\n")
print(f"{range_o!r}")
print(range_o.line)
print(range_o.numbers())
# Range("1,3-5")
# 1,3-5
# [1, 3, 4, 5]

Range with custom splitter and range_splitter

import netports

range_o = netports.parse_range("1 3 to 5 1 3 to 5", splitter=" ", range_splitter=" to ")
print(f"{range_o!r}")
print(range_o.line)
print(range_o.numbers())
# Range("1 3 to 5", splitter=" ", range_splitter=" to ")
# 1 3 to 5
# [1, 3, 4, 5]

6.2 inumbers(items, splitter, range_splitter)

Integer Numbers - Sorts numbers and removes duplicates.

Parameter

Type

Description

items

str, List[int], List[str]

Range of numbers, can be unsorted and with duplicates

splitter

str

Separator character between items, by default “,”

range_splitter

str

Separator between min and max numbers in range, by default “-”

Return

List[int] of unique sorted numbers

Converts unsorted range to sorted List[int] without duplicates

import netports

ports = netports.inumbers("3-5,1,3-5,1")
print(ports)
# [1, 3, 4, 5]

ports = netports.inumbers(["3-5,1", "3-4", "1"])
print(ports)
# [1, 3, 4, 5]

ports = netports.inumbers([3, 4, 5, 1, 3, 4, 5, 1])
print(ports)
# [1, 3, 4, 5]

Converts unsorted range to List[int] with custom splitters

import netports

ports = netports.inumbers("3 to 5 1 4 to 5 1", splitter=" ", range_splitter=" to ")
print(ports)
# [1, 3, 4, 5]

6.3 snumbers(items, splitter, range_splitter)

String Numbers - Sorts numbers and removes duplicates.

Parameter

Type

Description

items

str, List[int], List[str]

Range of numbers, can be unsorted and with duplicates

splitter

str

Separator character between items, by default “,”

range_splitter

str

Separator between min and max numbers in range, by default “-”

Return

str of unique sorted numbers

Converts unsorted range to sorted str without duplicates

import netports

ports = netports.snumbers("3-5,1,3-5,1")
print(ports)
# 1,3-5

ports = netports.snumbers(["3-5,1", "3-4", "1"])
print(ports)
# 1,3-5

ports = netports.snumbers([3, 4, 5, 1, 3, 4, 5, 1])
print(ports)
# 1,3-5

Converts unsorted range to str with custom splitters

import netports

ports = netports.snumbers("3 to 5 1 4 to 5 1", splitter=" ", range_splitter=" to ")
print(ports)
# 1 3 to 5

6.4 Interface4(line, splitter)

Interface4 - An object of interface name, that can contain up to 4 indexes. Sorts the interfaces by indexes (not by alphabetic).

Parameter

Type

Description

line

str

Interface name that can contain up to 4 indexes

splitter

Iterable[str]

Separator characters between indexes. By default “,./:”

Attributes demonstration

from netports import Interface4

interface = Interface4("interface Ethernet1/2/3.4")
assert interface.line == "interface Ethernet1/2/3.4"
assert interface.name == "Ethernet1/2/3.4"
assert interface.id0 == "interface Ethernet"
assert interface.id1 == 1
assert interface.id2 == 2
assert interface.id3 == 3
assert interface.id4 == 4

Interface with custom splitter between indexes. Splitter is ignored when comparing

from netports import Interface4

interface1 = Interface4("interface Ethernet1/2/3.4")
interface2 = Interface4("interface Ethernet1-2-3+4", splitter="-+")
assert interface1 == interface2

Sorting by indexes

from netports import Interface4

lines = [
        "interface Ethernet1/1/1.1",
        "interface Ethernet10/1/1.1",
        "interface Ethernet2/1/1.1",
        "interface Ethernet1/2/1.1",
        "interface Ethernet1/20/1.1",
        "interface Ethernet1/3/1.1",
]

# Alphabetical sorting. This approach is not convenient in scripting
for line in sorted(lines):
        print(line)
print()
# interface Ethernet1/1/1.1
# interface Ethernet1/2/1.1
# interface Ethernet1/20/1.1
# interface Ethernet1/3/1.1
# interface Ethernet10/1/1.1
# interface Ethernet2/1/1.1

# Sorting by indexes. This approach is useful in scripting
interfaces = [Interface4(line) for line in lines]
for interface in sorted(interfaces):
        print(interface)
# interface Ethernet1/1/1.1
# interface Ethernet1/2/1.1
# interface Ethernet1/3/1.1
# interface Ethernet1/20/1.1
# interface Ethernet2/1/1.1
# interface Ethernet10/1/1.1

Grouping interfaces by 3rd index

from netports import Interface4

lines = [
        "interface Ethernet101/1/1",
        "interface Ethernet101/1/2",
        "interface Ethernet101/1/3",
        "interface Ethernet102/1/1",
        "interface Ethernet102/1/2",
        "interface Ethernet102/1/3",
]
interfaces = [Interface4(line) for line in lines]
interfaces.sort(key=lambda o: o.id3)
for interface in interfaces:
        print(interface)
# interface Ethernet101/1/1
# interface Ethernet102/1/1
# interface Ethernet101/1/2
# interface Ethernet102/1/2
# interface Ethernet101/1/3
# interface Ethernet102/1/3

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

netports-0.5.1.tar.gz (24.9 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page