Junos PyEZ مفت ipv4 سب نیٹس تلاش کرنے کے کام کی مثال استعمال کرتے ہوئے

Junos PyEZ کے ساتھ کام کرنے کے بارے میں ایک مضمون - "Python microframework جو آپ کو Junos OS چلانے والے آلات کو منظم اور خودکار بنانے کے قابل بناتا ہے" آٹومیشن اور مینجمنٹ، ہر وہ چیز جو ہمیں پسند ہے۔ اس مضمون میں بیان کردہ اسکرپٹ کو لکھنے کے کئی مقاصد تھے - Python سیکھنا اور معلومات اکٹھا کرنے یا Junos OS چلانے والے آلات پر کنفیگریشنز کو تبدیل کرنے کے کاموں کو خودکار بنانا۔ Python + Junos PyEZ کے اس مخصوص امتزاج کا انتخاب Python پروگرامنگ زبان میں داخلے میں کم رکاوٹ اور Junos PyEZ لائبریری کے استعمال میں آسانی کی وجہ سے کیا گیا، جس کے لیے Junos OS کے ماہرانہ علم کی ضرورت نہیں ہے۔

ٹاسک

کمپنی سے تعلق رکھنے والے مفت ipv4 سب نیٹس کا آڈٹ۔ سب نیٹ کے مفت ہونے کا معیار یہ ہے کہ جونوس OS پر چلنے والے روٹر کے طور پر کام کرنے والے سوئچ پر روٹس میں اس کے بارے میں اندراج کی عدم موجودگی۔

Реализация

Python + Junos PyEZ، اگرچہ paramiko اور ssh.exec_command کے ذریعے ایسا کرنے کا لالچ تھا، نتیجے کے طور پر، آپ کو پول کیے جانے والے آلات پر netconf ڈیوائس نیٹ ورک مینجمنٹ پروٹوکول کو ترتیب دینے کی ضرورت ہوگی۔ Netconf ریموٹ پروسیجر کال RPC کے ذریعے ہارڈ ویئر کے ساتھ کام کرتا ہے اور XML کا استعمال کرتا ہے، اس مثال میں، اسے موصول ہونے والی معلومات فراہم کرنے کے لیے۔

PyPI سے Junos PyEZ کے موجودہ ورژن کو انسٹال کرنا درج ذیل کمانڈ کے ساتھ کیا جاتا ہے:

$ pip install junos-eznc

آپ مندرجہ ذیل کمانڈ کے ساتھ گٹ ہب پر پروجیکٹ کی مین برانچ سے بھی انسٹال کر سکتے ہیں۔

$ pip install git+https://github.com/Juniper/py-junos-eznc.git

اور ایک اور آپشن کے ذریعے

$ pip install -r requirements.txt 

یہ کمانڈ لائبریریوں کو انسٹال کرے گی جو سسٹم سے غائب ہیں اور آپریشن کے لیے ضروری ہیں۔ میرے ورژن میں conditions.txt ان میں سے صرف دو ہیں، تازہ ترین ورژن اسکرپٹ لکھنے کے وقت اشارہ کیے گئے ہیں:

junos-eznc
netaddr

اسکرپٹ بذریعہ ڈیفالٹ سسٹم میں موجودہ صارف کا نام لیتا ہے، آپ show_route.py -u getpass.getpass کلید کا استعمال کرتے ہوئے کسی دوسرے صارف کے نام سے لاگ ان کر سکتے ہیں stdin سے پاس ورڈ لیتا ہے لہذا پاس ورڈ باقی نہیں رہے گا۔ نظام میں. آلات سے جڑنے کے لیے، آپ کو اشارہ کرنے پر اس کا میزبان نام یا IP ایڈریس بھی درج کرنا ہوگا۔ ڈیوائس پر اجازت کے لیے ضروری تمام ڈیٹا موصول ہو گیا ہے۔

Junos PyEZ کنسول، telnet یا netconf کے ذریعے ssh کے ذریعے Junos OS چلانے والے آلات سے منسلک ہونے کی حمایت کرتا ہے۔ مضمون مؤخر الذکر آپشن پر بحث کرتا ہے۔

آلات سے جڑنے کے لیے، jnpr.junos ماڈیول کی ڈیوائس کلاس استعمال کریں۔

with jnpr.junos.Device(host=router,
                           user=args.name,
                           passwd=password) as dev:

ریموٹ پروسیجر کال یا ریموٹ پروسیجر کال کے ذریعے روٹر کو معلوم تمام راستوں کے لیے درخواست کی جاتی ہے، جو بھی زیادہ آسان ہو۔

data = dev.rpc.get_route_information()

جونوس OS پر اسی طرح کی کمانڈ

user@router> show route | display xml

کمانڈ کے آخر میں rpc کو شامل کرنے سے، ہمیں ایک درخواست کا ٹیگ ملتا ہے اور اسے RPC طریقہ کے نام سے مماثل کر سکتے ہیں، اس طرح ہم دلچسپی کے دیگر نام تلاش کر سکتے ہیں۔ یہ بات قابل غور ہے کہ درخواست ٹیگ لکھنے کا نحو طریقہ کے نام سے مختلف ہے، یعنی آپ کو ہائفنز کو انڈر سکور سے بدلنا چاہیے۔

user@router> show route | display xml rpc
<rpc-reply >route_list = data.xpath("//rt-destination/text()")

باقی حصے کو تھوڑی دیر کے لوپ میں لپیٹ دیا گیا تھا، تاکہ روٹر سے درخواست کو دہرایا نہ جائے اگر یہ ضروری ہو کہ کسی دوسرے سب نیٹ میں ان لوگوں سے چیک کیا جائے جن کے بارے میں راؤٹر پہلے سے جانتا ہے۔ یہ بات قابل ذکر ہے کہ جس راؤٹر پر میں درخواست کر رہا ہوں وہ صرف OSPF کے ذریعے روٹس کو جانتا ہے، اس لیے ایج روٹر کے لیے بہتر ہے کہ اسکرپٹ کے چلنے کے وقت کو کم کرنے کے لیے درخواست کو تھوڑا سا تبدیل کر دیا جائے۔

data = dev.rpc.get_ospf_route_information()

اب آئیے while لوپ کے مواد کو دیکھتے ہیں۔

شروع میں، صارف سے کہا جائے گا کہ وہ ماسک کے ساتھ سب نیٹ میں داخل ہو اور اسی سب نیٹ کے نیٹ ورک سے تین آکٹٹس سے زیادہ نہ ہوں، یہ سرچ رینج سیٹ کرنے کے لیے ضروری ہے۔ مجھے معیار اور تلاش کی حد کی وضاحت کرنے کا یہ عمل واقعی پسند نہیں ہے، لیکن اب تک مجھے اس سے بہتر حل نہیں ملا ہے۔ اس کے بعد، سب نیٹس روٹ_لسٹ کی نتیجے میں آنے والی فہرست سے، ایک متغیر کا استعمال کرتے ہوئے جس میں تین آکٹیٹس سے زیادہ نہ ہوں، میں ان سب نیٹس کو منتخب کرتا ہوں جو میری دلچسپی رکھتے ہیں۔

tmp = re.search(r'^%sS*' % subnet_search, route_list[i])

IPNetwork کے ذریعے، netaddr ماڈیول، میں ipv4 پتوں کی فہرست کی شکل میں سب نیٹس حاصل کرتا ہوں۔

range_subnet = netaddr.IPNetwork(tmp.group(0))

IPNetwork کا استعمال کرتے ہوئے، میں ایک ماسک کے ساتھ صارف کے داخل کردہ نیٹ ورک سے پتوں کی ایک رینج حاصل کرتا ہوں اور مقبوضہ پتوں کی فہرست کے مقابلے کے لیے اس رینج سے تمام پتوں کی فہرست تیار کرتا ہوں۔

for i in set(net_list).difference(set(busyip)):
        freeip.append(i)

میں مفت پتوں کی نتیجے کی فہرست سب نیٹس کی شکل میں ظاہر کرتا ہوں۔

print(netaddr.IPSet(freeip))

ذیل میں مکمل اسکرپٹ ہے، روٹر کے طور پر استعمال ہونے والے سوئچز پر تجربہ کیا گیا، ماڈلز ex4550، ex4600


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import getpass
import netaddr
import re
import sys

import jnpr.junos

parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user',
                    action='store',
                    dest='name',
                    help='Enter login from tacacs if it differs from the '
                         'username in the system.')
args = parser.parse_args()

if not args.name:
    args.name = getpass.getuser()    # Return the “login name” of the user.
router = input("Full routers name: ")
password = getpass.getpass("Password: ")

try:
    # Authenticates to a device running Junos, for get information about routs
    # into xml format and selects by tag.
    route_list = []
    with jnpr.junos.Device(host=router,
                           user=args.name,
                           passwd=password) as dev:
        data = dev.rpc.get_route_information()
    route_list = data.xpath("//rt-destination/text()")
except (jnpr.junos.exception.ConnectRefusedError,
        jnpr.junos.exception.ConnectUnknownHostError) as err:
    print("Equipment name or password wrong.")
    sys.exit(1)

while True:
    subnet = input("Net with mask: ")
    subnet_search = input("Input no more three octet: ")
    # Gets a list of busy IP addresses from the received subnets.
    busyip = []
    for i in range(len(route_list)):
        tmp = re.search(r'^%sS*' % subnet_search, route_list[i])
        if tmp:
            range_subnet = netaddr.IPNetwork(tmp.group(0))
            for ip in range_subnet:
                busyip.append("%s" % ip)
    range_subnet = netaddr.IPNetwork(subnet)
    # Gets list ip adresses from subnetworks lists.
    net_list = []
    for ip in range_subnet:
        net_list.append("%s" % ip)
    # Сomparing lists.
    freeip = []
    for i in set(net_list).difference(set(busyip)):
        freeip.append(i)
    print(netaddr.IPSet(freeip))

    request = input("To run request again enter yes or y, "
                    "press 'enter', complete request: ")
    if request in ("yes", "y"):
        continue
    else:
        print('Bye')
        break

ماخذ: www.habr.com

نیا تبصرہ شامل کریں