Junos PyEZ የነጻ ipv4 ንዑስ አውታረ መረቦችን የመፈለግ ተግባር ምሳሌ በመጠቀም

ከጁኖስ ፒኤዜ ጋር ስለመስራት መጣጥፍ - “Junos OSን የሚያሄዱ መሳሪያዎችን ለማስተዳደር እና በራስ-ሰር እንዲሰሩ የሚያስችልዎ የPython microframework” አውቶማቲክ እና አስተዳደር ፣ የምንወደውን ሁሉ። በዚህ ጽሑፍ ውስጥ የተገለጸውን ስክሪፕት መጻፍ ብዙ ግቦች ነበሩት - Python መማር እና መረጃን ለመሰብሰብ ተግባሮችን በራስ-ሰር ማድረግ ወይም ጁኖስ ኦኤስን በሚያሄዱ መሣሪያዎች ላይ ውቅሮችን መለወጥ። የዚህ ልዩ የፓይዘን + ጁኖስ ፒኤዜ ጥምረት ምርጫ የተደረገው ወደ ፓይዘን ፕሮግራሚንግ ቋንቋ ለመግባት ባለው ዝቅተኛ እንቅፋት እና የጁኖስ ፒኤዚ ቤተ-መጽሐፍት አጠቃቀም ቀላልነት ነው፣ ይህም የጁኖስ ኦኤስ ኤክስፐርት እውቀት አያስፈልገውም።

ዓላማ

የኩባንያው ንብረት የሆኑ የነጻ ipv4 ንዑስ መረቦች ኦዲት። ንኡስ ኔት ነፃ ነው የሚለው መስፈርት ጁኖስ ኦኤስን የሚያሄድ ራውተር ሆኖ በሚያገለግል ማብሪያ / ማጥፊያ ላይ ባሉት መንገዶች ውስጥ ስለ እሱ ግቤት አለመኖር ነው።

ትግበራ

Python + Junos PyEZ ምንም እንኳን በፓራሚኮ እና በ ssh.exec_command በኩል ለማድረግ ፈተና ቢኖርም ፣ በዚህ ምክንያት የ netconf መሳሪያ አውታረ መረብ አስተዳደር ፕሮቶኮልን በድምጽ መስጫ መሳሪያዎች ላይ ማዋቀር ያስፈልግዎታል. ኔትኮንፍ ከሃርድዌር ጋር አብሮ የሚሰራው በርቀት አሰራር ጥሪ RPC እና የሚቀበለውን መረጃ ለማቅረብ በዚህ ምሳሌ ኤክስኤምኤልን ይጠቀማል።

የአሁኑን የJunos PyEZ ስሪት ከPyPI መጫን የሚከናወነው በሚከተለው ትዕዛዝ ነው።

$ pip install junos-eznc

እንዲሁም ከፕሮጀክቱ ዋና ቅርንጫፍ በሚከተለው ትዕዛዝ በ GitHub ላይ መጫን ይችላሉ.

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

እና አንድ ተጨማሪ አማራጭ በ በኩል

$ pip install -r requirements.txt 

ይህ ትእዛዝ ከስርአቱ የጠፉ እና ለስራ አስፈላጊ የሆኑትን ቤተ-መጻሕፍት ይጭናል። በእኔ ስሪት ውስጥ መስፈርቶች .xt ከእነዚህ ውስጥ ሁለቱ ብቻ ናቸው፣ የቅርብ ጊዜዎቹ ስሪቶች ስክሪፕቱን በሚጽፉበት ጊዜ ይጠቁማሉ፡-

junos-eznc
netaddr

በነባሪነት ስክሪፕቱ በሲስተሙ ውስጥ ያለውን የአሁኑን ተጠቃሚ ስም ይወስዳል፡ በሌላ ተጠቃሚ ስም የ show_route.py -u ቁልፍን በመጠቀም መግባት ይችላሉ። getpass.getpass የይለፍ ቃሉን ከ stdin ይወስዳል ስለዚህ የይለፍ ቃሉ በሲስተሙ ውስጥ አይቆይም። ከመሳሪያው ጋር ለመገናኘት፣ ሲጠየቁ የአስተናጋጅ ስሙን ወይም አይፒ አድራሻውን ማስገባት ያስፈልግዎታል። በመሳሪያው ላይ ለፈቃድ አስፈላጊ የሆኑ ሁሉም መረጃዎች ደርሷል።

Junos PyEZ ኮንሶል፣ ቴልኔት ወይም ኔትኮንፍን በssh በመጠቀም Junos OS ከሚያሄዱ መሳሪያዎች ጋር መገናኘትን ይደግፋል። ጽሑፉ ስለ ሁለተኛው አማራጭ ይናገራል.

ከመሳሪያዎች ጋር ለመገናኘት የjnpr.junos ሞጁሉን የመሣሪያ ክፍል ይጠቀሙ

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

ለራውተሩ ለሚያውቁት ሁሉም መንገዶች በርቀት የአሰራር ጥሪ ወይም በርቀት የአሰራር ጥሪ በኩል ይጠየቃል፣ የትኛውም የበለጠ ምቹ ነው።

data = dev.rpc.get_route_information()

በ Junos OS ላይ ተመሳሳይ ትዕዛዝ

user@router> show route | display xml

rpc ን በትእዛዙ መጨረሻ ላይ በማከል የጥያቄ መለያ እናገኛለን እና ከ RPC ዘዴ ስም ጋር ማዛመድ እንችላለን ፣ በዚህ መንገድ ሌሎች የፍላጎት ስሞችን ማግኘት እንችላለን ። የጥያቄውን መለያ ለመጻፍ አገባብ ከስልቱ ስም የተለየ መሆኑን ልብ ሊባል የሚገባው ነው ፣ ማለትም ፣ ሰረዞችን ከስር ነጥቦች ጋር መተካት አለብዎት።

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

የቀረው ክፍል ራውተር ቀድሞውኑ ከሚያውቀው ሌላ ንዑስ አውታረ መረብ ውስጥ መፈተሽ አስፈላጊ ከሆነ ለ ራውተር የቀረበውን ጥያቄ ላለመድገም ለተወሰነ ጊዜ loop ተጠቅልሏል። ጥያቄውን ያቀረብኩበት ራውተር በOSPF በኩል መንገዶችን እንደሚያውቅ መጥቀስ ተገቢ ነው ፣ ስለሆነም ለጠርዝ ራውተር የስክሪፕቱን ጊዜ ለመቀነስ ጥያቄውን ትንሽ መለወጥ የተሻለ ነው ።

data = dev.rpc.get_ospf_route_information()

አሁን የትንሽ ዑደቱን ይዘት እንይ

መጀመሪያ ላይ ተጠቃሚው ጭምብል ያለው እና ከተመሳሳይ ንዑስ አውታረመረብ አውታረመረብ ከሶስት octets ያልበለጠ ንዑስ መረብ እንዲገባ ይጠየቃል ፣ ይህ የፍለጋ ወሰን ለማዘጋጀት አስፈላጊ ነው። ይህንን መመዘኛዎች እና የፍለጋ ክልልን የመግለጽ አተገባበርን በእውነት አልወደውም ፣ ግን እስካሁን የተሻለ መፍትሄ አላገኘሁም። በመቀጠል፣ ከተገኘው የንዑስኔትስ ዝርዝር route_list፣ ከሶስት octets የማይበልጥ ተለዋዋጭ በመጠቀም፣ እኔን የሚስቡኝን ንዑስ አውታረ መረቦች እመርጣለሁ።

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

በአይፒ አውታረ መረብ ፣ በ netaddr ሞጁል ፣ ንዑስ መረቦችን በ ipv4 አድራሻዎች ዝርዝር ውስጥ እቀበላለሁ ።

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

IPNetwork ን በመጠቀም፣ በተጠቃሚ ከገባ አውታረ መረብ ጭምብል ያለው የተለያዩ አድራሻዎችን አገኛለሁ እና ከተያዙት አድራሻዎች ዝርዝር ጋር ለማነፃፀር ከዚህ ክልል ሁሉንም አድራሻዎች ዝርዝር አዘጋጃለሁ።

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

የተገኘውን የነፃ አድራሻዎች ዝርዝር በንዑስኔትስ መልክ አሳይቻለሁ

print(netaddr.IPSet(freeip))

ከታች ያለው ሙሉ ስክሪፕት ነው፣ እንደ ራውተር በሚያገለግሉ ቁልፎች ላይ የተሞከረ፣ ሞዴሎች 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

ምንጭ: hab.com

አስተያየት ያክሉ