Isihloko esimayelana nokusebenza ne-Junos PyEZ - “Python microframework ekuvumela ukuthi ulawule futhi wenze ngokuzenzakalela amadivayisi asebenzisa i-Junos OS” okuzenzakalelayo nokuphatha, yonke into esiyithandayo. Ukubhala isikripthi esichazwe kulesi sihloko bekunemigomo embalwa - ukufunda iPython kanye nemisebenzi yokuzenzakalela yokuqoqa ulwazi noma ukushintsha ukulungiselelwa kumishini esebenzisa i-Junos OS. Ukukhethwa kwale nhlanganisela ethize yePython + Junos PyEZ kwenziwa ngenxa yokuvimbela okuphansi kokungena olimini lokuhlela lwePython kanye nokusebenziseka kalula komtapo wezincwadi we-Junos PyEZ, ongadingi ulwazi lochwepheshe lwe-Junos OS.
Inhloso
Ukucwaningwa kwamahhala kwama-subnet e-ipv4 enkampani. Umbandela wokuthi i-subnet imahhala ukungabi khona kokungenayo mayelana nayo emizileni ekushintsheni esebenza njengomzila osebenzisa i-Junos OS.
Ukuqaliswa
I-Python + Junos PyEZ, nakuba kwakukhona isilingo sokukwenza nge-paramiko kanye ne-ssh.exec_command,
Ukufaka inguqulo yamanje ye-Junos PyEZ kusuka ku-PyPI kwenziwa ngomyalo olandelayo:
$ pip install junos-eznc
Ungafaka futhi usuka egatsheni eliyinhloko lephrojekthi ku-GitHub ngomyalo olandelayo:
$ pip install git+https://github.com/Juniper/py-junos-eznc.git
Futhi enye inketho nge
$ pip install -r requirements.txt
Lo myalo uzofaka imitapo yolwazi engekho ohlelweni futhi edingekayo ukuze isebenze. Enguqulweni yami izidingo.txt Zimbili kuphela zazo, izinguqulo zakamuva zikhonjisiwe ngesikhathi sokubhala iskripthi:
junos-eznc
netaddr
Ngokuzenzakalelayo, umbhalo uthatha igama lomsebenzisi wamanje ohlelweni; ungangena ngaphansi kwegama lomunye umsebenzisi usebenzisa ukhiye we-show_route.py -u i-getpass.getpass ithatha iphasiwedi ku-stdin ukuze igama-mfihlo lingahlali ohlelweni. Ukuze uxhume kumshini, uzodinga futhi ukuthi ufake igama lomethuleli noma ikheli le-IP lapho uyalwa. Yonke idatha edingekayo ukuze kugunyazwe idivayisi yamukelwe.
I-Junos PyEZ isekela ukuxhuma kumishini esebenzisa i-Junos OS isebenzisa ikhonsoli, i-telnet noma i-netconf nge-ssh. Isihloko sidingida inketho yokugcina.
Ukuze uxhume kumishini, sebenzisa ikilasi ledivayisi lemojuli ye-jnpr.junos
with jnpr.junos.Device(host=router,
user=args.name,
passwd=password) as dev:
Isicelo senziwa ngayo yonke imizila eyaziwa yi-router ngocingo lwenqubo eqhelile noma ucingo lwenqubo olukude, kuye ngokuthi ikuphi okulula kakhulu.
data = dev.rpc.get_route_information()
Umyalo ofanayo ku-Junos OS
user@router> show route | display xml
Ngokungeza i-rpc ekupheleni komyalo, sithola ithegi yesicelo futhi singayifanisa negama lendlela ye-RPC, ngale ndlela singathola amanye amagama esithakazelo. Kuyaqapheleka ukuthi i-syntax yokubhala ithegi yesicelo ihlukile kunegama lendlela, okungukuthi, kufanele ubeke amakhonco ngama-underscore.
user@router> show route | display xml rpc
<rpc-reply >route_list = data.xpath("//rt-destination/text()")
Ingxenye esele yayigoqwe nge-loop yesikhashana, ukuze ungaphindi isicelo ku-router uma kudingekile ukuhlola enye i-subnet kulawo i-router eyazi kakade. Kuhle ukusho ukuthi i-router engifaka kuyo isicelo iyazi imizila nge-OSPF kuphela, ngakho-ke kumzila onqenqemeni kungcono ukuguqula isicelo kancane ukuze unciphise isikhathi sokusebenza sombhalo.
data = dev.rpc.get_ospf_route_information()
Manje ake sibheke okuqukethwe kwe-loop yesikhathi
Ekuqaleni, umsebenzisi uzocelwa ukuthi afake i-subnet nge-mask futhi angabi ngaphezu kwama-octet amathathu kusuka kunethiwekhi ye-subnet efanayo, lokhu kuyadingeka ukuze usethe ububanzi bokusesha. Angikuthandi ngempela lokhu kuqaliswa kokucacisa imibandela kanye nohlu lokusesha, kodwa kuze kube manje angikasitholi isisombululo esingcono. Okulandelayo, ohlwini oluwumphumela lwama-subnets route_list, ngisebenzisa okuguquguqukayo okuqukethe ama-octet angaphezu kwamathathu, ngikhetha ama-subnet engithakaselayo.
tmp = re.search(r'^%sS*' % subnet_search, route_list[i])
Nge-IPNetwork, imojula ye-netaddr, ngithola ama-subnets ngendlela yohlu lwamakheli e-ipv4
range_subnet = netaddr.IPNetwork(tmp.group(0))
Ngisebenzisa i-IPNetwork, ngithola izinhlobonhlobo zamakheli kunethiwekhi efakwe umsebenzisi ngemaski futhi ngikhiqize uhlu lwawo wonke amakheli asuka kulobu bubanzi ukuze ngiqhathanise nohlu lwamakheli ahlala abantu.
for i in set(net_list).difference(set(busyip)):
freeip.append(i)
Ngibonisa uhlu oluphumayo lwamakheli amahhala ngendlela yama-subnet
print(netaddr.IPSet(freeip))
Ngezansi umbhalo ophelele, ohlolwe kumaswishi asetshenziswa njengerutha, amamodeli 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