linux-ip 0.0.8
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 +7 -0
- data/Gemfile +4 -0
- data/Rakefile +2 -0
- data/lib/linux/ip/addr.rb +82 -0
- data/lib/linux/ip/route.rb +127 -0
- data/lib/linux/ip/version.rb +5 -0
- data/linux-ip.gemspec +23 -0
- data/test/linux_ip_addr_test.rb +170 -0
- data/test/linux_ip_route_test.rb +121 -0
- metadata +69 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5455286d6569e68731b345a81198606690501a71
|
4
|
+
data.tar.gz: 44c4e58a2b1ed135face3fcedf42618bd179d172
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2858983a68b5b829ee78ce9226de3d30b9aaa515fe879d8c231634e2512feba0d73cc724197a545b10012e0975c7f9d8727c22e0ff14860181c2e3524a7d8a75
|
7
|
+
data.tar.gz: 0f85cbf5553d5cc2c96cb73e2925a5955d777b1e9d634495b61de85eeae2964eb8f229d1c2d881f39ebc9b5aadf5b9e82ae87113b2f3a51362f7f86d6c87c9b3
|
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
require_relative "version.rb"
|
2
|
+
|
3
|
+
module Linux
|
4
|
+
module Ip
|
5
|
+
module Addr
|
6
|
+
|
7
|
+
class Interface
|
8
|
+
attr_accessor :mac_address
|
9
|
+
attr_reader :ips, :name
|
10
|
+
def initialize(name)
|
11
|
+
@name = name
|
12
|
+
@ips = []
|
13
|
+
end
|
14
|
+
def add_ip(ip)
|
15
|
+
@ips << ip
|
16
|
+
self
|
17
|
+
end
|
18
|
+
def as_commands(direction)
|
19
|
+
@ips.map do |ip|
|
20
|
+
"ip addr #{direction} #{ip} dev #{name}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
class IpAddr
|
27
|
+
attr_reader :interfaces
|
28
|
+
def initialize
|
29
|
+
@interfaces = []
|
30
|
+
end
|
31
|
+
def length
|
32
|
+
interfaces.length
|
33
|
+
end
|
34
|
+
def find(name)
|
35
|
+
interfaces.find { |i| i.name == name }
|
36
|
+
end
|
37
|
+
def as_commands(direction="add")
|
38
|
+
@interfaces.map do |interface|
|
39
|
+
interface.as_commands(direction)
|
40
|
+
end.flatten.compact
|
41
|
+
end
|
42
|
+
def execute_add
|
43
|
+
system as_commands("add")
|
44
|
+
end
|
45
|
+
def execute_del
|
46
|
+
system as_commands("del")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
#23: br202: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
|
52
|
+
# link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
53
|
+
# inet 10.10.103.11/22 brd 10.10.103.255 scope global br202
|
54
|
+
# valid_lft forever preferred_lft forever
|
55
|
+
# inet6 fe80::84c6:95ff:feb7:d76d/64 scope link
|
56
|
+
# valid_lft forever preferred_lft forever
|
57
|
+
def self.parse_from_lines(lines)
|
58
|
+
ip_addr = IpAddr.new
|
59
|
+
iface = nil
|
60
|
+
lines.each do |line|
|
61
|
+
line = line.strip.chomp
|
62
|
+
if line =~ /^\d+:\s+(\S+):\s+(.*)$/
|
63
|
+
iface = Interface.new($1.split('@')[0])
|
64
|
+
ip_addr.interfaces << iface
|
65
|
+
elsif iface
|
66
|
+
if line =~ /^\s*link\/ether\s+([a-f0-9:]+)\s+.*$/
|
67
|
+
iface.mac_address = $1
|
68
|
+
elsif line =~ /^\s*inet[6]*\s+([0-9a-f\:\.\/]+)\s+.*$/
|
69
|
+
iface.add_ip($1)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
ip_addr
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.parse
|
77
|
+
parse_from_lines(IO.popen("ip addr show").read.lines)
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require_relative "version"
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
module Linux
|
5
|
+
module Ip
|
6
|
+
module Route
|
7
|
+
|
8
|
+
class IpRoute
|
9
|
+
attr_reader :interfaces, :routes
|
10
|
+
def initialize
|
11
|
+
@interfaces = {}
|
12
|
+
@routes = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def as_commands(direction = 'add')
|
16
|
+
@routes.map do |route|
|
17
|
+
route.as_commands(direction)
|
18
|
+
end.flatten.compact.join("\n")
|
19
|
+
end
|
20
|
+
|
21
|
+
def execute_add
|
22
|
+
system as_commands("add")
|
23
|
+
end
|
24
|
+
def execute_del
|
25
|
+
system as_commands("del")
|
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
|
+
def as_ip
|
33
|
+
"" # there is some to do
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class ViaRoute
|
38
|
+
attr_reader :dst, :via, :dev, :options
|
39
|
+
def initialize(dst, via, dev, options)
|
40
|
+
@dst = dst
|
41
|
+
@via = via
|
42
|
+
@dev = dev
|
43
|
+
@options = options
|
44
|
+
end
|
45
|
+
def as_commands(direction)
|
46
|
+
"ip route #{direction} #{dst} via #{via} #{options.as_ip}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
def add_via(dev, dst, via, options = "")
|
50
|
+
@interfaces[dev] ||= []
|
51
|
+
route = ViaRoute.new(dst, via, dev, Options.new(options))
|
52
|
+
@interfaces[dev] << route
|
53
|
+
@routes << route
|
54
|
+
end
|
55
|
+
|
56
|
+
class IfaceRoute
|
57
|
+
attr_reader :dst, :dev, :options
|
58
|
+
def initialize(dst, dev, options)
|
59
|
+
@dst = dst
|
60
|
+
@dev = dev
|
61
|
+
@options = options
|
62
|
+
end
|
63
|
+
def as_commands(direction)
|
64
|
+
"ip route #{direction} #{dst} dev #{dev} #{options.as_ip}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
def add_dev(dev, dst, options)
|
68
|
+
@interfaces[dev] ||= []
|
69
|
+
route = IfaceRoute.new(dst, dev, Options.new(options))
|
70
|
+
@interfaces[dev] << route
|
71
|
+
@routes << route
|
72
|
+
end
|
73
|
+
|
74
|
+
def length
|
75
|
+
interfaces.length
|
76
|
+
end
|
77
|
+
def find(name)
|
78
|
+
interfaces.find { |i| i.name == name }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
#23: br202: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
|
83
|
+
# link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
84
|
+
# inet 10.10.103.11/22 brd 10.10.103.255 scope global br202
|
85
|
+
# valid_lft forever preferred_lft forever
|
86
|
+
# inet6 fe80::84c6:95ff:feb7:d76d/64 scope link
|
87
|
+
# valid_lft forever preferred_lft forever
|
88
|
+
def self.parse_from_lines(lines)
|
89
|
+
ip_route = IpRoute.new
|
90
|
+
iface = nil
|
91
|
+
lines.each do |line|
|
92
|
+
line = line.strip.chomp
|
93
|
+
dev_m = /^([0-9a-fA-F\.\:\/]+)\s+dev\s+([a-z0-9\.]+)\s*(.*)$/.match(line)
|
94
|
+
if dev_m
|
95
|
+
#puts "Dev #{dev_m[2]} -> #{dev_m.inspect}"
|
96
|
+
ip_route.add_dev(dev_m[2], dev_m[1], dev_m[3])
|
97
|
+
else
|
98
|
+
via_m = /^([0-9a-fA-F\.\:\/]+|default)\s+via\s+([a-z0-9\.\:]+)\s+dev\s+([a-z0-9\.]+)\s*(.*)$/.match(line)
|
99
|
+
if via_m
|
100
|
+
#puts "Via #{via_m[3]} -> #{via_m.inspect}"
|
101
|
+
ip_route.add_via(via_m[3], via_m[1], via_m[2], via_m[4])
|
102
|
+
else
|
103
|
+
direct_m = /^(blackhole)\s+([0-9a-fA-F\.\:\/]+)$/.match(line)
|
104
|
+
if direct_m
|
105
|
+
ip_route.add_via(direct_m[1], direct_m[2], nil, "")
|
106
|
+
else
|
107
|
+
# unreachable 2a04:2f80::/29 dev lo metric 1024 error -101
|
108
|
+
unreachable_m = /^(unreachable)\s+([0-9a-fA-F\.\:\/]+)\s+dev\s+([a-z0-9\.]+)\s+(.*)$/.match(line)
|
109
|
+
if unreachable_m
|
110
|
+
ip_route.add_dev(unreachable_m[3], unreachable_m[2], unreachable_m[1]+" "+unreachable_m[4])
|
111
|
+
else
|
112
|
+
puts "> #{line}"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
ip_route
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.parse
|
122
|
+
parse_from_lines(IO.popen("ip -4 route show").read.lines.to_a + IO.popen("ip -6 route show").read.lines.to_a)
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
data/linux-ip.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'linux/ip/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "linux-ip"
|
8
|
+
spec.version = Linux::Ip::VERSION
|
9
|
+
spec.authors = ["Meno Abels"]
|
10
|
+
spec.email = ["meno.abels@adviser.com"]
|
11
|
+
spec.summary = %q{Parse the output of ip addr on a linux system}
|
12
|
+
spec.description = %q{Parse the output of ip addr on a linux system}
|
13
|
+
spec.homepage = "https://github.com/mabels/linux-ip-parser"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# spec.add_development_dependency "rake", "~> 10.0"
|
22
|
+
spec.add_development_dependency "ipaddress", "~> 0.8"
|
23
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
|
5
|
+
$LOAD_PATH.unshift(File.join(Dir.pwd, File.dirname(__FILE__)))
|
6
|
+
$LOAD_PATH.unshift(File.join(Dir.pwd, File.dirname(File.dirname(__FILE__)), 'lib'))
|
7
|
+
require 'linux/ip/addr'
|
8
|
+
|
9
|
+
class LinuxIpAddrTest < Test::Unit::TestCase
|
10
|
+
def setup
|
11
|
+
@ip_addr_show = <<SAMPLE
|
12
|
+
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
|
13
|
+
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
14
|
+
inet 127.0.0.1/8 scope host lo
|
15
|
+
valid_lft forever preferred_lft forever
|
16
|
+
inet6 ::1/128 scope host
|
17
|
+
valid_lft forever preferred_lft forever
|
18
|
+
2: p1p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
|
19
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
20
|
+
inet6 fe80::d227:88ff:fed1:16d/64 scope link
|
21
|
+
valid_lft forever preferred_lft forever
|
22
|
+
3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
|
23
|
+
link/ether 36:1b:a1:ba:73:54 brd ff:ff:ff:ff:ff:ff
|
24
|
+
4: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
|
25
|
+
link/ether 74:e5:0b:d7:9d:44 brd ff:ff:ff:ff:ff:ff
|
26
|
+
5: p1p1.1507@p1p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br1507 state UP group default
|
27
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
28
|
+
inet6 fe80::d227:88ff:fed1:16d/64 scope link
|
29
|
+
valid_lft forever preferred_lft forever
|
30
|
+
6: p1p1.995@p1p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br995 state UP group default
|
31
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
32
|
+
inet6 fe80::d227:88ff:fed1:16d/64 scope link
|
33
|
+
valid_lft forever preferred_lft forever
|
34
|
+
7: br1507: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
|
35
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
36
|
+
inet 126.69.140.182/26 brd 126.96.140.191 scope global br1507
|
37
|
+
valid_lft forever preferred_lft forever
|
38
|
+
inet6 fe80::d227:88ff:fed1:16d/64 scope link
|
39
|
+
valid_lft forever preferred_lft forever
|
40
|
+
8: br995: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
|
41
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
42
|
+
inet 10.10.95.11/22 brd 10.10.95.255 scope global br995
|
43
|
+
valid_lft forever preferred_lft forever
|
44
|
+
inet 10.10.95.12/22 scope global secondary br995
|
45
|
+
valid_lft forever preferred_lft forever
|
46
|
+
inet6 fe80::d227:88ff:fed1:16d/64 scope link
|
47
|
+
valid_lft forever preferred_lft forever
|
48
|
+
9: gre0: <NOARP> mtu 1476 qdisc noop state DOWN group default
|
49
|
+
link/gre 169.254.10.9 brd 169.254.10.10
|
50
|
+
10: gretap0: <BROADCAST,MULTICAST> mtu 1476 qdisc noop state DOWN group default qlen 1000
|
51
|
+
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
|
52
|
+
11: gt0@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default
|
53
|
+
link/gre 169.254.10.1 peer 169.254.10.2
|
54
|
+
inet 169.254.10.1/30 brd 169.254.10.3 scope global gt0
|
55
|
+
valid_lft forever preferred_lft forever
|
56
|
+
inet6 fe80::5efe:a9fe:a01/64 scope link
|
57
|
+
valid_lft forever preferred_lft forever
|
58
|
+
12: gt1@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default
|
59
|
+
link/gre 169.254.10.5 peer 169.254.10.6
|
60
|
+
inet 169.254.10.5/30 brd 169.254.10.7 scope global gt1
|
61
|
+
valid_lft forever preferred_lft forever
|
62
|
+
inet6 fe80::5efe:a9fe:a05/64 scope link
|
63
|
+
valid_lft forever preferred_lft forever
|
64
|
+
13: gtmia@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default
|
65
|
+
link/gre 169.254.10.9 peer 169.254.10.10
|
66
|
+
inet 169.254.10.9/30 brd 169.254.10.11 scope global gtmia
|
67
|
+
valid_lft forever preferred_lft forever
|
68
|
+
inet6 fe80::5efe:a9fe:a09/64 scope link
|
69
|
+
valid_lft forever preferred_lft forever
|
70
|
+
14: p1p1.110@p1p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br110 state UP group default
|
71
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
72
|
+
inet6 fe80::d227:88ff:fed1:16d/64 scope link
|
73
|
+
valid_lft forever preferred_lft forever
|
74
|
+
15: p1p1.201@p1p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br201 state UP group default
|
75
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
76
|
+
inet6 fe80::d227:88ff:fed1:16d/64 scope link
|
77
|
+
valid_lft forever preferred_lft forever
|
78
|
+
16: p1p1.202@p1p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br202 state UP group default
|
79
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
80
|
+
inet6 fe80::d227:88ff:fed1:16d/64 scope link
|
81
|
+
valid_lft forever preferred_lft forever
|
82
|
+
17: p1p1.402@p1p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br402 state UP group default
|
83
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
84
|
+
inet6 fe80::d227:88ff:fed1:16d/64 scope link
|
85
|
+
valid_lft forever preferred_lft forever
|
86
|
+
18: p1p1.997@p1p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br997 state UP group default
|
87
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
88
|
+
inet6 fe80::d227:88ff:fed1:16d/64 scope link
|
89
|
+
valid_lft forever preferred_lft forever
|
90
|
+
19: br110: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
|
91
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
92
|
+
inet 10.1.0.11/16 brd 10.1.255.255 scope global br110
|
93
|
+
valid_lft forever preferred_lft forever
|
94
|
+
inet6 fe80::1046:faff:feed:ca96/64 scope link
|
95
|
+
valid_lft forever preferred_lft forever
|
96
|
+
20: br201: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
|
97
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
98
|
+
inet 10.10.16.11/22 brd 10.10.19.255 scope global br201
|
99
|
+
valid_lft forever preferred_lft forever
|
100
|
+
inet6 fe80::50ac:36ff:fe1b:24e8/64 scope link
|
101
|
+
valid_lft forever preferred_lft forever
|
102
|
+
21: br402: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
|
103
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
104
|
+
inet 10.10.99.11/22 brd 10.10.99.255 scope global br402
|
105
|
+
valid_lft forever preferred_lft forever
|
106
|
+
inet6 fe80::f41f:71ff:fe45:2e3b/64 scope link
|
107
|
+
valid_lft forever preferred_lft forever
|
108
|
+
22: br997: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
|
109
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
110
|
+
inet 17.110.59.53/26 brd 17.110.59.63 scope global br997
|
111
|
+
valid_lft forever preferred_lft forever
|
112
|
+
inet6 fe80::408e:b9ff:fe81:d1f2/64 scope link
|
113
|
+
valid_lft forever preferred_lft forever
|
114
|
+
23: br202: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
|
115
|
+
link/ether d0:27:88:d1:01:6d brd ff:ff:ff:ff:ff:ff
|
116
|
+
inet 10.10.103.11/22 brd 10.10.103.255 scope global br202
|
117
|
+
valid_lft forever preferred_lft forever
|
118
|
+
inet6 fe80::84c6:95ff:feb7:d76d/64 scope link
|
119
|
+
valid_lft forever preferred_lft forever
|
120
|
+
30: tun2: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
|
121
|
+
link/none
|
122
|
+
inet 10.153.66.129 peer 10.153.66.130/32 scope global tun2
|
123
|
+
valid_lft forever preferred_lft forever
|
124
|
+
31: tun1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
|
125
|
+
link/none
|
126
|
+
inet 10.153.65.1 peer 10.153.65.2/32 scope global tun1
|
127
|
+
valid_lft forever preferred_lft forever
|
128
|
+
32: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
|
129
|
+
link/none
|
130
|
+
inet 10.153.65.129 peer 10.153.65.130/32 scope global tun0
|
131
|
+
valid_lft forever preferred_lft forever
|
132
|
+
SAMPLE
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_me
|
136
|
+
ip_addr = Linux::Ip::Addr.parse_from_lines(@ip_addr_show.lines)
|
137
|
+
assert_equal 26, ip_addr.length
|
138
|
+
assert_equal "br995", ip_addr.find('br995').name
|
139
|
+
assert_equal ["10.10.95.11/22", "10.10.95.12/22", "fe80::d227:88ff:fed1:16d/64"], ip_addr.find('br995').ips
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_find
|
143
|
+
require 'ipaddress'
|
144
|
+
map = [{:net => IPAddress.parse("10.10.95.0/22"), :result => "huhu" }]
|
145
|
+
ip_addr = Linux::Ip::Addr.parse_from_lines(@ip_addr_show.lines)
|
146
|
+
ret = map.find do |matcher|
|
147
|
+
ip_addr.interfaces.find do |iface|
|
148
|
+
iface.ips.find do |ip|
|
149
|
+
ip = IPAddress.parse(ip)
|
150
|
+
ip.ipv4? && matcher[:net].include?(ip)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
assert_equal "huhu", ret[:result]
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_as_commands
|
158
|
+
ip_addr = Linux::Ip::Addr.parse_from_lines(@ip_addr_show.lines)
|
159
|
+
assert ip_addr.as_commands("add").include?("ip addr add fe80::d227:88ff:fed1:16d/64 dev p1p1.402")
|
160
|
+
assert ip_addr.as_commands("del").include?("ip addr del 10.1.0.11/16 dev br110")
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_from_scratch
|
164
|
+
ip_addr = Linux::Ip::Addr::IpAddr.new
|
165
|
+
ip_addr.interfaces << Linux::Ip::Addr::Interface.new("eth0").add_ip("47.11.1.1/26")
|
166
|
+
assert ip_addr.as_commands("del").include?("ip addr del 47.11.1.1/26 dev eth0")
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift(File.join(Dir.pwd, File.dirname(__FILE__)))
|
5
|
+
$LOAD_PATH.unshift(File.join(Dir.pwd, File.dirname(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
|
+
def test_as_command
|
108
|
+
ip_route = Linux::Ip::Route.parse_from_lines(@ip_route_4_show.lines)
|
109
|
+
assert ip_route.as_commands("del").include?("ip route del 112.164.91.136/29 dev eth3.207")
|
110
|
+
ip_route = Linux::Ip::Route.parse_from_lines(@ip_route_6_show.lines)
|
111
|
+
assert ip_route.as_commands("add").include?("ip route add 3c04:3a60:0:fe82::/64 via 3c04:3a60:0:2::21")
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_from_scratch
|
115
|
+
ip_route = Linux::Ip::Route::IpRoute.new
|
116
|
+
ip_route.add_via("eth0", "0.0.0.0/0", "47.11.1.1")
|
117
|
+
assert ip_route.as_commands("add").include?("ip route add 0.0.0.0/0 via 47.11.1.1")
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: linux-ip
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.8
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Meno Abels
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-05-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ipaddress
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.8'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.8'
|
27
|
+
description: Parse the output of ip addr on a linux system
|
28
|
+
email:
|
29
|
+
- meno.abels@adviser.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- Gemfile
|
35
|
+
- Rakefile
|
36
|
+
- lib/linux/ip/addr.rb
|
37
|
+
- lib/linux/ip/route.rb
|
38
|
+
- lib/linux/ip/version.rb
|
39
|
+
- linux-ip.gemspec
|
40
|
+
- test/linux_ip_addr_test.rb
|
41
|
+
- test/linux_ip_route_test.rb
|
42
|
+
homepage: https://github.com/mabels/linux-ip-parser
|
43
|
+
licenses:
|
44
|
+
- MIT
|
45
|
+
metadata: {}
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
requirements: []
|
61
|
+
rubyforge_project:
|
62
|
+
rubygems_version: 2.0.14.1
|
63
|
+
signing_key:
|
64
|
+
specification_version: 4
|
65
|
+
summary: Parse the output of ip addr on a linux system
|
66
|
+
test_files:
|
67
|
+
- test/linux_ip_addr_test.rb
|
68
|
+
- test/linux_ip_route_test.rb
|
69
|
+
has_rdoc:
|