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 +4 -4
- data/lib/linux/ip/addr.rb +1 -1
- data/lib/linux/ip/addr/version.rb +1 -1
- data/lib/linux/ip/route.rb +118 -0
- data/test/linux_ip_addr_test.rb +8 -6
- data/test/linux_ip_route_test.rb +108 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 025c233110ff3cb81d15e49c41deeadc37f43aef
|
4
|
+
data.tar.gz: 5f9574af347c0215a8d7dca5ac94e9a5db64739d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 79bca66d01ab74ac31a727168a3bba82015dbb772182ac5d89ed16d1c03470469b8a11018f4f0eaf161f1b1d750e11dbff3a8af8f6199dd1203fd3a2a332b583
|
7
|
+
data.tar.gz: 12932781e116dee601bc42e85dcf1a21d160a98e5fdf2b1c2081e856b50bcefbd94cadf167ed78a8b12edd5088676cd0dea394555fc051dec148cd8bf10065d8
|
data/lib/linux/ip/addr.rb
CHANGED
@@ -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*
|
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)
|
@@ -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
|
data/test/linux_ip_addr_test.rb
CHANGED
@@ -140,15 +140,17 @@ SAMPLE
|
|
140
140
|
|
141
141
|
def test_find
|
142
142
|
require 'ipaddress'
|
143
|
-
map = ["10.10.95.0/22"
|
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 =
|
146
|
-
|
147
|
-
|
148
|
-
|
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 "
|
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.
|
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
|
+
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:
|