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 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