예제 #1
0
    def GetIP(hostname, family=None):
        """Return IP address of given hostname.

    Supports both IPv4 and IPv6.

    @type hostname: str
    @param hostname: hostname to look up
    @type family: int
    @param family: AF_INET | AF_INET6 | None
    @rtype: str
    @return: IP address
    @raise errors.ResolverError: in case of errors in resolving

    """
        try:
            if family in (socket.AF_INET, socket.AF_INET6):
                result = socket.getaddrinfo(hostname, None, family)
            else:
                result = socket.getaddrinfo(hostname, None)
        except (socket.gaierror, socket.herror, socket.error) as err:
            # hostname not found in DNS, or other socket exception in the
            # (code, description format)
            raise errors.ResolverError(hostname, err.args[0], err.args[1])

        # getaddrinfo() returns a list of 5-tupes (family, socktype, proto,
        # canonname, sockaddr). We return the first tuple's first address in
        # sockaddr
        try:
            return result[0][4][0]
        except IndexError as err:
            # we don't have here an actual error code, it's just that the
            # data type returned by getaddrinfo is not what we expected;
            # let's keep the same format in the exception arguments with a
            # dummy error code
            raise errors.ResolverError(
                hostname, 0, "Unknown error in getaddrinfo(): %s" % err)
예제 #2
0
  def GetIP(hostname, family=None):
    """Return IP address of given hostname.

    Supports both IPv4 and IPv6.

    @type hostname: str
    @param hostname: hostname to look up
    @type family: int
    @param family: AF_INET | AF_INET6 | None
    @rtype: str
    @return: IP address
    @raise errors.ResolverError: in case of errors in resolving

    """
    try:
      if family in (socket.AF_INET, socket.AF_INET6):
        result = socket.getaddrinfo(hostname, None, family)
      else:
        result = socket.getaddrinfo(hostname, None)
    except (socket.gaierror, socket.herror, socket.error), err:
      # hostname not found in DNS, or other socket exception in the
      # (code, description format)
      raise errors.ResolverError(hostname, err.args[0], err.args[1])
예제 #3
0
class Hostname(object):
  """Class implementing resolver and hostname functionality.

  """
  _VALID_NAME_RE = re.compile("^[a-z0-9._-]{1,255}$")

  def __init__(self, name=None, family=None):
    """Initialize the host name object.

    If the name argument is None, it will use this system's name.

    @type family: int
    @param family: AF_INET | AF_INET6 | None
    @type name: str
    @param name: hostname or None

    """
    self.name = self.GetFqdn(name)
    self.ip = self.GetIP(self.name, family=family)

  @classmethod
  def GetSysName(cls):
    """Legacy method the get the current system's name.

    """
    return cls.GetFqdn()

  @classmethod
  def GetFqdn(cls, hostname=None):
    """Return fqdn.

    If hostname is None the system's fqdn is returned.

    @type hostname: str
    @param hostname: name to be fqdn'ed
    @rtype: str
    @return: fqdn of given name, if it exists, unmodified name otherwise

    """
    if hostname is None:
      virtfqdn = vcluster.GetVirtualHostname()
      if virtfqdn:
        result = virtfqdn
      else:
        result = socket.getfqdn()
    else:
      result = socket.getfqdn(hostname)

    return cls.GetNormalizedName(result)

  @staticmethod
  def GetIP(hostname, family=None):
    """Return IP address of given hostname.

    Supports both IPv4 and IPv6.

    @type hostname: str
    @param hostname: hostname to look up
    @type family: int
    @param family: AF_INET | AF_INET6 | None
    @rtype: str
    @return: IP address
    @raise errors.ResolverError: in case of errors in resolving

    """
    try:
      if family in (socket.AF_INET, socket.AF_INET6):
        result = socket.getaddrinfo(hostname, None, family)
      else:
        result = socket.getaddrinfo(hostname, None)
    except (socket.gaierror, socket.herror, socket.error), err:
      # hostname not found in DNS, or other socket exception in the
      # (code, description format)
      raise errors.ResolverError(hostname, err.args[0], err.args[1])

    # getaddrinfo() returns a list of 5-tupes (family, socktype, proto,
    # canonname, sockaddr). We return the first tuple's first address in
    # sockaddr
    try:
      return result[0][4][0]
    except IndexError, err:
      # we don't have here an actual error code, it's just that the
      # data type returned by getaddrinfo is not what we expected;
      # let's keep the same format in the exception arguments with a
      # dummy error code
      raise errors.ResolverError(hostname, 0,
                                 "Unknown error in getaddrinfo(): %s" % err)