Combine the address and netmask for an ACL in one column

This commit is contained in:
Tom Hughes 2012-02-08 14:09:50 +00:00
parent beb0ef6357
commit 9c0d5277ad
2 changed files with 46 additions and 1 deletions

View file

@ -1,3 +1,3 @@
class Acl < ActiveRecord::Base
scope :address, lambda { |address| where("? & netmask = address", address) }
scope :address, lambda { |address| where("address >> ?", address) }
end

View file

@ -0,0 +1,45 @@
require "ipaddr"
class IPAddr
def address
_to_string(@addr)
end
def netmask
_to_string(@mask_addr)
end
end
class MergeAclAddressAndMask < ActiveRecord::Migration
def up
Acl.find_each do |acl|
address = IPAddr.new(acl.address)
netmask = IPAddr.new(acl.netmask)
prefix = 0
while netmask != "0.0.0.0"
netmask = netmask << 1
prefix = prefix + 1
end
acl.address = "#{address.mask(prefix)}/#{prefix}"
acl.save!
end
remove_column :acls, :netmask
end
def down
add_column :acls, :netmask, :inet
Acl.find_each do |acl|
address = IPAddr.new(acl.address)
acl.address = address.address
acl.netmask = address.netmask
acl.save!
end
change_column :acls, :netmask, :inet, :null => false
end
end