Junos PyEZ ืžืฉืชืžืฉ ื‘ื“ื•ื’ืžื” ืฉืœ ื”ืžืฉื™ืžื” ืฉืœ ื—ื™ืคื•ืฉ ืจืฉืชื•ืช ืžืฉื ื” ipv4 ื‘ื—ื™ื ื

ืžืืžืจ ืขืœ ืขื‘ื•ื“ื” ืขื Junos PyEZ - "Python microframework ื”ืžืืคืฉืจ ืœืš ืœื ื”ืœ ื•ืœื‘ืฆืข ืื•ื˜ื•ืžืฆื™ื” ืฉืœ ืžื›ืฉื™ืจื™ื ื”ืžืจื™ืฆื™ื ืืช Junos OS" ืื•ื˜ื•ืžืฆื™ื” ื•ื ื™ื”ื•ืœ, ื›ืœ ืžื” ืฉืื ื—ื ื• ืื•ื”ื‘ื™ื. ืœื›ืชื™ื‘ืช ื”ืชืกืจื™ื˜ ื”ืžืชื•ืืจ ื‘ืžืืžืจ ื–ื” ื”ื™ื• ืžืกืคืจ ืžื˜ืจื•ืช - ืœื™ืžื•ื“ Python ื•ืื•ื˜ื•ืžืฆื™ื” ืฉืœ ืžืฉื™ืžื•ืช ืœืื™ืกื•ืฃ ืžื™ื“ืข ืื• ืฉื™ื ื•ื™ ืชืฆื•ืจื•ืช ื‘ืฆื™ื•ื“ ื”ืžืจื™ืฅ ืืช ืžืขืจื›ืช ื”ื”ืคืขืœื” Junos. ื”ื‘ื—ื™ืจื” ื‘ืฉื™ืœื•ื‘ ื”ืกืคืฆื™ืคื™ ื”ื–ื” ืฉืœ Python + Junos PyEZ ื ืขืฉืชื” ืขืงื‘ ืžื—ืกื•ื ื”ื›ื ื™ืกื” ื”ื ืžื•ืš ืœืฉืคืช ื”ืชื›ื ื•ืช Python ื•ืงืœื•ืช ื”ืฉื™ืžื•ืฉ ื‘ืกืคืจื™ื™ืช Junos PyEZ, ืฉืื™ื ื” ืžืฆืจื™ื›ื” ื™ื“ืข ืžื•ืžื—ื” ื‘-Junos OS.

ืžืฉื™ืžื”

ื‘ื™ืงื•ืจืช ืจืฉืชื•ืช ืžืฉื ื” ipv4 ื—ื™ื ืžื™ื•ืช ื”ืฉื™ื™ื›ื•ืช ืœื—ื‘ืจื”. ื”ืงืจื™ื˜ืจื™ื•ืŸ ืฉืจืฉืช ืžืฉื ื” ื”ื™ื ื—ื™ื ืžื™ืช ื”ื•ื ื”ื™ืขื“ืจ ืขืจืš ืขืœื™ื” ื‘ืžืกืœื•ืœื™ื ืขืœ ื”ืžืชื’ ื”ืคื•ืขืœ ื›ื ืชื‘ ื”ืžืจื™ืฅ ืืช ืžืขืจื›ืช ื”ื”ืคืขืœื” Junos.

ะ ะตะฐะปะธะทะฐั†ะธั

Python + Junos PyEZ, ืœืžืจื•ืช ืฉื”ื™ื” ืคื™ืชื•ื™ ืœืขืฉื•ืช ื–ืืช ื‘ืืžืฆืขื•ืช paramiko ื•-ssh.exec_command, ื›ืชื•ืฆืื” ืžื›ืš, ืชืฆื˜ืจืš ืœื”ื’ื“ื™ืจ ืืช ืคืจื•ื˜ื•ืงื•ืœ ื ื™ื”ื•ืœ ื”ืจืฉืช ืฉืœ ืžื›ืฉื™ืจ netconf ื‘ืฆื™ื•ื“ ื”ื ืฉืืœ. Netconf ืขื•ื‘ื“ืช ืขื ื—ื•ืžืจื” ื‘ืืžืฆืขื•ืช ืงืจื™ืืช ืคืจื•ืฆื“ื•ืจื” ืžืจื—ื•ืง RPC ื•ืžืฉืชืžืฉืช ื‘-XML, ื‘ื“ื•ื’ืžื” ื–ื•, ื›ื“ื™ ืœืกืคืง ืืช ื”ืžื™ื“ืข ืฉื”ื™ื ืžืงื‘ืœืช.

ื”ืชืงื ืช ื”ื’ืจืกื” ื”ื ื•ื›ื—ื™ืช ืฉืœ Junos PyEZ ืž- PyPI ืžืชื‘ืฆืขืช ื‘ืคืงื•ื“ื” ื”ื‘ืื”:

$ pip install junos-eznc

ืืชื” ื™ื›ื•ืœ ื’ื ืœื”ืชืงื™ืŸ ืžื”ืขื ืฃ ื”ืจืืฉื™ ืฉืœ ื”ืคืจื•ื™ืงื˜ ื‘- GitHub ืขื ื”ืคืงื•ื“ื” ื”ื‘ืื”:

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

ื•ืขื•ื“ ืืคืฉืจื•ืช ืื—ืช ื“ืจืš

$ pip install -r requirements.txt 

ืคืงื•ื“ื” ื–ื• ืชืชืงื™ืŸ ืกืคืจื™ื•ืช ืฉื—ืกืจื•ืช ื‘ืžืขืจื›ืช ื•ื”ืŸ ื”ื›ืจื—ื™ื•ืช ืœืคืขื•ืœื”. ื‘ื’ืจืกื” ืฉืœื™ ื“ืจื™ืฉื•ืช. ื˜ืงืกื˜ ื™ืฉ ืจืง ืฉื ื™ื™ื ืžื”ื, ื”ื’ืจืกืื•ืช ื”ืื—ืจื•ื ื•ืช ืžืฆื•ื™ื ื•ืช ื‘ื–ืžืŸ ื›ืชื™ื‘ืช ื”ืชืกืจื™ื˜:

junos-eznc
netaddr

ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ื”ืกืงืจื™ืคื˜ ืžืงื‘ืœ ืืช ืฉื ื”ืžืฉืชืžืฉ ื”ื ื•ื›ื—ื™ ื‘ืžืขืจื›ืช; ืืชื” ื™ื›ื•ืœ ืœื”ื™ื›ื ืก ืชื—ืช ืฉื ืฉืœ ืžืฉืชืžืฉ ืื—ืจ ื‘ืืžืฆืขื•ืช ืžืงืฉ show_route.py -u getpass.getpass ืœื•ืงื— ืืช ื”ืกื™ืกืžื” ืž-stdin ื›ืš ืฉื”ืกื™ืกืžื” ืœื ืชื™ืฉืืจ ื‘ืžืขืจื›ืช. ื›ื“ื™ ืœื”ืชื—ื‘ืจ ืœืฆื™ื•ื“, ืชืฆื˜ืจืš ื’ื ืœื”ื–ื™ืŸ ืืช ืฉื ื”ืžืืจื— ืื• ื›ืชื•ื‘ืช ื”-IP ืฉืœื• ื›ืืฉืจ ืชืชื‘ืงืฉ. ื›ืœ ื”ื ืชื•ื ื™ื ื”ื“ืจื•ืฉื™ื ืœื”ืจืฉืื” ื‘ืžื›ืฉื™ืจ ื”ืชืงื‘ืœื•.

Junos PyEZ ืชื•ืžืš ื‘ื—ื™ื‘ื•ืจ ืœืฆื™ื•ื“ ื”ืžืจื™ืฅ ืืช ืžืขืจื›ืช ื”ื”ืคืขืœื” Junos ื‘ืืžืฆืขื•ืช ื”ืžืกื•ืฃ, telnet ืื• netconf ื‘ืืžืฆืขื•ืช ssh. ื”ืžืืžืจ ื“ืŸ ื‘ืืคืฉืจื•ืช ื”ืฉื ื™ื™ื”.

ื›ื“ื™ ืœื”ืชื—ื‘ืจ ืœืฆื™ื•ื“, ื”ืฉืชืžืฉ ื‘ืžื—ืœืงืช ื”ืชืงืŸ ืฉืœ ืžื•ื“ื•ืœ jnpr.junos

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

ืžื•ื’ืฉืช ื‘ืงืฉื” ืœื›ืœ ื”ืžืกืœื•ืœื™ื ื”ืžื•ื›ืจื™ื ืœื ืชื‘ ื‘ืืžืฆืขื•ืช ืงืจื™ืืช ื ื•ื”ืœ ืžืจื—ื•ืง ืื• ืงืจื™ืืช ื ื•ื”ืœ ืžืจื—ื•ืง, ืœืคื™ ื”ื ื•ื— ืžื‘ื™ื ื™ื”ื.

data = dev.rpc.get_route_information()

ืคืงื•ื“ื” ื“ื•ืžื” ื‘-Junos OS

user@router> show route | display xml

ืขืœ ื™ื“ื™ ื”ื•ืกืคืช rpc ืœืกื•ืฃ ื”ืคืงื•ื“ื”, ื ืงื‘ืœ ืชื’ request ื•ื ื•ื›ืœ ืœื”ืชืื™ื ืื•ืชื• ืœืฉื ืฉืœ ืฉื™ื˜ืช RPC, ื‘ืฆื•ืจื” ื–ื• ื ื•ื›ืœ ืœื’ืœื•ืช ืฉืžื•ืช ื ื•ืกืคื™ื ืžืขื ื™ื™ื ื™ื. ืจืื•ื™ ืœืฆื™ื™ืŸ ืฉื”ืชื—ื‘ื™ืจ ืœื›ืชื™ื‘ืช ืชื’ ื”ื‘ืงืฉื” ืฉื•ื ื” ืžืฉื ื”ืฉื™ื˜ื”, ื›ืœื•ืžืจ, ืขืœื™ืš ืœื”ื—ืœื™ืฃ ืืช ื”ืžืงืคื™ื ื‘ืงื• ืชื—ืชื•ืŸ.

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

ืฉืืจ ื”ื—ืœืง ื ืขื˜ืฃ ื‘-while loop, ื›ื“ื™ ืœื ืœื—ื–ื•ืจ ืขืœ ื”ื‘ืงืฉื” ืœื ืชื‘ ืื ื”ื™ื” ืฆื•ืจืš ืœื‘ื“ื•ืง ืจืฉืช ืžืฉื ื” ืื—ืจืช ืžืืœื” ืฉื”ื ืชื‘ ื›ื‘ืจ ื™ื•ื“ืข ืขืœื™ื”ืŸ. ืจืื•ื™ ืœื”ื–ื›ื™ืจ ืฉื”ื ืชื‘ ืขืœื™ื• ืื ื™ ืขื•ืฉื” ืืช ื”ื‘ืงืฉื” ื™ื•ื“ืข ืžืกืœื•ืœื™ื ืจืง ื“ืจืš OSPF, ื›ืš ืฉืœื ืชื‘ ืงืฆื” ืขื“ื™ืฃ ืœืฉื ื•ืช ืžืขื˜ ืืช ื”ื‘ืงืฉื” ื›ื“ื™ ืœืฆืžืฆื ืืช ื–ืžืŸ ื”ืจื™ืฆื” ืฉืœ ื”ืกืงืจื™ืคื˜

data = dev.rpc.get_ospf_route_information()

ื›ืขืช ื ืกืชื›ืœ ืขืœ ื”ืชื•ื›ืŸ ืฉืœ ืœื•ืœืืช ื”-while

ื‘ื”ืชื—ืœื”, ื”ืžืฉืชืžืฉ ื™ืชื‘ืงืฉ ืœื”ื™ื›ื ืก ืœืจืฉืช ืžืฉื ื” ืขื ืžืกื™ื›ื” ื•ืœื ื™ื•ืชืจ ืžืฉืœื•ืฉ ืื•ืงื˜ื˜ื™ื ืžื”ืจืฉืช ืฉืœ ืื•ืชื” ืจืฉืช ืžืฉื ื”, ื–ื” ื”ื›ืจื—ื™ ื›ื“ื™ ืœื”ื’ื“ื™ืจ ืืช ื˜ื•ื•ื— ื”ื—ื™ืคื•ืฉ. ืื ื™ ืœื ืžืžืฉ ืื•ื”ื‘ ืืช ื”ื™ื™ืฉื•ื ื”ื–ื” ืฉืœ ืฆื™ื•ืŸ ื”ืงืจื™ื˜ืจื™ื•ื ื™ื ื•ื˜ื•ื•ื— ื”ื—ื™ืคื•ืฉ, ืื‘ืœ ืขื“ ื›ื” ืœื ืžืฆืืชื™ ืคืชืจื•ืŸ ื˜ื•ื‘ ื™ื•ืชืจ. ืœืื—ืจ ืžื›ืŸ, ืžืชื•ืš ื”ืจืฉื™ืžื” ื”ืžืชืงื‘ืœืช ืฉืœ subnets route_list, ื‘ืืžืฆืขื•ืช ืžืฉืชื ื” ื”ืžื›ื™ืœ ืœื ื™ื•ืชืจ ืžืฉืœื•ืฉ ืื•ืงื˜ื˜ื™ื, ืื ื™ ื‘ื•ื—ืจ ืืช ืจืฉืชื•ืช ื”ืžืฉื ื” ืฉืžืขื ื™ื™ื ื•ืช ืื•ืชื™

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

ื“ืจืš IPNetwork, ืžื•ื“ื•ืœ netaddr, ืื ื™ ืžืงื‘ืœ ืจืฉืชื•ืช ืžืฉื ื” ื‘ืฆื•ืจื” ืฉืœ ืจืฉื™ืžื” ืฉืœ ื›ืชื•ื‘ื•ืช ipv4

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

ื‘ืืžืฆืขื•ืช IPNetwork, ืื ื™ ืžืฉื™ื’ ื˜ื•ื•ื— ื›ืชื•ื‘ื•ืช ืžืจืฉืช ืฉื”ื•ื›ื ืกื” ืขืœ ื™ื“ื™ ืžืฉืชืžืฉ ืขื ืžืกื™ื›ื” ื•ืžื™ื™ืฆืจ ืจืฉื™ืžื” ืฉืœ ื›ืœ ื”ื›ืชื•ื‘ื•ืช ืžื˜ื•ื•ื— ื–ื” ืœืฆื•ืจืš ื”ืฉื•ื•ืื” ืœืจืฉื™ืžืช ื”ื›ืชื•ื‘ื•ืช ื”ื›ื‘ื•ืฉื™ื.

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

ืื ื™ ืžืฆื™ื’ ืืช ื”ืจืฉื™ืžื” ื”ืžืชืงื‘ืœืช ืฉืœ ื›ืชื•ื‘ื•ืช ื—ื™ื ืžื™ื•ืช ื‘ืฆื•ืจื” ืฉืœ ืจืฉืชื•ืช ืžืฉื ื”

print(netaddr.IPSet(freeip))

ืœื”ืœืŸ ื”ืกืงืจื™ืคื˜ ื”ืžืœื, ื ื‘ื“ืง ืขืœ ืžืชื’ื™ื ื”ืžืฉืžืฉื™ื ื›ื ืชื‘, ื“ื’ืžื™ื 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

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”