Junos PyEZ faʻaaogaina le faʻataʻitaʻiga o le galuega o le suʻeina o subnets ipv4 saoloto

O se tala e uiga i le galulue faatasi ma Junos PyEZ - "Python microframework e mafai ai e oe ona faʻatautaia ma faʻaogaina masini e faʻaogaina ai le Junos OS" otometi ma pulega, mea uma matou te fiafia i ai. O le tusiaina o le faʻamatalaga o loʻo faʻamatalaina i lenei tusiga e tele ni sini - aʻoaʻoina le Python ma le faʻaaogaina o galuega mo le aoina o faʻamatalaga poʻo le suia o faʻasalalauga i mea faigaluega o loʻo faʻaogaina Junos OS. O le filifiliga o lenei tuʻufaʻatasiga patino o le Python + Junos PyEZ na faia ona o le paʻu maualalo e ulufale ai i le gagana polokalame Python ma le faigofie o le faʻaogaina o le faletusi Junos PyEZ, lea e le manaʻomia ai le poto faʻapitoa o Junos OS.

Faamoemoega

Su'etusi ole ipv4 subnets a le kamupani. O le fa'ailoga e leai se totogi o se subnet o le leai lea o se fa'amatalaga e uiga i ai i ala i luga o le ki o lo'o galue e pei o se router e fa'aogaina Junos OS.

Реализация

Python + Junos PyEZ, e ui lava sa i ai se faaosoosoga e faia e ala i paramiko ma ssh.exec_command, O se taunuuga, e te manaʻomia le faʻatulagaina o le netconf device network management protocol i luga o masini o loʻo suʻesuʻeina. Netconf e galue ma meafaigaluega e ala i le mamao mamao valaau RPC ma faʻaoga XML, i lenei faʻataʻitaʻiga, e tuʻuina atu ai faʻamatalaga na te mauaina.

O le faʻapipiʻiina o le lomiga o loʻo i ai nei o Junos PyEZ mai le PyPI ua faia i le poloaiga lenei:

$ pip install junos-eznc

E mafai foi ona e faʻapipiʻi mai le lala autu o le poloketi ile GitHub ma le faʻatonuga lea:

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

Ma se isi filifiliga e ala i

$ pip install -r requirements.txt 

O lenei poloaiga o le a faʻapipiʻi faletusi o loʻo misi mai le faiga ma e manaʻomia mo le faʻaogaina. I la'u lomiga manaʻoga.txt E naʻo le lua o latou, o faʻamatalaga lata mai o loʻo faʻaalia i le taimi na tusia ai le tusitusiga:

junos-eznc
netaddr

O le tusitusiga e le mafai ona ave le igoa o le tagata o loʻo i ai nei i totonu o le polokalama, e mafai ona e ulufale i lalo o le igoa o se isi tagata faʻaoga e faʻaaoga ai le ki show_route.py -u getpass.getpass ave le password mai le stdin ina ia le tumau le upu faʻamaonia. i le faiga. Ina ia faʻafesoʻotaʻi i meafaigaluega, e te manaʻomia foʻi le ulufale i lona igoa talimalo poʻo le tuatusi IP pe a faʻamalosia. O faʻamatalaga uma e manaʻomia mo le faʻatagaina i luga o le masini ua maua.

E lagolagoina e Junos PyEZ le fa'afeso'ota'i i masini fa'aoga Junos OS e fa'aoga ai le fa'amafanafanaga, telnet po'o le netconf e ala ile ssh. O loʻo talanoaina e le tusiga le filifiliga mulimuli.

Ina ia fa'afeso'ota'i i masini, fa'aoga le vasega masini o le module jnpr.junos

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

E faia se talosaga mo auala uma e iloa e le router e ala i le mamao o le telefoni poʻo le mamao, po o fea e sili atu ona faigofie.

data = dev.rpc.get_route_information()

Faiga tutusa i Junos OS

user@router> show route | display xml

E ala i le faʻaopoopoina o le rpc i le pito o le faʻatonuga, matou te maua se pine talosaga ma mafai ona fetaui ma le igoa o le RPC metotia, i lenei auala e mafai ai ona matou suʻeina isi igoa e fiafia i ai. E taua le matauina o le syntax mo le tusiaina o le pepa talosaga e ese mai le igoa o le metotia, o lona uiga, e tatau ona e suia le va'aiga i lalo.

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

O le vaega o totoe o le vaega na afifiina i se taimi matasele, ina ia aua nei toe faia le talosaga i le router pe a tatau ona siaki se isi subnet mai i latou ua uma ona iloa e le router. E taua le taʻua o le router lea o loʻo ou faia ai le talosaga e iloa auala e naʻo le OSPF, o lea mo se router pito e sili atu le suia o le talosaga e faʻaitiitia ai le taimi o le tusitusiga.

data = dev.rpc.get_ospf_route_information()

Se'i o tatou va'ai i mea o lo'o i totonu o le while loop

I le amataga, o le a talosagaina le tagata faʻaoga e ulufale i totonu o se subnet ma se mask ma e le sili atu ma le tolu octets mai le fesoʻotaʻiga o le subnet tutusa, e manaʻomia lea e seti ai le vaʻaiga suʻesuʻe. Ou te le fiafia tele i lenei faʻatinoga o le faʻamalamalamaina o taʻiala ma le vaʻaiga o suʻesuʻega, ae o le taimi nei ou te leʻi mauaina se fofo sili atu. Ma le isi, mai le lisi o loʻo iʻu i lalo o laina laina, faʻaaogaina se fesuiaiga e le sili atu ma le tolu octets, ou te filifilia le subnets ou te fiafia i ai.

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

E ala i le IPNetwork, le netaddr module, ou te mauaina subnets i le tulaga o se lisi o tuatusi ipv4

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

I le faʻaaogaina o le IPNetwork, ou te mauaina le tele o tuatusi mai se fesoʻotaʻiga e tuʻuina atu e le tagata faʻaoga ma se matapulepule ma fatuina se lisi o tuatusi uma mai lenei laina mo le faʻatusatusaina ma le lisi o tuatusi nofoia.

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

Ou te faʻaalia le lisi o faʻauluuluga o tuatusi saoloto i foliga o subnets

print(netaddr.IPSet(freeip))

O loʻo i lalo le faʻamaumauga atoa, faʻataʻitaʻiina i suiga na faʻaaogaina e avea o se router, faʻataʻitaʻiga 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

puna: www.habr.com

Faaopoopo i ai se faamatalaga