ืึทื ืึทืจืืืงื ืืืขืื ืืจืืขืื ืืื Junos PyEZ - "Python ืืืงืจืึธืคืจืึทืืขืืืึธืจืง ืืืึธืก ืื ืืืืึทืื ืืืจ ืฆื ืคืืจื ืืื ืึธืืึทืืืื ืืขืืืืกืขืก ืืื Junos OS" ืึธืืึทืืืืฉืึทื ืืื ืคืึทืจืืืึทืืืื ื, ืึทืืฅ ืืืึธืก ืืืจ ืืืืข. ืฉืจืืืื ืืขื ืฉืจืืคื ืืืกืงืจืืืื ืืื ืืขื ืึทืจืืืงื ืืื ืขืืืขืืข ืืึธืืื - ืืขืจื ืขื ืคึผืืืืึธื ืืื ืึธืืึทืืืืืื ื ืืึทืกืงืก ืคึฟืึทืจ ืงืึทืืขืงืืื ื ืืื ืคึฟืึธืจืืึทืฆืืข ืึธืืขืจ ืืฉืึทื ืืื ื ืงืึทื ืคืืืืขืจืืืฉืึทื ื ืืืืฃ ืืืกืจืืื ืืื Junos OS. ืื ืืจืืจื ืคืื ืืขื ืกืคึผืขืฆืืคืืฉ ืงืึธืืืื ืึทืฆืืข ืคืื โโPython + Junos PyEZ ืืื ืืขืืืื ืจืขืื ืฆื ืืขืจ ื ืืืขืจืืง ืืึทืจืืขืจ ืฆื ืึทืจืืึทื ืืจืขืื ืืื ืื Python ืคึผืจืึธืืจืึทืืืื ื ืฉืคึผืจืึทื ืืื ืื ืื ืคืื ื ืืฆื ืคืื ืื Junos PyEZ ืืืืืืึธืืขืง, ืืืึธืก ืืื ื ืืฉื ืืึทืจืคื ืขืงืกืคึผืขืจื ืืืืกื ืคืื Junos OS.
ืึทืจืืขื
ืงืึธื ืืจืึธืืืจื ืื ืคืจืื ืืคึผืื4 ืกืืื ืขืฅ ืืืึธืก ืืขืืขืจื ืฆื ืื ืคืืจืืข. ืืขืจ ืงืจืืืขืจืืข ืึทื ืึท ืกืืื ืขื ืืื ืคืจืื ืืื ืืขืจ ืึทืืืขืง ืคืื ืึท ืคึผืึธืืืฆืืข ืืืขืื ืืื ืืื ืื ืจืืฅ ืืืืฃ ืื ืืึทืฉืืืืขื ืึทืงืืื ื ืืื ืึท ืจืึทืืืขืจ ืืื Junos OS.
ืืืคึผืืขืืขื ืืึทืืืึธื
Python + Junos PyEZ, ืืึธืืฉ ืขืก ืืื ืืขืืืขื ืึท ื ืกืืื ืฆื ืืึธื ืืึธืก ืืืจื paramiko ืืื ssh.exec_command,
ืื ืกืืึธืืื ื ืื ืงืจืึทื ื ืืืขืจืกืืข ืคืื โโ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 ื ืขืื ืื ืคึผืึทืจืึธื ืคืื ืกืืืื ืึทืืื ืื ืคึผืึทืจืึธื ืืืขื ื ืืฉื ืืืืึทืื ืืื ืื ืกืืกืืขื. ืฆื ืคืึทืจืืื ืื ืฆื ืื ืขืงืืืืคึผืืขื ื, ืืืจ ืืืขื ืืืื ืืึทืจืคึฟื ืฆื ืึทืจืืึทื ืืืึทื ืืึธืกืื ืึทืืข ืึธืืขืจ IP ืึทืืจืขืก ืืืขื ืคึผืจืึทืืคึผืืื. ืื ืืึทืื ื ืืืืืง ืคึฟืึทืจ ืืขืจืืืืืขื ืืฉ ืืืืฃ ืื ืืืื ืืื ืืืงืืืขื.
Junos PyEZ ืฉืืืฆื ืงืึทื ืขืงืืื ื ืฆื ืขืงืืืืคึผืืขื ื ืืื Junos OS ืืื ืื ืงืึทื ืกืึธืื, ืืขืื ืขื ืึธืืขืจ ื ืขืืงืึธื ืฃ ืืืจื 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 ืฆื ืื ืกืืฃ ืคืื ืื ืืึทืคึฟืขื, ืืืจ ืืึทืงืืืขื ืึท ืืขืื ืงืืืืื ืืื ืงืขื ืขื ืืืืึทืื ืขืก ืืื ืื ื ืึธืืขื ืคืื ืื RPC ืืืคึฟื, ืืื ืืขื ืืืขื ืืืจ ืงืขื ืขื ืืขืคึฟืื ืขื ืื ืืขืจืข ื ืขืืขื ืคืื ืืื ืืขืจืขืก. ืขืก ืืื ืืืื ืฆื ืืืืขืจืงื ืึทื ืื ืกืื ืืึทืงืก ืคึฟืึทืจ ืฉืจืืืื ืื ืืขืื ืงืืืืื ืืื ืึทื ืืขืจืฉ ืคืื ืืขื ืืืคึฟื ื ืึธืืขื, ื ืืืืื, ืืืจ ืืึธื ืคืึทืจืืืึทืื ืื ืืืืคืึทื ื ืืื ืึทื ืืขืจืงืึธืจื.
user@router> show route | display xml rpc
<rpc-reply >route_list = data.xpath("//rt-destination/text()")
ืื ืจืขืฉื ืคืื ืื ืืืื ืืื ืืขืืืขื ืืื ืืขืืืืงืื ืืื ืึท ืืฉืขืช ืฉืืืืฃ, ืึทืืื ื ืืฉื ืฆื ืืืืขืจืืืจื ืื ืืงืฉื ืฆื ืื ืจืึทืืืขืจ ืืืื ืขืก ืืื ื ืืืืืง ืฆื ืงืึธื ืืจืึธืืืจื ืื ืื ืืขืจ ืกืืื ืขื ืคืื ืื ืืืึธืก ืื ืจืึทืืืขืจ ืฉืืื ืืืืกื ืืืขืื. ืขืก ืืื ืืืื ืฆื ืืขืจืืึธื ืขื ืึทื ืืขืจ ืจืึทืืืขืจ ืืืืฃ ืืืึธืก ืืื ืืึทืื ืื ืืขืื ืืืืืกื ืจืืฅ ืืืืื ืืืจื OSPF, ืึทืืื ืคึฟืึทืจ ืึท ืืจืขื ืจืึทืืืขืจ ืขืก ืืื ืืขืกืขืจ ืฆื ืืืืฉื ืื ืืขืื ืึท ืืืกื ืฆื ืจืขืืืฆืืจื ืื ืคืืืกื ืืืง ืฆืืื ืคืื ืื ืฉืจืืคื.
data = dev.rpc.get_ospf_route_information()
ืืืฆื ืืึธืื ืก ืงืืง ืืื ืื ืืื ืืึทืื ืคืื ืื ืืฉืขืช ืฉืืืืฃ
ืืื ืื ืึธื ืืืื, ืืขืจ ืืึทื ืืฆืขืจ ืืืขื ืืืื ืืขืืขืื ืฆื ืึทืจืืึทื ืึท ืกืืื ืขื ืืื ืึท ืืึทืกืงืข ืืื ื ืื ืืขืจ ืืื ืืจืื ืึธืงืืขืฅ ืคืื ืื ื ืขืฅ ืคืื ืืขืจ ืืขืืืืงืขืจ ืกืืื ืขื, ืืึธืก ืืื ื ืืืืืง ืฆื ืฉืืขืื ืื ืืืื ืงืืื. ืืื ืืึธื ื ืื ืืึทืงืข ืืื ืืขื ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืกืคึผืขืฆืืคืืฆืืจื ืื ืงืจืืืืืจืืึท ืืื ืืืื ืงืืื, ืึธืืขืจ ืึทืืื ืืืืึทื ืืื ืืึธืื ื ืืฉื ืืขืคึฟืื ืขื ืึท ืืขืกืขืจ ืืืืืื ื. ืืขืจื ืึธื, ืคึฟืื ืื ืจืืืึทืืืื ื ืจืฉืืื ืคืื ืกืืื ืขืฅ route_list, ื ืืฆื ืึท ืืืึทืืขืืืืืง ืืื ื ืื ืืขืจ ืืื ืืจืื ืึธืงืืขืฅ, ืืื ืืืืกืงืืืึทืื ืื ืกืืื ืขืฅ ืืืึธืก ืืื ืืขืจืขืก ืืืจ
tmp = re.search(r'^%sS*' % subnet_search, route_list[i])
ืืืจื IPNetwork, ืื netaddr ืืึธืืืืข, ืืื ืืึทืงืืืขื ืกืืื ืขืฅ ืืื ืื ืคืึธืจืขื ืคืื ืึท ืจืฉืืื ืคืื ืืคึผืื4 ืึทืืจืขืกืขืก
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