Junos PyEZ gamit ang panig-ingnan sa tahas sa pagpangita alang sa libre nga ipv4 subnets

Usa ka artikulo bahin sa pagtrabaho kauban ang Junos PyEZ - "Python microframework nga nagtugot kanimo sa pagdumala ug pag-automate sa mga aparato nga nagpadagan sa Junos OS" automation ug pagdumala, tanan nga among gihigugma. Ang pagsulat sa script nga gihulagway sa kini nga artikulo adunay daghang mga katuyoan - pagkat-on sa Python ug pag-automate sa mga buluhaton alang sa pagkolekta sa kasayuran o pagbag-o sa mga pag-configure sa kagamitan nga nagpadagan sa Junos OS. Ang pagpili niining espesipikong kombinasyon sa Python + Junos PyEZ gihimo tungod sa ubos nga babag sa pagsulod sa Python programming language ug ang kasayon ​​sa paggamit sa Junos PyEZ library, nga wala magkinahanglan og kahibalo sa eksperto sa Junos OS.

Tumong

Pag-audit sa libre nga ipv4 subnets nga iya sa kompanya. Ang sukaranan nga ang usa ka subnet libre mao ang pagkawala sa usa ka entry bahin niini sa mga ruta sa switch nga naglihok ingon usa ka router nga nagpadagan sa Junos OS.

Pagpatuman

Python + Junos PyEZ, bisan kung adunay usa ka tintasyon sa pagbuhat niini pinaagi sa paramiko ug ssh.exec_command, Ingon nga resulta, kinahanglan nimo nga i-configure ang netconf device network management protocol sa mga kagamitan nga gisusi. Ang Netconf nagtrabaho sa hardware pinaagi sa remote procedure call RPC ug naggamit sa XML, niini nga pananglitan, aron paghatag sa impormasyon nga nadawat niini.

Ang pag-instalar sa kasamtangan nga bersyon sa Junos PyEZ gikan sa PyPI gihimo sa mosunod nga sugo:

$ pip install junos-eznc

Mahimo ka usab mag-install gikan sa panguna nga sanga sa proyekto sa GitHub gamit ang mosunud nga mando:

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

Ug usa pa ka kapilian pinaagi sa

$ pip install -r requirements.txt 

Kini nga sugo mag-instalar sa mga librarya nga nawala sa sistema ug gikinahanglan alang sa operasyon. Sa akong version mga kinahanglanon.txt Adunay duha lamang niini, ang pinakabag-o nga mga bersyon gipakita sa panahon sa pagsulat sa script:

junos-eznc
netaddr

Ang script sa default nagkuha sa ngalan sa kasamtangan nga user sa sistema, mahimo ka mag log in ubos sa ngalan sa laing user gamit ang yawe show_route.py -u getpass.getpass gikuha ang password gikan sa stdin aron ang password dili magpabilin sa sistema. Aron makonektar sa kagamitan, kinahanglan nimo nga isulod ang hostname o IP address niini kung giaghat. Ang tanan nga datos nga gikinahanglan alang sa pagtugot sa aparato nadawat.

Gisuportahan sa Junos PyEZ ang pagkonektar sa kagamitan nga nagpadagan sa Junos OS gamit ang console, telnet o netconf pinaagi sa ssh. Gihisgotan sa artikulo ang ulahi nga kapilian.

Aron makonektar sa kagamitan, gamita ang klase sa Device sa jnpr.junos module

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

Ang usa ka hangyo gihimo alang sa tanan nga mga ruta nga nahibal-an sa router pinaagi sa remote procedure call o remote procedure call, hain ang mas sayon.

data = dev.rpc.get_route_information()

Susama nga sugo sa Junos OS

user@router> show route | display xml

Pinaagi sa pagdugang sa rpc sa katapusan sa mando, makakuha kami usa ka hangyo nga tag ug mahimo nga ipares kini sa ngalan sa pamaagi sa RPC, sa niini nga paagi mahibal-an namon ang ubang mga ngalan sa interes. Angay nga hinumdoman nga ang syntax alang sa pagsulat sa hangyo nga tag lahi sa ngalan sa pamaagi, nga mao, kinahanglan nimo nga pulihan ang mga hyphen nga adunay mga underscore.

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

Ang nahabilin nga bahin giputos sa usa ka while loop, aron dili masubli ang hangyo sa router kung kinahanglan nga susihon ang lain nga subnet gikan sa nahibal-an na sa router. Angayan nga isulti nga ang router diin ako naghimo sa hangyo nahibal-an ang mga ruta lamang pinaagi sa OSPF, mao nga alang sa usa ka edge router mas maayo nga usbon ang hangyo aron makunhuran ang oras sa pagdagan sa script

data = dev.rpc.get_ospf_route_information()

Karon atong tan-awon ang sulod sa while loop

Sa sinugdanan, ang user hangyoon nga mosulod sa usa ka subnet nga adunay maskara ug dili molapas sa tulo ka mga octet gikan sa network sa samang subnet, kini gikinahanglan aron itakda ang search range. Dili gyud ko ganahan niini nga pagpatuman sa pagtino sa criteria ug search range, apan hangtod karon wala pa koy nakit-an nga mas maayo nga solusyon. Sunod, gikan sa resulta nga lista sa mga subnet route_list, gamit ang usa ka variable nga adunay sulod nga dili molapas sa tulo ka octet, akong pilion ang mga subnet nga makapainteres kanako.

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

Pinaagi sa IPNetwork, ang module sa netaddr, nakadawat ako mga subnet sa porma sa usa ka lista sa mga adres sa ipv4

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

Gamit ang IPNetwork, nakakuha ako usa ka lainlaing mga adres gikan sa usa ka network nga gisulod sa gumagamit nga adunay maskara ug naghimo usa ka lista sa tanan nga mga adres gikan sa kini nga sakup alang sa pagtandi sa lista sa mga gi-okupar nga adres.

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

Gipakita nako ang resulta nga lista sa mga libre nga adres sa porma sa mga subnet

print(netaddr.IPSet(freeip))

Sa ubos mao ang kompleto nga script, gisulayan sa mga switch nga gigamit ingon usa ka router, mga modelo nga 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

Source: www.habr.com

Idugang sa usa ka comment