Junos PyEZ na-eji ihe atụ nke ọrụ ịchọ subnet ipv4 n'efu

Otu akụkọ gbasara ịrụ ọrụ na Junos PyEZ - "Python microframework nke na-enyere gị aka ijikwa ma megharịa ngwaọrụ na-agba ọsọ Junos OS" akpaaka na njikwa, ihe niile anyị hụrụ n'anya. Ide edemede a kọwara n'isiokwu a nwere ọtụtụ ebumnuche - ịmụta Python na ịmegharị ọrụ maka ịnakọta ozi ma ọ bụ gbanwee nhazi na akụrụngwa na-agba Junos OS. Nhọrọ nke nchikota Python + Junos PyEZ a ka emebere n'ihi obere ihe mgbochi ịbanye na asụsụ mmemme Python yana ịdị mfe iji ọbá akwụkwọ Junos PyEZ, nke na-achọghị ịma ọkachamara nke Junos OS.

Ebumnuche

Nyochaa nke subnets ipv4 n'efu nke ụlọ ọrụ ahụ. Ihe njiri mara na subnet bụ n'efu bụ enweghị ntinye gbasara ya na ụzọ ndị na-agbanwe agbanwe na-eme dị ka rawụta na-agba Junos OS.

Mmejuputa iwu

Python + Junos PyEZ, n'agbanyeghị na enwere ọnwụnwa ime ya site na paramiko na ssh.exec_command, N'ihi ya, ị ga-achọ ịhazi usoro njikwa netwọkụ ngwaọrụ netconf na akụrụngwa a na-eme ntuli aka. Netconf na-arụ ọrụ na ngwaike site na usoro dịpụrụ adịpụ na-akpọ RPC ma jiri XML, na ọmụmaatụ a, iji nye ozi ọ na-enweta.

Ịwụnye ụdị Junos PyEZ dị ugbu a sitere na PyPI na-eji iwu a:

$ pip install junos-eznc

Ị nwekwara ike iwunye site na isi ngalaba nke ọrụ ahụ na GitHub site na iwu a:

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

И еще один вариант через

$ pip install -r requirements.txt 

Iwu a ga-etinye ọba akwụkwọ ndị na-efu na sistemụ ma dị mkpa maka ịrụ ọrụ. Na ụdị m chọrọ.txt их всего две, версии указаны последние на момент написания скрипта:

junos-eznc
netaddr

Edemede site na ndabara na-ewere aha onye ọrụ ugbu a na sistemụ, ị nwere ike ịbanye n'okpuru aha onye ọrụ ọzọ site na iji igodo show_route.py -u getpass.getpass na-ewe paswọọdụ site na stdin ka paswọọdụ agaghị adịgide. n'ime usoro. Iji jikọọ na akụrụngwa, ị ga-achọkwa itinye aha nnabata ma ọ bụ adreesị IP mgbe kpaliri ya. Anatala data niile dị mkpa maka ikike na ngwaọrụ.

Junos PyEZ поддерживает подключение к оборудованию под управлением Junos OS используя консоль, telnet или netconf через ssh. В статье рассмотрен последний вариант.

Iji jikọọ na akụrụngwa, jiri klas ngwaọrụ nke modul jnpr.junos

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

A na-arịọ arịrịọ maka ụzọ niile onye rawụta maara site na oku usoro dịpụrụ adịpụ ma ọ bụ oku usoro dịpụrụ adịpụ, nke ọ bụla dabara adaba.

data = dev.rpc.get_route_information()

Iwu yiri ya na Junos OS

user@router> show route | display xml

Добавив в конец команды rpc, получим тег запроса и можем сопоставить его с именем метода RPC, таким способом можно узнать и другие интересующие имена. Стоит отметить, что синтаксис написания тега запроса отличается от имени метода, а именно следует заменить знаки дефиса на нижние подчеркивание.

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

A na-ekechi akụkụ nke ọzọ n'ime obere oge, ka ọ ghara imeghachi arịrịọ ahụ na rawụta ma ọ bụrụ na ọ dị mkpa ịlele na subnet ọzọ site na ndị rawụta ahụ amaworị. Ọ bara uru ịkọwa na rawụta nke m na-arịọ arịrịọ maara ụzọ naanị site na OSPF, yabụ maka rawụta ihu ọ ka mma ịgbanwe arịrịọ ahụ ntakịrị iji belata oge ịgba ọsọ nke edemede ahụ.

data = dev.rpc.get_ospf_route_information()

Ugbu a, ka anyị leba anya na ọdịnaya nke oge loop

Na mbido, a ga-agwa onye ọrụ ka ọ banye subnet nwere ihe nkpuchi ma ọ bụghị ihe karịrị octets atọ site na netwọkụ nke otu subnet, nke a dị mkpa iji tọọ oke ọchụchọ. Enweghị m mmasị na mmejuputa a nke ịkọwapụta njirisi na ọnụọgụ ọchụchọ, ma ruo ugbu a ahụbeghị m ngwọta ka mma. Na-esote, site na ndepụta nke subnets route_list, na-eji mgbanwe na-enweghị ihe karịrị octets atọ, m na-ahọrọ subnets ndị masịrị m.

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

Site na IPNetwork, modul netaddr, ana m enweta subnets n'ụdị ndepụta adreesị IPv4.

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

N'iji IPNetwork, ana m enweta adreesị dị iche iche site na netwọk onye ọrụ na-eji ihe nkpuchi wee mepụta ndepụta adreesị niile site na nso a maka iji tụnyere ndepụta nke adreesị ndị ejiri.

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

M na-egosiputa ndepụta nke adreesị efu n'ụdị subnets

print(netaddr.IPSet(freeip))

N'okpuru ebe a bụ edemede zuru oke, nwalere na switches eji dị ka rawụta, ụdị 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

isi: www.habr.com

Tinye a comment