Junos PyEZ lè l sèvi avèk egzanp travay la pou chèche sous-rezo ipv4 gratis

Yon atik sou travay ak Junos PyEZ - "Python microframework ki pèmèt ou jere ak otomatize aparèy ki kouri Junos OS" automatisation ak jesyon, tout sa nou renmen. Ekri script ki dekri nan atik sa a te gen plizyè objektif - aprann Python ak otomatize travay pou kolekte enfòmasyon oswa chanje konfigirasyon sou ekipman ki kouri Junos OS. Chwa a nan konbinezon espesifik sa a nan Python + Junos PyEZ te fèt akòz baryè ki ba a antre nan lang nan pwogramasyon Python ak fasilite nan itilize nan bibliyotèk la Junos PyEZ, ki pa mande pou konesans ekspè nan Junos OS.

Objektif Travay la

Odit sou sous-rezo ipv4 gratis ki fè pati konpayi an. Kritè ke yon subnet gratis se absans yon antre sou li nan wout yo sou switch la aji kòm yon routeur ki kouri Junos OS.

Aplikasyon

Python + Junos PyEZ, byenke te gen yon tantasyon fè li atravè paramiko ak ssh.exec_command, Kòm yon rezilta, w ap bezwen konfigirasyon pwotokòl jesyon rezo aparèy netconf sou ekipman yo te vote a. Netconf travay ak pyès ki nan konpitè atravè pwosedi aleka rele RPC epi li sèvi ak XML, nan egzanp sa a, pou bay enfòmasyon li resevwa.

Enstale vèsyon aktyèl la nan Junos PyEZ soti nan PyPI fè ak lòd sa a:

$ pip install junos-eznc

Ou ka enstale tou nan branch prensipal pwojè a sou GitHub ak lòd sa a:

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

Ak yon lòt opsyon via

$ pip install -r requirements.txt 

Kòmand sa a pral enstale bibliyotèk ki manke nan sistèm nan epi ki nesesè pou operasyon. Nan vèsyon mwen an kondisyon.txt Gen sèlman de nan yo, dènye vèsyon yo endike nan moman ekri script la:

junos-eznc
netaddr

Pa default, script la pran non itilizatè aktyèl la nan sistèm lan; ou ka konekte sou non yon lòt itilizatè lè l sèvi avèk kle show_route.py -u. getpass.getpass pran modpas la nan stdin pou modpas la p ap rete nan sistèm nan. Pou konekte ak ekipman an, w ap bezwen tou antre non host li oswa adrès IP lè li mande. Tout done ki nesesè pou otorizasyon sou aparèy la te resevwa.

Junos PyEZ sipòte koneksyon ak ekipman ki kouri Junos OS lè l sèvi avèk konsole a, telnet oswa netconf atravè ssh. Atik la diskite sou opsyon ki sot pase a.

Pou konekte ak ekipman, itilize klas Aparèy modil jnpr.junos la

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

Yo fè yon demann pou tout wout routeur la konnen atravè apèl pwosedi aleka oswa apèl pwosedi aleka, kèlkeswa sa ki pi pratik.

data = dev.rpc.get_route_information()

Kòmandman menm jan an sou Junos OS

user@router> show route | display xml

Lè nou ajoute rpc nan fen kòmandman an, nou jwenn yon tag demann epi nou ka matche li ak non metòd RPC a, nan fason sa a nou ka jwenn lòt non ki enterese. Li se vo anyen ke sentaks la pou ekri tag demann lan diferan de non metòd la, sètadi, ou ta dwe ranplase tire yo ak souliye.

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

Rès la nan pati a te vlope nan yon bouk pandan y ap, se konsa yo pa repete demann lan nan routeur la si li te nesesè yo tcheke nan yon lòt subnet soti nan sa yo ke routeur la deja konnen sou. Li vo mansyone ke routeur kote m ap fè demann lan konnen wout sèlman atravè OSPF, kidonk pou yon routeur kwen li pi bon pou chanje demann lan yon ti kras pou diminye tan kouri script la.

data = dev.rpc.get_ospf_route_information()

Koulye a, kite a gade nan sa ki nan bouk la while

Nan kòmansman an, yo pral mande itilizatè a antre nan yon subnet ak yon mask ak pa plis pase twa octets soti nan rezo a nan menm subnet la, sa a nesesè yo mete seri rechèch la. Mwen pa reyèlman renmen aplikasyon sa a nan espesifye kritè a ak seri rechèch, men jiskaprezan mwen pa te jwenn yon solisyon pi bon. Apre sa, soti nan lis sous-rezo route_list, lè l sèvi avèk yon varyab ki pa gen plis pase twa octets, mwen chwazi sous-rezo ki enterese m.

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

Atravè IPNetwork, modil netaddr, mwen resevwa sous-rezo nan fòm yon lis adrès ipv4.

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

Sèvi ak IPNetwork, mwen jwenn yon seri adrès ki soti nan yon rezo itilizatè-antre ak yon mask epi jenere yon lis tout adrès ki soti nan seri sa a pou konparezon ak lis adrès yo okipe yo.

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

Mwen montre lis ki kapab lakòz adrès gratis nan fòm subnets

print(netaddr.IPSet(freeip))

Anba a se script konplè a, teste sou switch yo itilize kòm yon routeur, modèl 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

Sous: www.habr.com

Add nouvo kòmantè