Junos PyEZ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π·Π° Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ Π½Π° Π±Π΅Π·ΠΏΠ»Π°Ρ‚Π½ΠΈ ipv4 ΠΏΠΎΠ΄ΠΌΡ€Π΅ΠΆΠΈ

Бтатия Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с Junos PyEZ - β€žΠœΠΈΠΊΡ€ΠΎΡ€Π°ΠΌΠΊΠ° Π½Π° Python, която Π²ΠΈ позволява Π΄Π° управляватС ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ устройства, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΈ с Junos OSβ€œ автоматизация ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΠ±ΠΈΡ‡Π°ΠΌΠ΅. ΠŸΠΈΡΠ°Π½Π΅Ρ‚ΠΎ Π½Π° скрипта, описан Π² Ρ‚Π°Π·ΠΈ статия, имашС няколко Ρ†Π΅Π»ΠΈ - ΠΈΠ·ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° Python ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈ Π·Π° ΡΡŠΠ±ΠΈΡ€Π°Π½Π΅ Π½Π° информация ΠΈΠ»ΠΈ промяна Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° ΠΎΠ±ΠΎΡ€ΡƒΠ΄Π²Π°Π½Π΅, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΎ с Junos OS. Π˜Π·Π±ΠΎΡ€ΡŠΡ‚ Π½Π° Ρ‚Π°Π·ΠΈ спСцифична комбинация ΠΎΡ‚ Python + Junos PyEZ бСшС Π½Π°ΠΏΡ€Π°Π²Π΅Π½ ΠΏΠΎΡ€Π°Π΄ΠΈ ниската Π±Π°Ρ€ΠΈΠ΅Ρ€Π° Π·Π° Π½Π°Π²Π»ΠΈΠ·Π°Π½Π΅ Π² Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ Python ΠΈ Π»Π΅ΠΊΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Junos PyEZ, която Π½Π΅ изисква СкспСртни познания Π·Π° Junos OS.

Π—Π°Π΄Π°Ρ‡Π°

ΠžΠ΄ΠΈΡ‚ Π½Π° Π±Π΅Π·ΠΏΠ»Π°Ρ‚Π½ΠΈ ipv4 ΠΏΠΎΠ΄ΠΌΡ€Π΅ΠΆΠΈ, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈ Π½Π° компанията. ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΡΡ‚, Ρ‡Π΅ ΠΏΠΎΠ΄ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Π΅ свободна, Π΅ липсата Π½Π° запис Π·Π° нСя Π² ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΠΌΡƒΡ‚Π°Ρ‚ΠΎΡ€Π°, дСйстващ ΠΊΠ°Ρ‚ΠΎ Ρ€ΡƒΡ‚Π΅Ρ€, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ с Junos OS.

ИзпълнСниС

Python + Junos PyEZ, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ имашС ΠΈΠ·ΠΊΡƒΡˆΠ΅Π½ΠΈΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ Ρ‡Ρ€Π΅Π· paramiko ΠΈ ssh.exec_command, Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° Ρ‰Π΅ трябва Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π·Π° ΠΌΡ€Π΅ΠΆΠΎΠ²ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° устройството netconf Π½Π° Π·Π°ΠΏΠΈΡ‚Π²Π°Π½ΠΎΡ‚ΠΎ ΠΎΠ±ΠΎΡ€ΡƒΠ΄Π²Π°Π½Π΅. Netconf Ρ€Π°Π±ΠΎΡ‚ΠΈ с Ρ…Π°Ρ€Π΄ΡƒΠ΅Ρ€ Ρ‡Ρ€Π΅Π· ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° RPC ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° XML, Π² Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π° Π΄Π° прСдостави информацията, която ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° вСрсия Π½Π° Junos PyEZ ΠΎΡ‚ PyPI сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° със слСдната ΠΊΠΎΠΌΠ°Π½Π΄Π°:

$ pip install junos-eznc

ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΡΡŠΡ‰ΠΎ Π΄Π° инсталиратС ΠΎΡ‚ главния ΠΊΠ»ΠΎΠ½ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² GitHub със слСдната ΠΊΠΎΠΌΠ°Π½Π΄Π°:

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

И ΠΎΡ‰Π΅ Π΅Π΄Π½Π° опция Ρ‡Ρ€Π΅Π·

$ pip install -r requirements.txt 

Π’Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ‰Π΅ инсталира Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ липсват Π² систСмата ΠΈ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°. Π’ моя Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ изисквания.txt Има само Π΄Π²Π΅ ΠΎΡ‚ тях, Π½Π°ΠΉ-Π½ΠΎΠ²ΠΈΡ‚Π΅ вСрсии са посочСни към ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° писанС Π½Π° скрипта:

junos-eznc
netaddr

По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ ΡΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° тСкущия ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» Π² систСмата; ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²Π»Π΅Π·Π΅Ρ‚Π΅ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Π΄Ρ€ΡƒΠ³ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π», ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΊΠ»ΡŽΡ‡Π° show_route.py -u getpass.getpass Π²Π·Π΅ΠΌΠ° ΠΏΠ°Ρ€ΠΎΠ»Π°Ρ‚Π° ΠΎΡ‚ stdin, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΏΠ°Ρ€ΠΎΠ»Π°Ρ‚Π° няма Π΄Π° останС Π² систСмата. Π—Π° Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ с ΠΎΠ±ΠΎΡ€ΡƒΠ΄Π²Π°Π½Π΅Ρ‚ΠΎ, Ρ‰Π΅ трябва ΡΡŠΡ‰ΠΎ Π΄Π° Π²ΡŠΠ²Π΅Π΄Π΅Ρ‚Π΅ Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅ Π½Π° хост ΠΈΠ»ΠΈ IP адрСс, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π±ΡŠΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ΄ΠΊΠ°Π½Π΅Π½ΠΈ. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈ са всички Π΄Π°Π½Π½ΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° авторизация Π½Π° устройството.

Junos PyEZ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ към ΠΎΠ±ΠΎΡ€ΡƒΠ΄Π²Π°Π½Π΅, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΎ с Junos OS, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π°, telnet ΠΈΠ»ΠΈ netconf Ρ‡Ρ€Π΅Π· ssh. Бтатията Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π° послСдния Π²Π°Ρ€ΠΈΠ°Π½Ρ‚.

Π—Π° Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ с ΠΎΠ±ΠΎΡ€ΡƒΠ΄Π²Π°Π½Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ класа Device Π½Π° ΠΌΠΎΠ΄ΡƒΠ»Π° 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()")

ΠžΡΡ‚Π°Π½Π°Π»Π°Ρ‚Π° част бСшС ΠΎΠ±Π²ΠΈΡ‚Π° Π² Ρ†ΠΈΠΊΡŠΠ» while, Π·Π° Π΄Π° Π½Π΅ сС повтаря заявката към Ρ€ΡƒΡ‚Π΅Ρ€Π°, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈ Π΄Ρ€ΡƒΠ³Π° ΠΏΠΎΠ΄ΠΌΡ€Π΅ΠΆΠ° ΠΎΡ‚ Ρ‚Π΅Π·ΠΈ, Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ Ρ€ΡƒΡ‚Π΅Ρ€ΡŠΡ‚ Π²Π΅Ρ‡Π΅ Π·Π½Π°Π΅. Π‘Ρ‚Ρ€ΡƒΠ²Π° си Π΄Π° сС спомСнС, Ρ‡Π΅ Ρ€ΡƒΡ‚Π΅Ρ€ΡŠΡ‚, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ правя заявката, ΠΏΠΎΠ·Π½Π°Π²Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈ само ΠΏΡ€Π΅Π· OSPF, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π·Π° ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€Π΅Π½ Ρ€ΡƒΡ‚Π΅Ρ€ Π΅ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΌΠ°Π»ΠΊΠΎ заявката, Π·Π° Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΡ‚Π΅ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° изпълнСниС Π½Π° скрипта

data = dev.rpc.get_ospf_route_information()

Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ†ΠΈΠΊΡŠΠ»Π° while

Π’ Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ потрСбитСлят Ρ‰Π΅ бъдС ΠΏΠΎΠΌΠΎΠ»Π΅Π½ Π΄Π° въвСдС ΠΏΠΎΠ΄ΠΌΡ€Π΅ΠΆΠ° с маска ΠΈ Π½Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ Ρ‚Ρ€ΠΈ ΠΎΠΊΡ‚Π΅Ρ‚Π° ΠΎΡ‚ ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Π½Π° ΡΡŠΡ‰Π°Ρ‚Π° ΠΏΠΎΠ΄ΠΌΡ€Π΅ΠΆΠ°, Ρ‚ΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΎΠ±Ρ…Π²Π°Ρ‚Π° Π½Π° Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅. НС ΠΌΠΈ харСсва ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π°Π·ΠΈ рСализация Π½Π° опрСдСлянС Π½Π° ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈΡ‚Π΅ ΠΈ ΠΎΠ±Ρ…Π²Π°Ρ‚Π° Π½Π° Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅, Π½ΠΎ досСга Π½Π΅ съм Π½Π°ΠΌΠ΅Ρ€ΠΈΠ» ΠΏΠΎ-Π΄ΠΎΠ±Ρ€ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΎΡ‚ получСния списък с ΠΏΠΎΠ΄ΠΌΡ€Π΅ΠΆΠΈ route_list, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰Π° Π½Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ Ρ‚Ρ€ΠΈ ΠΎΠΊΡ‚Π΅Ρ‚Π°, ΠΈΠ·Π±ΠΈΡ€Π°ΠΌ ΠΏΠΎΠ΄ΠΌΡ€Π΅ΠΆΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠ΅ интСрСсуват

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

Π§Ρ€Π΅Π· IPNetwork, ΠΌΠΎΠ΄ΡƒΠ»Π° 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

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€