# File lib/ec2/ec2.rb, line 781
    def describe_security_groups(list=[])
      link = generate_request("DescribeSecurityGroups", hash_params('GroupName', list.to_a))
      request_cache_or_info(:describe_security_groups, link, QEc2DescribeSecurityGroupsParser, @@bench, list.blank?) do |parser|
        result = []
        parser.result.each do |item|
          perms = []
          item.ipPermissions.each do |perm|
            perm.groups.each do |ngroup|
              perms << {:group => ngroup.groupName,
                        :owner => ngroup.userId}
            end
            perm.ipRanges.each do |cidr_ip|
              perms << {:from_port => perm.fromPort,
                        :to_port   => perm.toPort,
                        :protocol  => perm.ipProtocol,
                        :cidr_ips  => cidr_ip}
            end
          end

          # delete duplication
          perms.each_index do |i|
            (0...i).each do |j|
              if perms[i] == perms[j] then
                perms[i] = nil; break;
              end
            end
          end
          perms.compact!

          result << {:aws_owner       => item.ownerId,
                     :aws_group_name  => item.groupName,
                     :aws_description => item.groupDescription,
                     :aws_perms       => perms}

        end
        result
      end
    rescue Exception
      on_exception
    end