Junos PyEZ ื ื™ืฆืŸ ื“ืขื ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ื“ื™ ืึทืจื‘ืขื˜ ืคื•ืŸ ื–ื•ื›ืŸ ืคึฟืึทืจ ืคืจื™ื™ ื™ืคึผื•ื•4 ืกื•ื‘ื ืขืฅ

ืึทืŸ ืึทืจื˜ื™ืงืœ ื•ื•ืขื’ืŸ ืืจื‘ืขื˜ืŸ ืžื™ื˜ Junos PyEZ - "Python ืžื™ืงืจืึธืคืจืึทืžืขื•ื•ืึธืจืง ื•ื•ืึธืก ื™ื ื™ื™ื‘ืึทืœื– ืื™ืจ ืฆื• ืคื™ืจืŸ ืื•ืŸ ืึธื˜ืึทืžื™ื™ื˜ ื“ืขื•ื•ื™ืกืขืก ืžื™ื˜ Junos OS" ืึธื˜ืึทืžื™ื™ืฉืึทืŸ ืื•ืŸ ืคืึทืจื•ื•ืึทืœื˜ื•ื ื’, ืึทืœืฅ ื•ื•ืึธืก ืžื™ืจ ืœื™ื‘ืข. ืฉืจื™ื™ื‘ืŸ ื“ืขื ืฉืจื™ืคื˜ ื“ื™ืกืงืจื™ื™ื‘ื“ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ื”ืื˜ ืขื˜ืœืขื›ืข ื’ืึธื•ืœื– - ืœืขืจื ืขืŸ ืคึผื™ื˜ื”ืึธืŸ ืื•ืŸ ืึธื˜ืึทืžื™ื™ื˜ื™ื ื’ ื˜ืึทืกืงืก ืคึฟืึทืจ ืงืึทืœืขืงื˜ื™ื ื’ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืึธื“ืขืจ ื˜ืฉืึทื ื’ื™ื ื’ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทื ื– ืื•ื™ืฃ ื•ื™ืกืจื™ื›ื˜ ืžื™ื˜ Junos OS. ื“ื™ ื‘ืจื™ืจื” ืคื•ืŸ ื“ืขื ืกืคึผืขืฆื™ืคื™ืฉ ืงืึธืžื‘ื™ื ืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹Python + Junos PyEZ ืื™ื– ื’ืขืžืื›ื˜ ืจืขื›ื˜ ืฆื• ื“ืขืจ ื ื™ื“ืขืจื™ืง ื‘ืึทืจื™ืขืจ ืฆื• ืึทืจื™ื™ึทื ื˜ืจืขื˜ืŸ ืื™ืŸ ื“ื™ Python ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืฉืคึผืจืึทืš ืื•ืŸ ื“ื™ ื™ื– ืคื•ืŸ ื ื•ืฆืŸ ืคื•ืŸ ื“ื™ Junos PyEZ ื‘ื™ื‘ืœื™ืึธื˜ืขืง, ื•ื•ืึธืก ื˜ื•ื˜ ื ื™ืฉื˜ ื“ืึทืจืคืŸ ืขืงืกืคึผืขืจื˜ ื•ื•ื™ืกืŸ ืคื•ืŸ Junos OS.

ืึทืจื‘ืขื˜

ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืคืจื™ื™ ื™ืคึผื•ื•4 ืกื•ื‘ื ืขืฅ ื•ื•ืึธืก ื’ืขื”ืขืจืŸ ืฆื• ื“ื™ ืคื™ืจืžืข. ื“ืขืจ ืงืจื™ื˜ืขืจื™ืข ืึทื– ืึท ืกื•ื‘ื ืขื˜ ืื™ื– ืคืจื™ื™ ืื™ื– ื“ืขืจ ืึทื•ื•ืขืง ืคื•ืŸ ืึท ืคึผืึธื–ื™ืฆื™ืข ื•ื•ืขื’ืŸ ืื™ื ืื™ืŸ ื“ื™ ืจื•ืฅ ืื•ื™ืฃ ื“ื™ ื‘ืึทืฉื˜ื™ืžืขืŸ ืึทืงื˜ื™ื ื’ ื•ื•ื™ ืึท ืจืึทื•ื˜ืขืจ ืžื™ื˜ Junos OS.

ื™ืžืคึผืœืขืžืขื ื˜ืึทื˜ื™ืึธืŸ

Python + Junos PyEZ, ื›ืึธื˜ืฉ ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืึท ื ืกื™ื•ืŸ ืฆื• ื˜ืึธืŸ ื“ืึธืก ื“ื•ืจืš paramiko ืื•ืŸ ssh.exec_command, ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืื™ืจ ื•ื•ืขื˜ ื“ืึทืจืคึฟืŸ ืฆื• ืงืึทื ืคื™ื’ื™ืขืจ ื“ื™ ื ืขืฅ ืคืึทืจื•ื•ืึทืœื˜ื•ื ื’ ืคึผืจืึธื˜ืึธืงืึธืœ ืคื•ืŸ ื“ื™ ื ืขืฅ ืคืึทืจื ืขืžื•ื ื’ ืžื™ื˜ืœ ืื•ื™ืฃ ื“ื™ ืขืงื•ื•ื™ืคึผืžืขื ื˜. 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 

ื“ืขืจ ื‘ืึทืคึฟืขืœ ื•ื•ืขื˜ ื™ื ืกื˜ืึทืœื™ืจืŸ ืœื™ื™ื‘ืจืขืจื™ื– ื•ื•ืึธืก ื–ืขื ืขืŸ ืคืขืœื ื“ื™ืง ืคื•ืŸ ื“ื™ ืกื™ืกื˜ืขื ืื•ืŸ ื–ืขื ืขืŸ ื ื™ื™ื˜ื™ืง ืคึฟืึทืจ ืึธืคึผืขืจืึทืฆื™ืข. ืื™ืŸ ืžื™ื™ืŸ ื•ื•ืขืจืกื™ืข ืจืขืงื•ื•ื™ืจืขืžืขื ืฅ.ื˜ืงืกื˜ ืขืก ื–ืขื ืขืŸ ื‘ืœื•ื™ื– ืฆื•ื•ื™ื™ ืคื•ืŸ ื–ื™ื™, ื“ื™ ืœืขืฆื˜ืข ื•ื•ืขืจืกื™ืขืก ื–ืขื ืขืŸ ืื ื’ืขื•ื•ื™ื–ืŸ ืื™ืŸ ื“ืขืจ ืฆื™ื™ื˜ ืคื•ืŸ ืฉืจื™ื™ื‘ืŸ ื“ืขื ืฉืจื™ืคื˜:

junos-eznc
netaddr

ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜, ื“ื™ ืฉืจื™ืคื˜ ื ืขืžื˜ ื“ื™ ื ืึธืžืขืŸ ืคื•ืŸ ื“ืขื ืงืจืึทื ื˜ ื‘ืึทื ื™ืฆืขืจ ืื™ืŸ ื“ื™ ืกื™ืกื˜ืขื; ืื™ืจ ืงืขื ืขืŸ ืงืœืึธืฅ ืื™ืŸ ืื•ื ื˜ืขืจ ื“ื™ ื ืึธืžืขืŸ ืคื•ืŸ ืืŸ ืื ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ื ื™ืฆืŸ ื“ื™ show_route.py -u ืฉืœื™ืกืœ getpass.getpass ื ืขืžื˜ ื“ื™ ืคึผืึทืจืึธืœ ืคื•ืŸ ืกื˜ื“ื™ืŸ ืึทื–ื•ื™ ื“ื™ ืคึผืึทืจืึธืœ ื•ื•ืขื˜ ื ื™ืฉื˜ ื‘ืœื™ื™ึทื‘ืŸ ืื™ืŸ ื“ื™ ืกื™ืกื˜ืขื. ืฆื• ืคืึทืจื‘ื™ื ื“ืŸ ืฆื• ื“ื™ ืขืงื•ื•ื™ืคึผืžืขื ื˜, ืื™ืจ ื•ื•ืขื˜ ืื•ื™ืš ื“ืึทืจืคึฟืŸ ืฆื• ืึทืจื™ื™ึทืŸ ื–ื™ื™ึทืŸ ื”ืึธืกื˜ื ืึทืžืข ืึธื“ืขืจ IP ืึทื“ืจืขืก ื•ื•ืขืŸ ืคึผืจืึทืžืคึผื˜ื™ื“. ื›ืœ ื“ืึทื˜ืŸ ื ื™ื™ื˜ื™ืง ืคึฟืึทืจ ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ืื•ื™ืฃ ื“ื™ ืžื™ื˜ืœ ืื™ื– ื‘ืืงื•ืžืขืŸ.

Junos PyEZ ืฉื˜ื™ืฆื˜ ืงืึทื ืขืงื˜ื™ื ื’ ืฆื• ืขืงื•ื•ื™ืคึผืžืขื ื˜ ืžื™ื˜ Junos OS ืžื™ื˜ ื“ื™ ืงืึทื ืกืึธื•ืœ, ื˜ืขืœื ืขื˜ ืึธื“ืขืจ ื ืขื˜ืงืึธื ืฃ ื“ื•ืจืš 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()

ืื™ืฆื˜ ืœืึธื–ืŸ ืก ืงื•ืง ืื™ืŸ ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ื™ ื‘ืฉืขืช ืฉืœื™ื™ืฃ

ืื™ืŸ ื“ื™ ืึธื ื”ื™ื™ื‘, ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื‘ืขื˜ืŸ ืฆื• ืึทืจื™ื™ึทืŸ ืึท ืกื•ื‘ื ืขื˜ ืžื™ื˜ ืึท ืžืึทืกืงืข ืื•ืŸ ื ื™ื˜ ืžืขืจ ื•ื•ื™ ื“ืจื™ื™ ืึธืงื˜ืขืฅ ืคื•ืŸ ื“ื™ ื ืขืฅ ืคื•ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืกื•ื‘ื ืขื˜, ื“ืึธืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ืฉื˜ืขืœืŸ ื“ื™ ื–ื•ื›ืŸ ืงื™ื™ื˜. ืื™ืš ื˜ืึธืŸ ื ื™ื˜ ื˜ืึทืงืข ื•ื•ื™ ื“ืขื ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื“ื™ ืงืจื™ื™ื˜ื™ืจื™ืึท ืื•ืŸ ื–ื•ื›ืŸ ืงื™ื™ื˜, ืึธื‘ืขืจ ืึทื–ื•ื™ ื•ื•ื™ื™ึทื˜ ืื™ืš ื”ืึธื‘ืŸ ื ื™ืฉื˜ ื’ืขืคึฟื•ื ืขืŸ ืึท ื‘ืขืกืขืจ ืœื™ื™ื–ื•ื ื’. ื“ืขืจื ืึธืš, ืคึฟื•ืŸ ื“ื™ ืจื™ื–ืึทืœื˜ื™ื ื’ ืจืฉื™ืžื” ืคื•ืŸ ืกื•ื‘ื ืขืฅ route_list, ื ื™ืฆืŸ ืึท ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ืžื™ื˜ ื ื™ื˜ ืžืขืจ ื•ื•ื™ ื“ืจื™ื™ ืึธืงื˜ืขืฅ, ืื™ืš ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ื“ื™ ืกื•ื‘ื ืขืฅ ื•ื•ืึธืก ืื™ื ื˜ืขืจืขืก ืžื™ืจ

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

ื“ื•ืจืš IPNetwork, ื“ื™ netaddr ืžืึธื“ื•ืœืข, ืื™ืš ื‘ืึทืงื•ืžืขืŸ ืกื•ื‘ื ืขืฅ ืื™ืŸ ื“ื™ ืคืึธืจืขื ืคื•ืŸ ืึท ืจืฉื™ืžื” ืคื•ืŸ ื™ืคึผื•ื•4 ืึทื“ืจืขืกืขืก

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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’