Junos PyEZ nggunakake conto tugas nggoleki subnet ipv4 gratis

Artikel babagan nggarap Junos PyEZ - "Python microframework sing ngidini sampeyan ngatur lan ngotomatisasi piranti sing nganggo Junos OS" otomatisasi lan manajemen, kabeh sing kita tresnani. Nulis skrip sing diterangake ing artikel iki duwe sawetara tujuan - sinau Python lan ngotomatisasi tugas kanggo ngumpulake informasi utawa ngganti konfigurasi ing peralatan sing nganggo Junos OS. Pilihan saka kombinasi tartamtu saka Python + Junos PyEZ iki digawe amarga alangi kurang kanggo entri menyang basa program Python lan ease saka nggunakake perpustakaan Junos PyEZ, kang ora mbutuhake kawruh pakar saka Junos OS.

Tujuan

Audit subnet ipv4 gratis sing diduweni perusahaan. Kriteria manawa subnet gratis yaiku ora ana entri babagan rute kasebut ing saklar sing tumindak minangka router sing nganggo Junos OS.

РСализация

Python + Junos PyEZ, sanajan ana godaan kanggo nindakake liwat paramiko lan ssh.exec_command, AkibatΓ©, sampeyan kudu ngatur protokol manajemen jaringan piranti netconf ing peralatan sing dijajaki. Netconf nggarap hardware liwat RPC prosedur remot lan nggunakake XML, ing conto iki, kanggo nyedhiyani informasi sing ditampa.

Nginstal versi Junos PyEZ saiki saka PyPI wis rampung nganggo printah ing ngisor iki:

$ pip install junos-eznc

Sampeyan uga bisa nginstal saka cabang utama proyek ing GitHub kanthi printah ing ngisor iki:

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

Lan siji opsi liyane liwat

$ pip install -r requirements.txt 

Printah iki bakal nginstal perpustakaan sing ilang saka sistem lan perlu kanggo operasi. Ing versi kula syarat.txt Mung ana loro, versi paling anyar dituduhake nalika nulis naskah:

junos-eznc
netaddr

Skrip kanthi gawan njupuk jeneng pangguna saiki ing sistem, sampeyan bisa mlebu ing jeneng pangguna liyane nggunakake tombol show_route.py -u getpass.getpass njupuk tembung sandhi saka stdin supaya tembung sandhi ora tetep ing sistem. Kanggo nyambung menyang peralatan, sampeyan uga kudu ngetik jeneng host utawa alamat IP nalika dijaluk. Kabeh data sing dibutuhake kanggo wewenang ing piranti wis ditampa.

Junos PyEZ ndhukung nyambungake menyang peralatan sing mlaku Junos OS nggunakake console, telnet utawa netconf liwat ssh. Artikel kasebut mbahas pilihan sing terakhir.

Kanggo nyambung menyang peralatan, nggunakake kelas Piranti saka modul jnpr.junos

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

Panyuwunan digawe kanggo kabeh rute sing dikenal router liwat telpon prosedur remot utawa telpon prosedur remot, endi wae sing luwih trep.

data = dev.rpc.get_route_information()

Prentah sing padha ing Junos OS

user@router> show route | display xml

Kanthi nambahake rpc ing pungkasan printah, kita entuk tag panyuwunan lan bisa cocog karo jeneng metode RPC, kanthi cara iki kita bisa ngerteni jeneng liya sing menarik. Wigati dicathet yen sintaks kanggo nulis tag panyuwunan beda karo jeneng metode, yaiku, sampeyan kudu ngganti tanda hubung kanthi garis ngisor.

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

Sisa bagean kasebut dibungkus sawetara wektu, supaya ora mbaleni panjaluk menyang router yen perlu mriksa subnet liyane saka sing wis dingerteni router. Wigati dicathet yen router sing dakjaluk mung ngerti rute liwat OSPF, dadi kanggo router pinggiran luwih apik kanggo ngganti panjalukan sethithik kanggo nyuda wektu skrip.

data = dev.rpc.get_ospf_route_information()

Saiki ayo ndeleng isi loop while

Ing wiwitan, pangguna bakal dijaluk ngetik subnet kanthi topeng lan ora luwih saka telung oktet saka jaringan subnet sing padha, iki perlu kanggo nyetel sawetara telusuran. Aku ora seneng banget karo implementasine nemtokake kritΓ©ria lan jangkauan telusuran, nanging nganti saiki aku durung nemokake solusi sing luwih apik. Sabanjure, saka asil dhaptar subnet route_list, nggunakake variabel sing ngemot ora luwih saka telung oktet, aku milih subnet sing narik kawigatenku.

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

Liwat IPNetwork, modul netaddr, aku nampa subnet ing wangun dhaptar alamat ipv4

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

Nggunakake IPNetwork, aku entuk sawetara alamat saka jaringan sing dilebokake pangguna kanthi topeng lan nggawe dhaptar kabeh alamat saka kisaran iki kanggo mbandhingake karo dhaptar alamat sing dikuwasani.

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

Aku nampilake dhaptar asil alamat gratis ing wangun subnet

print(netaddr.IPSet(freeip))

Ing ngisor iki skrip lengkap, diuji ing switch sing digunakake minangka router, 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

Source: www.habr.com

Add a comment