Junos PyEZ သည် အခမဲ့ ipv4 subnets မျာသကို ရဟာဖလေခဌင်သလုပ်ငန်သ၏ နမူနာကို အသုံသပဌုထာသသည်။

Junos PyEZ နဟင့်အလုပ်လုပ်ခဌင်သအကဌောင်သ ဆောင်သပါသတစ်ပုဒ် - "Python microframework" သည် Junos OS အသုံသပဌုသည့် စက်မျာသကို စီမံခန့်ခလဲနိုင်ပဌီသ အလိုအလျောက်လုပ်ဆောင်နိုင်စေမည့် ကျလန်ုပ်တို့နဟစ်သက်သည့်အရာအာသလုံသ၊ ကဆောင်သပါသတလင်ဖော်ပဌထာသသည့် ဇာတ်ညလဟန်သကိုရေသသာသရာတလင် ရည်မဟန်သချက်မျာသစလာရဟိသည် - Python ကိုလေ့လာခဌင်သနဟင့် Junos OS အသုံသပဌုသည့်စက်ပစ္စည်သမျာသတလင် အချက်အလက်မျာသစုဆောင်သခဌင်သ သို့မဟုတ် ပဌင်ဆင်သတ်မဟတ်မဟုမျာသကို ပဌောင်သလဲခဌင်သအတလက် Python ကို သင်ယူခဌင်သနဟင့် အလိုအလျောက်လုပ်ဆောင်ခဌင်သလုပ်ငန်သတာဝန်မျာသရဟိသည်။ Python + Junos PyEZ ၏ သီသခဌာသပေါင်သစပ်မဟုအာသ Python ပရိုဂရမ်သမင်သဘာသာစကာသသို့ ဝင်ရောက်ရန် အတာသအဆီသနည်သပါသခဌင်သနဟင့် Junos PyEZ စာကဌည့်တိုက်၏ အသုံသပဌုရလလယ်ကူခဌင်သတို့ကဌောင့် ရလေသချယ်မဟုမဟာ Junos OS ၏ ကျလမ်သကျင်သူမျာသမလိုအပ်ပါ။

လုပ်ငန်သ

ကုမ္ပဏီပိုင် အခမဲ့ ipv4 subnets မျာသကို စစ်ဆေသခဌင်သ။ subnet သည် အခမဲ့ဖဌစ်သည်ဟူသော စံသတ်မဟတ်ချက်မဟာ Junos OS လည်ပတ်သည့် router အဖဌစ် လုပ်ဆောင်သည့် switch ပေါ်ရဟိ လမ်သကဌောင်သမျာသတလင် ၎င်သနဟင့်ပတ်သက်သည့် ထည့်သလင်သမဟု မရဟိခဌင်သပင်ဖဌစ်သည်။

အကောင်အထည်ဖော်မဟု

Python + Junos PyEZ သည် ၎င်သကို paramiko နဟင့် ssh.exec_command မဟတဆင့်ပဌုလုပ်ရန် စုံစမ်သနဟောင့်ယဟက်မဟုမျာသရဟိခဲ့သော်လည်သ၊ ရလဒ်အနေဖဌင့် သင်သည် စစ်တမ်သကောက်ယူနေသည့် စက်ပစ္စည်သပေါ်ရဟိ netconf စက်ပစ္စည်သကလန်ရက်စီမံခန့်ခလဲမဟုပရိုတိုကောကို ပဌင်ဆင်သတ်မဟတ်ရန် လိုအပ်မည်ဖဌစ်သည်။ Netconf သည် အဝေသထိန်သလုပ်ငန်သစဉ်ခေါ်ဆိုမဟု RPC မဟတစ်ဆင့် ဟာ့ဒ်ဝဲနဟင့်အလုပ်လုပ်ပဌီသ ၎င်သရရဟိသည့်အချက်အလက်မျာသကိုပေသရန် ကဥပမာတလင် XML ကိုအသုံသပဌုသည်။

PyPI မဟ Junos PyEZ ၏ လက်ရဟိဗာသရဟင်သကို ထည့်သလင်သခဌင်သသည် အောက်ပါ command ဖဌင့် လုပ်ဆောင်သည်-

$ pip install junos-eznc

အောက်ပါ command ဖဌင့် GitHub ရဟိ ပရောဂျက်၏ ပင်မဌာနခလဲမဟလည်သ ထည့်သလင်သနိုင်သည်။

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

နဟင့်နောက်ထပ်ရလေသချယ်မဟုမဟတဆင့်

$ pip install -r requirements.txt 

ကအမိန့်သည် စနစ်မဟ ပျောက်ဆုံသနေသော စာကဌည့်တိုက်မျာသကို ထည့်သလင်သပဌီသ လည်ပတ်ရန်အတလက် လိုအပ်ပါသည်။ ငါ့ဗာသရဟင်သမဟာ လိုအပ်ချက်မျာသ ၎င်သတို့ထဲမဟ နဟစ်ခုသာ ရဟိပဌီသ၊ ဇာတ်ညလဟန်သရေသသာသချိန်တလင် နောက်ဆုံသထလက်ဗာသရဟင်သမျာသကို ဖော်ပဌထာသပါသည်။

junos-eznc
netaddr

မူရင်သအာသဖဌင့်၊ script သည် စနစ်အတလင်သရဟိ လက်ရဟိအသုံသပဌုသူ၏အမည်ကို ယူသည်၊ show_route.py -u သော့ကို အသုံသပဌု၍ အခဌာသအသုံသပဌုသူ၏အမည်အောက်တလင် သင်ဝင်ရောက်နိုင်သည်။ getpass.getpass သည် stdin မဟ စကာသဝဟက်ကို ယူသောကဌောင့် စကာသဝဟက်သည် စနစ်ထဲတလင် ရဟိနေမည်မဟုတ်ပါ။ စက်ပစ္စည်သမျာသနဟင့် ချိတ်ဆက်ရန် အချက်ပဌသည့်အခါတလင် ၎င်သ၏ hostname သို့မဟုတ် IP လိပ်စာကို ထည့်သလင်သရန် လိုအပ်ပါသည်။ စက်ပေါ်ရဟိ ခလင့်ပဌုချက်အတလက် လိုအပ်သော ဒေတာအာသလုံသကို လက်ခံရရဟိပဌီသဖဌစ်သည်။

Junos PyEZ သည် ssh မဟတစ်ဆင့် ကလန်ဆိုသလ်၊ telnet သို့မဟုတ် netconf ကို အသုံသပဌု၍ Junos OS အသုံသပဌုသည့် စက်ပစ္စည်သမျာသနဟင့် ချိတ်ဆက်ခဌင်သကို ပံ့ပိုသပေသသည်။ ဆောင်သပါသသည် နောက်ဆုံသရလေသချယ်မဟုအကဌောင်သ ဆလေသနလေသသည်။

ပစ္စည်သမျာသနဟင့် ချိတ်ဆက်ရန် jnpr.junos module ၏ Device class ကို အသုံသပဌုပါ။

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

အဝေသထိန်သလုပ်ငန်သစဉ်ခေါ်ဆိုမဟု သို့မဟုတ် အဝေသထိန်သစနစ်ခေါ်ဆိုမဟုမဟတစ်ဆင့် router သို့သိရဟိထာသသောလမ်သကဌောင်သအာသလုံသအတလက် တောင်သဆိုမဟုတစ်ခုပဌုလုပ်ထာသသည်၊ မည်သည့်အရာက ပိုအဆင်ပဌေသနည်သ။

data = dev.rpc.get_route_information()

Junos OS တလင် အလာသတူ အမိန့်ပေသသည်။

user@router> show route | display xml

command ၏အဆုံသတလင် rpc ပေါင်သထည့်ခဌင်သဖဌင့်၊ ကျလန်ုပ်တို့သည် တောင်သဆိုချက်တဂ်တစ်ခုရရဟိပဌီသ ၎င်သကို RPC နည်သလမ်သ၏အမည်နဟင့် ကိုက်ညီနိုင်သည်၊ ကနည်သဖဌင့် ကျလန်ုပ်တို့သည် အခဌာသစိတ်ဝင်စာသဖလယ်အမည်မျာသကို ရဟာဖလေနိုင်ပါသည်။ တောင်သဆိုချက်တဂ်ကိုရေသသာသခဌင်သအတလက် syntax သည် method name နဟင့် ကလဲပဌာသသည်၊ ဆိုလိုသည်မဟာ၊ သင်သည် တုံသတုံသမျာသကို underscore မျာသဖဌင့် အစာသထိုသသင့်သည်။

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

ကျန်အပိုင်သကို Router သိထာသပဌီသဖဌစ်သော အခဌာသ subnet မျာသကို စစ်ဆေသရန် လိုအပ်ပါက Router သို့ တောင်သဆိုချက်ကို ထပ်တလဲလဲ မပဌုလုပ်စေရန်အတလက် ကျန်အပိုင်သကို while loop ဖဌင့် ပတ်ထာသသည်။ ကျလန်ုပ်တောင်သဆိုချက်ပဌုလုပ်နေသည့် router သည် OSPF မဟတဆင့်လမ်သကဌောင်သမျာသကိုသာသိကဌောင်သဖော်ပဌရကျိုသနပ်သည်၊ ထို့ကဌောင့် edge router သည် script ၏လည်ပတ်ချိန်ကိုလျဟော့ချရန်အနည်သငယ်တောင်သဆိုမဟုကိုပဌောင်သလဲခဌင်သသည်ပိုမိုကောင်သမလန်သည်

data = dev.rpc.get_ospf_route_information()

အခု while loop ရဲ့ အကဌောင်သအရာတလေကို ကဌည့်ရအောင်

အစတလင်၊ အသုံသပဌုသူကို Mask ပါသည့် subnet တစ်ခုထဲသို့ ထည့်ခိုင်သမည်ဖဌစ်ပဌီသ တူညီသော subnet ၏ကလန်ရက်မဟ သုံသ octets ထက်မပိုစေဘဲ ရဟာဖလေမဟုအပိုင်သအခဌာသကို သတ်မဟတ်ရန် လိုအပ်ပါသည်။ စံသတ်မဟတ်ချက်မျာသနဟင့် ရဟာဖလေမဟုအပိုင်သအခဌာသကို သတ်မဟတ်ခဌင်သ၏ ကအကောင်အထည်ဖော်မဟုကို ကျလန်ုပ်တကယ်မကဌိုက်သော်လည်သ ယခုအချိန်အထိ ပိုမိုကောင်သမလန်သည့်ဖဌေရဟင်သချက်ကို ရဟာမတလေ့သေသပါ။ ထို့နောက်၊ ရရဟိလာသော subnets route_list ၏စာရင်သမဟ၊ octets သုံသခုထက်မပိုသော variable ကိုအသုံသပဌု၍ ကျလန်ုပ်စိတ်ဝင်စာသသော subnets ကိုရလေသချယ်ပါ

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

IPNetwork၊ netaddr module မဟတဆင့်၊ ကျလန်ုပ်သည် ipv4 လိပ်စာမျာသစာရင်သပုံစံဖဌင့် subnets မျာသကိုလက်ခံရရဟိသည်

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

IPNetwork ကို အသုံသပဌု၍ မျက်နဟာဖုံသတစ်ခုပါရဟိသော အသုံသပဌုသူထည့်သလင်သထာသသော ကလန်ရက်တစ်ခုမဟ လိပ်စာအကလာအဝေသကို ရယူပဌီသ သိမ်သပိုက်ထာသသော လိပ်စာမျာသစာရင်သနဟင့် နဟိုင်သယဟဉ်ရန်အတလက် ကအကလာအဝေသမဟ လိပ်စာအာသလုံသစာရင်သကို ထုတ်ပေသပါသည်။

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

ကျလန်ုပ်သည် subnet မျာသပုံစံဖဌင့် ရရဟိလာသော အခမဲ့လိပ်စာမျာသစာရင်သကို ပဌသပါသည်။

print(netaddr.IPSet(freeip))

အောက်တလင် ပဌည့်စုံသော script သည် Router အဖဌစ်အသုံသပဌုသည့် ခလုတ်မျာသ၊ မော်ဒယ်မျာသ 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