Junos PyEZ nganggo conto tugas milarian subnet ipv4 gratis

Artikel ngeunaan gawé bareng Junos PyEZ - "Python microframework anu ngamungkinkeun anjeun pikeun ngatur sareng ngajadikeun otomatis alat-alat anu ngajalankeun Junos OS" otomatisasi sareng manajemén, sadaya anu urang resep. Nulis naskah anu dijelaskeun dina tulisan ieu ngagaduhan sababaraha tujuan - diajar Python sareng ngajadikeun otomatis tugas pikeun ngumpulkeun inpormasi atanapi ngarobih konfigurasi dina alat anu ngajalankeun Junos OS. Pilihan kombinasi husus ieu Python + Junos PyEZ dijieun alatan panghalang low pikeun asupna kana basa programming Python jeung betah pamakéan perpustakaan Junos PyEZ, nu teu merlukeun pangaweruh ahli ngeunaan Junos OS.

tugas

Audit subnet ipv4 gratis milik perusahaan. Kriteria yén subnet bébas nyaéta henteuna éntri ngeunaan éta dina rute dina saklar anu bertindak salaku router anu ngajalankeun Junos OS.

Реализация

Python + Junos PyEZ, sanaos aya godaan pikeun ngalakukeunana ngaliwatan paramiko sareng ssh.exec_command, Hasilna, anjeun kedah ngonpigurasikeun protokol manajemén jaringan alat netconf dina alat anu dijajal. Netconf tiasa dianggo sareng hardware via RPC nelepon prosedur jauh sareng nganggo XML, dina conto ieu, pikeun nyayogikeun inpormasi anu ditampi.

Masang versi ayeuna Junos PyEZ ti PyPI parantos dilakukeun ku paréntah di handap ieu:

$ pip install junos-eznc

Anjeun ogé tiasa masang tina cabang utama proyék dina GitHub kalayan paréntah di handap ieu:

$ pip install git+https://github.com/Juniper/py-junos-eznc.git

Sareng hiji deui pilihan via

$ pip install -r requirements.txt 

Paréntah ieu bakal masang perpustakaan anu leungit tina sistem sareng dipikabutuh pikeun operasi. Dina versi kuring sarat.txt Aya ngan dua di antarana, versi panganyarna dituduhkeun dina waktu nulis naskah:

junos-eznc
netaddr

Sacara standar, skrip nyandak nami pangguna ayeuna dina sistem; anjeun tiasa log in handapeun nami pangguna anu sanés nganggo konci show_route.py -u getpass.getpass nampi kecap akses ti stdin supados kecap konci henteu tetep dina sistem. Pikeun nyambung ka alat, anjeun ogé kedah ngalebetkeun hostname atanapi alamat IP na nalika dipenta. Sadaya data anu dipikabutuh pikeun otorisasi dina alat parantos nampi.

Junos PyEZ ngadukung nyambungkeun kana alat anu ngajalankeun Junos OS nganggo konsol, telnet atanapi netconf via ssh. Tulisan ngabahas pilihan anu terakhir.

Pikeun nyambung ka alat, make kelas Alat tina modul jnpr.junos

with jnpr.junos.Device(host=router,
                           user=args.name,
                           passwd=password) as dev:

A pamundut dijieun pikeun sakabéh ruteu dipikawanoh ka router via panggero prosedur jauh atawa panggero prosedur jauh, whichever leuwih merenah.

data = dev.rpc.get_route_information()

Paréntah anu sami dina Junos OS

user@router> show route | display xml

Ku nambahkeun rpc ka tungtung paréntah, urang meunang tag pamundut tur bisa cocog eta kalawan ngaran metoda RPC, ku cara kieu urang bisa manggihan ngaran séjén dipikaresep. Eta sia noting yén sintaksis pikeun nulis tag pamundut béda ti ngaran métode, nyaéta, anjeun kudu ngaganti hyphens kalawan underscores.

user@router> show route | display xml rpc
<rpc-reply >route_list = data.xpath("//rt-destination/text()")

Sesa bagian dibungkus dina loop bari, ku kituna teu malikan deui pamundut ka router lamun perlu pariksa dina subnet sejen ti nu router geus nyaho ngeunaan. Perlu disebatkeun yén router anu kuring nyuhunkeun éta terang rute ngan ukur ngaliwatan OSPF, ku kituna pikeun router tepi langkung saé ngarobih pamundut sakedik pikeun ngirangan waktos jalanna naskah.

data = dev.rpc.get_ospf_route_information()

Ayeuna hayu urang nempo eusi loop bari

Dina awalna, pamaké bakal dipenta pikeun nuliskeun subnet kalawan topeng jeung teu leuwih ti tilu oktét tina jaringan tina subnet sarua, ieu perlu pikeun ngeset rentang pilarian. Kuring teu bener resep palaksanaan ieu nangtukeun kriteria na rentang pilarian, tapi jadi jauh kuring teu kapanggih solusi hadé. Salajengna, tina daptar hasil subnet route_list, ngagunakeun variabel anu ngandung henteu langkung ti tilu oktét, kuring milih subnet anu dipikaresep ku kuring.

tmp = re.search(r'^%sS*' % subnet_search, route_list[i])

Ngaliwatan IPNetwork, modul netaddr, kuring nampi subnet dina bentuk daptar alamat ipv4.

range_subnet = netaddr.IPNetwork(tmp.group(0))

Nganggo IPNetwork, kuring kéngingkeun sajumlah alamat tina jaringan anu diasupkeun ku pangguna nganggo topéng sareng ngahasilkeun daptar sadaya alamat tina rentang ieu pikeun ngabandingkeun sareng daptar alamat anu dijajah.

for i in set(net_list).difference(set(busyip)):
        freeip.append(i)

Kuring mintonkeun daptar hasil tina alamat bébas dina bentuk subnets

print(netaddr.IPSet(freeip))

Di handap ieu naskah lengkep, diuji dina switch dipaké salaku router a, model 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

sumber: www.habr.com

Tambahkeun komentar