Junos PyEZ αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž—αžΆαžšαž€αž·αž…αŸ’αž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αžŽαŸ’αžαžΆαž‰αžšαž„ ipv4 αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒ

αž’αžαŸ’αžαž”αž‘αž’αŸ†αž–αžΈαž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ Junos PyEZ - "Python microframework αžŠαŸ‚αž›αž’αžΆαž…αž±αŸ’αž™αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ αž“αž·αž„αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜αž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš 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 αŸ” αž’αžαŸ’αžαž”αž‘αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαž‡αž˜αŸ’αžšαžΎαžŸαž…αž»αž„αž€αŸ’αžšαŸ„αž™αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž§αž”αž€αžšαžŽαŸ αžŸαžΌαž˜αž”αŸ’αžšαžΎαžαŸ’αž“αžΆαž€αŸ‹αž§αž”αž€αžšαžŽαŸαž“αŸƒαž˜αŸ‰αžΌαžŒαž»αž› 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()")

αž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž»αŸ†αžŠαŸ„αž™αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αž˜αž½αž™αžšαž™αŸˆ αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αžŸαŸ†αžŽαžΎαžšαž‘αŸ…αž€αžΆαž“αŸ‹αžšαŸ‰αŸ„αžαž‘αŸαžšαž‘αžΎαž„αžœαž·αž‰ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž”αžŽαŸ’αžαžΆαž‰αžšαž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž–αžΈαž’αŸ’αž“αž€αžŠαŸ‚αž›αžšαŸ‰αŸ„αžαž‘αŸαžšαžŠαžΉαž„αžšαž½αž…αž αžΎαž™αŸ” αžœαžΆαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαž€αŸ’αž“αž»αž„αž€αžΆαžšαž“αž·αž™αžΆαž™αžαžΆαžšαŸ‰αŸ„αžαž‘αŸαžšαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αž’αŸ’αžœαžΎαžŸαŸ†αžŽαžΎαžŠαžΉαž„αžαŸ‚αž•αŸ’αž›αžΌαžœαžαžΆαž˜αžšαž™αŸˆ OSPF αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαŸ‰αŸ„αžαž‘αŸαžšαž‚αŸ‚αž˜αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŸαŸ†αžŽαžΎαž”αž“αŸ’αžαž·αž…αž”αž“αŸ’αžαž½αž…αžŠαžΎαž˜αŸ’αž”αžΈαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž–αŸαž›αžœαŸαž›αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαž”αžŸαŸ‹αžŸαŸ’αž‚αŸ’αžšαžΈαž”

data = dev.rpc.get_ospf_route_information()

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒ while loop

αž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αž“αžΎαž±αŸ’αž™αž”αž‰αŸ’αž…αžΌαž›αž”αžŽαŸ’αžαžΆαž‰αžšαž„αžŠαŸ‚αž›αž˜αžΆαž“αžšαž”αžΆαŸ†αž„ αž“αž·αž„αž˜αž·αž“αž›αžΎαžŸαž–αžΈαž”αžΈ octets αž–αžΈαž”αžŽαŸ’αžαžΆαž‰αž“αŸƒαž”αžŽαŸ’αžαžΆαž‰αžšαž„αžŠαžΌαž…αž‚αŸ’αž“αžΆ αž“αŸαŸ‡αž‚αžΊαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αž‡αž½αžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αŸ” αžαŸ’αž‰αž»αŸ†αž–αž·αžαž‡αžΆαž˜αž·αž“αž…αžΌαž›αž…αž·αžαŸ’αžαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž“αŸƒαž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž›αž€αŸ’αžαžŽαŸˆαžœαž·αž“αž·αž…αŸ’αž†αŸαž™ αž“αž·αž„αž‡αž½αžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž“αŸαŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžšαž αžΌαžαž˜αž€αžŠαž›αŸ‹αž–αŸαž›αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αžΆαž“αžšαž€αžƒαžΎαž‰αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž„αž“αŸαŸ‡αž‘αŸαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž–αžΈαž”αž‰αŸ’αž‡αžΈαž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž”αžŽαŸ’αžαžΆαž‰αžšαž„ route_list αžŠαŸ„αž™αž”αŸ’αžšαžΎαž’αžαŸαžšαžŠαŸ‚αž›αž˜αžΆαž“αž˜αž·αž“αž›αžΎαžŸαž–αžΈαž”αžΈ octets αžαŸ’αž‰αž»αŸ†αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž”αžŽαŸ’αžαžΆαž‰αžšαž„αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ

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

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹