Π‘ΡΠ°ΡΡΡ ΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ Junos PyEZ β βPython microframework that enables you to manage and automate devices running Junos OSβ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, Π²ΡΠ΅ ΠΊΠ°ΠΊ ΠΌΡ Π»ΡΠ±ΠΈΠΌ. ΠΠ°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΊΡΠΈΠΏΡΠ° ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ³ΠΎ Π² ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΏΡΠ΅ΡΠ»Π΅Π΄ΠΎΠ²Π°Π»ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅Π»Π΅ΠΉ β ΠΈΠ·ΡΡΠ΅Π½ΠΈΠ΅ Python ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π·Π°Π΄Π°Ρ ΠΏΠΎ ΡΠ±ΠΎΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π½Π° ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΠ΄ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Junos OS. ΠΡΠ±ΠΎΡ ΠΈΠΌΠ΅Π½Π½ΠΎΠΉ ΡΡΠΎΠΉ ΡΠ²ΡΠ·ΠΊΠΈ Python + Junos PyEZ Π±ΡΠ» ΡΠ΄Π΅Π»Π°Π½ ΠΈΠ·-Π·Π° Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠ³Π° Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π² ΡΠ·ΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Python ΠΈ ΠΏΡΠΎΡΡΠΎΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Junos PyEZ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΊΡΠΏΠ΅ΡΡΠ½ΡΡ Π·Π½Π°Π½ΠΈΠΉ Junos OS.
ΠΠ°Π΄Π°ΡΠ°
ΠΡΠ΄ΠΈΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ ΠΏΠΎΠ΄ΡΠ΅ΡΠ΅ΠΉ ipv4 ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΠΈΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. ΠΡΠΈΡΠ΅ΡΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΏΠΎΠ΄ΡΠ΅ΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½Π° β ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ Π·Π°ΠΏΠΈΡΠΈ ΠΎ Π½Π΅ΠΉ Π² ΠΌΠ°ΡΡΡΡΡΠ°Ρ Π½Π° ΠΊΠΎΠΌΠΌΡΡΠ°ΡΠΎΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ΅ΠΌ ΡΠΎΠ»Ρ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΠ° ΠΏΠΎΠ΄ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Junos OS.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
Python + Junos PyEZ, Ρ
ΠΎΡΡ Π±ΡΠ» ΡΠΎΠ±Π»Π°Π·Π½ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ΅ΡΠ΅Π· paramiko ΠΈ ssh.exec_command,
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ Junos PyEZ ΠΈΠ· PyPI, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
$ pip install junos-eznc
ΠΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π²Π΅ΡΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° GitHub ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
$ pip install git+https://github.com/Juniper/py-junos-eznc.git
Π Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ΅ΡΠ΅Π·
$ pip install -r requirements.txt
ΡΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΠ΅ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ. Π ΠΌΠΎΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ requirements.txt ΠΈΡ Π²ΡΠ΅Π³ΠΎ Π΄Π²Π΅, Π²Π΅ΡΡΠΈΠΈ ΡΠΊΠ°Π·Π°Π½Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡΠ°:
junos-eznc
netaddr
Π‘ΠΊΡΠΈΠΏΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π±Π΅ΡΠ΅Ρ ΠΈΠΌΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅, Π·Π°Π»ΠΎΠ³ΠΈΠ½ΠΈΡΡΡΡ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠ»ΡΡ show_route.py -u <user_name> getpass.getpass ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΏΠ°ΡΠΎΠ»Ρ ΠΈΠ· stdin ΡΠ°ΠΊ ΠΏΠ°ΡΠΎΠ»Ρ Π½Π΅ ΠΎΡΡΠ°Π½Π΅ΡΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅. ΠΠ»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π²Π²Π΅ΡΡΠΈ ΠΏΠΎ Π·Π°ΠΏΡΠΎΡΡ Π΅Π³ΠΎ hostname ΠΈΠ»ΠΈ 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
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com