Examples#

Setting port mirroring#

Example of setting port mirroring. Traffic will be redirected from port 1 to port 2.

import os
import pprint
from dotenv import load_dotenv
from switch_TL_SG108PE.switch_manager import SwitchManager


def load_environment_variables():
    """Loads environment variables from file."""
    current_file_dir = os.path.dirname(os.path.abspath(__file__))
    env_file = os.path.join(current_file_dir, '..', 'environment', '.env.testing')
    load_dotenv(env_file)


def main():
    """Enables traffic mirroring (redirects traffic from port 1 to port 2)."""

    load_environment_variables()

    switch_manager = SwitchManager()
    print('Connecting... ', end='')
    switch_manager.connect(os.environ['ADMIN_IP'], os.environ['ADMIN_USERNAME'], os.environ['ADMIN_PASSWORD'])
    print('OK')
    monitoring = switch_manager.control('monitoring')

    mirrored_ports = [1]
    mirroring_port = 2
    print('Setting port mirroring... ', end='')
    monitoring.enable_port_mirroring(mirrored_ports, mirroring_port)
    print('OK')
    print()

    info = monitoring.mirrored_ports()
    print(f'Mirrored ports:')
    pprint.pprint(info)
    print()

    info = monitoring.mirroring_port()
    print(f'Mirroring port:')
    pprint.pprint(info)
    print()

    switch_manager.disconnect()


if __name__ == '__main__':
    main()

Output:

$ python 02_set_port_mirroring.py
Connecting... OK
Setting port mirroring... OK

Mirrored ports:
{'Mirrored Ports': {'Port 1': {'Egress': 'Enable', 'Ingress': 'Enable'},
                    'Port 2': {'Egress': 'Disable', 'Ingress': 'Disable'},
                    'Port 3': {'Egress': 'Disable', 'Ingress': 'Disable'},
                    'Port 4': {'Egress': 'Disable', 'Ingress': 'Disable'},
                    'Port 5': {'Egress': 'Disable', 'Ingress': 'Disable'},
                    'Port 6': {'Egress': 'Disable', 'Ingress': 'Disable'},
                    'Port 7': {'Egress': 'Disable', 'Ingress': 'Disable'},
                    'Port 8': {'Egress': 'Disable', 'Ingress': 'Disable'}}}

Mirroring port:
{'Mirroring Port': 'Port 2'}

Creating Port Based VLAN#

Creating port base VLAN with ID 2. Ports 1 nad 2 are added.

import os
from dotenv import load_dotenv
from switch_TL_SG108PE.switch_manager import SwitchManager


PORTS = [1, 2]
VLAN_ID = 2


def load_environment_variables():
    """Loads environment variables from file."""
    current_file_dir = os.path.dirname(os.path.abspath(__file__))
    env_file = os.path.join(current_file_dir, '..', 'environment', '.env.testing')
    load_dotenv(env_file)


def main():
    """Creates Port Based VLAN 2 with ports 1 and 2."""

    load_environment_variables()

    switch_manager = SwitchManager()
    switch_manager.connect(os.environ['ADMIN_IP'], os.environ['ADMIN_USERNAME'], os.environ['ADMIN_PASSWORD'])
    vlan = switch_manager.control('VLAN')

    vlan.enable_port_based_vlan_configuration()
    vlan.add_port_based_vlan(vlan_id=VLAN_ID, ports=PORTS)
    vlan_configuration = vlan.port_based_vlan_configuration()
    print(vlan_configuration)

    switch_manager.disconnect()


if __name__ == '__main__':
    main()

Output:

$ python 03_create_port_based_vlan.py
{'Port Based VLAN Configuration': 'Enable', 'VLANs': [{'VLAN ID': '1', 'VLAN Member Port': '3-8'}, {'VLAN ID': '2', 'VLAN Member Port': '1-2'}]}wink:|

Creating CLI Script#

Basic script with error handling.

import sys
import argparse
from switch_TL_SG108PE.switch_manager import SwitchManager
from switch_TL_SG108PE.exceptions import LoginException, TpLinkSwitchException, LogoutException


def argument_parser():
    """Parses user arguments."""
    parser = argparse.ArgumentParser(
        prog='psv',
        description='Port Statistics Viewer (PSV) returns statistics for given port.'
    )
    parser.add_argument('-i', '--ip',  help='IP address of switch admin page.',
                        type=str, required=True)
    parser.add_argument('-l', '--login', help='Username to authenticate.',
                        type=str, required=True)
    parser.add_argument('-p', '--password', help='Password to authenticate.',
                        type=str, required=True)
    parser.add_argument('-s', '--switch-port', help='Port number.',
                        type=int, required=True)
    args = parser.parse_args()
    return args


def show(statistics, port):
    """Shows port statistics."""
    label = f'Port {port}'
    info = statistics[label]
    print('[*]', label)
    print('Status:       ', info['Status'])
    print('Link Status:  ', info['Link Status'])
    print('TxGoodPkt:    ', info['TxGoodPkt'])
    print('TxBadPkt:     ', info['TxBadPkt'])
    print('RxGoodPkt:    ', info['RxGoodPkt'])
    print('RxBadPkt:     ', info['RxBadPkt'])


def main():
    """Gets port statistics."""
    args = argument_parser()
    switch_manager = SwitchManager()

    try:
        switch_manager.connect(args.ip, args.login, args.password)
    except LoginException:  # Catch errors raise by given function (check them in method docs)
        print('Unable to connect to the switch management page. Check credentials.')
        sys.exit(1)

    monitoring = switch_manager.control('monitoring')

    try:
        port_statistics = monitoring.port_statistics()
        show(port_statistics, args.switch_port)
    except TpLinkSwitchException as err:  # If method doesn't raise any errors, catch base library error
        print(f'Unable to read port statistics: {err}')
        sys.exit(1)

    try:
        switch_manager.disconnect()
    except LogoutException:
        print('Unable to disconnect from the switch management page.')
        sys.exit(1)


if __name__ == '__main__':
    main()

Output:

$ python 04_psv.py -i=192.168.1.42 -l=admin -p=admin -s=3
[*] Port 3
Status:        Enabled
Link Status:   Link Down
TxGoodPkt:     0
TxBadPkt:      0
RxGoodPkt:     0
RxBadPkt:      0

Yes, I know - password 😉