docs: def AnalyzeClient(self, client):
      """Finds the client_id and keywords for a client.
  
      Args:
        client: A Client object record to find keywords for.
  
      Returns:
        A list of keywords related to client.
      """
  
      # Start with a universal keyword, used to find all clients.
      #
      # TODO(user): Remove the universal keyword once we have a better way
      # to do this, i.e., once we have a storage library which can list all
      # clients directly.
  
      keywords = set(["."])
  
      def TryAppend(prefix, keyword):
        precondition.AssertType(prefix, Text)
        precondition.AssertType(keyword, Text)
        if keyword:
          keyword_string = self._NormalizeKeyword(keyword)
          keywords.add(keyword_string)
          if prefix:
            keywords.add(prefix + ":" + keyword_string)
  
      def TryAppendPrefixes(prefix, keyword, delimiter):
        TryAppend(prefix, keyword)
        segments = keyword.split(delimiter)
        for i in range(1, len(segments)):
          TryAppend(prefix, delimiter.join(segments[0:i]))
        return len(segments)
  
      def TryAppendIP(ip):
        TryAppend("ip", ip)
        # IP4v?
        if TryAppendPrefixes("ip", Text(ip), ".") == 4:
          return
        # IP6v?
        TryAppendPrefixes("ip", Text(ip), ":")
  
      def TryAppendMac(mac):
        TryAppend("mac", mac)
        if len(mac) == 12:
          # If looks like a mac address without ":" symbols, also add the keyword
          # with them.
          TryAppend("mac", ":".join([mac[i:i + 2] for i in range(0, 12, 2)]))
  
      TryAppend("host", client.knowledge_base.fqdn)
      host = client.knowledge_base.fqdn.split(".", 1)[0]
      TryAppendPrefixes("host", host, "-")
      TryAppendPrefixes("host", client.knowledge_base.fqdn, ".")
      TryAppend("", client.knowledge_base.os)
      TryAppend("", client.Uname())
      TryAppend("", client.os_release)
      TryAppend("", client.os_version)
      TryAppend("", client.kernel)
      TryAppend("", client.arch)
  
      kb = client.knowledge_base
      if kb:
        for user in kb.users:
          TryAppend("user", user.username)
          TryAppend("", user.full_name)
          if user.full_name:
            for name in user.full_name.split():
              # full_name often includes nicknames and similar, wrapped in
              # punctuation, e.g. "Thomas 'TJ' Jones". We remove the most common
              # wrapping characters.
              TryAppend("", name.strip("\"'()"))
  
      for ip in client.GetIPAddresses():
        TryAppendIP(ip)
      for mac in client.GetMacAddresses():
        TryAppendMac(mac)
  
      client_info = client.startup_info.client_info
      if client_info:
        TryAppend("client", client_info.client_name)
        TryAppend("client", Text(client_info.client_version))
        if client_info.labels:
          for label in client_info.labels:
            TryAppend("label", label)
  
      return keywords