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