YÊU CẦU:
Kiểm tra các địa chỉ mac hiện trên switch nếu địa chỉ nào không có trong danh sách các địa chỉ mac đang đăng ký thì lưu thông tin của chúng vào file
THỰC HIỆN:
Chuẩn bị template lưu nội dung file show_mac_address.template:
Value VLAN (\d+)
Value MAC_ADDRESS ([0-9a-fA-F]{4}(?:\.[0-9a-fA-F]{4}){2})
Value INTERFACE ([^,\s]+)
Start
^Vlan\s+Mac Address\s+Type\s+Ports -> TYPE1
TYPE1
^\s*${VLAN}\s+${MAC_ADDRESS}\s+\w+\s+${INTERFACE}(?:\s|$$) -> Record
Code:
'''
- Kết nối switch kiểm tra các địa chỉ mac hiện trên switch nếu địa chỉ nào không có trong danh sách các địa chỉ mac đã đăng ký thì lưu thông tin của chúng vào file
- Câu lệnh sử dụng trong bài:
show mac address-table
- Thư viện cần cài:
+ pip install textfsm
+ pip install pandas
'''
import pandas as pd # dùng khi ghi file csv
from pprint import pprint # dùng để in ra đẹp, dễ nhìn hơn
import textfsm
from netmiko import ConnectHandler
import os
path = os.getcwd() # lấy đường dẫn hiện tại
show_mac_01 = pd.read_csv('mac_store.csv', encoding = "utf-8") # đọc và xử lý chuyển dữ liệu về dạng DataFrame, và sử dụng code utf-8, lấy tất cả các cột hiện có
column_name = 'MAC_ADDRESS' # tên của cột phải tồn tại trong file mac_store.csv
mac_store = show_mac_01.values.tolist() # Trích lọc cột MAC_ADDRESS
mac_store = show_mac_01[column_name].values.tolist()
#pprint(mac_store)
Sw_1 = {
"host":"192.168.100.23",
"username":"admin",
"password":"l2Hsv-Tw!!)",
"device_type":"cisco_ios"
}
print("Connecting to a host: " + Sw_1["host"] + "...\n") # Hiển thị thông báo kết nối tới
# dùng hàm ConnectHandler trong thư viện netmiko để kết nối với Sw_1 với các thông tin đã định nghĩa trong dictionnary
net_connect = ConnectHandler(**Sw_1)
print("Connected successfully")
sh_mac_addr = "show mac address-table"
sh_mac_addr = net_connect.send_command(sh_mac_addr) # thực hiện lênh show arp với chính IP cần tìm
with open('show_mac_address.template') as template: # Mở file show_mac_address.template vừa định nghĩa
fsm = textfsm.TextFSM(template)
sh_mac_addr = fsm.ParseText(sh_mac_addr)
'''
for item in sh_mac_addr :
if item[1] not in mac_store:
print(item)
else: print ("x")
'''
# lấy cụm thứ 2 (là địa chỉ MAC) và kiểm tra nếu chúng không có trong có trong file mac_store.csv thì đưa vào biến mac_diff
mac_diff = [item for item in sh_mac_addr if item[1] not in mac_store]
file_name = f"MAC_diff_{Sw_1['host']}.csv"
df = pd.DataFrame(mac_diff) # convert dữ liệu sang kiểu DataFrame
df.to_csv(file_name, header = fsm.header, index = False) # thực hiện lưu các địa chỉ mac khác nhau vào file
print (f"Cac dia chi MAC chua dang ky duoc luu vao '{file_name}' tai '{path}'")
Tham khảo bài export MAC Address trong switch tại đây
Xong!