Netmask validator


#1

Sharing the wealth. I just finished working on a custom netmask
validator and thought others might benefit. Of course, comments and
suggestions are welcome.

def validates_netmask(*attr_names)
configuration = { :only_numbers => ‘must only use numbers as octet
values’,
:range => ‘has one or more octet values that are >
255’,
:invalid => ‘is invalid’ }
configuration.update(attr_names.pop) if attr_names.last.is_a?(Hash)

validates_each attr_names do |record, attr_name, value|
# Test for non-numeric values
record.errors.add(attr_name, configuration[:only_numbers]) unless
value.tr(’.’, ‘’) =~ /^\d+$/

# Make binary string from octets
binary = ''
value.split('.').each do |octet|
  binary << '%08b' % octet
end

# Test for octet values > 255
record.errors.add(attr_name, configuration[:range]) if binary.length 

32

# Test for valid netmask (contiguous binary string of 1's)
record.errors.add(attr_name, configuration[:invalid]) if

binary.include? ‘01’
end
end