Junos PyEZ ááŸáá·áºá¡áá¯ááºáá¯ááºááŒááºážá¡ááŒá±á¬ááºáž áá±á¬ááºážáá«ážáá áºáá¯áẠ- "Python microframework" ááẠJunos OS á¡áá¯á¶ážááŒá¯ááá·áº á ááºáá»á¬ážááᯠá á®áá¶ááá·áºááœá²ááá¯ááºááŒá®áž á¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±á¬ááºááá¯ááºá á±ááá·áº áá»áœááºá¯ááºááá¯á·ááŸá áºáááºááá·áºá¡áá¬á¡á¬ážáá¯á¶ážá á€áá±á¬ááºážáá«ážááœááºáá±á¬áºááŒáá¬ážááá·áº áá¬ááºááœáŸááºážááá¯áá±ážáá¬ážáá¬ááœáẠáááºááŸááºážáá»ááºáá»á¬ážá áœá¬ááŸáááẠ- Python ááá¯áá±á·áá¬ááŒááºážááŸáá·áº Junos OS á¡áá¯á¶ážááŒá¯ááá·áºá ááºáá á¹á ááºážáá»á¬ážááœáẠá¡áá»ááºá¡áááºáá»á¬ážá á¯áá±á¬ááºážááŒááºáž ááá¯á·ááá¯áẠááŒááºáááºáááºááŸááºááŸá¯áá»á¬ážááᯠááŒá±á¬ááºážáá²ááŒááºážá¡ááœáẠPython ááᯠáááºáá°ááŒááºážááŸáá·áº á¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±á¬ááºááŒááºážáá¯ááºáááºážáá¬áááºáá»á¬ážááŸááááºá Python + Junos PyEZ á áá®ážááŒá¬ážáá±á«ááºážá ááºááŸá¯á¡á¬áž Python áááá¯ááááºážáááºážáá¬áá¬á áá¬ážááá¯á· áááºáá±á¬ááºááẠá¡áá¬ážá¡áá®ážáááºážáá«ážááŒááºážááŸáá·áº Junos PyEZ á á¬ááŒáá·áºááá¯ááºá á¡áá¯á¶ážááŒá¯áááœááºáá°ááŒááºážááá¯á·ááŒá±á¬áá·áº ááœá±ážáá»ááºááŸá¯ááŸá¬ Junos OS á áá»áœááºážáá»ááºáá°áá»á¬ážáááá¯á¡ááºáá«á
áá¯ááºáááºáž
áá¯áá¹ááá®ááá¯áẠá¡ááá²á· ipv4 subnets áá»á¬ážááᯠá á áºáá±ážááŒááºážá subnet ááẠá¡ááá²á·ááŒá áºáááºáá°áá±á¬ á á¶áááºááŸááºáá»ááºááŸá¬ Junos OS áááºáááºááá·áº router á¡ááŒá Ạáá¯ááºáá±á¬ááºááá·áº switch áá±á«áºááŸá áááºážááŒá±á¬ááºážáá»á¬ážááœáẠáááºážááŸáá·áºáááºáááºááá·áº ááá·áºááœááºážááŸá¯ áááŸáááŒááºážáááºááŒá áºáááºá
á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯
Python + Junos PyEZ ááẠáááºážááᯠparamiko ááŸáá·áº ssh.exec_command ááŸáááá·áºááŒá¯áá¯ááºááẠá
á¯á¶á
ááºážááŸá±á¬áá·áºááŸááºááŸá¯áá»á¬ážááŸááá²á·áá±á¬áºáááºážá
PyPI á០Junos PyEZ á áááºááŸááá¬ážááŸááºážááᯠááá·áºááœááºážááŒááºážááẠá¡á±á¬ááºáá« command ááŒáá·áº áá¯ááºáá±á¬ááºáááº-
$ pip install junos-eznc
á¡á±á¬ááºáá« command ááŒáá·áº GitHub ááŸá ááá±á¬áá»ááºá áááºááá¬áááœá²ááŸáááºáž ááá·áºááœááºážááá¯ááºáááºá
$ pip install git+https://github.com/Juniper/py-junos-eznc.git
ááŸáá·áºáá±á¬ááºáááºááœá±ážáá»ááºááŸá¯ááŸáááá·áº
$ pip install -r requirements.txt
á€á¡áááá·áºááẠá áá áºá០áá»á±á¬ááºáá¯á¶ážáá±áá±á¬ á á¬ááŒáá·áºááá¯ááºáá»á¬ážááᯠááá·áºááœááºážááŒá®áž áááºáááºáááºá¡ááœáẠááá¯á¡ááºáá«áááºá áá«á·áá¬ážááŸááºážááŸá¬ ááá¯á¡ááºáá»ááºáá»á¬áž áááºážááá¯á·áá²á០ááŸá áºáá¯áᬠááŸáááŒá®ážá áá¬ááºááœáŸááºážáá±ážáá¬ážáá»áááºááœáẠáá±á¬ááºáá¯á¶ážááœááºáá¬ážááŸááºážáá»á¬ážááᯠáá±á¬áºááŒáá¬ážáá«áááºá
junos-eznc
netaddr
áá°áááºážá¡á¬ážááŒáá·áºá script ááẠá áá áºá¡ááœááºážááŸá áááºááŸáá¡áá¯á¶ážááŒá¯áá°áá¡áááºááᯠáá°áááºá show_route.py -u áá±á¬á·ááᯠá¡áá¯á¶ážááŒá¯á á¡ááŒá¬ážá¡áá¯á¶ážááŒá¯áá°áá¡áááºá¡á±á¬ááºááœáẠáááºáááºáá±á¬ááºááá¯ááºáááºá getpass.getpass ááẠstdin á០á áá¬ážááŸááºááᯠáá°áá±á¬ááŒá±á¬áá·áº á áá¬ážááŸááºááẠá áá áºáá²ááœáẠááŸááá±áááºááá¯ááºáá«á á ááºáá á¹á ááºážáá»á¬ážááŸáá·áº áá»áááºáááºááẠá¡áá»ááºááŒááá·áºá¡áá«ááœáẠáááºážá hostname ááá¯á·ááá¯áẠIP ááááºá á¬ááᯠááá·áºááœááºážááẠááá¯á¡ááºáá«áááºá á ááºáá±á«áºááŸá ááœáá·áºááŒá¯áá»ááºá¡ááœáẠááá¯á¡ááºáá±á¬ áá±áá¬á¡á¬ážáá¯á¶ážááᯠáááºáá¶áááŸáááŒá®ážááŒá áºáááºá
Junos PyEZ ááẠssh ááŸáá áºááá·áº ááœááºááá¯ážááºá telnet ááá¯á·ááá¯áẠnetconf ááᯠá¡áá¯á¶ážááŒá¯á Junos OS á¡áá¯á¶ážááŒá¯ááá·áº á ááºáá á¹á ááºážáá»á¬ážááŸáá·áº áá»áááºáááºááŒááºážááᯠáá¶á·ááá¯ážáá±ážáááºá áá±á¬ááºážáá«ážááẠáá±á¬ááºáá¯á¶ážááœá±ážáá»ááºááŸá¯á¡ááŒá±á¬ááºáž ááœá±ážááœá±ážáááºá
áá á¹á ááºážáá»á¬ážááŸáá·áº áá»áááºáááºááẠjnpr.junos module á Device class ááᯠá¡áá¯á¶ážááŒá¯áá«á
with jnpr.junos.Device(host=router,
user=args.name,
passwd=password) as dev:
á¡áá±ážááááºážáá¯ááºáááºážá ááºáá±á«áºááá¯ááŸá¯ ááá¯á·ááá¯áẠá¡áá±ážááááºážá áá áºáá±á«áºááá¯ááŸá¯ááŸáá áºááá·áº router ááá¯á·ááááŸááá¬ážáá±á¬áááºážááŒá±á¬ááºážá¡á¬ážáá¯á¶ážá¡ááœáẠáá±á¬ááºážááá¯ááŸá¯áá áºáá¯ááŒá¯áá¯ááºáá¬ážáááºá áááºááá·áºá¡áá¬á ááá¯á¡áááºááŒá±ááááºážá
data = dev.rpc.get_route_information()
Junos OS ááœáẠá¡áá¬ážáá° á¡áááá·áºáá±ážáááºá
user@router> show route | display xml
command áá¡áá¯á¶ážááœáẠrpc áá±á«ááºážááá·áºááŒááºážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá±á¬ááºážááá¯áá»ááºáááºáá áºáá¯áááŸáááŒá®áž áááºážááᯠRPC áááºážáááºážáá¡áááºááŸáá·áº ááá¯ááºáá®ááá¯ááºáááºá á€áááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠá¡ááŒá¬ážá áááºáááºá á¬ážááœááºá¡áááºáá»á¬ážááᯠááŸá¬ááœá±ááá¯ááºáá«áááºá áá±á¬ááºážááá¯áá»ááºáááºááá¯áá±ážáá¬ážááŒááºážá¡ááœáẠsyntax ááẠmethod name ááŸáá·áº ááœá²ááŒá¬ážáááºá ááá¯ááá¯áááºááŸá¬á áááºááẠáá¯á¶ážáá¯á¶ážáá»á¬ážááᯠunderscore áá»á¬ážááŒáá·áº á¡á á¬ážááá¯ážááá·áºáááºá
user@router> show route | display xml rpc
<rpc-reply >route_list = data.xpath("//rt-destination/text()")
áá»ááºá¡ááá¯ááºážááᯠRouter áááá¬ážááŒá®ážááŒá áºáá±á¬ á¡ááŒá¬áž subnet áá»á¬ážááᯠá á áºáá±ážááẠááá¯á¡ááºáá«á Router ááá¯á· áá±á¬ááºážááá¯áá»ááºááᯠáááºááá²áá² áááŒá¯áá¯ááºá á±áááºá¡ááœáẠáá»ááºá¡ááá¯ááºážááᯠwhile loop ááŒáá·áº áááºáá¬ážáááºá áá»áœááºá¯ááºáá±á¬ááºážááá¯áá»ááºááŒá¯áá¯ááºáá±ááá·áº router ááẠOSPF ááŸáááá·áºáááºážááŒá±á¬ááºážáá»á¬ážááá¯áá¬ááááŒá±á¬ááºážáá±á¬áºááŒááá»áá¯ážáááºáááºá ááá¯á·ááŒá±á¬áá·áº edge router ááẠscript ááááºáááºáá»áááºááá¯áá»áŸá±á¬á·áá»áááºá¡áááºážáááºáá±á¬ááºážááá¯ááŸá¯ááá¯ááŒá±á¬ááºážáá²ááŒááºážáááºááá¯ááá¯áá±á¬ááºážááœááºáááº
data = dev.rpc.get_ospf_route_information()
á¡áᯠwhile loop áá²á· á¡ááŒá±á¬ááºážá¡áá¬ááœá±ááᯠááŒáá·áºáá¡á±á¬ááº
á¡á ááœááºá á¡áá¯á¶ážááŒá¯áá°ááᯠMask áá«ááá·áº subnet áá áºáá¯áá²ááá¯á· ááá·áºááá¯ááºážáááºááŒá áºááŒá®áž áá°áá®áá±á¬ subnet áááœááºáááºá០áá¯á¶áž octets áááºáááá¯á á±áá² ááŸá¬ááœá±ááŸá¯á¡ááá¯ááºážá¡ááŒá¬ážááᯠáááºááŸááºááẠááá¯á¡ááºáá«áááºá á á¶áááºááŸááºáá»ááºáá»á¬ážááŸáá·áº ááŸá¬ááœá±ááŸá¯á¡ááá¯ááºážá¡ááŒá¬ážááᯠáááºááŸááºááŒááºážá á€á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááᯠáá»áœááºá¯ááºááááºáááŒáá¯ááºáá±á¬áºáááºáž ááá¯á¡áá»áááºá¡áá ááá¯ááá¯áá±á¬ááºážááœááºááá·áºááŒá±ááŸááºážáá»ááºááᯠááŸá¬áááœá±á·áá±ážáá«á ááá¯á·áá±á¬ááºá áááŸááá¬áá±á¬ subnets route_list áá á¬áááºážááŸá octets áá¯á¶ážáá¯áááºáááá¯áá±á¬ variable ááá¯á¡áá¯á¶ážááŒá¯á áá»áœááºá¯ááºá áááºáááºá á¬ážáá±á¬ subnets ááá¯ááœá±ážáá»ááºáá«
tmp = re.search(r'^%sS*' % subnet_search, route_list[i])
IPNetworká netaddr module ááŸáááá·áºá áá»áœááºá¯ááºááẠipv4 ááááºá á¬áá»á¬ážá á¬áááºážáá¯á¶á á¶ááŒáá·áº subnets áá»á¬ážááá¯áááºáá¶áááŸááááº
range_subnet = netaddr.IPNetwork(tmp.group(0))
IPNetwork ááᯠá¡áá¯á¶ážááŒá¯á áá»ááºááŸá¬áá¯á¶ážáá áºáá¯áá«ááŸááá±á¬ á¡áá¯á¶ážááŒá¯áá°ááá·áºááœááºážáá¬ážáá±á¬ ááœááºáááºáá áºáá¯á០ááááºá á¬á¡ááœá¬á¡áá±ážááᯠááá°ááŒá®áž ááááºážááá¯ááºáá¬ážáá±á¬ ááááºá á¬áá»á¬ážá á¬áááºážááŸáá·áº ááŸáá¯ááºážááŸááºáááºá¡ááœáẠá€á¡ááœá¬á¡áá±ážá០ááááºá á¬á¡á¬ážáá¯á¶ážá á¬áááºážááᯠáá¯ááºáá±ážáá«áááºá
for i in set(net_list).difference(set(busyip)):
freeip.append(i)
áá»áœááºá¯ááºááẠsubnet áá»á¬ážáá¯á¶á á¶ááŒáá·áº áááŸááá¬áá±á¬ á¡ááá²á·ááááºá á¬áá»á¬ážá á¬áááºážááᯠááŒááá«áááºá
print(netaddr.IPSet(freeip))
á¡á±á¬ááºááœáẠááŒáá·áºá á¯á¶áá±á¬ script ááẠRouter á¡ááŒá áºá¡áá¯á¶ážááŒá¯ááá·áº ááá¯ááºáá»á¬ážá áá±á¬áºáááºáá»á¬áž 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