ip_methods 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +3 -0
- data/README.rdoc +11 -0
- data/Rakefile +52 -0
- data/lib/ip_methods.rb +99 -0
- data/lib/ip_methods/version.rb +8 -0
- data/spec/ip_methods_spec.rb +56 -0
- data/spec/spec_helper.rb +4 -0
- metadata +87 -0
data/CHANGELOG.rdoc
ADDED
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__) + "/lib")
|
2
|
+
|
3
|
+
require "rake"
|
4
|
+
require "spec/rake/spectask"
|
5
|
+
require "ip_methods/version"
|
6
|
+
|
7
|
+
begin
|
8
|
+
require "hanna/rdoctask"
|
9
|
+
rescue LoadError => e
|
10
|
+
require "rake/rdoctask"
|
11
|
+
end
|
12
|
+
|
13
|
+
begin
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
gem.name = "ip_methods"
|
17
|
+
gem.version = IpMethods::Version::STRING
|
18
|
+
gem.summary = %Q{IpMethods gem for helping with IP operations}
|
19
|
+
gem.description = %Q{Provides an easy way for dealing with IP operations!}
|
20
|
+
gem.email = "morellon@gmail.com"
|
21
|
+
gem.homepage = "http://github.com/morellon/ip_methods"
|
22
|
+
gem.authors = ["morellon"]
|
23
|
+
gem.add_development_dependency "rspec"
|
24
|
+
end
|
25
|
+
Jeweler::GemcutterTasks.new
|
26
|
+
rescue LoadError
|
27
|
+
puts "Jeweler not available. Install it with: gem install jeweler"
|
28
|
+
end
|
29
|
+
|
30
|
+
desc 'Run the specs'
|
31
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
32
|
+
t.spec_opts = ['--colour --format specdoc --loadby mtime --reverse']
|
33
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "Rspec : run all with RCov"
|
37
|
+
Spec::Rake::SpecTask.new('spec:rcov') do |t|
|
38
|
+
t.spec_files = FileList['spec/**/*.rb']
|
39
|
+
t.rcov = true
|
40
|
+
t.rcov_opts = ['--exclude', 'gems', '--exclude', 'spec']
|
41
|
+
end
|
42
|
+
|
43
|
+
Rake::RDocTask.new do |rdoc|
|
44
|
+
rdoc.main = "README.rdoc"
|
45
|
+
rdoc.rdoc_dir = "doc"
|
46
|
+
rdoc.title = "IP Methods"
|
47
|
+
rdoc.options += %w[ --line-numbers --inline-source --charset utf-8 ]
|
48
|
+
rdoc.rdoc_files.include("README.rdoc", "CHANGELOG.rdoc")
|
49
|
+
rdoc.rdoc_files.include("lib/**/*.rb")
|
50
|
+
end
|
51
|
+
|
52
|
+
task :default => :spec
|
data/lib/ip_methods.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
require "ip_methods/version"
|
2
|
+
|
3
|
+
# -*- coding: UTF-8 -*-
|
4
|
+
module IpMethods
|
5
|
+
IPV4_PATTERN = /^(?:25[0-5]|(?:2[0-4]|1\d|[1-9])?\d)(?:\.(?:25[0-5]|(?:2[0-4]|1\d|[1-9])?\d)){3}$/
|
6
|
+
IPV4_BIT_WIDTH = 32
|
7
|
+
IPV4_BIT_OCTET = 8
|
8
|
+
|
9
|
+
def self.from_bin(ip_bin)
|
10
|
+
"#{ip_bin >> 24}.#{(ip_bin >> 16) & 255}.#{(ip_bin >> 8) & 255}.#{ip_bin & 255}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.ip?(ip)
|
14
|
+
ip =~ IPV4_PATTERN
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.mask?(mask)
|
18
|
+
mask.to_s =~ /^\d+$/ && (0..32).include?(mask.to_i)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.ip_and_mask?(address)
|
22
|
+
parts = address.to_s.split('/')
|
23
|
+
parts.size == 2 && ip?(parts[0]) && mask?(parts[1])
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.to_bin(ip)
|
27
|
+
ip_bin = 0
|
28
|
+
shift = IPV4_BIT_WIDTH - IPV4_BIT_OCTET
|
29
|
+
ip.split('.').each do |part|
|
30
|
+
ip_bin += (part.to_i << shift)
|
31
|
+
shift -= IPV4_BIT_OCTET
|
32
|
+
end
|
33
|
+
ip_bin
|
34
|
+
end
|
35
|
+
|
36
|
+
def network
|
37
|
+
IpMethods.from_bin(network_bin)
|
38
|
+
end
|
39
|
+
|
40
|
+
def net_mask
|
41
|
+
IpMethods.from_bin(mask_bin)
|
42
|
+
end
|
43
|
+
|
44
|
+
def default_gateway
|
45
|
+
IpMethods.from_bin(network_bin+1)
|
46
|
+
end
|
47
|
+
|
48
|
+
def broadcast
|
49
|
+
IpMethods.from_bin(broadcast_bin)
|
50
|
+
end
|
51
|
+
|
52
|
+
def generate_ips
|
53
|
+
ips = []
|
54
|
+
(network_bin+1..broadcast_bin-1).each {|ip_bin| ips << IpMethods.from_bin(ip_bin)}
|
55
|
+
ips
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_bin
|
59
|
+
IpMethods.to_bin(address)
|
60
|
+
end
|
61
|
+
|
62
|
+
def mask_bin
|
63
|
+
umask = 0
|
64
|
+
range = 32 - mask
|
65
|
+
(0..mask-1).each {|i| umask += 1 << i}
|
66
|
+
umask << range
|
67
|
+
end
|
68
|
+
|
69
|
+
def umask_bin
|
70
|
+
umask = 0
|
71
|
+
range = 32 - mask
|
72
|
+
(0..range-1).each {|i| umask += 1 << i}
|
73
|
+
umask
|
74
|
+
end
|
75
|
+
|
76
|
+
def network_bin
|
77
|
+
self.to_bin & mask_bin
|
78
|
+
end
|
79
|
+
|
80
|
+
def broadcast_bin
|
81
|
+
mask_bin & network_bin | umask_bin;
|
82
|
+
end
|
83
|
+
|
84
|
+
def belongs_to?(range)
|
85
|
+
range = SimpleIP.new(range) unless range.is_a? IpMethods
|
86
|
+
range.mask <= self.mask && SimpleIP.new(self.address, range.mask).network == range.network
|
87
|
+
end
|
88
|
+
|
89
|
+
class SimpleIP
|
90
|
+
include IpMethods
|
91
|
+
attr_accessor :address, :mask
|
92
|
+
|
93
|
+
def initialize(address, mask = 32)
|
94
|
+
(@address, @mask) = address.split('/')
|
95
|
+
@mask ||= mask
|
96
|
+
@mask = @mask.to_i
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe IpMethods do
|
5
|
+
|
6
|
+
subject { IpMethods::SimpleIP.new "10.1.2.34", 26 }
|
7
|
+
|
8
|
+
it "should give the binary ip representation" do
|
9
|
+
subject.to_bin.should == 0b00001010_00000001_00000010_00100010
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should convert from binary ip representation" do
|
13
|
+
IpMethods.from_bin(subject.to_bin).should == subject.address
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should give the ip's network address" do
|
17
|
+
subject.network.should == "10.1.2.0"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should give the ip's broadcast address" do
|
21
|
+
subject.broadcast.should == "10.1.2.63"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should give the ip's default gateway address" do
|
25
|
+
subject.default_gateway.should == "10.1.2.1"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should give the ip's net mask address" do
|
29
|
+
subject.net_mask.should == "255.255.255.192"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should generate all host ips on this ip range" do
|
33
|
+
ips = []
|
34
|
+
ip = subject.network
|
35
|
+
62.times {|i| ips << "10.1.2.#{i+1}"}
|
36
|
+
subject.generate_ips.should == ips
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should belong to a wider range" do
|
40
|
+
subject.belongs_to?(IpMethods::SimpleIP.new "10.1.2.34", subject.mask - 1).should be_true
|
41
|
+
subject.belongs_to?(IpMethods::SimpleIP.new "0.0.0.0/0").should be_true
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should belong to itself" do
|
45
|
+
subject.belongs_to?(subject).should be_true
|
46
|
+
subject.belongs_to?(IpMethods::SimpleIP.new "10.1.2.32/26").should be_true
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should not belong to a narrower range" do
|
50
|
+
subject.belongs_to?(IpMethods::SimpleIP.new "10.1.2.34", subject.mask + 1).should be_false
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should not belong to a different range" do
|
54
|
+
subject.belongs_to?(IpMethods::SimpleIP.new "10.2.2.0/26").should be_false
|
55
|
+
end
|
56
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ip_methods
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- morellon
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-09-24 00:00:00 -03:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rspec
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id001
|
35
|
+
description: Provides an easy way for dealing with IP operations!
|
36
|
+
email: morellon@gmail.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- README.rdoc
|
43
|
+
files:
|
44
|
+
- CHANGELOG.rdoc
|
45
|
+
- README.rdoc
|
46
|
+
- Rakefile
|
47
|
+
- lib/ip_methods.rb
|
48
|
+
- lib/ip_methods/version.rb
|
49
|
+
- spec/ip_methods_spec.rb
|
50
|
+
- spec/spec_helper.rb
|
51
|
+
has_rdoc: true
|
52
|
+
homepage: http://github.com/morellon/ip_methods
|
53
|
+
licenses: []
|
54
|
+
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options:
|
57
|
+
- --charset=UTF-8
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
hash: 3
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
version: "0"
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 3
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
version: "0"
|
78
|
+
requirements: []
|
79
|
+
|
80
|
+
rubyforge_project:
|
81
|
+
rubygems_version: 1.3.7
|
82
|
+
signing_key:
|
83
|
+
specification_version: 3
|
84
|
+
summary: IpMethods gem for helping with IP operations
|
85
|
+
test_files:
|
86
|
+
- spec/ip_methods_spec.rb
|
87
|
+
- spec/spec_helper.rb
|