Iunos PyEZ exemplo usus negotii per ipv4 subnets gratis quaerendi

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; Quam ob rem, necesse erit configurare retis fabricam configurare protocollo in instrumento cum indicendo. Netconf laborat cum ferramentis per modum remotis procedendi RPC voca et utitur XML in hoc exemplo ad informationes recipiendas.

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