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 😉