در ادامهی پستهای ورود به دنیای برنامه نویسی شبکه، در این پست و پستهای آتی به ایجاد و توضیح اسکریپتهای کاربردی پایتون در حوزهی نتورک میپردازیم. این اسکریپتها عموما طی پروژه و بر اساس نیاز واقعی نوشته شدهاند و انتشار آن میتواند برای سایرین نیز مفید باشد. سعی داریم با توضیح کامل کتابخانههای استفاده شده و کد ایجاد شده در هر اسکریپت درک کاملی از فرآیند طی شده ایجاد کنیم و امیدواریم این روش بتواند به مرور توانایی ایجاد اسکریپتهای مشابه را برای افرادی که آشنایی کمتری با این زبان دارند فراهم کند.
به عنوان اولین قدم ، در این پست به کمک یک اسکریپت وضعیت CRC روتر و سویچ ها را چک میکنیم و در صورت وجود CRC، مدیر سیستم را از طریق ایمیل با خبر میکنیم.
ابتدا برای راحت تر و بهینه شدن نحوه اتصال به روترها و سویچ ها یک فایل با فرمت YAML درست میکنیم که در آن اطلاعات تجهیزات، IP،نام کاربری و گذرواژه و IOS موجود است.
Testbed:
name: alwaysonsbxs
credentials:
default:
username: "admin"
password: "ipcafe"
enable: "ipcafe"
devices:
csr1000v-1:
type: router
os: iosxe
connections:
ssh:
protocol: ssh
ip: 192.168.1.200
csr1000v-2:
type: router
os: iosxe
connections:
ssh:
protocol: ssh
ip: 192.168.1.201
در ادامه با استفاده از کتابخانه Genie دستور CLI را به روترها ارسال میکنیم و نتیجه را در قالب فرمت JSON دریافت میکنیم. همچنین از کتابخانه های smtplib , email.mime.multipart و email.mme.text جهت ارسال ایمیل استفاده میکنیم.
from genie.conf import Genie
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
در بخش اصلی اسکریپت به کمک حلقه for به تجهیزاتی که مشخصات آنها را در فایل testbed مشخص کردیم متصل میشویم و دستور show interfaces را ارسال میکنیم.
برای اطلاعات بیشتر در مورد کتابخانه genie و مواردی که پشتیبانی میکند به این لینک مراجعه کنید: https://pubhub.devnetcloud.com/media/genie-feature-browser/docs/#/
for device in testbed.devices:
testbed.devices[device].connect()
interface_details=testbed.devices[device].parse("show interfaces")
device_verstions[device]=verstion
device_interface_details[device]=interface_details
نتیجه دریافت شده را به کمک ۲ حلقه for به فرمت مطلوب خود تبدیل میکنیم و شرطی جهت بررسی CRC اینترفیس های مینویسیم و نتیجه را به تابع sendmail ارسال میکنیم.
for device,interfaces in device_interface_details.items():
for interface, details in interfaces.items():
if details["counters"]["in_crc_errors"]==0:
continue
else:
sendmail(crc= details["counters"]["in_crc_errors"],interface=interface,device=device)
عمل ارسال ایمیل را به صورت یک function در نظر گرفتیم که بتوانیم چندین بار از این function استفاده کنیم:
def sendmail(crc,interface,device):
from_addr='ipcafe@gmail.com'
to_addr='info@ipcafe.net'
msg=MIMEMultipart()
msg['From']=from_addr
msg['To']=",".join(to_addr)
msg['Subject']=f'{device}--Interface CRC Error'
body=f"device: {device} on{interface} have {crc} CRC Error"
msg.attach(MIMEText(body,'plain'))
smtp_server=smtplib.SMTP('smtp.gmail.com',587)
smtp_server.starttls()
smtp_server.login(''ipcafe@gmail.com”,”password”)
text=msg.as_string()
smtp_server.sendmail(from_addr,to_addr,text)
smtp_server.quit()
- نکته: اگر از gmail برای ارسال ایمیل در برنامه استفاده میکنید باید ابتدا به account gmailای که فرستنده ایمیل در برنامه است لاگین کنید، سپس وارد این url شوید و گزینه اجازه به برنامههای با امنیت کمتر را روشن کنید.
- به کمک cron job میتوانید زمانبندی دلخواه را برای اجرای این برنامه انتخاب کنید.
دانلود کد برنامه و فایل testbed :دانلود
گذرواژه:ipcafe.net