-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrandom_ipaddr.rb
88 lines (75 loc) · 1.21 KB
/
random_ipaddr.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
require 'ipaddr'
class RandomIPAddr
attr_reader :addr
def initialize
set_ip_sub_v4
@addr = IPAddr.new(ipv4)
end
def set_ip_sub_v4
loop do
@ip_v4 = new_ip
@subnet_v4 = subnet
break if @subnet_v4
end
end
def klass_a?
return true if o1_to_b =~ /^0/
false
end
def klass_b?
return true if o1_to_b =~ /^10/
false
end
def klass_c?
return true if o1_to_b =~ /^110/
false
end
def o1_to_b
"%08b" % @ip_v4[0]
end
def first
@addr.to_range.first
end
def last
@addr.to_range.last
end
def ipv4
@ip_v4.join('.') + "/" + @subnet_v4.to_s
end
def ipv4_rand
if rand(2) == 0
i = 0
subnet_mask = ""
31.downto(0) do |i|
subnet_mask << "1"
if i % 8 == 0
subnet_mask << " "
end
end
else
subnet_mask = @subnet_v4.to_s
end
@ip_v4.join('.') + "/" + subnet_mask
end
def new_ip
ip = []
for i in (1..4)
ip << rand(256)
end
ip
end
def to_s
@ip_v4.join(".")
end
def subnet
if klass_a?
rand(23) + 8
elsif klass_b?
rand(19) + 12
elsif klass_c?
rand(15) + 16
else
false
end
end
end