lib/testlab/interface.rb in testlab-1.8.3 vs lib/testlab/interface.rb in testlab-1.8.4

- old
+ new

@@ -21,26 +21,84 @@ def initialize(*args) @ui = TestLab.ui @ui.logger.debug { "Loading Interface" } super(*args) + + self.address ||= generate_ip + self.mac ||= generate_mac + @ui.logger.debug { "Interface '#{self.id}' Loaded" } end + # IP address for the interface def ip TestLab::Utility.ip(self.address) end + # CIDR mask for the interface def cidr TestLab::Utility.cidr(self.address) end + # Netmask for the interface def netmask TestLab::Utility.netmask(self.address) end + # PTR record for the interface def ptr TestLab::Utility.ptr(self.address) + end + + # Generate IP address + # + # Generates an RFC compliant private IP address. + # + # @return [String] A random, private IP address in the 192.168.0.1/24 + # range. + def generate_ip + crc32 = Zlib.crc32(self.id.to_s) + offset = crc32.modulo(255) + + octets = [ 192..192, + 168..168, + 0..254, + 1..254 ] + ip = Array.new + for x in 1..4 do + ip << octets[x-1].to_a[offset.modulo(octets[x-1].count)].to_s + end + "#{ip.join(".")}/24" + end + + # Generate MAC address + # + # Generates an RFC compliant private MAC address. + # + # @return [String] A random, private MAC address. + def generate_mac + crc32 = Zlib.crc32(self.id.to_s) + offset = crc32.modulo(255) + + digits = [ %w(0), + %w(0), + %w(0), + %w(0), + %w(5), + %w(e), + %w(0 1 2 3 4 5 6 7 8 9 a b c d e f), + %w(0 1 2 3 4 5 6 7 8 9 a b c d e f), + %w(5 6 7 8 9 a b c d e f), + %w(3 4 5 6 7 8 9 a b c d e f), + %w(0 1 2 3 4 5 6 7 8 9 a b c d e f), + %w(0 1 2 3 4 5 6 7 8 9 a b c d e f) ] + mac = "" + for x in 1..12 do + mac += digits[x-1][offset.modulo(digits[x-1].count)] + mac += ":" if (x.modulo(2) == 0) && (x != 12) + end + mac end end end