subnet_calc 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a8e521e99a577d3c78b49a8400f3b38133150d4d
4
+ data.tar.gz: 0c006f2519c6aa9916020d326b481fa019031c30
5
+ SHA512:
6
+ metadata.gz: c355f531b300e7a96dfa0e1f21ef771de13a69714a2a81836766aa4ec4419a810eb02112134d9e897ed505a7ec5a3f88ac7dfa13c77d3713da25f42a54b3803c
7
+ data.tar.gz: 3f275b0feb9baaa4bc2548d19ae8e3fd101f801a75b58ef0798bfa220d3cf111e29b6c8515a9aeb61cc8837fdaa30b35d6bd54009659f56892f0670873d00fe1
checksums.yaml.gz.sig ADDED
Binary file
data.tar.gz.sig ADDED
@@ -0,0 +1 @@
1
+ 1�Kz�ݧ��a�� o���3
@@ -0,0 +1,199 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # file: subnet_calc.rb
4
+
5
+
6
+ require 'kvx'
7
+ require 'ostruct'
8
+ require 'table-formatter'
9
+
10
+
11
+ module Ordinals
12
+
13
+ refine Fixnum do
14
+ def ordinal
15
+ self.to_s + ( (10...20).include?(self) ? 'th' :
16
+ %w{ th st nd rd th th th th th th }[self % 10] )
17
+ end
18
+ end
19
+ end
20
+
21
+ class SubnetCalc
22
+
23
+ using Ordinals
24
+
25
+ attr_reader :to_h
26
+
27
+ def initialize(inputs={hosts: 254})
28
+
29
+ @inputs = inputs
30
+ default_inputs = {hosts: 254, ip: '192.168.0.0'}.merge(inputs)
31
+
32
+ @prefixes = 1.upto(32).each_slice(8).to_a
33
+ =begin
34
+ #=> [
35
+ [1, 2, 3, 4, 5, 6, 7, 8], [9, 10, 11, 12, 13, 14, 15, 16],
36
+ [17, 18, 19, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 30, 31, 32]
37
+ ]
38
+ =end
39
+
40
+ octets = @prefixes.map do |octet|
41
+
42
+ a = octet.map.with_index do |prefix, i|
43
+ OpenStruct.new prefix: prefix, decimal: 2 ** (octet.length - 1 - i )
44
+ end
45
+
46
+ OpenStruct.new mask: nil, bits: a
47
+
48
+ end
49
+
50
+ # determine what class of network we are using
51
+
52
+ class_type = 'c'
53
+
54
+ # Identify the network bits and the host bits
55
+
56
+ classes = ('a'..'d')
57
+
58
+ # identify the initial network bits for a class *a,b or c*
59
+
60
+ class_n = (classes.to_a.index(class_type) + 1)
61
+ network_bits = class_n.times.map {|x| Array.new(8, 1)}
62
+ host_bits = (classes.to_a.length - class_n).times.map {|x| Array.new(8, 0)}
63
+ address_bits = network_bits + host_bits
64
+
65
+ # add the mask to each octet
66
+
67
+ octets.each.with_index do |octet, i|
68
+ octet.mask = address_bits[i].join.to_i(2)
69
+ end
70
+
71
+ # ------------------------------------
72
+
73
+ # Using the input(s) supplied:
74
+
75
+ hosts = default_inputs[:hosts]
76
+
77
+ # find the smallest decimal value to match the
78
+ # required number of hosts on a network
79
+
80
+ col = octets[class_n].bits.reverse.detect {|x| x.decimal > hosts }
81
+
82
+ magic_number, prefix = col.decimal, col.prefix
83
+ n = octets[class_n].bits.map(&:decimal).index(magic_number)
84
+ no_of_subnets = 2 ** (n+1)
85
+
86
+
87
+ # add the new mask to the octet
88
+
89
+ octets[class_n].mask = octets[class_n].bits.map(&:decimal)[0..n].inject(:+)
90
+ subnet_mask = octets.map(&:mask).join('.')
91
+
92
+ subnets = no_of_subnets.times.inject([]) do |r,n|
93
+
94
+ i = r.last ? r.last.network + magic_number : 0
95
+
96
+ broadcast = i + magic_number - 1
97
+ first = i + 1
98
+ last = broadcast - 1
99
+ r << OpenStruct.new({network: i, first: first, last: last,
100
+ broadcast: broadcast})
101
+ end
102
+
103
+ ip = (default_inputs[:ip] + ' ') .split('.')
104
+ ip[class_n] = subnets.first.first
105
+ first_ip = ip.join('.')
106
+ ip[class_n] = subnets.first.last
107
+ last_ip = ip.join('.')
108
+
109
+ result = {
110
+ class_type: class_type.upcase,
111
+ magic_number: magic_number,
112
+ hosts: magic_number - 2,
113
+ subnet_mask: subnet_mask,
114
+ subnet_bitmask: subnet_mask.split('.').map {|x| x.to_i.to_s(2)},
115
+ prefix: prefix,
116
+ subnets: subnets,
117
+ range: "%s-%s" % [first_ip, last_ip],
118
+ subnet_bits: n+1,
119
+ max_subnets: no_of_subnets
120
+ }
121
+
122
+ @class_n = class_n
123
+ @h = result
124
+ end
125
+
126
+
127
+ def to_s()
128
+
129
+
130
+ tfo = TableFormatter.new
131
+
132
+ tfo.source = @h[:subnets].map{|x| x.to_h.values.map(&:to_s) }
133
+ tfo.labels = %w(Network 1st last broadcast)
134
+ subnets_table = tfo.display(markdown: true).to_s
135
+
136
+ # octet broken down
137
+
138
+ tfo2 = TableFormatter.new
139
+
140
+ prefixes = @prefixes[@class_n].map {|x| '/' + x.to_s}
141
+ tfo2.source = [@h[:subnet_bitmask][@class_n].chars, prefixes]
142
+ tfo2.labels = 8.times.map {|n| (2 ** n).to_s }.reverse
143
+ octet_table = tfo2.display(markdown: true).to_s
144
+
145
+
146
+ <<EOF
147
+
148
+
149
+ Subnet calculator
150
+ =================
151
+
152
+ Inputs:
153
+
154
+ #{Kvx.new(@inputs).to_s.lines.map {|x| ' ' * 2 + x}.join}
155
+
156
+ Summary
157
+ -------
158
+
159
+ * Network class: #{@h[:class_type]}
160
+ * magic number: #{@h[:magic_number]}
161
+ * hosts per subnet (magic number - 2 ): #{@h[:hosts]}
162
+ * subnet mask: #{@h[:subnet_mask]}
163
+ * subnet bitmask: #{@h[:subnet_bitmask].join('.')}
164
+ * prefix bit-length: #{@h[:prefix]}
165
+ * range: #{@h[:range]}
166
+
167
+ * subnet_bits: #{@h[:subnet_bits]}
168
+ * maximum subnets: #{@h[:max_subnets]}
169
+
170
+
171
+
172
+ Breakdown
173
+ ---------
174
+
175
+ #{(@class_n + 1).ordinal} octet:
176
+
177
+ #{indent octet_table}
178
+
179
+ ### Subnets
180
+
181
+
182
+ #{indent subnets_table}
183
+
184
+ -----------------------------------------------
185
+
186
+ EOF
187
+
188
+ end
189
+
190
+ def to_h()
191
+ @h
192
+ end
193
+
194
+ private
195
+
196
+ def indent(s, i=2)
197
+ s.lines.map{|x| ' ' * i + x}.join
198
+ end
199
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: subnet_calc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - James Robertson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBIMRIwEAYDVQQDDAlnZW1t
14
+ YXN0ZXIxHjAcBgoJkiaJk/IsZAEZFg5qYW1lc3JvYmVydHNvbjESMBAGCgmSJomT
15
+ 8ixkARkWAmV1MB4XDTE2MTEwNjE1MjYxMFoXDTE3MTEwNjE1MjYxMFowSDESMBAG
16
+ A1UEAwwJZ2VtbWFzdGVyMR4wHAYKCZImiZPyLGQBGRYOamFtZXNyb2JlcnRzb24x
17
+ EjAQBgoJkiaJk/IsZAEZFgJldTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
18
+ ggEBAPVqVqTGhTW3Ph6mzF3tBResSXXhxAkyJbw4BcVRgk8dvqJwNpAgtlt/BB9B
19
+ KJmuAYo1cviZ8XIXCrbSEjXSLNF9acv2YSYZdmGdwNLtGQVKt+N9DLbFIGRMh2L2
20
+ 4/he6hxypRKDS9gONQ4YXUVZdCawA3++wslin+BREK8Ujy6ULTkRvQJZF2J6J8ex
21
+ a5oGJsQuDyO52rz2m7nm+LPPGTuuv8wIjyuYL/fn/nw4FY0XfW9mOmLHFfEo/9HZ
22
+ 7SEsrpA4u2Izxiz/ngnICUipJznXe2fF2KX9vYpnHpfV2jeeN6IoZX8Jg5pyoZBz
23
+ 5bQISgWwJfpJjhsOCGy3ju631/UCAwEAAaOBijCBhzAJBgNVHRMEAjAAMAsGA1Ud
24
+ DwQEAwIEsDAdBgNVHQ4EFgQU1lNDXV4p/8OlTXMCiS+R28ekARgwJgYDVR0RBB8w
25
+ HYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1h
26
+ c3RlckBqYW1lc3JvYmVydHNvbi5ldTANBgkqhkiG9w0BAQUFAAOCAQEAj62jBmu0
27
+ ttOHIlwiLlINXEEIfnLPAMX85eeepU+FFrC+LfAxRLZ/Z+jBMDiNaNC4696jdZnW
28
+ 14Bc0EuI6ZSshPPQHlkZ9vCVvS5IbymMkhsGSdzBCn7U3RhbItc8eaZii6F0uuZX
29
+ ytJiqiVwujezDxT2QYyI94xbWfU6f9tBNX7blfXysexghcEDm0BxtrEOk4ssykt8
30
+ PyPsXxOL9+WA/tVhAFUQeAogZNF5ZFOO1t0EWxTthM5H79lzF7qtthPO2nsRGeNn
31
+ oAH9dWawpFIItSVexeVF4ycrINDboVQH/q93Udr9ZLbwux6Dp2bpsAxyXAdIw+Um
32
+ ZWJvjR10ewlMyQ==
33
+ -----END CERTIFICATE-----
34
+ date: 2016-11-06 00:00:00.000000000 Z
35
+ dependencies:
36
+ - !ruby/object:Gem::Dependency
37
+ name: kvx
38
+ requirement: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '0.6'
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: 0.6.1
46
+ type: :runtime
47
+ prerelease: false
48
+ version_requirements: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '0.6'
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: 0.6.1
56
+ - !ruby/object:Gem::Dependency
57
+ name: table-formatter
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '0.3'
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: 0.3.1
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - "~>"
71
+ - !ruby/object:Gem::Version
72
+ version: '0.3'
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 0.3.1
76
+ description:
77
+ email: james@r0bertson.co.uk
78
+ executables: []
79
+ extensions: []
80
+ extra_rdoc_files: []
81
+ files:
82
+ - lib/subnet_calc.rb
83
+ homepage: https://github.com/jrobertson/subnet_calc
84
+ licenses:
85
+ - MIT
86
+ metadata: {}
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 2.5.1
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: A subnet calculator (only tested for a class C network)
107
+ test_files: []
metadata.gz.sig ADDED
Binary file