net-ip 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ script: 'rake spec'
3
+ rvm:
4
+ - 1.8.7
5
+ - 1.9.2
6
+ - 1.9.3
7
+ - 2.0.0
data/README.md CHANGED
@@ -1,20 +1,10 @@
1
- # Net::Ip
1
+ # Net::IP
2
2
 
3
- TODO: Write a gem description
3
+ [![Build Status](https://travis-ci.org/jbussdieker/ruby-net-ip.png?branch=master)](https://travis-ci.org/jbussdieker/ruby-net-ip)
4
+ [![Code Climate](https://codeclimate.com/github/jbussdieker/ruby-net-ip.png)](https://codeclimate.com/github/jbussdieker/ruby-net-ip)
5
+ [![Gem Version](https://badge.fury.io/rb/net-ip.png)](http://badge.fury.io/rb/net-ip)
4
6
 
5
- ## Installation
6
-
7
- Add this line to your application's Gemfile:
8
-
9
- gem 'net-ip'
10
-
11
- And then execute:
12
-
13
- $ bundle
14
-
15
- Or install it yourself as:
16
-
17
- $ gem install net-ip
7
+ Tools for working with IP routes
18
8
 
19
9
  ## Usage
20
10
 
@@ -23,12 +13,12 @@ require 'net/ip'
23
13
 
24
14
  Net::IP::Route.flush(:cache)
25
15
 
26
- Net::IP::Route.each do |rt|
27
- p rt
16
+ Net::IP::Route.each do |route|
17
+ puts route
28
18
  end
29
19
 
30
- Net::IP::Route.find_gateways("eth0").each do |gw|
31
- puts gw.via
20
+ Net::IP::Route.find_gateways("eth0").each do |gateway|
21
+ puts gateway.via
32
22
  end
33
23
 
34
24
  gws = ["192.168.0.1", "192.168.0.2"].collect do |ip|
@@ -37,11 +27,3 @@ end
37
27
 
38
28
  Net::IP::Route.update_gateways(gws)
39
29
  ````
40
-
41
- ## Contributing
42
-
43
- 1. Fork it
44
- 2. Create your feature branch (`git checkout -b my-new-feature`)
45
- 3. Commit your changes (`git commit -am 'Add some feature'`)
46
- 4. Push to the branch (`git push origin my-new-feature`)
47
- 5. Create new Pull Request
data/Rakefile CHANGED
@@ -1 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec) do |task|
5
+ task.rspec_opts = '--color'
6
+ end
@@ -0,0 +1,57 @@
1
+ module Net
2
+ module IP
3
+ # Parses routing table entries
4
+ class RouteParser
5
+ # Parse a routing table entry into a hash
6
+ #
7
+ # @param line {String}
8
+ # @return {Hash}
9
+ def self.parse_line(line)
10
+ params = {}
11
+
12
+ if line =~ /^(unicast|unreachable|blackhole|prohibit|local|broadcast|throw|nat|via|anycast|multicast)\s+/
13
+ params[:type] = $1
14
+ line = line[$1.length..-1]
15
+ end
16
+
17
+ params[:prefix] = line.split.first
18
+ params[:dev] = $1 if line =~ /\s+dev\s+([^\s]+)/
19
+ params[:scope] = $1 if line =~ /\s+scope\s+([^\s]+)/
20
+ params[:metric] = $1 if line =~ /\s+metric\s+([^\s]+)/
21
+ params[:proto] = $1 if line =~ /\s+proto\s+([^\s]+)/
22
+ params[:src] = $1 if line =~ /\s+src\s+([^\s]+)/
23
+ params[:via] = $1 if line =~ /\s+via\s+([^\s]+)/
24
+ params[:weight] = $1 if line =~ /\s+weight\s+([^\s]+)/
25
+ params[:table] = $1 if line =~ /\s+table\s+([^\s]+)/
26
+ params[:error] = $1 if line =~ /\s+error\s+([^\s]+)/
27
+
28
+ params
29
+ end
30
+
31
+ # Parse the output of ip route into an array of hashes
32
+ #
33
+ # @param data {String}
34
+ # @return {Array}
35
+ def self.parse(data)
36
+ list = []
37
+ in_default = false
38
+ data.each_line do |line|
39
+ if in_default == true
40
+ if line.start_with? "\t"
41
+ list << parse_line(line.strip.gsub("nexthop", "default"))
42
+ else
43
+ in_default = false
44
+ end
45
+ elsif line.strip == "default"
46
+ in_default = true
47
+ end
48
+
49
+ unless in_default
50
+ list << parse_line(line.strip)
51
+ end
52
+ end
53
+ list
54
+ end
55
+ end
56
+ end
57
+ end
@@ -1,5 +1,5 @@
1
1
  module Net
2
2
  module IP
3
- VERSION = "0.0.3"
3
+ VERSION = "0.0.4"
4
4
  end
5
5
  end
@@ -0,0 +1,100 @@
1
+ require 'net/ip/route_parser'
2
+
3
+ describe Net::IP::RouteParser do
4
+ context "line parser" do
5
+ def test_parse_line(line, field, expect)
6
+ h = Net::IP::RouteParser.parse_line(line)
7
+ h[field].should eql(expect)
8
+ end
9
+
10
+ it "should parse prefix" do
11
+ test_parse_line("1.1.0.0/16 dev eth0 scope link metric 1000", :prefix, "1.1.0.0/16")
12
+ end
13
+
14
+ it "should parse dev" do
15
+ test_parse_line("1.1.0.0/16 dev eth0 scope link metric 1000", :dev, "eth0")
16
+ end
17
+
18
+ it "should parse scope" do
19
+ test_parse_line("1.1.0.0/16 dev eth0 scope link metric 1000", :scope, "link")
20
+ end
21
+
22
+ it "should parse metric" do
23
+ test_parse_line("1.1.0.0/16 dev eth0 scope link metric 1000", :metric, "1000")
24
+ end
25
+
26
+ it "should parse proto" do
27
+ test_parse_line("1.0.0.0/24 dev eth0 proto kernel scope link src 1.0.1.1", :proto, "kernel")
28
+ end
29
+
30
+ it "should parse src" do
31
+ test_parse_line("1.0.0.0/24 dev eth0 proto kernel scope link src 1.0.1.1", :src, "1.0.1.1")
32
+ end
33
+
34
+ it "should parse type" do
35
+ test_parse_line("unreachable default dev lo table unspec proto kernel metric -1 error -101", :type, "unreachable")
36
+ end
37
+
38
+ it "should parse table" do
39
+ test_parse_line("unreachable default dev lo table unspec proto kernel metric -1 error -101", :table, "unspec")
40
+ end
41
+
42
+ it "should parse error" do
43
+ test_parse_line("unreachable default dev lo table unspec proto kernel metric -1 error -101", :error, "-101")
44
+ end
45
+ end
46
+
47
+ context "parser" do
48
+ def test_parse(file, expect)
49
+ Net::IP::RouteParser.parse(File.read(file)).should eql(expect)
50
+ end
51
+
52
+ it "handles sample 1" do
53
+ test_parse("spec/net/ip/sample1", [
54
+ {:prefix=>"default", :dev=>"eth0", :proto=>"static", :via=>"192.168.0.1"},
55
+ {:prefix=>"169.254.0.0/16", :dev=>"eth0", :scope=>"link", :metric=>"1000"},
56
+ {:prefix=>"192.168.0.0/24", :dev=>"eth0", :scope=>"link", :metric=>"1", :proto=>"kernel", :src=>"192.168.0.15"}
57
+ ])
58
+ end
59
+
60
+ it "handles sample 2" do
61
+ test_parse("spec/net/ip/sample2", [
62
+ {:prefix=>"default", :dev=>"eth0", :via=>"10.0.61.225", :weight=>"1"},
63
+ {:prefix=>"default", :dev=>"eth0", :via=>"10.0.45.153", :weight=>"1"},
64
+ {:prefix=>"10.0.0.0", :dev=>"eth0", :via=>"10.0.0.1"},
65
+ {:prefix=>"10.0.0.0/18", :dev=>"eth0", :scope=>"link", :proto=>"kernel", :src=>"10.0.14.184"},
66
+ {:prefix=>"169.254.169.254", :dev=>"eth0", :via=>"10.0.0.1"}
67
+ ])
68
+ end
69
+
70
+ it "handles sample 3" do
71
+ test_parse("spec/net/ip/sample3", [
72
+ {:prefix=>"default", :dev=>"eth0", :via=>"10.0.35.196"},
73
+ {:prefix=>"10.0.0.0", :dev=>"eth0", :via=>"10.0.0.1"},
74
+ {:prefix=>"10.0.0.0/18", :dev=>"eth0", :scope=>"link", :proto=>"kernel", :src=>"10.0.58.155"},
75
+ {:prefix=>"169.254.169.254", :dev=>"eth0", :via=>"10.0.0.1"}
76
+ ])
77
+ end
78
+
79
+ it "handles sample 4" do
80
+ test_parse("spec/net/ip/sample4", [
81
+ {:prefix=>"default", :dev=>"eth0", :via=>"192.168.0.1"},
82
+ {:prefix=>"169.254.0.0/16", :dev=>"eth0", :scope=>"link", :metric=>"1000"},
83
+ {:prefix=>"192.168.0.0/24", :dev=>"eth0", :scope=>"link", :metric=>"1", :proto=>"kernel", :src=>"192.168.0.15"},
84
+ {:type=>"broadcast", :prefix=>"127.0.0.0", :dev=>"lo", :scope=>"link", :proto=>"kernel", :src=>"127.0.0.1", :table=>"local"},
85
+ {:type=>"local", :prefix=>"127.0.0.0/8", :dev=>"lo", :scope=>"host", :proto=>"kernel", :src=>"127.0.0.1", :table=>"local"},
86
+ {:type=>"local", :prefix=>"127.0.0.1", :dev=>"lo", :scope=>"host", :proto=>"kernel", :src=>"127.0.0.1", :table=>"local"},
87
+ {:type=>"broadcast", :prefix=>"127.255.255.255", :dev=>"lo", :scope=>"link", :proto=>"kernel", :src=>"127.0.0.1", :table=>"local"},
88
+ {:type=>"broadcast", :prefix=>"192.168.0.0", :dev=>"eth0", :scope=>"link", :proto=>"kernel", :src=>"192.168.0.15", :table=>"local"},
89
+ {:type=>"local", :prefix=>"192.168.0.15", :dev=>"eth0", :scope=>"host", :proto=>"kernel", :src=>"192.168.0.15", :table=>"local"},
90
+ {:type=>"broadcast", :prefix=>"192.168.0.255", :dev=>"eth0", :scope=>"link", :proto=>"kernel", :src=>"192.168.0.15", :table=>"local"},
91
+ {:prefix=>"fe80::/64", :dev=>"eth0", :metric=>"256", :proto=>"kernel"},
92
+ {:type=>"unreachable", :prefix=>"default", :dev=>"lo", :metric=>"-1", :proto=>"kernel", :table=>"unspec", :error=>"-101"},
93
+ {:type=>"local", :prefix=>"::1", :dev=>"lo", :metric=>"0", :proto=>"none", :via=>"::", :table=>"local"},
94
+ {:type=>"local", :prefix=>"fe80::226:18ff:fe3a:3112", :dev=>"lo", :metric=>"0", :proto=>"none", :via=>"::", :table=>"local"},
95
+ {:prefix=>"ff00::/8", :dev=>"eth0", :metric=>"256", :table=>"local"},
96
+ {:type=>"unreachable", :prefix=>"default", :dev=>"lo", :metric=>"-1", :proto=>"kernel", :table=>"unspec", :error=>"-101"}
97
+ ])
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,7 @@
1
+ require 'net/ip/route'
2
+
3
+ describe Net::IP::Route do
4
+ it "should be creatable" do
5
+ Net::IP::Route.new.should be_kind_of(Net::IP::Route)
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ default via 192.168.0.1 dev eth0 proto static
2
+ 169.254.0.0/16 dev eth0 scope link metric 1000
3
+ 192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.15 metric 1
@@ -0,0 +1,6 @@
1
+ default
2
+ nexthop via 10.0.61.225 dev eth0 weight 1
3
+ nexthop via 10.0.45.153 dev eth0 weight 1
4
+ 10.0.0.0 via 10.0.0.1 dev eth0
5
+ 10.0.0.0/18 dev eth0 proto kernel scope link src 10.0.14.184
6
+ 169.254.169.254 via 10.0.0.1 dev eth0
@@ -0,0 +1,4 @@
1
+ default via 10.0.35.196 dev eth0
2
+ 10.0.0.0 via 10.0.0.1 dev eth0
3
+ 10.0.0.0/18 dev eth0 proto kernel scope link src 10.0.58.155
4
+ 169.254.169.254 via 10.0.0.1 dev eth0
@@ -0,0 +1,16 @@
1
+ default via 192.168.0.1 dev eth0
2
+ 169.254.0.0/16 dev eth0 scope link metric 1000
3
+ 192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.15 metric 1
4
+ broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
5
+ local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
6
+ local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
7
+ broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
8
+ broadcast 192.168.0.0 dev eth0 table local proto kernel scope link src 192.168.0.15
9
+ local 192.168.0.15 dev eth0 table local proto kernel scope host src 192.168.0.15
10
+ broadcast 192.168.0.255 dev eth0 table local proto kernel scope link src 192.168.0.15
11
+ fe80::/64 dev eth0 proto kernel metric 256
12
+ unreachable default dev lo table unspec proto kernel metric -1 error -101
13
+ local ::1 via :: dev lo table local proto none metric 0
14
+ local fe80::226:18ff:fe3a:3112 via :: dev lo table local proto none metric 0
15
+ ff00::/8 dev eth0 table local metric 256
16
+ unreachable default dev lo table unspec proto kernel metric -1 error -101
metadata CHANGED
@@ -1,109 +1,129 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: net-ip
3
- version: !ruby/object:Gem::Version
4
- version: 0.0.3
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 4
10
+ version: 0.0.4
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Joshua Bussdieker
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2013-08-09 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: bundler
16
- requirement: !ruby/object:Gem::Requirement
17
+
18
+ date: 2013-08-09 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
17
22
  none: false
18
- requirements:
23
+ requirements:
19
24
  - - ~>
20
- - !ruby/object:Gem::Version
21
- version: '1.3'
22
- type: :development
25
+ - !ruby/object:Gem::Version
26
+ hash: 9
27
+ segments:
28
+ - 1
29
+ - 3
30
+ version: "1.3"
31
+ name: bundler
23
32
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
33
+ type: :development
34
+ requirement: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ version_requirements: &id002 !ruby/object:Gem::Requirement
25
37
  none: false
26
- requirements:
27
- - - ~>
28
- - !ruby/object:Gem::Version
29
- version: '1.3'
30
- - !ruby/object:Gem::Dependency
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ hash: 3
42
+ segments:
43
+ - 0
44
+ version: "0"
31
45
  name: rake
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - ! '>='
36
- - !ruby/object:Gem::Version
37
- version: '0'
38
- type: :development
39
46
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
47
+ type: :development
48
+ requirement: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ version_requirements: &id003 !ruby/object:Gem::Requirement
41
51
  none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: '0'
46
- - !ruby/object:Gem::Dependency
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ hash: 3
56
+ segments:
57
+ - 0
58
+ version: "0"
47
59
  name: rspec
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ! '>='
52
- - !ruby/object:Gem::Version
53
- version: '0'
54
- type: :development
55
60
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
61
+ type: :development
62
+ requirement: *id003
62
63
  description:
63
- email:
64
+ email:
64
65
  - jbussdieker@gmail.com
65
66
  executables: []
67
+
66
68
  extensions: []
69
+
67
70
  extra_rdoc_files: []
68
- files:
71
+
72
+ files:
69
73
  - .gitignore
74
+ - .travis.yml
70
75
  - Gemfile
71
76
  - LICENSE.txt
72
77
  - README.md
73
78
  - Rakefile
74
79
  - lib/net/ip.rb
75
80
  - lib/net/ip/route.rb
81
+ - lib/net/ip/route_parser.rb
76
82
  - lib/net/ip/version.rb
77
83
  - net-ip.gemspec
84
+ - spec/net/ip/route_parser_spec.rb
85
+ - spec/net/ip/route_spec.rb
86
+ - spec/net/ip/sample1
87
+ - spec/net/ip/sample2
88
+ - spec/net/ip/sample3
89
+ - spec/net/ip/sample4
78
90
  homepage: http://github.com/jbussdieker/ruby-net-ip
79
- licenses:
91
+ licenses:
80
92
  - MIT
81
93
  post_install_message:
82
94
  rdoc_options: []
83
- require_paths:
95
+
96
+ require_paths:
84
97
  - lib
85
- required_ruby_version: !ruby/object:Gem::Requirement
98
+ required_ruby_version: !ruby/object:Gem::Requirement
86
99
  none: false
87
- requirements:
88
- - - ! '>='
89
- - !ruby/object:Gem::Version
90
- version: '0'
91
- segments:
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ hash: 3
104
+ segments:
92
105
  - 0
93
- hash: 2052506917589996489
94
- required_rubygems_version: !ruby/object:Gem::Requirement
106
+ version: "0"
107
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
108
  none: false
96
- requirements:
97
- - - ! '>='
98
- - !ruby/object:Gem::Version
99
- version: '0'
100
- segments:
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ hash: 3
113
+ segments:
101
114
  - 0
102
- hash: 2052506917589996489
115
+ version: "0"
103
116
  requirements: []
117
+
104
118
  rubyforge_project:
105
119
  rubygems_version: 1.8.25
106
120
  signing_key:
107
121
  specification_version: 3
108
122
  summary: Tools for working with IP routes
109
- test_files: []
123
+ test_files:
124
+ - spec/net/ip/route_parser_spec.rb
125
+ - spec/net/ip/route_spec.rb
126
+ - spec/net/ip/sample1
127
+ - spec/net/ip/sample2
128
+ - spec/net/ip/sample3
129
+ - spec/net/ip/sample4