I-Junos PyEZ isebenzisa isibonelo somsebenzi wokusesha ama-subnets we-ipv4 wamahhala

Isihloko esimayelana nokusebenza ne-Junos PyEZ - “Python microframework ekuvumela ukuthi ulawule futhi wenze ngokuzenzakalela amadivayisi asebenzisa i-Junos OS” okuzenzakalelayo nokuphatha, yonke into esiyithandayo. Ukubhala isikripthi esichazwe kulesi sihloko bekunemigomo embalwa - ukufunda iPython kanye nemisebenzi yokuzenzakalela yokuqoqa ulwazi noma ukushintsha ukulungiselelwa kumishini esebenzisa i-Junos OS. Ukukhethwa kwale nhlanganisela ethize yePython + Junos PyEZ kwenziwa ngenxa yokuvimbela okuphansi kokungena olimini lokuhlela lwePython kanye nokusebenziseka kalula komtapo wezincwadi we-Junos PyEZ, ongadingi ulwazi lochwepheshe lwe-Junos OS.

Inhloso

Ukucwaningwa kwamahhala kwama-subnet e-ipv4 enkampani. Umbandela wokuthi i-subnet imahhala ukungabi khona kokungenayo mayelana nayo emizileni ekushintsheni esebenza njengomzila osebenzisa i-Junos OS.

Ukuqaliswa

I-Python + Junos PyEZ, nakuba kwakukhona isilingo sokukwenza nge-paramiko kanye ne-ssh.exec_command, Njengomphumela walokho, uzodinga ukumisa iphrothokholi yokuphatha inethiwekhi yedivayisi ye-netconf kokokusebenza okuphendulwayo. I-Netconf isebenza nezingxenyekazi zekhompuyutha ngenqubo yokushayela ekude i-RPC futhi isebenzisa i-XML, kulesi sibonelo, ukuze inikeze ulwazi olutholayo.

Ukufaka inguqulo yamanje ye-Junos PyEZ kusuka ku-PyPI kwenziwa ngomyalo olandelayo:

$ pip install junos-eznc

Ungafaka futhi usuka egatsheni eliyinhloko lephrojekthi ku-GitHub ngomyalo olandelayo:

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

Futhi enye inketho nge

$ pip install -r requirements.txt 

Lo myalo uzofaka imitapo yolwazi engekho ohlelweni futhi edingekayo ukuze isebenze. Enguqulweni yami izidingo.txt Zimbili kuphela zazo, izinguqulo zakamuva zikhonjisiwe ngesikhathi sokubhala iskripthi:

junos-eznc
netaddr

Ngokuzenzakalelayo, umbhalo uthatha igama lomsebenzisi wamanje ohlelweni; ungangena ngaphansi kwegama lomunye umsebenzisi usebenzisa ukhiye we-show_route.py -u i-getpass.getpass ithatha iphasiwedi ku-stdin ukuze igama-mfihlo lingahlali ohlelweni. Ukuze uxhume kumshini, uzodinga futhi ukuthi ufake igama lomethuleli noma ikheli le-IP lapho uyalwa. Yonke idatha edingekayo ukuze kugunyazwe idivayisi yamukelwe.

I-Junos PyEZ isekela ukuxhuma kumishini esebenzisa i-Junos OS isebenzisa ikhonsoli, i-telnet noma i-netconf nge-ssh. Isihloko sidingida inketho yokugcina.

Ukuze uxhume kumishini, sebenzisa ikilasi ledivayisi lemojuli ye-jnpr.junos

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

Isicelo senziwa ngayo yonke imizila eyaziwa yi-router ngocingo lwenqubo eqhelile noma ucingo lwenqubo olukude, kuye ngokuthi ikuphi okulula kakhulu.

data = dev.rpc.get_route_information()

Umyalo ofanayo ku-Junos OS

user@router> show route | display xml

Ngokungeza i-rpc ekupheleni komyalo, sithola ithegi yesicelo futhi singayifanisa negama lendlela ye-RPC, ngale ndlela singathola amanye amagama esithakazelo. Kuyaqapheleka ukuthi i-syntax yokubhala ithegi yesicelo ihlukile kunegama lendlela, okungukuthi, kufanele ubeke amakhonco ngama-underscore.

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

Ingxenye esele yayigoqwe nge-loop yesikhashana, ukuze ungaphindi isicelo ku-router uma kudingekile ukuhlola enye i-subnet kulawo i-router eyazi kakade. Kuhle ukusho ukuthi i-router engifaka kuyo isicelo iyazi imizila nge-OSPF kuphela, ngakho-ke kumzila onqenqemeni kungcono ukuguqula isicelo kancane ukuze unciphise isikhathi sokusebenza sombhalo.

data = dev.rpc.get_ospf_route_information()

Manje ake sibheke okuqukethwe kwe-loop yesikhathi

Ekuqaleni, umsebenzisi uzocelwa ukuthi afake i-subnet nge-mask futhi angabi ngaphezu kwama-octet amathathu kusuka kunethiwekhi ye-subnet efanayo, lokhu kuyadingeka ukuze usethe ububanzi bokusesha. Angikuthandi ngempela lokhu kuqaliswa kokucacisa imibandela kanye nohlu lokusesha, kodwa kuze kube manje angikasitholi isisombululo esingcono. Okulandelayo, ohlwini oluwumphumela lwama-subnets route_list, ngisebenzisa okuguquguqukayo okuqukethe ama-octet angaphezu kwamathathu, ngikhetha ama-subnet engithakaselayo.

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

Nge-IPNetwork, imojula ye-netaddr, ngithola ama-subnets ngendlela yohlu lwamakheli e-ipv4

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

Ngisebenzisa i-IPNetwork, ngithola izinhlobonhlobo zamakheli kunethiwekhi efakwe umsebenzisi ngemaski futhi ngikhiqize uhlu lwawo wonke amakheli asuka kulobu bubanzi ukuze ngiqhathanise nohlu lwamakheli ahlala abantu.

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

Ngibonisa uhlu oluphumayo lwamakheli amahhala ngendlela yama-subnet

print(netaddr.IPSet(freeip))

Ngezansi umbhalo ophelele, ohlolwe kumaswishi asetshenziswa njengerutha, amamodeli 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

Engeza amazwana