Junos PyEZ рдореЛрдлрдд ipv4 рд╕рдмрдиреЗрдЯ рд╢реЛрдзрдгреНрдпрд╛рдЪреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рдкрд░реВрди

Junos PyEZ рд╕реЛрдмрдд рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдмрджреНрджрд▓рдЪрд╛ рдПрдХ рд▓реЗрдЦ - тАЬPython microframework рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЬреБрдиреЛрд╕ OS рдЪрд╛рд▓рд╡рдгрд╛рд░реА рдЙрдкрдХрд░рдгреЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рдХрд░рддреЗтАЭ рдСрдЯреЛрдореЗрд╢рди рдЖрдгрд┐ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди, рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рдбрддреЗ рд╕рд░реНрд╡рдХрд╛рд╣реА. рдпрд╛ рд▓реЗрдЦрд╛рдд рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдорд╛рдЧреЗ рдЕрдиреЗрдХ рдЙрджреНрджрд┐рд╖реНрдЯреЗ рд╣реЛрддреА - рдкрд╛рдпрдерди рд╢рд┐рдХрдгреЗ рдЖрдгрд┐ рдЬреБрдиреЛрд╕ рдУрдПрд╕ рдЪрд╛рд▓рд╡рдгрд╛рд▒реНрдпрд╛ рдЙрдкрдХрд░рдгрд╛рдВрд╡рд░ рдорд╛рд╣рд┐рддреА рдЧреЛрд│рд╛ рдХрд░рдгреЗ рдХрд┐рдВрд╡рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдмрджрд▓рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдпреЗ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреЗ. Python + Junos PyEZ рдЪреНрдпрд╛ рдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдпреЛрдЬрдирд╛рдЪреА рдирд┐рд╡рдб Python рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖реЗрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрдореА рдЕрдбрдерд│рд╛ рдЖрдгрд┐ рдЬреБрдиреЛрд╕ PyEZ рд▓рд╛рдпрдмреНрд░рд░реАрдЪрд╛ рд╡рд╛рдкрд░ рд╕реБрд▓рднрддреЗрдореБрд│реЗ рдХрд░рдгреНрдпрд╛рдд рдЖрд▓реА, рдЬреНрдпрд╛рд▓рд╛ Junos OS рдЪреНрдпрд╛ рддрдЬреНрдЮ рдЬреНрдЮрд╛рдирд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА.

рдЙрджреНрджрд┐рд╖реНрдЯ

рдХрдВрдкрдиреАрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдореЛрдлрдд ipv4 рд╕рдмрдиреЗрдЯрдЪреЗ рдСрдбрд┐рдЯ. рд╕рдмрдиреЗрдЯ рд╡рд┐рдирд╛рдореВрд▓реНрдп рдЖрд╣реЗ рд╣рд╛ рдирд┐рдХрд╖ рдореНрд╣рдгрдЬреЗ рдЬреБрдиреЛрд╕ OS рдЪрд╛рд▓рд╡рдгрд╛рд░реНтАНрдпрд╛ рд░рд╛рдЙрдЯрд░рдЪреНрдпрд╛ рд░реВрдкрд╛рдд рдХрд╛рдо рдХрд░рдгрд╛рд░реНтАНрдпрд╛ рд╕реНрд╡рд┐рдЪрд╡рд░реАрд▓ рдорд╛рд░реНрдЧрд╛рдВрдордзреНрдпреЗ рддреНрдпрд╛рдмрджреНрджрд▓рдЪреА рдиреЛрдВрдж рдирд╕рдгреЗ.

рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА

Python + Junos PyEZ, рдЬрд░реА paramiko рдЖрдгрд┐ ssh.exec_command рджреНрд╡рд╛рд░реЗ рддреЗ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдореЛрд╣ рд╣реЛрддрд╛, рдкрд░рд┐рдгрд╛рдореА, рддреБрдореНрд╣рд╛рд▓рд╛ рдорддрджрд╛рди рд╣реЛрдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЙрдкрдХрд░рдгрд╛рдВрд╡рд░ netconf рдбрд┐рд╡реНрд╣рд╛рдЗрд╕ рдиреЗрдЯрд╡рд░реНрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. Netconf рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░рд╕рд╣ рд░рд┐рдореЛрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓ RPC рджреНрд╡рд╛рд░реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рдЖрдгрд┐ XML рд╡рд╛рдкрд░рддреЗ, рдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдд, рдкреНрд░рд╛рдкреНрдд рдорд╛рд╣рд┐рддреА рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА.

PyPI рд╡рд░реВрди рдЬреБрдиреЛрд╕ PyEZ рдЪреА рд╡рд░реНрддрдорд╛рди рдЖрд╡реГрддреНрддреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЦрд╛рд▓реАрд▓ рдЖрджреЗрд╢рд╛рд╕рд╣ рдХреЗрд▓реЗ рдЬрд╛рддреЗ:

$ 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 ssh рджреНрд╡рд╛рд░реЗ рдХрдиреНрд╕реЛрд▓, рдЯреЗрд▓рдиреЗрдЯ рдХрд┐рдВрд╡рд╛ рдиреЗрдЯрдХреЙрдирдл рд╡рд╛рдкрд░реВрди рдЬреБрдиреЛрд╕ рдУрдПрд╕ рдЪрд╛рд▓рд╡рдгрд╛рд▒реНрдпрд╛ рдЙрдкрдХрд░рдгрд╛рдВрд╢реА рдХрдиреЗрдХреНрдЯ рд╣реЛрдгреНрдпрд╛рд╕ рд╕рдорд░реНрдерди рджреЗрддреЗ. рд▓реЗрдЦ рдирдВрддрд░рдЪреНрдпрд╛ рдкрд░реНрдпрд╛рдпрд╛рд╡рд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЛ.

рдЙрдкрдХрд░рдгрд╛рдВрд╢реА рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА, jnpr.junos рдореЙрдбреНрдпреВрд▓рдЪрд╛ рдЙрдкрдХрд░рдг рд╡рд░реНрдЧ рд╡рд╛рдкрд░рд╛

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

рд░рд┐рдореЛрдЯ рдкреНрд░реЛрд╕рд┐рдЬрд░ рдХреЙрд▓ рдХрд┐рдВрд╡рд╛ рд░рд┐рдореЛрдЯ рдкреНрд░реЛрд╕рд┐рдЬрд░ рдХреЙрд▓ рджреНрд╡рд╛рд░реЗ рд░рд╛рдЙрдЯрд░рд▓рд╛ рдЬреНрдЮрд╛рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рдорд╛рд░реНрдЧрд╛рдВрд╕рд╛рдареА рд╡рд┐рдирдВрддреА рдХреЗрд▓реА рдЬрд╛рддреЗ, рдЬреЗ рдЕрдзрд┐рдХ рд╕реЛрдпреАрдЪреЗ рдЕрд╕реЗрд▓.

data = dev.rpc.get_route_information()

рдЬреБрдиреЛрд╕ 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 рдордзреАрд▓ рд╕рд╛рдордЧреНрд░реА рдкрд╛рд╣реВ

рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛, рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд╕ рдорд╛рд╕реНрдХрд╕рд╣ рд╕рдмрдиреЗрдЯ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рддреНрдпрд╛рдЪ рд╕рдмрдиреЗрдЯрдЪреНрдпрд╛ рдиреЗрдЯрд╡рд░реНрдХрдордзреВрди рддреАрди рдСрдХреНрдЯреЗрдЯрдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдирд╛рд╣реА, рд╢реЛрдз рд╢реНрд░реЗрдгреА рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╣реЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдирд┐рдХрд╖ рдЖрдгрд┐ рд╢реЛрдз рд╢реНрд░реЗрдгреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рд╣реА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдорд▓рд╛ рдЦрд░реЛрдЦрд░ рдЖрд╡рдбрдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЖрддрд╛рдкрд░реНрдпрдВрдд рдорд▓рд╛ рдпрд╛рдкреЗрдХреНрд╖рд╛ рдЪрд╛рдВрдЧрд▓рд╛ рдЙрдкрд╛рдп рд╕рд╛рдкрдбрд▓рд╛ рдирд╛рд╣реА. рдкреБрдвреЗ, рд╕рдмрдиреЗрдЯ рд░реВрдЯ_рд▓рд┐рд╕реНрдЯрдЪреНрдпрд╛ рдкрд░рд┐рдгрд╛рдореА рд╕реВрдЪреАрдордзреВрди, рддреАрди рдСрдХреНрдЯреЗрдЯреНрд╕рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдирд╕рд▓реЗрд▓реЗ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рд╡рд╛рдкрд░реВрди, рдореА рдорд▓рд╛ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реЗрд▓реЗ рд╕рдмрдиреЗрдЯ рдирд┐рд╡рдбрддреЛ.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛