# File lib/ec2/right_ec2_security_groups.rb, line 82
    def describe_security_groups(list=[])
      link = generate_request("DescribeSecurityGroups", amazonize_list('GroupName', list))

      request_cache_or_info( :describe_security_groups, link,  QEc2DescribeSecurityGroupsParser, @@bench, list.blank?) do |parser|
        result = []
        parser.result.each do |item|
          result_item = { :aws_owner       => item[:owner_id],
                          :aws_group_name  => item[:group_name],
                          :aws_description => item[:group_description] }
          aws_perms = []
          item[:ip_permissions].each do |permission|
            result_perm = {}
            result_perm[:from_port] = permission[:from_port]
            result_perm[:to_port]   = permission[:to_port]
            result_perm[:protocol]  = permission[:ip_protocol]
            # IP permissions
            Array(permission[:ip_ranges]).each do |ip_range|
              perm = result_perm.dup
              # Mhhh... For Eucalyptus we somehow get used to use ":cidr_ip" instead of ":cidr_ips"...
              if @params[:eucalyptus] then  perm[:cidr_ip]  = ip_range
              else                          perm[:cidr_ips] = ip_range
              end
              aws_perms << perm
            end
            # Group permissions
            Array(permission[:groups]).each do |group|
              perm = result_perm.dup
              perm[:group] = group[:group_name]
              perm[:owner] = group[:user_id]
              # AWS does not support Port Based Group Permissions but Eucalyptus does
              unless @params[:port_based_group_ingress]
                perm.delete(:from_port)
                perm.delete(:to_port)
                perm.delete(:protocol)
              end
              aws_perms << perm
            end
          end
          result_item[:aws_perms] = aws_perms.uniq
          result << result_item
        end
        result
      end
    rescue Exception
      on_exception
    end