linux-ip-addr 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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: