/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

Học Python Qua Ví Dụ #008 - Python List POP, Del, Remove, Copy, Clear - Trong Python

Yêu Cầu:
1. List POP - Lấy ra
2. List Del - Xóa phần tử
3. List Remove - Xóa phần tử
4. List Copy
5. List Clear:

Thực hiện:
1. List POP: phương thức lấy ra và xóa phần tử trong list dựa vào index đưa vào
Code:
ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
print()
print(ip_list)
print()
ip_list.pop(2) # xóa phần tử có index là 2, xóa 192.168.1.12 
print("List sau khi xoa:", ip_list)

Kết quả:
C:\python>python Demo.py
['192.168.1.10', '192.168.1.11', '192.168.1.12']

List sau khi xoa: ['192.168.1.10', '192.168.1.11']

C:\python>

Chúng ta thấy 192.168.1.12 đã được xóa ra khỏi list

2. List Del: phương thức xóa phần tử trong list dựa vào index đưa vào

Code:
ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
print()
print(ip_list)
print()
del ip_list[1] # xóa phần tử có index là 1, xóa 192.168.1.11 
print("List sau khi xoa:", ip_list)

Kết quả:
C:\python>python Demo.py
['192.168.1.10', '192.168.1.11', '192.168.1.12']

List sau khi xoa: ['192.168.1.10', '192.168.1.12']

C:\python>

Sự khác nhau giữa pop là del: cùng là xóa phần tử trong list, tuy nhiên với POP chúng ta có lấy/tách phần tử đó ra có thể áp dụng trong một số trường hợp.

3. List Remove: phương thứ xóa phần tử dự vào giá trị đưa vào (del: dùng index, remote: dùn value)
Code:
ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
print()
print(ip_list)
print()
ip_list.remove("192.168.1.12") # xóa phần tử có giá trị 192.168.1.12 
print("List sau khi xoa:", ip_list)

Kết quả:
C:\python>python Demo.py
['192.168.1.10', '192.168.1.11', '192.168.1.12']

List sau khi xoa: ['192.168.1.10', '192.168.1.11']

C:\python>

 4. List Copy: phương thức trả về list mới tương list đã cho

Code:
ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
print()
print("IP List:",ip_list)
print()
new_list = ip_list.copy() # copy các phần tử của ip_list và gán vào list có tên new_list
print("New list:",new_list)

Kết quả:
C:\python>python Demo.py
IP List: ['192.168.1.10', '192.168.1.11', '192.168.1.12']

New list: ['192.168.1.10', '192.168.1.11', '192.168.1.12']

C:\python>

5. List Clear: phương thức xóa tất cả mọi phần tử trong list
Code:
ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
ip_list.clear() # xóa tất cả các phần tử trong list
print(ip_list)

Xong!

Word, Mail Merge/Trộn Mail Trong Ms Word 2013 Cho Kỹ Sư

Các bạn đã biết đến trộn mail/merge của Ms Word trong việc gửi thông báo, giấy mời, bảng lương, thư cám ơn,... Hôm nay chúng tôi giới thiệu các bạn cách sử dụng tính năng này trong việc tạo/định nghĩa host ứng dụng trong việc sửa file .XML

Yêu Cầu:
1. Chuẩn bị file mẫu "zbx_export_hosts.XML"
2. Tạo source mẫu, danh sách thiết bị
3. Thực hiện Merge trên Ms Word


Thực hiện
1. Chuẩn bị file mẫu "zbx_export_hosts.XML" -> download tại đây

2. Tạo source mẫu, danh sách thiết bị

Tạo MS Excel có tên ListDevices và nội dung là danh sách các thiết bị cần trộn, ví dụ như hình:


File mẫu (zbx_export_hosts.xml) export từ zabbix có nội dung như hình:

Ta thấy dữ liệu của host nằm trong tab <hosts> ...</hosts> dữ liệu từ dòng thứ 11 đến dòng thứ 32 cho phép được lặp lại .

Copy nội dung từ dòng 11 đến dòng 32 sang Ms Word và lưu lại với file là FormTemplates:
<host>
            <host>12</host>
            <name> 13</name>
            <description>14</description>
            <templates>
                <template>
                    <name>17</name>
                </template>
            </templates>
            <groups>
                <group>
                    <name>22</name>
                </group>
            </groups>
            <interfaces>
                <interface>
                    <ip>27</ip>
                    <interface_ref>if1</interface_ref>
                </interface>
            </interfaces>
            <inventory_mode>31</inventory_mode>
 </host>

Các số highlight màu vàng là dữ liệu cần thay đổi (các số đó chỉ là tên gợi nhớ), các chổ này sẽ được thay thế bằng nội trong file Excel. Sau khi thực hiện Merge thành công, mỗi dòng bên excel sẽ điền dữ liệu tương ứng chổ màu vàng này.

3. Thực hiện Merge trên Ms Word

Mở file FormTemplates lên -> Mailings -> Use an Existing List ..-> tìm đến file ListDevices đã tạo ở mục 1 -> Open -> chọn sheet có tên List Of Devices -> OK



Bôi chọn số 12 -> Insert Merger Field -> Host_12 (đây là trường tiêu đề của file ListDevices), tương tự chúng ta làm hết tất cả các trường cần insert vào


Bấm Preview Results để xem kết quả


Vào Maillings -> Finish & Merger -> Edit Individual Document... -> nhập from 1 to 7 (vì danh sách có 7 thiết bị nên chúng ta chỉ trộn đến 7 mẫu)

Ms Word sẽ tạo ra file mới với nội dung là các trường tương ứng bên excel đã trộn vào nội dung file mẫu FormTemplates


Mở file zbx_export_hosts.xml, thay thế từ dòng 11 đến dòng 32 bằng nội dung sau khi merge (copy dán đè) và lưu lại (ở đây chúng tôi lưu với tên zbx_export_hosts_merge.xml)

Đến đây chúng ta có thể dùng file zbx_export_hosts_merge.xml này để import vào Zabbix.

Xong!

Bài Viết Có Liên Quan









Word, Mail Merge/Trộn Mail Trong Ms Word 2013 Cho Kỹ Sư

Các bạn đã biết đến trộn mail/merge của Ms Word trong việc gửi thông báo, giấy mời, bảng lương, thư cám ơn,... Hôm nay chúng tôi giới thiệu các bạn cách sử dụng tính năng này trong việc tạo/định nghĩa host ứng dụng trong việc sửa file .XML

Yêu Cầu:
1. Chuẩn bị file mẫu "zbx_export_hosts.XML"
2. Tạo source mẫu, danh sách thiết bị
3. Thực hiện Merge trên Ms Word


Thực hiện
1. Chuẩn bị file mẫu "zbx_export_hosts.XML" -> download tại đây

2. Tạo source mẫu, danh sách thiết bị

Tạo MS Excel có tên ListDevices và nội dung là danh sách các thiết bị cần trộn, ví dụ như hình:


File mẫu (zbx_export_hosts.xml) export từ zabbix có nội dung như hình:

Ta thấy dữ liệu của host nằm trong tab <hosts> ...</hosts> dữ liệu từ dòng thứ 11 đến dòng thứ 32 cho phép được lặp lại .

Copy nội dung từ dòng 11 đến dòng 32 sang Ms Word và lưu lại với file là FormTemplates:
<host>
            <host>12</host>
            <name> 13</name>
            <description>14</description>
            <templates>
                <template>
                    <name>17</name>
                </template>
            </templates>
            <groups>
                <group>
                    <name>22</name>
                </group>
            </groups>
            <interfaces>
                <interface>
                    <ip>27</ip>
                    <interface_ref>if1</interface_ref>
                </interface>
            </interfaces>
            <inventory_mode>31</inventory_mode>
 </host>

Các số highlight màu vàng là dữ liệu cần thay đổi (các số đó chỉ là tên gợi nhớ), các chổ này sẽ được thay thế bằng nội trong file Excel. Sau khi thực hiện Merge thành công, mỗi dòng bên excel sẽ điền dữ liệu tương ứng chổ màu vàng này.

3. Thực hiện Merge trên Ms Word

Mở file FormTemplates lên -> Mailings -> Use an Existing List ..-> tìm đến file ListDevices đã tạo ở mục 1 -> Open -> chọn sheet có tên List Of Devices -> OK



Bôi chọn số 12 -> Insert Merger Field -> Host_12 (đây là trường tiêu đề của file ListDevices), tương tự chúng ta làm hết tất cả các trường cần insert vào


Bấm Preview Results để xem kết quả


Vào Maillings -> Finish & Merger -> Edit Individual Document... -> nhập from 1 to 7 (vì danh sách có 7 thiết bị nên chúng ta chỉ trộn đến 7 mẫu)

Ms Word sẽ tạo ra file mới với nội dung là các trường tương ứng bên excel đã trộn vào nội dung file mẫu FormTemplates


Mở file zbx_export_hosts.xml, thay thế từ dòng 11 đến dòng 32 bằng nội dung sau khi merge (copy dán đè) và lưu lại (ở đây chúng tôi lưu với tên zbx_export_hosts_merge.xml)

Đến đây chúng ta có thể dùng file zbx_export_hosts_merge.xml này để import vào Zabbix.

Xong!

Network Automation #004 - Netmiko How To Build Network Maps/Discover Network Topology Diagram Based on CDP/LLDP

Nên xem các bài dưới đây trước khi xem bài này:


Sơ đồ lab:


Dùng thư viện netmiko và các câu lệnh show cdp để thực hiện, thông tin thiết bị như file device_listCDP.csv dưới:



Yêu cầu:
1. Ghi lại thông tin đấu nối các cổng của các thiết bị trong sơ đồ lab.
2. Cấu hình cdp run trên Sw_13 (dùng netmiko để cấu hình), thực hiện show cdp để lấy thông tin đấu nối và ghi tiếp vào kết quả của yêu cầu 1


Chuẩn bị:

Thực hiện:

1. Ghi lại thông tin đấu nối các cổng của các thiết bị trong sơ đồ lab.

  • Code
Hàm xử lý show cdp (1):
from netmiko import ConnectHandler 
import re
import os

file_cdp = "show_cdp_neighbors.txt"
file_cdp_not = "show_cdp_NOT_enable.csv"
path = os.getcwd()	# lấy đường dẫn hiện tại

cdp_device = {} 
def show_cdp(txt):
	cmd = "show cdp neighbors"
	cmd2 = "show cdp entry"
	filename = txt
	
	print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")	
	net_connect = ConnectHandler(**cdp_device)

	output = net_connect.send_command(cmd)
	
	if "CDP is not enabled" in  output:							# nếu cdp không được enable
		with open (file_cdp_not,"a") as afile:					# mở file ghi log và sẽ xử lý sau
			afile.write(values[1] + "," + values[2] + "," + values[3] + "," + values[4] + "," + output + "\n") 		# nội dung là IP, dấu 2 chấm, lỗi trả về, xuống hàng
	else:		
		
		with open (file_cdp, "a") as afile:
			afile.write("\n\n" + "*" * 40 + values[1] + "*" * 40 +"\n")
			afile.write(output)
		
		'''
		output của lệnh: "show cdp neighbors" trả về có dạng:
		---------------------------------------------------------------------------
		Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
                  S - Switch, H - Host, I - IGMP, r - Repeater, P - Phone, 
                  D - Remote, C - CVTA, M - Two-port Mac Relay 

		Device ID        Local Intrfce     Holdtme    Capability  Platform  Port ID
		Sw_12.netmiko.lab
		                 Eth 0/2           137             R S I  Linux Uni Eth 0/0
		Sw_11.netmiko.lab
		                 Eth 0/1           135             R S I  Linux Uni Eth 0/0

		Total cdp entries displayed : 2
		---------------------------------------------------------------------------
		bỏ 5 dòng đầu tiên là header, 
		lấy từ dòng số 6 đến cuối kết quả và bỏ 2 dòng cuối cùng
		mỗi dòng chuyển thành list
		'''
		lines = output.splitlines()[5:-2]
		
		''' 
		xử lý và trích lọc trong lệnh show cdp neighbors, show cdp entry *
		- 
		-
		'''
		hostname = None
		for line in lines:
			fields = line.split()					# chuyển mỗi dòng sang list
			if len(fields) == 1:					# đối với những hostname dài kết quả của neighbors sẽ trả về 2 dòng cho mỗi neighbors
				hostname = fields[0]

			elif hostname == None:					# kết quả của neighbors sẽ trả về là 1 dòng thì thực hiện trong elif này
				hostname = fields[0]				# lấy ra hostname của láng giềng
				localint = "".join(fields[1:3])		# lấy ra local interface (lấy trường số 1 đến số 2)
				remoteint = "".join(fields[-2:])	# lấy ra remote interface


				outputentry = net_connect.send_command(cmd2 + " " + hostname) 
				regex = r'\d{1,3}(?:\.\d{1,3}){3}'  	# định nghĩa regular expression của IPv4 có dạng
				ips = re.findall(regex, outputentry)    # trích lọc lấy IPv4 ra, IP trả về là dạng list
				ips = "".join(list(set(ips)))			# remove duplicate IP và convert to string
				
				with open ("show_cdp_neighbors.txt", "a") as afile:
					
					afile.write("{}{}".format("\n\n","-" * 80))
					afile.write("\nThe information of the neighbors:\n")
					afile.write("\nNeighbors hostname is: " + hostname)
					afile.write("\nIP address: " + ips)
					afile.write("\n\nLocal interface: " + localint + " of " + values[1] + " connect to interface: " + remoteint + " of IP(s) " + ips)
				
			else:
				outputentry = net_connect.send_command(cmd2 + " " + hostname)
				regex = r'\d{1,3}(?:\.\d{1,3}){3}'			# định nghĩa regular expression của IPv4 có dạng
				ips = re.findall(regex, outputentry)		# trích lọc lấy IPv4 ra, IP trả về là dạng list
				ips = "".join(list(set(ips)))				# remove duplicate IP và convert to string	
				localint = "".join(fields[:2])				# lấy 2 trường đầu tiên
				remoteint = "".join(fields[-2:])			# lấy 2 trường cuối cùng

				with open ("show_cdp_neighbors.txt", "a") as afile:
					afile.write("{}{}".format("\n\n","-" * 80))
					afile.write("\nThe information of the neighbors:\n")
					afile.write("\nNeighbors hostname is: " + hostname)

					afile.write("\n\nLocal interface: " + localint + " of " + values[1] + " connect to interface: " + remoteint + " of IP(s) " + ips)	




Mở file và gọi hàm xử lý (2)
with open ("device_listCDP.csv","r") as rfile: # mở file

	keys = rfile.readline().split(",")
	values = rfile.read() 

#print(keys)
#print(values)

for values in values.splitlines(): 
	values = values.split(",") 
	for i in range(1,len(keys)-1,1): 
		cdp_device[keys[i]] = values[i]  
	
	#print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")	
	show_cdp(values[1])
print("Thong tin neighbors da luu vao file: '{}' tai duong dan '{}'".format(file_cdp,path))

Nối 2 đoạn code trên thành code chạy (1) + (2) = (3):
from netmiko import ConnectHandler 
import re
import os

file_cdp = "show_cdp_neighbors.txt"
file_cdp_not = "show_cdp_NOT_enable.csv"
path = os.getcwd()	# lấy đường dẫn hiện tại

cdp_device = {} 
def show_cdp(txt):
	cmd = "show cdp neighbors"
	cmd2 = "show cdp entry"
	filename = txt
	
	print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")	
	net_connect = ConnectHandler(**cdp_device)

	output = net_connect.send_command(cmd)
	
	if "CDP is not enabled" in  output:							# nếu cdp không được enable
		with open (file_cdp_not,"a") as afile:					# mở file ghi log và sẽ xử lý sau
			afile.write(values[1] + "," + values[2] + "," + values[3] + "," + values[4] + "," + output + "\n") 		# nội dung là IP, dấu 2 chấm, lỗi trả về, xuống hàng
	else:		
		
		with open (file_cdp, "a") as afile:
			afile.write("\n\n" + "*" * 40 + values[1] + "*" * 40 +"\n")
			afile.write(output)
		
		'''
		output của lệnh: "show cdp neighbors" trả về có dạng:
		---------------------------------------------------------------------------
		Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
                  S - Switch, H - Host, I - IGMP, r - Repeater, P - Phone, 
                  D - Remote, C - CVTA, M - Two-port Mac Relay 

		Device ID        Local Intrfce     Holdtme    Capability  Platform  Port ID
		Sw_12.netmiko.lab
		                 Eth 0/2           137             R S I  Linux Uni Eth 0/0
		Sw_11.netmiko.lab
		                 Eth 0/1           135             R S I  Linux Uni Eth 0/0

		Total cdp entries displayed : 2
		---------------------------------------------------------------------------
		bỏ 5 dòng đầu tiên là header, 
		lấy từ dòng số 6 đến cuối kết quả và bỏ 2 dòng cuối cùng
		mỗi dòng chuyển thành list
		'''
		lines = output.splitlines()[5:-2]
		
		''' 
		xử lý và trích lọc trong lệnh show cdp neighbors, show cdp entry *
		- 
		-
		'''
		hostname = None
		for line in lines:
			fields = line.split()					# chuyển mỗi dòng sang list
			if len(fields) == 1:					# đối với những hostname dài kết quả của neighbors sẽ trả về 2 dòng cho mỗi neighbors
				hostname = fields[0]

			elif hostname == None:					# kết quả của neighbors sẽ trả về là 1 dòng thì thực hiện trong elif này
				hostname = fields[0]				# lấy ra hostname của láng giềng
				localint = "".join(fields[1:3])		# lấy ra local interface (lấy trường số 1 đến số 2)
				remoteint = "".join(fields[-2:])	# lấy ra remote interface


				outputentry = net_connect.send_command(cmd2 + " " + hostname) 
				regex = r'\d{1,3}(?:\.\d{1,3}){3}'  	# định nghĩa regular expression của IPv4 có dạng
				ips = re.findall(regex, outputentry)    # trích lọc lấy IPv4 ra, IP trả về là dạng list
				ips = "".join(list(set(ips)))			# remove duplicate IP và convert to string
				
				with open ("show_cdp_neighbors.txt", "a") as afile:
					
					afile.write("{}{}".format("\n\n","-" * 80))
					afile.write("\nThe information of the neighbors:\n")
					afile.write("\nNeighbors hostname is: " + hostname)
					afile.write("\nIP address: " + ips)
					afile.write("\n\nLocal interface: " + localint + " of " + values[1] + " connect to interface: " + remoteint + " of IP(s) " + ips)
				
			else:
				outputentry = net_connect.send_command(cmd2 + " " + hostname)
				regex = r'\d{1,3}(?:\.\d{1,3}){3}'			# định nghĩa regular expression của IPv4 có dạng
				ips = re.findall(regex, outputentry)		# trích lọc lấy IPv4 ra, IP trả về là dạng list
				ips = "".join(list(set(ips)))				# remove duplicate IP và convert to string	
				localint = "".join(fields[:2])				# lấy 2 trường đầu tiên
				remoteint = "".join(fields[-2:])			# lấy 2 trường cuối cùng

				with open ("show_cdp_neighbors.txt", "a") as afile:
					afile.write("{}{}".format("\n\n","-" * 80))
					afile.write("\nThe information of the neighbors:\n")
					afile.write("\nNeighbors hostname is: " + hostname)

					afile.write("\n\nLocal interface: " + localint + " of " + values[1] + " connect to interface: " + remoteint + " of IP(s) " + ips)					


with open ("device_listCDP.csv","r") as rfile: # mở file

	keys = rfile.readline().split(",")
	values = rfile.read() 

#print(keys)
#print(values)

for values in values.splitlines(): 
	values = values.split(",") 
	for i in range(1,len(keys)-1,1): 
		cdp_device[keys[i]] = values[i]  
	
	#print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")	
	show_cdp(values[1])
print("Thong tin neighbors da luu vao file: '{}' tai duong dan '{}'".format(file_cdp,path))



  • Kết quả:
C:\python>python Demo.py
Dang ket noi vao IP:'192.168.0.1' voi Username: 'admin'
Dang ket noi vao IP:'192.168.0.11' voi Username: 'admin'
Dang ket noi vao IP:'192.168.0.12' voi Username: 'admin'
Dang ket noi vao IP:'192.168.0.13' voi Username: 'admin'
Thong tin neighbors da luu vao file: 'show_cdp_neighbors.txt' tai duong dan 'C:\python'

C:\python>
Nội dung file 


Chúng ta thấy rằng thông tin neighbor của Sw_13 chưa được thể hiện trong file, vì thiết bị này cdp không được cài đặt. Thông tin các thiết bị đã cấu hình tắt cdp được lưu ở file show_cdp_NOT_enable.csv (file này sinh ra trong khi thực thi chương trình)

2. Cấu hình cdp run trên Sw_13 (dùng netmiko để cấu hình), thực hiện show cdp để lấy thông tin đấu nối và ghi tiếp vào kết quả của yêu cầu 1

  • Code
Định nghĩa hàm show_cdp_not_running (4):
from netmiko import ConnectHandler
import time
file_cdp_not = "show_cdp_NOT_enable.csv"
conf_t = "conf t"
cdp_run = "cdp run"
keys = "no., host, username, password, device_type, remark" # header cho file show_cdp_NOT_enable.csv
txt = file_cdp_not

cdp_device = {} 
def show_cdp_not_running(txt):

	cmd_run = "cdp run"
	net_connect = ConnectHandler(**cdp_device)
	#output = net_connect.send_command(cmd)
	output = net_connect.send_command_timing(conf_t) 			# vào mode config t
	output += net_connect.send_command_timing(cdp_run)			# cấu hình cdp run
	
	'''
	đợi 65s sau đó gọi hàm show_cdp(txt). 
	Mặc định cứ 60s/lần cdp sẽ gửi thông tin cdp cho láng giềng, để chắc ăn chúng ta thêm vài giây
	'''
	time.sleep(65)												
	show_cdp(txt)                                               # gọi hàm show_cdp như bình thường, vì đã cấu hình cdp run
	
	output += net_connect.send_command_timing("no " + cdp_run)  # trả lại cấu hình ban đầu

Mở file và gọi hàm xử lý (5)
try: 
	with open (file_cdp_not,"r") as rfile: 
		keys = key_csv.split(", ") #
		values = rfile.read()
		for values in values.splitlines(): 
			values = values.split(",") 
			for i in range(1,len(keys)-1,1): 
				cdp_device[keys[i]] = values[i]  
			
			show_cdp_not_running(file_cdp_not) # truyền chuỗi vào nhằm mục đích ghi chú
except NameError: 
	
	print("File'{}' khong ton tai!".format(file_cdp_not))
	pass

Vì file "show_cdp_NOT_enable.csv" có thể tồn tại hoặc không, chúng ta thực bắt lỗi để khi nếu có lỗi về việc này chương trình vẫn tiếp tục.

  • Code chính gộp các đoạn (3) + (4) + (5) = (6)
from netmiko import ConnectHandler 
import re
import os
import time

file_cdp = "show_cdp_neighbors.txt"
file_cdp_not = "show_cdp_NOT_enable.csv"
path = os.getcwd()	# lấy đường dẫn hiện tại

conf_t = "conf t"
cdp_run = "cdp run"
key_csv = "no., host, username, password, device_type, remark" # header cho file show_cdp_NOT_enable.csv
txt = file_cdp_not

cdp_device = {} 
def show_cdp(txt):
	cmd = "show cdp neighbors"
	cmd2 = "show cdp entry"
	
	if txt == file_cdp_not:
		print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}' '{txt}'")	# sau khi enable cdp sẽ thông báo dòng này
	else:	
		print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")	
	
	net_connect = ConnectHandler(**cdp_device)

	output = net_connect.send_command(cmd)
	i = 0 # định nghĩa biến đếm chỉ dùng trong trường hợp CDP not enable
	
	if "CDP is not enabled" in  output:							# nếu cdp không được enable
		i += 1
		with open (file_cdp_not,"a") as afile:					# mở file ghi log và sẽ xử lý sau
			afile.write(str(i) + "," + values[1] + "," + values[2] + "," + values[3] + "," + values[4] + "," + output + "\n") 		# ghi thông tin ip, username, password.... vào file
	else:		
		with open (file_cdp, "a") as afile:
			if txt == file_cdp_not:
				afile.write("\n\n" + "=" * 40 + txt + "=" * 40) # chèn thêm dòng này file log nếu nếu cdp không được enable
			afile.write("\n\n" + "*" * 40 + values[1] + "*" * 40 +"\n")
			afile.write(output)
		
		'''
		output của lệnh: "show cdp neighbors" trả về có dạng:
		---------------------------------------------------------------------------
		Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
                  S - Switch, H - Host, I - IGMP, r - Repeater, P - Phone, 
                  D - Remote, C - CVTA, M - Two-port Mac Relay 

		Device ID        Local Intrfce     Holdtme    Capability  Platform  Port ID
		Sw_12.netmiko.lab
		                 Eth 0/2           137             R S I  Linux Uni Eth 0/0
		Sw_11.netmiko.lab
		                 Eth 0/1           135             R S I  Linux Uni Eth 0/0

		Total cdp entries displayed : 2
		---------------------------------------------------------------------------
		bỏ 5 dòng đầu tiên là header, 
		lấy từ dòng số 6 đến cuối kết quả và bỏ 2 dòng cuối cùng
		mỗi dòng chuyển thành list
		'''
		lines = output.splitlines()[5:-2]
		
		''' 
		xử lý và trích lọc trong lệnh show cdp neighbors, show cdp entry *
		- 
		-
		'''
		hostname = None
		for line in lines:
			fields = line.split()					# chuyển mỗi dòng sang list
			if len(fields) == 1:					# đối với những hostname dài kết quả của neighbors sẽ trả về 2 dòng cho mỗi neighbors
				hostname = fields[0]

			elif hostname == None:					# kết quả của neighbors sẽ trả về là 1 dòng thì thực hiện trong elif này
				hostname = fields[0]				# lấy ra hostname của láng giềng
				localint = "".join(fields[1:3])		# lấy ra local interface (lấy trường số 1 đến số 2)
				remoteint = "".join(fields[-2:])	# lấy ra remote interface


				outputentry = net_connect.send_command(cmd2 + " " + hostname) 
				regex = r'\d{1,3}(?:\.\d{1,3}){3}'  	# định nghĩa regular expression của IPv4 có dạng
				ips = re.findall(regex, outputentry)    # trích lọc lấy IPv4 ra, IP trả về là dạng list
				ips = "".join(list(set(ips)))			# remove duplicate IP và convert to string
				
				with open ("show_cdp_neighbors.txt", "a") as afile:
					
					afile.write("{}{}".format("\n\n","-" * 80))
					afile.write("\nThe information of the neighbors:\n")
					afile.write("\nNeighbors hostname is: " + hostname)
					afile.write("\nIP address: " + ips)
					afile.write("\n\nLocal interface: " + localint + " of " + values[1] + " connect to interface: " + remoteint + " of IP(s) " + ips)
				
			else:
				outputentry = net_connect.send_command(cmd2 + " " + hostname)
				regex = r'\d{1,3}(?:\.\d{1,3}){3}'			# định nghĩa regular expression của IPv4 có dạng
				ips = re.findall(regex, outputentry)		# trích lọc lấy IPv4 ra, IP trả về là dạng list
				ips = "".join(list(set(ips)))				# remove duplicate IP và convert to string	
				localint = "".join(fields[:2])				# lấy 2 trường đầu tiên
				remoteint = "".join(fields[-2:])			# lấy 2 trường cuối cùng

				with open ("show_cdp_neighbors.txt", "a") as afile:
					afile.write("{}{}".format("\n\n","-" * 80))
					afile.write("\nThe information of the neighbors:\n")
					afile.write("\nNeighbors hostname is: " + hostname)

					afile.write("\n\nLocal interface: " + localint + " of " + values[1] + " connect to interface: " + remoteint + " of IP(s) " + ips)					

def show_cdp_not_running(txt):

	cmd_run = "cdp run"
	net_connect = ConnectHandler(**cdp_device)
	#output = net_connect.send_command(cmd)
	output = net_connect.send_command_timing(conf_t) 			# vào mode config t
	output += net_connect.send_command_timing(cdp_run)			# cấu hình cdp run
	
	'''
	đợi 65s sau đó gọi hàm show_cdp(txt). 
	Mặc định cứ 60s/lần cdp sẽ gửi thông tin cdp cho láng giềng, để chắc ăn chúng ta thêm vài giây
	'''
	time.sleep(65)												
	show_cdp(txt)                                               # gọi hàm show_cdp như bình thường, vì đã cấu hình cdp run
	
	output += net_connect.send_command_timing("no " + cdp_run)  # trả lại cấu hình ban đầu




with open ("device_listCDP.csv","r") as rfile: # mở file

	keys = rfile.readline().split(",")
	values = rfile.read() 

#print(keys)
#print(values)

for values in values.splitlines(): 
	values = values.split(",") 
	for i in range(1,len(keys)-1,1): 
		cdp_device[keys[i]] = values[i]  
	
	#print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")	
	show_cdp(values[1]) # trong trường hợp này biến values[1] truyền vào nhưng không dùng đến

'''
dùng trong trường hợp cdp run đã được tắt
danh sách này có được khi ta thực hiện lệnh show cdp không thành lưu nó lại
bây giờ mở ra để xử lý
'''
try: 
	with open (file_cdp_not,"r") as rfile: 
		keys = key_csv.split(", ") #
		values = rfile.read()
		for values in values.splitlines(): 
			values = values.split(",") 
			for i in range(1,len(keys)-1,1): 
				cdp_device[keys[i]] = values[i]  
			
			show_cdp_not_running(file_cdp_not) # truyền chuỗi vào nhằm mục đích ghi chú
except NameError: 
	
	print("File'{}' khong ton tai!".format(file_cdp_not))
	pass

print("Thong tin neighbors da luu vao file: '{}' tai duong dan '{}'".format(file_cdp,path))


P/s: trong phần code của hàm show_cdp có chèn thêm các dòng 20 -> 22 và 36,37 như hình dưới:


  • Chạy code
C:\python>python Demo.py
Dang ket noi vao IP:'192.168.0.1' voi Username: 'admin'
Dang ket noi vao IP:'192.168.0.11' voi Username: 'admin'
Dang ket noi vao IP:'192.168.0.12' voi Username: 'admin'
Dang ket noi vao IP:'192.168.0.13' voi Username: 'admin'
Dang ket noi vao IP:'192.168.0.13' voi Username: 'admin' 'show_cdp_NOT_enable.csv'
Thong tin neighbors da luu vao file: 'show_cdp_neighbors.txt' tai duong dan 'C:\python'

    Chúng ta thấy ip 192.168.0.13 được kết nối vào 2 lần:
    - Lần 1: kiểm tra show cdp không thành công => đưa ip này vào danh sách thiết bị cdp không được cấu hình/hay tắt
    - Lần 2: kết nối vào cấu hinh cdp run rồi thực hiện show cdp như bình thường, xong trả lại cấu hình ban đầu cho thiết bị

    • Kết quả

    Đối với các thiết bị không cấu hình cdp run nó sẽ thêm vào log dòng show_cdp_NOT_enable như hình.


    Xong!

    Học Python Qua Ví Dụ #007 - Python List/List, Loop For Enumerate, Append, Extend, Insert-Vòng Lặp, Cách Thêm/Nối Phần Tử Trong Python

    Yêu cầu:
    1. Thực hiện in List trong python
    2. In list với Loop và enumerate
    3. List, String format, F-string
    4. Các cách thêm/nối list và Append, Extend, Insert

    Thực hiện:

    1. Thực hiện in List trong python

    • Ví dụ 1:
    Code:
    ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
    print()
    print("Chieu dai cua list: ", len(ip_list)) # in ra chiều dài của list
    print (ip_list[0]) # index 0: kết quả sẽ là "192.168.1.10"
    print (ip_list[1]) # index 1 kết quả sẽ là "192.168.1.11"
    print (ip_list[2]) # index 2 kết quả sẽ là "192.168.1.12"
    

    Noted: Trong list Index và value tạo nên Item, ở ví dụ trên ta có 3 item với các giá trị dương đương như bảng
    Bảng cấu trúc của list

      • Hoặc in tất cả các items của list kết hợp với Loop - For
    Code:
    ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
    print()
    print("Chieu dai cua list: ", len(ip_list)) # in ra chiều dài của list
    for items in ip_list: # đọc cho đến hết list
    	print (items) 
    


    Kết quả:
    C:\python>python Demo.py
    Chieu dai cua list:  3
    192.168.1.10
    192.168.1.11
    192.168.1.12

    C:\python>

     

    • Ví dụ 2:
    ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12", "10.12.1.1"]
    kq = [i for i in ip_list if "10." in i] # lấy ra vị trị thứ i của list, nếu "10." có trong vị trí đó
    print(kq)
    
    Kết quả:
    C:\python>python Demo.py
    ['10.12.1.1']

    • Ví dụ 3:
    string = "Hello 12345 World"
    numbers = [x for x in string if x.isdigit()] # trả về một list kết quả nếu ký tự trong chuỗi là số thì
    print (numbers)
    

    C:\python>python Demo.py
    ['1', '2', '3', '4', '5']

    • Ví dụ 4:
    '''
    vòng for y sẽ chạy trước
    có nghĩa chương trình sẽ chạy là:
    10 + 20
    10 + 40
    10 + 60
    30 + 20
    30 + 40
    ...
    ...
    '''
    a=[x+y for x in [10,30,50] for y in [20,40,60]] 
    print (a)
    

    C:\python>python Demo.py
    [30, 50, 70, 50, 70, 90, 70, 90, 110]

    2. In list với Loop và enumerate
      Code:
      ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
      print()
      
      for items in enumerate(ip_list): # đọc cho đến hết list
      	print (items)  # kết quả trả về bao gồm index và giá trị theo từng cặp.
      

      Kết quả:
      C:\python>python Demo.py

      (0, '192.168.1.10')
      (1, '192.168.1.11')
      (2, '192.168.1.12')

      C:\python>

      • Ví dụ khác:
      Code:
      ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
      print()
      
      var_index=[]
      var_value=[]
      for x, y in enumerate(ip_list):
      	var_index.append(x) # nối list index
      	var_value.append(y) # nối list value
      '''
      in ra thành list
      list thứ nhất là index
      list thứ hai là value
      '''
      print(var_index)
      print(var_value)
      

      Kết quả:
      C:\python>python Demo.py
      [0, 1, 2]
      ['192.168.1.10', '192.168.1.11', '192.168.1.12']

      C:\python>

      3. List, String format, F-string
        Ví dụ:

        Code:
        hostname = ["R_HaNoi", "R_DaNang", "R_HoChiMinh"]
        ip_addr = ["10.0.0.1", "172.16.1.2","192.168.1.3"]
        item =["Devices", "Management IP", "-"]
        
        #format
        print()
        print("{:^50}".format("=====USING FORMAT METHOD OF STRING CLASS====="))
        print("{:^20} {:^20}".format(item[0], item[1]))
        print("{:^20} {:^20}".format(item[2]*20,item[2]*20))
        print("{:>20} {}".format(hostname[0],ip_addr[0]))
        print("{:>20} {}".format(hostname[1],ip_addr[1]))
        print("{:>20} {}".format(hostname[2],ip_addr[2]))
        
        #f-string
        print()
        print(f"{'=====USING F-STRING=====':^50}")
        print(f"{item[0]:^20}  {item[1]:^20}")
        print(f"{item[2]*20:^20}  {item[2]*20:^20}")
        print(f"{hostname[0]:>20}  {ip_addr[0]}")
        print(f"{hostname[1]:>20}  {ip_addr[1]}")
        print(f"{hostname[2]:>20}  {ip_addr[2]}")
        

        Kết quả:


        4. Các cách thêm/nối list và Append, Extend, Insert
        • List-Extend: Thêm list mới vào list list đã có (thừa kế dữ liệu của list cũ)
        Code:
        ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
        print()
        print(ip_list)
        ip_list.extend(["8.8.8.8", "4.4.4.4"]) # thêm giá trị vào cuối list
        print(ip_list)
        

        Kết quả:
        C:\python>python Demo.py
        ['192.168.1.10', '192.168.1.11', '192.168.1.12']
        ['192.168.1.10', '192.168.1.11', '192.168.1.12', '8.8.8.8', '4.4.4.4']

        C:\python>

        • List-Append: Thêm phân tử vào cuối của list 
        Code:
        ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
        print()
        print(ip_list)
        ip_list.append("10.10.10.10") # thêm giá trị vào cuối list
        print(ip_list)
        

        Kết quả:
        C:\python>python Demo.py
        ['192.168.1.10', '192.168.1.11', '192.168.1.12']
        ['192.168.1.10', '192.168.1.11', '192.168.1.12', '10.10.10.10']

        C:\python>

        • List-Insert: Thêm phần tử vào một vị trí (index) của list, các phần từ vị trí được thêm vào sẽ được đẩy lùi về sau
        Code:
        ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
        print()
        print(ip_list)
        ip_list.insert(1,"20.20.20.20") # thêm vào vị trí thứ 2 của list với giá trị là: "20.20.20.20"
        print(ip_list)
        

        Kết quả:
        C:\python>python Demo.py
        ['192.168.1.10', '192.168.1.11', '192.168.1.12']
        ['192.168.1.10', '20.20.20.20', '192.168.1.11', '192.168.1.12']

        C:\python>

        • Cộng list
        Code:
        ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
        ip_netpub = ["8.8.8.8","8.8.4.4","203.113.131.1","1.1.1.1"]
        cong_list = ip_list + ip_netpub # thực hiện cộng 2 list
        print()
        print(cong_list)
        

        Kết quả:
        C:\python>python Demo.py
        ['192.168.1.10', '192.168.1.11', '192.168.1.12', '8.8.8.8', '8.8.4.4', '203.113.131.1', '1.1.1.1']

        C:\python>


        Xong!

        Zabbix, Cấu Hình Zabbix Cơ Bản / ICMP Template - Monitoring Map 1/5

        Yêu cầu
        1. Định nghĩa Icon
        2. Tạo Group Host
        3. Tạo ICMP monitor host
        4. Kỹ thuật Import host từ file .XML
        5. Map Network on Zabbix
        6. Tạo User mới cho Zabbix

        Xem cách cài đặt Zabbix trước khi xem bài này.

        Thực hiện
        1. Định nghĩa Icon

        Chèn biểu tượng cần thể hiện cho host. Thực ra Zabbix đã có sẳn thư viện Icon rồi, tuy nhiên chúng tôi muốn giới thiệu cho các bạn để khi vẽ sơ đồ mạng sẽ có nhiều lựa chọn hơn trong việc lựa chọn Icon cho mình.

        Chúng tôi chỉ thực hiện thêm 6 biểu tượng nhằm mục đích tham khảo.

        2. Tạo Group Host

        Tạo group có tên là: vck_ICMP Group

        3. Tạo ICMP monitor host

        Thêm host có IP 8.8.8.8 cần giám sát IMCP và host 8.8.8.8 thuộc group vừa tạo trên là vck_ICMP Group, ta thực hiện như hình

        Kết quả sau khi thêm host mới

        Tương tự vậy chúng ta có thể add nhiều host cần giám sát theo yêu cầu vào zabbix.
        Hoặc chọn Full Clone để nhân bản một host, ví dụ 8.8.4.4


        Tuy nhiên chúng ta cũng có thể thêm một hoặc host vào zabbix bằng cách import.

        Trước tiên chúng ta export 1 host ra file .XML và mở nó lên.

        Nhân xét: Chúng ta thấy rằng host 8.8.8.8 vừa định vừa tạo được định nghĩa từ dòng 11 đến dòng 32, nếu muốn thêm một hay nhiều host vào file này chúng ta chỉ việc copy nội dung trong từ dòng 11 đến dòng 32 chỉnh sửa thông tin các dòng 12, 13, 14, 17, 22 và 27 cho hợp lý rồi dán vào tab <hosts> </hosts> rồi import vào là được.

        4. Kỹ thuật Import host từ file .XML
        Tham khảo cách chỉnh sửa file .XML bằng kỹ thuật Merge Mail  sau khi chỉnh sửa xong chọn Configuration -> Hosts -> Choose File  để trỏ đến file XML vừa chỉnh sửa -> Import

        Import thành công

        Kết quả sau khi import từ file XML.

        5. Map Network on Zabbix

        Vào Monitoring -> Maps -> Create Map -> Điền tên, chiều cao, chiều rộng của Map, và chọn user được phép xem Map này (trong trường hợp này chúng tôi chọn user Admin) -> Add.

        Chọn vào tên Map of ICMP (tên vừa tạo ở bước trên) -> edit map -> add Map element, và điền thông tin như hình
        Giải thích:
        • {HOST.NAME}, {HOST.CONN}: biến tự động lấy thông tin của host ở trong phần định host ở các mục trên
        • host ICMP Net 8.8.8.8: host cần vẽ và sẽ được thể hiện trong Map
        • Icons Default: là hình chúng ta muốn thể hiện trên Map đang ở trạng thái monitor thành công
        • Icons Problem: là hình thể hiện trạng thái monitor KHÔNG thành công (phần định nghĩa Icon ở mục trên)

        Tương tự add thêm Map element cho Route ISP với các Icon chúng ta đã định nghĩa mở các mục trên

        Nhấn chọn 2 Icon -> Add Link để tạo đường kết nối 2 icon này (chúng ta có thể chọn màu và kiểu đường nối trong phần edit)

        Tương tự chúng ta có thể thêm nhiều thiết bị cần monitor được thể hiện trên Map và chọn các đường link cho đúng với sơ đồ của mình

        Bây giờ chúng ta đã có 1 map đơn giản với các icon như hình dưới. (chú ý nếu trạng thái monitor thành công thì có thêm chữ OK, ngược lại sẽ có hình như Icons Problem đã chọn và đã giải thích ở trên.)

        6. Tạo User mới cho Zabbix

        Administration -> Users -> Create User -> điền thông tin, chọn phân quyền cho user theo yêu cầu của các bạn -> Add
        Đăng nhập để kiểm tra nhé.

        Hy vọng đến đây sẽ giúp các bạn phần nào có cơ sở để tìm hiểu zabbix rộng hơn. Hẹn các bạn trong các bài sau.

        Xong!


        /*header slide*/