48 lines
849 B
Ruby
48 lines
849 B
Ruby
require "ipaddr"
|
|
|
|
class IPAddr
|
|
def address
|
|
_to_string(@addr)
|
|
end
|
|
|
|
def netmask
|
|
_to_string(@mask_addr)
|
|
end
|
|
end
|
|
|
|
class MergeAclAddressAndMask < ActiveRecord::Migration[4.2]
|
|
class Acl < ApplicationRecord
|
|
end
|
|
|
|
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 <<= 1
|
|
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
|