Source code for owtf.utils.ip
"""
owtf.utils.ip
~~~~~~~~~~~~~
"""
import logging
import socket
from ipaddr import IPAddress
from owtf.config import config_handler
from owtf.lib.exceptions import UnresolvableTargetException
[docs]def get_ips_from_hostname(hostname):
"""Get IPs from the hostname
:param hostname: Target hostname
:type hostname: `str`
:return: IP addresses of the target hostname as a list
:rtype: `list`
"""
ip = ""
# IP validation based on @marcwickenden's pull request, thanks!
for sck in [socket.AF_INET, socket.AF_INET6]:
try:
socket.inet_pton(sck, hostname)
ip = hostname
break
except socket.error:
continue
if not ip:
try:
ip = socket.gethostbyname(hostname)
except socket.gaierror:
raise UnresolvableTargetException("Unable to resolve: '{!s}'".format(hostname))
ipchunks = ip.strip().split("\n")
return ipchunks
[docs]def get_ip_from_hostname(hostname):
"""Get IP from the hostname
:param hostname: Target hostname
:type hostname: `str`
:return: IP address of the target hostname
:rtype: `str`
"""
ip = ""
# IP validation based on @marcwickenden's pull request, thanks!
for sck in [socket.AF_INET, socket.AF_INET6]:
try:
socket.inet_pton(sck, hostname)
ip = hostname
break
except socket.error:
continue
if not ip:
try:
ip = socket.gethostbyname(hostname)
except socket.gaierror:
raise UnresolvableTargetException("Unable to resolve: '{!s}'".format(hostname))
ipchunks = ip.strip().split("\n")
alternative_ips = []
if len(ipchunks) > 1:
ip = ipchunks[0]
logging.info("%s has several IP addresses: (%s).Choosing first: %s", hostname, "".join(ipchunks)[0:-3], ip)
alternative_ips = ipchunks[1:]
config_handler.set_val("alternative_ips", alternative_ips)
ip = ip.strip()
config_handler.set_val("INTERNAL_IP", is_internal_ip(ip))
logging.info("The IP address for %s is: '%s'", hostname, ip)
return ip
[docs]def hostname_is_ip(hostname, ip):
"""Test if the hostname is an IP.
:param str hostname: the hostname of the target.
:param str ip: the IP (v4 or v6) of the target.
:return: ``True`` if the hostname is an IP, ``False`` otherwise.
:rtype: :class:`bool`
"""
return hostname == ip
[docs]def is_internal_ip(ip):
"""Parses the input IP and checks if it is a private IP
:param str ip: IP address
:return: True if it is a private IP, otherwise False
:rtype: `bool`
"""
parsed_ip = IPAddress(ip)
return parsed_ip.is_private