Junos PyEZ استعمال ڪندي ٽاسڪ جو مثال مفت ipv4 subnets جي ڳولا لاءِ

Junos PyEZ سان ڪم ڪرڻ بابت هڪ مضمون - "Python microframework جيڪو توهان کي اجازت ڏئي ٿو ته توهان جونوس OS تي هلندڙ ڊوائيسز کي منظم ۽ خودڪار ڪرڻ" آٽوميشن ۽ انتظام، هر شي جيڪا اسان پسند ڪريون ٿا. هن آرٽيڪل ۾ بيان ڪيل اسڪرپٽ لکڻ جا ڪيترائي مقصد هئا - پيٿون سکڻ ۽ معلومات گڏ ڪرڻ يا جونوس او ايس تي هلندڙ سامان تي ترتيبن کي تبديل ڪرڻ لاءِ خودڪار ڪم. Python + Junos PyEZ جي هن مخصوص ميلاپ جي چونڊ پٿون پروگرامنگ ٻولي ۾ داخل ٿيڻ ۾ گهٽ رڪاوٽ ۽ جونوس PyEZ لائبريري جي استعمال جي آسانيءَ جي ڪري ڪئي وئي، جنهن لاءِ Junos OS جي ماهر علم جي ضرورت نه آهي.

مقصد

ڪمپني سان تعلق رکندڙ مفت ipv4 سبنيٽس جو آڊٽ. معيار اهو آهي ته هڪ سب نيٽ مفت آهي ان جي باري ۾ داخل ٿيڻ جي غير موجودگي سوئچ تي رستن ۾ هڪ روٽر طور ڪم ڪري رهيو آهي Junos OS.

عمل

Python + Junos PyEZ، جيتوڻيڪ اتي paramiko ۽ ssh.exec_command ذريعي ان کي ڪرڻ جي لالچ هئي، نتيجي طور، توھان کي netconf ڊيوائس نيٽ ورڪ مئنيجمينٽ پروٽوڪول کي ترتيب ڏيڻ جي ضرورت پوندي پولنگ سامان تي. Netconf هارڊويئر سان ڪم ڪري ٿو ريموٽ پروسيجر ڪال RPC ذريعي ۽ استعمال ڪري ٿو XML، هن مثال ۾، معلومات مهيا ڪرڻ لاءِ جيڪا ان کي ملي ٿي.

انسٽال ڪرڻ جو موجوده نسخو Junos PyEZ PyPI کان هيٺ ڏنل حڪم سان ڪيو ويو آهي:

$ pip install junos-eznc

توھان ھيٺ ڏنل حڪم سان GitHub تي منصوبي جي مکيه شاخ مان پڻ انسٽال ڪري سگھو ٿا:

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

۽ هڪ وڌيڪ اختيار ذريعي

$ pip install -r requirements.txt 

هي حڪم لائبريريون نصب ڪندو جيڪي سسٽم مان غائب آهن ۽ آپريشن لاء ضروري آهن. منهنجي نسخي ۾ گهرجن. txt انهن مان صرف ٻه آهن، جديد نسخن کي اسڪرپٽ لکڻ جي وقت اشارو ڪيو ويو آهي:

junos-eznc
netaddr

ڊفالٽ طور اسڪرپٽ سسٽم ۾ موجوده استعمال ڪندڙ جو نالو وٺندو آهي، توهان ڪنهن ٻئي صارف جي نالي هيٺ لاگ ان ڪري سگهو ٿا ڪي استعمال ڪندي show_route.py -u getpass.getpass پاسورڊ stdin کان وٺي ٿو ته پاسورڊ باقي نه رهندو. سسٽم ۾. سامان سان ڳنڍڻ لاء، توهان کي پڻ داخل ڪرڻ جي ضرورت پوندي ان جو ميزبان نالو يا IP پتو جڏهن اشارو ڪيو ويندو. ڊوائيس تي اختيار لاءِ گهربل سڀ ڊيٽا حاصل ڪئي وئي آهي.

Junos PyEZ ssh ذريعي ڪنسول، telnet يا netconf استعمال ڪندي Junos OS تي هلندڙ سامان سان ڳنڍڻ جي حمايت ڪري ٿو. مضمون ۾ آخري اختيار تي بحث ڪيو ويندو.

سامان سان ڳنڍڻ لاء، jnpr.junos ماڊل جي ڊوائيس ڪلاس استعمال ڪريو

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

ريموٽ پروسيسنگ ڪال يا ريموٽ پروسيسنگ ڪال ذريعي روٽر کي سڃاتل سڀني رستن لاءِ درخواست ڪئي وئي آهي، جيڪو به وڌيڪ آسان هجي.

data = dev.rpc.get_route_information()

ساڳيو حڪم Junos OS تي

user@router> show route | display xml

آر پي سي کي ڪمانڊ جي آخر ۾ شامل ڪرڻ سان، اسان کي هڪ درخواست ٽيگ ملي ٿو ۽ ان کي آر پي سي طريقي جي نالي سان ملائي سگهون ٿا، ان طريقي سان اسان دلچسپي جا ٻيا نالا ڳولي سگهون ٿا. اها ڳالهه نوٽ ڪرڻ جي قابل آهي ته درخواست ٽيگ لکڻ لاء نحو طريقي جي نالي کان مختلف آهي، يعني، توهان کي hyphens کي انڊر اسڪور سان تبديل ڪرڻ گهرجي.

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

باقي حصو ڪجھ دير واري لوپ ۾ لپي ويو، جيئن روٽر جي درخواست کي ورجائي نه سگھي، جيڪڏھن ضروري ھجي ته انھن مان ڪنھن ٻئي سب نيٽ ۾ چيڪ ڪريو جن جي باري ۾ روٽر اڳ ۾ ئي ڄاڻي ٿو. اها ڳالهه قابل ذڪر آهي ته جنهن راؤٽر تي مان درخواست ڪري رهيو آهيان اهو روٽ صرف OSPF ذريعي ڄاڻي ٿو، ان ڪري ايج روٽر لاءِ بهتر آهي ته درخواست کي ٿورو تبديل ڪيو وڃي ته جيئن اسڪرپٽ جي هلندڙ وقت کي گهٽايو وڃي.

data = dev.rpc.get_ospf_route_information()

ھاڻي اچو ته ان وقت لوپ جي مواد کي ڏسو

شروعات ۾، صارف کي چيو ويندو ته هڪ ماسڪ سان هڪ سب نيٽ داخل ڪيو ۽ ساڳئي سب نيٽ جي نيٽ ورڪ کان ٽن آڪٽٽس کان وڌيڪ نه، اهو سرچ رينج مقرر ڪرڻ لاء ضروري آهي. مان واقعي پسند نٿو ڪريان ته معيار ۽ ڳولا جي حد کي بيان ڪرڻ جي هن عمل کي، پر اڃا تائين مون کي بهتر حل نه مليو آهي. اڳيون، subnets route_list جي نتيجي واري لسٽ مان، هڪ متغير استعمال ڪندي جنهن ۾ ٽن آڪٽٽس کان وڌيڪ نه هجي، مان انهن سبنيٽس کي چونڊيو جيڪي منهنجي دلچسپي رکن ٿا.

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

IPNetwork ذريعي، نيٽادڊر ماڊل، مان 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

تبصرو شامل ڪريو