class IPAddr def self.handle_wildcards(val) return if val.blank? num_wildcards = val.count('*') return val if num_wildcards == 0 # strip ranges like "/16" from the end if present v = val.gsub(/\/.*/, '') return if v[v.index('*')..-1] =~ /[^\.\*]/ parts = v.split('.') (4 - parts.size).times { parts << '*' } # support strings like 192.* v = parts.join('.') "#{v.tr('*', '0')}/#{32 - (v.count('*') * 8)}" end def to_cidr_s if @addr mask = @mask_addr.to_s(2).count('1') if mask == 32 to_s else "#{to_s}/#{mask}" end else nil end end end