linux-ip-addr 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d81d96b09dc43d3c8bad671207fac42074618241
4
- data.tar.gz: 57adf5ffdee3436161df76f0781c34f70e900895
3
+ metadata.gz: 025c233110ff3cb81d15e49c41deeadc37f43aef
4
+ data.tar.gz: 5f9574af347c0215a8d7dca5ac94e9a5db64739d
5
5
  SHA512:
6
- metadata.gz: eb34e19e0610e70b3179420948f1b7ae3aa0c23c9ec6875b2c7910115e0dbb24f9b4908a46289fe078bffbe3b58033f4272a112c494f10e421faae3921fe9897
7
- data.tar.gz: 351a37c90d6ae9626fd6681c31ce090c2110dbc319f799d74d941c77e7689881dd22fd4d3b5aa99def14bb26561a152ca2727e633f53e140910336c7d51917a6
6
+ metadata.gz: 79bca66d01ab74ac31a727168a3bba82015dbb772182ac5d89ed16d1c03470469b8a11018f4f0eaf161f1b1d750e11dbff3a8af8f6199dd1203fd3a2a332b583
7
+ data.tar.gz: 12932781e116dee601bc42e85dcf1a21d160a98e5fdf2b1c2081e856b50bcefbd94cadf167ed78a8b12edd5088676cd0dea394555fc051dec148cd8bf10065d8
@@ -45,7 +45,7 @@ module Linux
45
45
  iface = Interface.new($1)
46
46
  ip_addr.interfaces << iface
47
47
  elsif iface
48
- if line =~ /^\s*line\/ether\s+([a-f0-9:]+)\s+.*$/
48
+ if line =~ /^\s*link\/ether\s+([a-f0-9:]+)\s+.*$/
49
49
  iface.mac_address($1)
50
50
  elsif line =~ /^\s*inet[6]*\s+([0-9a-f\:\.\/]+)\s+.*$/
51
51
  iface.add_ip($1)
@@ -1,7 +1,7 @@
1
1
  module Linux
2
2
  module Ip
3
3
  module Addr
4
- VERSION = "0.0.1"
4
+ VERSION = "0.0.2"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,118 @@
1
+ require "linux/ip/addr/version"
2
+ require 'ostruct'
3
+
4
+ module Linux
5
+ module Ip
6
+ module Route
7
+
8
+ class Interface
9
+ attr_accessor :mac_address
10
+ attr_reader :ips, :name
11
+ def initialize(name)
12
+ @name = name
13
+ @ips = []
14
+ end
15
+ def add_ip(ip)
16
+ @ips << ip
17
+ end
18
+ end
19
+
20
+
21
+ class IpRoute
22
+ attr_reader :interfaces, :routes
23
+ def initialize
24
+ @interfaces = {}
25
+ @routes = []
26
+ end
27
+
28
+ class Options < OpenStruct
29
+ def initialize(options_str)
30
+ super(options_str.split(/\s+/).inject({}) { |r, i| r[i] = true; r })
31
+ end
32
+ end
33
+
34
+ class ViaRoute
35
+ attr_reader :dst, :via, :dev, :options
36
+ def initialize(dst, via, dev, options)
37
+ @dst = dst
38
+ @via = via
39
+ @dev = dev
40
+ @options = options
41
+ end
42
+ end
43
+ def add_via(dev, dst, via, options)
44
+ @interfaces[dev] ||= []
45
+ route = ViaRoute.new(dst, via, dev, Options.new(options))
46
+ @interfaces[dev] << route
47
+ @routes << route
48
+ end
49
+
50
+ class IfaceRoute
51
+ attr_reader :dst, :dev, :options
52
+ def initialize(dst, dev, options)
53
+ @dst = dst
54
+ @dev = dev
55
+ @options = options
56
+ end
57
+ end
58
+ def add_dev(dev, dst, options)
59
+ @interfaces[dev] ||= []
60
+ route = IfaceRoute.new(dst, dev, Options.new(options))
61
+ @interfaces[dev] << route
62
+ @routes << route
63
+ end
64
+
65
+ def length
66
+ interfaces.length
67
+ end
68
+ def find(name)
69
+ interfaces.find { |i| i.name == name }
70
+ end
71
+ end
72
+
73
+ #23: br202: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
74
+ # link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
75
+ # inet 10.10.103.11/22 brd 10.10.103.255 scope global br202
76
+ # valid_lft forever preferred_lft forever
77
+ # inet6 fe80::84c6:95ff:feb7:d76d/64 scope link
78
+ # valid_lft forever preferred_lft forever
79
+ def self.parse_from_lines(lines)
80
+ ip_route = IpRoute.new
81
+ iface = nil
82
+ lines.each do |line|
83
+ line = line.strip.chomp
84
+ dev_m = /^([0-9a-fA-F\.\:\/]+)\s+dev\s+([a-z0-9\.]+)\s*(.*)$/.match(line)
85
+ if dev_m
86
+ #puts "Dev #{dev_m[2]} -> #{dev_m.inspect}"
87
+ ip_route.add_dev(dev_m[2], dev_m[1], dev_m[3])
88
+ else
89
+ via_m = /^([0-9a-fA-F\.\:\/]+|default)\s+via\s+([a-z0-9\.\:]+)\s+dev\s+([a-z0-9\.]+)\s*(.*)$/.match(line)
90
+ if via_m
91
+ #puts "Via #{via_m[3]} -> #{via_m.inspect}"
92
+ ip_route.add_via(via_m[3], via_m[1], via_m[2], via_m[4])
93
+ else
94
+ direct_m = /^(blackhole)\s+([0-9a-fA-F\.\:\/]+)$/.match(line)
95
+ if direct_m
96
+ ip_route.add_via(direct_m[1], direct_m[2], nil, "")
97
+ else
98
+ # unreachable 2a04:2f80::/29 dev lo metric 1024 error -101
99
+ unreachable_m = /^(unreachable)\s+([0-9a-fA-F\.\:\/]+)\s+dev\s+([a-z0-9\.]+)\s+(.*)$/.match(line)
100
+ if unreachable_m
101
+ ip_route.add_dev(unreachable_m[3], unreachable_m[2], unreachable_m[1]+" "+unreachable_m[4])
102
+ else
103
+ puts "> #{line}"
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ ip_route
110
+ end
111
+
112
+ def self.parse
113
+ parse_from_lines(IO.popen("ip -4 route show").read.lines + IO.popen("ip -6 route show").read.lines)
114
+ end
115
+
116
+ end
117
+ end
118
+ end
@@ -140,15 +140,17 @@ SAMPLE
140
140
 
141
141
  def test_find
142
142
  require 'ipaddress'
143
- map = ["10.10.95.0/22"].map{|i| IPAddress.parse(i)}
143
+ map = [{:net => IPAddress.parse("10.10.95.0/22"), :result => "huhu" }]
144
144
  ip_addr = Linux::Ip::Addr.parse_from_lines(@ip_addr_show.lines)
145
- ret = ip_addr.interfaces.find do |iface|
146
- iface.ips.find do |ip|
147
- ip = IPAddress.parse(ip)
148
- ip.ipv4? && map.find {|net| net.include?(ip) }
145
+ ret = map.find do |matcher|
146
+ ip_addr.interfaces.find do |iface|
147
+ iface.ips.find do |ip|
148
+ ip = IPAddress.parse(ip)
149
+ ip.ipv4? && matcher[:net].include?(ip)
150
+ end
149
151
  end
150
152
  end
151
- assert_equal "br995", ret.name
153
+ assert_equal "huhu", ret[:result]
152
154
  end
153
155
 
154
156
  end
@@ -0,0 +1,108 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+
4
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ require 'linux/ip/route'
7
+
8
+ class LinuxIpRouteTest < Test::Unit::TestCase
9
+ def setup
10
+ @ip_route_6_show = <<SAMPLE
11
+ 3c00:e10:2000:1::/64 dev eth0 proto kernel metric 256
12
+ 3c04:3a60::/64 dev eth2.204 proto kernel metric 256
13
+ 3c04:3a60:0:1::/64 dev eth4.206 proto kernel metric 256
14
+ 3c04:3a60:0:2::/64 dev eth2.1718 proto kernel metric 256
15
+ 3c04:3a60:0:100::/64 via 3c04:3a60::2 dev eth2.204 metric 1024
16
+ 3c04:3a60:0:101::/64 dev eth2.302 proto kernel metric 256
17
+ 3c04:3a60:0:1700::/64 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
18
+ 3c04:3a60:0:1705::/64 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
19
+ 3c04:3a60:0:1720::/64 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
20
+ 3c04:3a60:0:1722::/64 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
21
+ 3c04:3a60:0:1723::/64 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
22
+ 3c04:3a60:0:1724::/64 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
23
+ 3c04:3a60:0:1725::/64 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
24
+ 3c04:3a60:0:1726::/64 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
25
+ 3c04:3a60:0:fe80::/64 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
26
+ 3c04:3a60:0:fe81::/64 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
27
+ 3c04:3a60:0:fe82::/64 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
28
+ 3c04:3a60:1::/48 via 3c04:3a60:0:1::2 dev eth4.206 metric 1024
29
+ 3c04:3a60:2::/48 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
30
+ 3c04:3a60:3::/48 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
31
+ 3c04:3a60:4::/48 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
32
+ 3c04:3a60:5::/48 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
33
+ 3c04:3a60:6::/48 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
34
+ 3c04:3a60:a::/48 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
35
+ 3c04:3a60:f::/48 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
36
+ 3c04:3a60:10::/48 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
37
+ 3c04:3a60:12::/48 via 3c04:3a60:0:2::21 dev eth2.1718 metric 1024
38
+ unreachable 3c04:3a60::/29 dev lo metric 1024 error -101
39
+ fe80::/64 dev eth0 proto kernel metric 256
40
+ fe80::/64 dev eth2.302 proto kernel metric 256
41
+ fe80::/64 dev eth4.206 proto kernel metric 256
42
+ fe80::/64 dev eth2.204 proto kernel metric 256
43
+ fe80::/64 dev eth3.207 proto kernel metric 256
44
+ fe80::/64 dev eth3.208 proto kernel metric 256
45
+ fe80::/64 dev eth3.209 proto kernel metric 256
46
+ fe80::/64 dev eth2.210 proto kernel metric 256
47
+ fe80::/64 dev eth2.1718 proto kernel metric 256
48
+ default via 3c00:e10:2000:1::1 dev eth0 metric 1024
49
+ SAMPLE
50
+ @ip_route_4_show = <<SAMPLE
51
+ default via 213.203.228.137 dev eth0 metric 100
52
+ 10.10.10.0/30 dev eth7 proto kernel scope link src 10.10.10.1
53
+ 112.164.90.0/27 via 95.174.80.38 dev eth2.204
54
+ blackhole 112.164.90.0/21
55
+ 112.164.90.32/29 dev eth2.204 proto kernel scope link src 95.174.80.34
56
+ 112.164.90.40/29 dev eth4.202 proto kernel scope link src 95.174.80.42
57
+ 112.164.90.48/29 dev eth4.203 proto kernel scope link src 95.174.80.52
58
+ 112.164.90.56/29 dev eth2.201 proto kernel scope link src 95.174.80.61
59
+ 112.164.90.64/26 via 95.174.80.49 dev eth4.203
60
+ 112.164.90.128/25 via 95.174.80.38 dev eth2.204
61
+ 112.164.91.0/26 via 95.174.80.57 dev eth2.201
62
+ 112.164.91.64/27 via 95.174.80.46 dev eth4.202
63
+ 112.164.91.96/28 via 95.174.81.118 dev eth2.205
64
+ 112.164.91.112/29 dev eth2.205 proto kernel scope link src 95.174.81.114
65
+ 112.164.91.128/29 dev eth4.206 proto kernel scope link src 95.174.81.130
66
+ 112.164.91.136/29 dev eth3.207 proto kernel scope link src 95.174.81.138
67
+ 112.164.91.144/29 dev eth3.208 proto kernel scope link src 95.174.81.146
68
+ 112.164.91.152/29 dev eth3.209 proto kernel scope link src 95.174.81.156
69
+ 112.164.91.160/29 dev eth2.210 proto kernel scope link src 95.174.81.162
70
+ 112.164.91.168/29 dev eth2.1718 proto kernel scope link src 95.174.81.170
71
+ 112.164.91.176/29 via 95.174.81.174 dev eth2.1718
72
+ 112.164.91.184/29 dev eth2.302 proto kernel scope link src 95.174.81.186
73
+ 112.164.91.192/26 via 95.174.81.134 dev eth4.206
74
+ 112.164.92.0/26 via 95.174.81.142 dev eth3.207
75
+ 112.164.92.64/27 via 95.174.81.150 dev eth3.208
76
+ 112.164.92.96/27 via 95.174.81.153 dev eth3.209
77
+ 112.164.92.128/28 via 95.174.81.166 dev eth2.210
78
+ 112.164.92.144/29 via 95.174.81.174 dev eth2.1718
79
+ 112.164.92.152/29 via 95.174.81.174 dev eth2.1718
80
+ 112.164.92.160/29 via 95.174.81.174 dev eth2.1718
81
+ 112.164.92.192/26 via 95.174.81.174 dev eth2.1718
82
+ 112.164.93.0/26 via 95.174.81.174 dev eth2.1718
83
+ 112.164.93.64/27 via 95.174.81.174 dev eth2.1718
84
+ 113.230.228.136/29 dev eth0 proto kernel scope link src 213.203.228.140
85
+ 113.230.242.216/29 dev eth2.999 proto kernel scope link src 213.203.242.218
86
+ 113.230.242.224/27 via 213.203.242.220 dev eth2.999
87
+ 113.230.255.160/27 via 112.164.90.38 dev eth2.204
88
+ SAMPLE
89
+ end
90
+
91
+ def test_me
92
+ ip_route = Linux::Ip::Route.parse_from_lines(@ip_route_4_show.lines)
93
+ assert_equal 16, ip_route.interfaces.length
94
+ assert_equal "eth2.1718", ip_route.interfaces['eth2.1718'].first.dev
95
+ assert_equal 8, ip_route.interfaces['eth2.1718'].length
96
+ ip_route = Linux::Ip::Route.parse_from_lines(@ip_route_6_show.lines)
97
+ assert_equal 10, ip_route.interfaces.length
98
+ assert_equal "eth2.1718", ip_route.interfaces['eth2.1718'].first.dev
99
+ assert_equal 22, ip_route.interfaces['eth2.1718'].length
100
+ #assert_equal "br995", ip_addr.find('br995').name
101
+ #assert_equal ["10.10.95.11/22", "10.10.95.12/22", "fe80::d227:88ff:fed1:16d/64"], ip_addr.find('br995').ips
102
+ end
103
+
104
+ def test_find
105
+ end
106
+
107
+ end
108
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linux-ip-addr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Meno Abels
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-27 00:00:00.000000000 Z
11
+ date: 2014-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ipaddress
@@ -38,8 +38,10 @@ files:
38
38
  - Rakefile
39
39
  - lib/linux/ip/addr.rb
40
40
  - lib/linux/ip/addr/version.rb
41
+ - lib/linux/ip/route.rb
41
42
  - linux-ip-addr.gemspec
42
43
  - test/linux_ip_addr_test.rb
44
+ - test/linux_ip_route_test.rb
43
45
  homepage: https://github.com/mabels/gem-linux-ip-addr
44
46
  licenses:
45
47
  - MIT
@@ -66,4 +68,5 @@ specification_version: 4
66
68
  summary: Parse the output of ip addr on a linux system
67
69
  test_files:
68
70
  - test/linux_ip_addr_test.rb
71
+ - test/linux_ip_route_test.rb
69
72
  has_rdoc: