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 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
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in linux-ip-parser.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -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
@@ -0,0 +1,5 @@
1
+ module Linux
2
+ module Ip
3
+ VERSION = "0.0.8"
4
+ end
5
+ 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: