Articulum de operando cum Iunonibus PyEZ - "Phython microframework quae efficit ut machinas cures et automataria Iunonum OS currentes" automationem et administrationem, omnia amamus. Scripturae scripturae in hoc articulo descriptae plures fines habuit - discendi Pythonem et officia automandi ad colligendas informationes vel mutandas figurationes in apparatu cursus Iunonum OS. Electio certae compositionis huius Pythonis + Iunonis PyEZ facta est ob impedimentum humile ad ingressum in linguam programmandi Pythonis et facilitatem usus bibliothecae Iunonis PyEZ, quae scientia peritia Iunonum OS non requirit.
negotium
Audit libere ipv4 subnets ad comitatum spectantia. Criterium quod subnet liberum est absentia introitus circa eam in itineribus in transitum agendi sicut iter Iunos OS currentem.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
Python + Junos PyEZ, quamvis tentatio id faceret per paramiko et ssh.exec_mand;
Praesens emendationem Iunonum PyEZ ex PyPI inaugurari facto mandato sequenti:
$ pip install junos-eznc
Potes etiam instituere e summa parte rei in GitHub cum sequenti mandato:
$ pip install git+https://github.com/Juniper/py-junos-eznc.git
Et una optio via
$ pip install -r requirements.txt
Praeceptum hoc instituet bibliothecas, quae a ratione carent et ad operandum necessaria sunt. In mea version requirements.txt Ex his duo tantum ultimi versiones indicantur tempore scripto scripto;
junos-eznc
netaddr
Defalta scriptum nomen usoris currentis in systematis accipit; inire potes sub nomine alterius usoris utendi in clavem show_route.py -u getpass.getpass tesseram ab stdin accipit et signum in systemate non remanebit. Ad apparatum coniungere, etiam hostname eius vel IP oratio monita opus inire debebis. Omnia data necessaria pro licentia in fabrica recepta sunt.
Junos PyEZ sustinet connectens ad apparatum cursus Junos OS utens console, telnet vel netconf per ssh. Articulus de hac optione disputat.
Ad apparatum coniungere, utere fabrica ordinis jnpr.junos moduli
with jnpr.junos.Device(host=router,
user=args.name,
passwd=password) as dev:
Petitio fit omnibus itineribus notis iter itineris per remotam rationem vocationis vel procedendi remotam vocationem, uter est commodior.
data = dev.rpc.get_route_information()
Simile mandatum de Iunonibus OS
user@router> show route | display xml
Rpc ad finem praecepti addendo, petitionem tag accipimus et cum nomine methodi RPC congruit, hoc modo alia nomina interest invenire possumus. Notatu dignum est syntaxin pro scribendo rogatu tag differre a methodo nominis, nempe, hyphens cum underscores reponere debes.
user@router> show route | display xml rpc
<rpc-reply >route_list = data.xpath("//rt-destination/text()")
Reliqua pars ansa paulisper involuta erat, ne si iter in aliud subnetum peteret, ab iis quae iam iter scit. Memorabile est quod iter in quo petitio facio solum per OSPF itinera scita, sic in ora itineris melius est petitionem mutare paulum temporis currentis scriptoris reducere.
data = dev.rpc.get_ospf_route_information()
Nunc videamus contenta fasciculi
Initio, usor rogabitur ut subnet cum larva et non plus quam tres octetae ex retis eiusdem subnet, hoc investigationis ambitum ponere necesse est. Haec exsecutio specificandi criteriis et range inquisitionis non placet, sed adhuc meliorem solutionem non inveni. Deinde e indice subnetuum meatus_listorum consequentium, variabili utens, non plus quam tres octetas continens, subnets delego quae intersunt.
tmp = re.search(r'^%sS*' % subnet_search, route_list[i])
Per IPNetwork, moduli netaddr, subnets accipio in forma inscriptionum inscriptionum ipv4
range_subnet = netaddr.IPNetwork(tmp.group(0))
IPNetwork utens, inscriptionum usor-initarum retis cum larva usoriis amplis obtineo et indicem omnium inscriptionum ex hoc ambitu generat ad comparationem cum inscriptionum numero occupatarum.
for i in set(net_list).difference(set(busyip)):
freeip.append(i)
Propono inde album inscriptionum liberarum in forma subnets
print(netaddr.IPSet(freeip))
Infra scriptum est integrum , probatum in permutandis ut iter, exemplaribus 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