рдореБрдлрд╝реНрдд рдЖрдИрдкреАрд╡реА4 рд╕рдмрдиреЗрдЯ рдХреА рдЦреЛрдЬ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬреВрдиреЛрд╕ рдкрд╛рдпрдЬрд╝

рдЬреВрдиреЛрд╕ PyEZ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ - "рдкрд╛рдпрдерди рдорд╛рдЗрдХреНрд░реЛрдлреНрд░реЗрдорд╡рд░реНрдХ рдЬреЛ рдЖрдкрдХреЛ рдЬреВрдиреЛрд╕ рдУрдПрд╕ рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ" рд╕реНрд╡рдЪрд╛рд▓рди рдФрд░ рдкреНрд░рдмрдВрдзрди, рд╡рд╣ рд╕рдм рдХреБрдЫ рдЬреЛ рд╣рдореЗрдВ рдкрд╕рдВрдж рд╣реИред рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрдИ рд▓рдХреНрд╖реНрдп рдереЗ - рдкрд╛рдпрдерди рд╕реАрдЦрдирд╛ рдФрд░ рдЬреВрдиреЛрд╕ рдУрдПрд╕ рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдиреЗ рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ред Python + Junos PyEZ рдХреЗ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЪреБрдирд╛рд╡ Python рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХреЗ рд▓рд┐рдП рдХрдо рдмрд╛рдзрд╛ рдФрд░ рдЬреВрдиреЛрд╕ PyEZ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рдХрд╛рд░рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЬреВрдиреЛрд╕ OS рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдХрд╛рд░реНрдп

рдХрдВрдкрдиреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдГрд╢реБрд▓реНрдХ рдЖрдИрдкреАрд╡реА4 рд╕рдмрдиреЗрдЯ рдХрд╛ рдСрдбрд┐рдЯред рдПрдХ рд╕рдмрдиреЗрдЯ рдХреЗ рдореБрдлрд╝реНрдд рд╣реЛрдиреЗ рдХрд╛ рдорд╛рдирджрдВрдб рдЬреВрдиреЛрдЬрд╝ рдУрдПрд╕ рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рд░рд╛рдЙрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрд╡рд┐рдЪ рдкрд░ рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдкрд╛рдпрдерди + рдЬреВрдиреЛрдЬрд╝ PyEZ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрд╕реЗ рдкреИрд░рд╛рдорд┐рдХреЛ рдФрд░ ssh.exec_command рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд▓реЛрднрди рдерд╛, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдкрдХреЛ рдкреЛрд▓ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЙрдкрдХрд░рдг рдкрд░ рдиреЗрдЯрдХреЙрдиреНрдл рдбрд┐рд╡рд╛рдЗрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рдмрдВрдзрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдиреЗрдЯрдХреЙрдиреНрдл рджреВрд░рд╕реНрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓ рдЖрд░рдкреАрд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдПрдордПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

PyPI рд╕реЗ рдЬреВрдиреЛрд╕ PyEZ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

$ 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 getpass.getpass рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдирд╛рдо рдХреЗ рддрд╣рдд рд▓реЙрдЧ рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, stdin рд╕реЗ рдкрд╛рд╕рд╡рд░реНрдб рд▓реЗрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рдирд╣реАрдВ рд░рд╣реЗрдЧрд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВред рдЙрдкрдХрд░рдг рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдВрдХреЗрдд рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдЗрд╕рдХрд╛ рд╣реЛрд╕реНрдЯрдирд╛рдо рдпрд╛ рдЖрдИрдкреА рдкрддрд╛ рднреА рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдЬреВрдиреЛрд╕ PyEZ рдПрд╕рдПрд╕рдПрдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдВрд╕реЛрд▓, рдЯреЗрд▓рдиреЗрдЯ рдпрд╛ рдиреЗрдЯрдХреЙрдиреНрдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреВрдиреЛрд╕ рдУрдПрд╕ рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдХрд░рдгреЛрдВ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдЦ рдмрд╛рдж рд╡рд╛рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред

рдЙрдкрдХрд░рдг рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, jnpr.junos рдореЙрдбреНрдпреВрд▓ рдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

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

рд░рд┐рдореЛрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓ рдпрд╛ рд░рд┐рдореЛрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓, рдЬреЛ рднреА рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ, рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд╛рдЙрдЯрд░ рдХреЛ рдЬреНрдЮрд╛рдд рд╕рднреА рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

data = dev.rpc.get_route_information()

рдЬреВрдиреЛрдЬрд╝ рдУрдПрд╕ рдкрд░ рд╕рдорд╛рди рдХрдорд╛рдВрдб

user@router> show route | display xml

рдХрдорд╛рдВрдб рдХреЗ рдЕрдВрдд рдореЗрдВ рдЖрд░рдкреАрд╕реА рдЬреЛрдбрд╝рдХрд░, рд╣рдореЗрдВ рдПрдХ рдЕрдиреБрд░реЛрдз рдЯреИрдЧ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЖрд░рдкреАрд╕реА рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ рд╣рдо рд░реБрдЪрд┐ рдХреЗ рдЕрдиреНрдп рдирд╛рдореЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдЯреИрдЧ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд┐рдзрд┐ рдирд╛рдо рд╕реЗ рднрд┐рдиреНрди рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдЖрдкрдХреЛ рд╣рд╛рдЗрдлрд╝рди рдХреЛ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

data = dev.rpc.get_ospf_route_information()

рдЕрдм рдЖрдЗрдП while рд▓реВрдк рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦреЗрдВ

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

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

IPNetwork, Netaddr рдореЙрдбреНрдпреВрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдореБрдЭреЗ IPv4 рдкрддреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдмрдиреЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ

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

рдЖрдИрдкреАрдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдПрдХ рдорд╛рд╕реНрдХ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдкрддреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХрдмреНрдЬреЗ рд╡рд╛рд▓реЗ рдкрддреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╢реНрд░реЗрдгреА рд╕реЗ рд╕рднреА рдкрддреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ