เชœเซเชจเซ‹เชธ PyEZ เชฎเชซเชค ipv4 เชธเชฌเชจเซ‡เชŸ เชถเซ‹เชงเชตเชพเชจเชพ เช•เชพเชฐเซเชฏเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡

Junos PyEZ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชตเชฟเชถเซ‡เชจเซ‹ เชฒเซ‡เช– - โ€œPython microframework เช•เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ Junos OS เชšเชฒเชพเชตเชคเชพ เช‰เชชเช•เชฐเชฃเซ‹เชจเซ‡ เชธเช‚เชšเชพเชฒเชฟเชค เช…เชจเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเชตเชพ เชธเช•เซเชทเชฎ เช•เชฐเซ‡ เช›เซ‡โ€ เช“เชŸเซ‹เชฎเซ‡เชถเชจ เช…เชจเซ‡ เชฎเซ‡เชจเซ‡เชœเชฎเซ‡เชจเซเชŸ, เช…เชฎเชจเซ‡ เช—เชฎเซ‡ เช›เซ‡. เช† เชฒเซ‡เช–เชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฒเช–เชตเชพเชจเชพ เช˜เชฃเชพ เชงเซเชฏเซ‡เชฏเซ‹ เชนเชคเชพ - เชชเชพเชฏเชฅเซ‹เชจ เชถเซ€เช–เชตเชพ เช…เชจเซ‡ เชœเซเชจเซ‹เชธ OS เชšเชฒเชพเชตเชคเชพ เชธเชพเชงเชจเซ‹ เชชเชฐ เชฎเชพเชนเชฟเชคเซ€ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เช…เชฅเชตเชพ เช—เซ‹เช เชตเชฃเซ€ เชฌเชฆเชฒเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เช•เชพเชฐเซเชฏเซ‹เชจเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเชตเชพ. Python + Junos PyEZ เชจเชพ เช† เชตเชฟเชถเชฟเชทเซเชŸ เชธเช‚เชฏเซ‹เชœเชจเชจเซ€ เชชเชธเช‚เชฆเช—เซ€ เชชเชพเชฏเชฅเซ‹เชจ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเชฎเชพเช‚ เชชเซเชฐเชตเซ‡เชถ เชฎเชพเชŸเซ‡เชจเชพ เช“เช›เชพ เช…เชตเชฐเซ‹เชง เช…เชจเซ‡ เชœเซเชจเซ‹เชธ PyEZ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เชจเชพ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชธเชฐเชณเชคเชพเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€, เชœเซ‡เชจเซ‡ Junos OS เชจเชพ เชจเชฟเชทเซเชฃเชพเชค เชœเซเชžเชพเชจเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.

เช‰เชฆเซเชฆเซ‡เชถ

เช•เช‚เชชเชจเซ€ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒเชพ เชฎเชซเชค ipv4 เชธเชฌเชจเซ‡เชŸเชจเซเช‚ เช“เชกเชฟเชŸ. เชธเชฌเชจเซ‡เชŸ เชซเซเชฐเซ€ เช›เซ‡ เชคเซ‡ เชฎเชพเชชเชฆเช‚เชก เช เช›เซ‡ เช•เซ‡ เชœเซเชจเซ‹เชธ OS เชชเชฐ เชšเชพเชฒเชคเชพ เชฐเชพเช‰เชŸเชฐ เชคเชฐเซ€เช•เซ‡ เช•เชพเชฎ เช•เชฐเชคเชพ เชธเซเชตเซ€เชš เชชเชฐเชจเชพ เชฐเซ‚เชŸเซเชธเชฎเชพเช‚ เชคเซ‡เชจเชพ เชตเชฟเชถเซ‡เชจเซ€ เชเชจเซเชŸเซเชฐเซ€เชจเซ€ เช—เซ‡เชฐเชนเชพเชœเชฐเซ€ เช›เซ‡.

ะ ะตะฐะปะธะทะฐั†ะธั

Python + Junos PyEZ, เชœเซ‹เช•เซ‡ paramiko เช…เชจเซ‡ ssh.exec_command เชฆเซเชตเชพเชฐเชพ เชคเซ‡ เช•เชฐเชตเชพเชจเซ€ เชฒเชพเชฒเชš เชนเชคเซ€, เชชเชฐเชฟเชฃเชพเชฎเซ‡, เชคเชฎเชพเชฐเซ‡ เชฎเชคเชฆเชพเชจ เชฅเชˆ เชฐเชนเซ‡เชฒเชพ เชธเชพเชงเชจเซ‹ เชชเชฐ netconf เช‰เชชเช•เชฐเชฃ เชจเซ‡เชŸเชตเชฐเซเช• เชฎเซ‡เชจเซ‡เชœเชฎเซ‡เชจเซเชŸ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. Netconf เชนเชพเชฐเซเชกเชตเซ‡เชฐ เชธเชพเชฅเซ‡ เชฐเชฟเชฎเซ‹เชŸ เชชเซเชฐเซ‹เชธเซ‡เชธ เช•เซ‹เชฒ RPC เชฆเซเชตเชพเชฐเชพ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ XML เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เช† เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, เชคเซ‡ เชฎเซ‡เชณเชตเซ‡เชฒเซ€ เชฎเชพเชนเชฟเชคเซ€ เชชเซ‚เชฐเซ€ เชชเชพเชกเชตเชพ เชฎเชพเชŸเซ‡.

PyPI เชฎเชพเช‚เชฅเซ€ Junos 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 เชฎเชพเชฐเชซเชคเซ‡ เช•เชจเซเชธเซ‹เชฒ, เชŸเซ‡เชฒเชจเซ‡เชŸ เช…เชฅเชตเชพ เชจเซ‡เชŸเช•เซ‹เชจเซเชซเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Junos OS เชšเชฒเชพเชตเชคเชพ เชธเชพเชงเชจเซ‹ เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชŸ เชฅเชตเชพเชจเซเช‚ เชธเชฎเชฐเซเชฅเชจ เช•เชฐเซ‡ เช›เซ‡. เชฒเซ‡เช– เชชเช›เซ€เชจเชพ เชตเชฟเช•เชฒเซเชชเชจเซ€ เชšเชฐเซเชšเชพ เช•เชฐเซ‡ เช›เซ‡.

เชธเชพเชงเชจเซ‹ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชตเชพ เชฎเชพเชŸเซ‡, 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

เช†เชฆเซ‡เชถเชจเชพ เช…เช‚เชคเชฎเชพเช‚ 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()

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชœเซเชฏเชพเชฐเซ‡ เชฒเซ‚เชชเชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€ เชœเซ‹เชˆเช

เชถเชฐเซ‚เช†เชคเชฎเชพเช‚, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชฎเชพเชธเซเช• เชธเชพเชฅเซ‡ เชธเชฌเชจเซ‡เชŸ เชฆเชพเช–เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เช…เชจเซ‡ เชธเชฎเชพเชจ เชธเชฌเชจเซ‡เชŸเชจเชพ เชจเซ‡เชŸเชตเชฐเซเช•เชฎเชพเช‚เชฅเซ€ เชคเซเชฐเชฃ เช“เช•เซเชŸเซ‡เชŸเซเชธเชฅเซ€ เชตเชงเซ เชจเชนเซ€เช‚, เชถเซ‹เชง เชถเซเชฐเซ‡เชฃเซ€ เชธเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช† เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เชฎเชจเซ‡ เชฎเชพเชชเชฆเช‚เชกเซ‹ เช…เชจเซ‡ เชถเซ‹เชง เชถเซเชฐเซ‡เชฃเซ€เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชจเซ‹ เช† เช…เชฎเชฒ เช–เชฐเซ‡เช–เชฐ เช—เชฎเชคเซ‹ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชนเชœเซ€ เชธเซเชงเซ€ เชฎเชจเซ‡ เชตเชงเซ เชธเชพเชฐเซ‹ เช‰เช•เซ‡เชฒ เชฎเชณเซเชฏเซ‹ เชจเชฅเซ€. เช†เช—เชณ, เชธเชฌเชจเซ‡เชŸเซเชธ เชฐเซ‚เชŸ_เชฒเชฟเชธเซเชŸเชจเซ€ เชชเชฐเชฟเชฃเชพเชฎเซ€ เชธเซ‚เชšเชฟเชฎเชพเช‚เชฅเซ€, เชคเซเชฐเชฃ เช“เช•เซเชŸเซ‡เชŸเซเชธ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชจ เชนเซ‹เชฏ เชคเซ‡เชตเชพ เชšเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชนเซเช‚ เชฎเชจเซ‡ เชฐเซเชšเชฟ เชงเชฐเชพเชตเชคเชพ เชธเชฌเชจเซ‡เชŸเซเชธ เชชเชธเช‚เชฆ เช•เชฐเซเช‚ เช›เซเช‚.

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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹