Combine the address and netmask for an ACL in one column
This commit is contained in:
parent
beb0ef6357
commit
9c0d5277ad
2 changed files with 46 additions and 1 deletions
|
@ -1,3 +1,3 @@
|
|||
class Acl < ActiveRecord::Base
|
||||
scope :address, lambda { |address| where("? & netmask = address", address) }
|
||||
scope :address, lambda { |address| where("address >> ?", address) }
|
||||
end
|
||||
|
|
45
db/migrate/20120208122334_merge_acl_address_and_mask.rb
Normal file
45
db/migrate/20120208122334_merge_acl_address_and_mask.rb
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue