Junos PyEZ nganggo conto tugas milarian subnet ipv4 gratis

Artikel ngeunaan gawé bareng Junos PyEZ—"Mikroframework Python anu ngamungkinkeun anjeun ngatur sareng ngajadikeun otomatis alat anu ngajalankeun Junos OS" - nyaéta ngeunaan otomatisasi sareng manajemén, sapertos anu urang resep. Skrip anu dijelaskeun dina tulisan ieu ditulis kalayan sababaraha tujuan dina pikiran: diajar Python sareng ngajadikeun otomatis tugas sapertos ngumpulkeun inpormasi atanapi ngarobih konfigurasi dina hardware anu ngajalankeun Junos OS. Kombinasi Python + Junos PyEZ tinangtu ieu dipilih kusabab kurva diajar anu rendah pikeun basa pamrograman Python sareng betah panggunaan perpustakaan Junos PyEZ, anu henteu meryogikeun pangaweruh ahli ngeunaan Junos OS.

tugas

Inok subnet IPv4 anu sayogi milik perusahaan. A subnet dianggap sadia lamun teu didaptarkeun dina ruteu on switch akting salaku router ngajalankeun Junos OS.

Реализация

Python + Junos PyEZ, sanaos kuring kagoda pikeun ngalakukeunana ngaliwatan paramiko sareng ssh.exec_command, Hasilna, anjeun kedah ngonpigurasikeun protokol manajemén alat jaringan (NetConf) dina alat anu dijajal. NetConf komunikasi sareng alat-alat via telepon prosedur jauh (RPC) sareng, dina conto ieu, nganggo XML pikeun nampilkeun inpormasi anu ditampi.

Pikeun masang versi ayeuna Junos PyEZ ti PyPI, jalankeun paréntah di handap ieu:

$ pip install junos-eznc

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

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

Jeung hiji deui pilihan ngaliwatan

$ pip install -r requirements.txt 

Paréntah ieu bakal masang perpustakaan anu leungit anu diperyogikeun pikeun operasi. Dina versi abdi sarat.txt Aya ngan dua di antarana, versi didaptarkeun anu panganyarna dina waktu nulis naskah:

junos-eznc
netaddr

Sacara standar, naskah nyokot ngaran pamaké ayeuna dina sistem; Anjeun tiasa log in handapeun ngaran pamaké séjén maké show_route.py -u konci. getpass.getpass narima sandi ti stdin, jadi eta moal tetep dina sistem. Pikeun nyambung ka alat, anjeun ogé kedah ngalebetkeun hostname atanapi alamat IP na nalika dipenta. Sadaya data anu dipikabutuh pikeun otorisasi alat parantos ditampi.

Junos PyEZ ngarojong sambungan kana hardware Junos OS ngagunakeun konsol, telnet, atawa netconf ngaliwatan SSH. Tulisan ieu ngabahas pilihan anu terakhir.

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

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

Paménta pikeun sadaya rute anu dipikanyaho ku router dilakukeun ku telepon prosedur jauh atanapi telepon prosedur jauh, anu mana anu langkung merenah.

data = dev.rpc.get_route_information()

Paréntah anu sami dina Junos OS

user@router> show route | display xml

Ku appending rpc kana paréntah, urang ménta tag pamundut tur bisa cocog eta kalawan ngaran metoda RPC. Metoda ieu ogé bisa dipaké pikeun manggihan ngaran séjén dipikaresep. Perhatos yén sintaksis pikeun nyerat tag pamundut béda sareng nami metode; husus, hyphens kudu diganti ku underscores.

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

Kuring mungkus sesa query dina loop bari ulah ulang querying router lamun kuring kudu pariksa dina subnet béda ti hiji router geus nyaho ngeunaan. Eta sia mentioning yén router Kuring querying ngan nyaho ruteu via OSPF, jadi pikeun router ujung, éta pangalusna rada ngaropéa query pikeun ngurangan waktu palaksanaan naskah.

data = dev.rpc.get_ospf_route_information()

Ayeuna hayu urang nempo eusi loop bari.

Dina awalna, pamaké bakal dipenta pikeun nuliskeun subnet kalawan topéng jeung nepi ka tilu oktét tina jaringan subnet sarua; ieu diperlukeun pikeun ngeset rentang pilarian. Kuring teu resep pendekatan ieu nangtukeun kriteria pilarian sarta rentang, tapi kuring teu acan kapanggih solusi hadé acan. Salajengna, tina daptar hasil tina subnets, route_list, Kuring milih subnets Abdi resep ngagunakeun variabel ngandung nepi ka tilu oktét.

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

Ngagunakeun IPNetwork, modul netaddr, kuring meunang subnets salaku daptar alamat IPv4.

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

Nganggo IPNetwork, kuring nampi 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 pinuh, 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

Mésér hosting anu dipercaya pikeun situs anu gaduh panyalindungan DDoS, server VPS VDS 🔥 Meser hosting situs wéb anu tiasa dipercaya nganggo panyalindungan DDoS, server VPS VDS | ProHoster