irrc 0.1.0

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.
@@ -0,0 +1,193 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Whois as-set resolution' do
4
+ include_context 'whois queries'
5
+
6
+ context 'When FQDN specified for Whois server' do
7
+ subject { send_query(whois_fqdn, 'AS-JPNIC') }
8
+
9
+ it 'returns ipv4 and ipv6 prefixes by default' do
10
+ expect(subject['AS-JPNIC'][:ipv4]['AS2515']).to include '192.41.192.0/24', '202.12.30.0/24',
11
+ '211.120.240.0/21', '211.120.248.0/24'
12
+ expect(subject['AS-JPNIC'][:ipv6]['AS2515']).to include '2001:dc2::/32', '2001:0fa0::/32'
13
+ end
14
+ end
15
+
16
+ context 'When a name specified for Whois server' do
17
+ subject { send_query(whois, as_set) }
18
+
19
+ it 'returns the same result as if the FQDN specified' do
20
+ expect(subject).to eq send_query(whois_fqdn, as_set)
21
+ end
22
+ end
23
+
24
+ it 'gently closes connections to Whois server' do
25
+ expect_any_instance_of(Irrc::Whoisd::Client).to receive(:close)
26
+ send_query(whois_fqdn, as_set)
27
+ end
28
+
29
+ describe 'Fintering by Authoritative Whois server' do
30
+ subject { send_query(:jpirr, 'AS-JPNIC', source: :apnic) }
31
+
32
+ it 'returns nothing' do
33
+ expect(subject).to eq({})
34
+ end
35
+ end
36
+
37
+ context 'When as-set resolution is done but something wrong while further processes' do
38
+ subject { send_query(whois, as_set) }
39
+ before do
40
+ allow_any_instance_of(Irrc::Whoisd::Client).to receive(:resolve_prefixes_from_aut_nums){ raise }
41
+ end
42
+
43
+ it 'ignores a halfway result' do
44
+ expect(subject).to eq({})
45
+ end
46
+ end
47
+
48
+ context 'When only ipv4 is specified for protocol' do
49
+ subject { send_query(whois, as_set, protocol: :ipv4) }
50
+
51
+ it 'returns nothing about ipv6' do
52
+ expect(subject[as_set][:ipv6]).to be_nil
53
+ end
54
+ end
55
+
56
+ context 'When nil specified for protocol' do
57
+ subject { send_query(whois, as_set, protocol: nil) }
58
+
59
+ it 'returns nothing about the as-set' do
60
+ expect(subject[as_set]).to eq({})
61
+ end
62
+ end
63
+
64
+ context 'When blank protocol specified' do
65
+ subject { send_query(whois, as_set, protocol: []) }
66
+
67
+ it 'returns nothing about the as-set' do
68
+ expect(subject[as_set]).to eq({})
69
+ end
70
+ end
71
+
72
+ context 'When an invalid protocol specified' do
73
+ subject { send_query(whois, as_set, protocol: :invalid) }
74
+
75
+ it 'reports an ArgumentError' do
76
+ expect { subject }.to raise_error ArgumentError
77
+ end
78
+ end
79
+
80
+ context 'When a non-mirrored server specified for authoritative Whois server' do
81
+ subject { send_query(whois, as_set, source: :outsider) }
82
+
83
+ it 'returns nothing' do
84
+ expect(subject).to eq({})
85
+ end
86
+ end
87
+
88
+ context 'When nil specified for authoritative Whois server' do
89
+ subject { send_query(whois, as_set, source: nil) }
90
+
91
+ it 'returns a result without any filter of authoritative Whois server' do
92
+ expect(subject).to eq send_query(whois, as_set)
93
+ end
94
+ end
95
+
96
+ context 'When blank authoritative Whois server specified' do
97
+ subject { send_query(whois, as_set, source: []) }
98
+
99
+ it 'returns a result without any filter of authoritative Whois server' do
100
+ expect(subject).to eq send_query(whois, as_set)
101
+ end
102
+ end
103
+
104
+ context 'When non-existent Whois object specified' do
105
+ subject { send_query(whois, 'AS-NON-EXISTENT') }
106
+
107
+ it 'ignores the Whois error' do
108
+ expect(subject).to eq({})
109
+ end
110
+ end
111
+
112
+ context 'When invalid Whois server name specified' do
113
+ subject { send_query(:invalid, as_set) }
114
+
115
+ it 'reports an error' do
116
+ expect { subject }.to raise_error
117
+ end
118
+ end
119
+
120
+ context 'When non-resolvable Whois server fqdn specified' do
121
+ subject { send_query('non-resolvable.localdomain', as_set) }
122
+
123
+ it 'reports an error' do
124
+ expect { subject }.to raise_error
125
+ end
126
+ end
127
+
128
+ context 'When unreachable Whois server specified' do
129
+ subject { send_query('192.0.2.1', as_set) }
130
+
131
+ it 'reports an error' do
132
+ expect { subject }.to raise_error
133
+ end
134
+ end
135
+
136
+ context 'When specifing an Whois server out of service' do
137
+ subject { send_query('127.0.0.1', as_set) }
138
+
139
+ it 'reports an error' do
140
+ expect { subject }.to raise_error
141
+ end
142
+ end
143
+
144
+ describe 'NOTE: These may fail due to Whois database changes, not code. Check Whois database if fails.' do
145
+ describe 'route-set' do
146
+ subject { send_query(whois, 'RS-RC-26462') }
147
+
148
+ it 'returns the same result as Whois database' do
149
+ expect(subject['RS-RC-26462']).to eq(
150
+ {:ipv4=>{nil=>["137.238.0.0/16"]}, :ipv6=>{nil=>["2620:0:5080::/48"]}}
151
+ )
152
+ end
153
+ end
154
+
155
+ describe 'nested as-set' do
156
+ subject { send_query(whois, 'AS-PDOXUPLINKS', source: :apnic) }
157
+
158
+ it 'returns the same result as Whois database' do
159
+ expect(subject['AS-PDOXUPLINKS']).to eq(
160
+ {:ipv4=>
161
+ {"AS703"=>[],
162
+ "AS1221"=>["155.143.128.0/17", "203.92.26.0/24"],
163
+ "AS2764"=>[],
164
+ "AS7474"=>[],
165
+ "AS7657"=>[],
166
+ "AS4565"=>[],
167
+ "AS5650"=>[],
168
+ "AS6461"=>[]},
169
+ :ipv6=>
170
+ {"AS703"=>[],
171
+ "AS1221"=>[],
172
+ "AS2764"=>[],
173
+ "AS7474"=>[],
174
+ "AS7657"=>[],
175
+ "AS4565"=>[],
176
+ "AS5650"=>[],
177
+ "AS6461"=>[]}}
178
+ )
179
+ end
180
+ end
181
+
182
+ describe 'nested route-set' do
183
+ subject { send_query(whois, 'RS-RR-COUDERSPORT') }
184
+
185
+ it 'returns the same result as Whois database' do
186
+ expect(subject['RS-RR-COUDERSPORT']).to eq(
187
+ {:ipv4=>{nil=>["71.74.32.0/20", "75.180.128.0/19", "107.14.160.0/20"]},
188
+ :ipv6=>{nil=>[]}}
189
+ )
190
+ end
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Whois Invalid object resolution' do
4
+ include_context 'whois queries'
5
+
6
+ describe 'Try as-jpnic with JPIRR' do
7
+ context 'When invalid object specified' do
8
+ subject { send_query(whois, 'INVALID') }
9
+
10
+ it "doesn't report an error" do
11
+ expect(subject['INVALID']).to eq({})
12
+ end
13
+ end
14
+
15
+ context 'When a blank String given for IRR object to resolve' do
16
+ subject { send_query(whois, '') }
17
+
18
+ it "doesn't report an error" do
19
+ expect(subject['']).to eq({})
20
+ end
21
+ end
22
+
23
+ context 'When nil given for IRR object to resolve' do
24
+ subject { send_query(whois, nil) }
25
+
26
+ it 'does nothing even reporting the error' do
27
+ expect_any_instance_of(Irrc::Whoisd::Client).not_to receive(:connect)
28
+ expect(subject).to eq({})
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,7 @@
1
+ require 'irrc'
2
+
3
+ Dir[File.expand_path('../support/**/*.rb', __FILE__)].each {|f| require f }
4
+
5
+ RSpec.configure do |config|
6
+ config.include QueryHelper
7
+ end
@@ -0,0 +1,12 @@
1
+ shared_context 'irr queries' do
2
+ let(:irr) { :jpirr }
3
+ let(:irr_fqdn) { 'jpirr.nic.ad.jp' }
4
+ let(:as_set) { 'AS-JPNIC' }
5
+ end
6
+
7
+ shared_context 'whois queries' do
8
+ let(:whois) { :apnic }
9
+ let(:whois_fqdn) { 'whois.apnic.net' }
10
+ let(:as_set) { 'AS-JPNIC' }
11
+ end
12
+
@@ -0,0 +1,7 @@
1
+ module QueryHelper
2
+ def send_query(host, object, *options)
3
+ client = Irrc::Client.new(1)
4
+ client.query(host, object, *options)
5
+ client.perform
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: irrc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Shintaro Kojima
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: irrc is a lightweight and flexible client of IRR / Whois Database to
42
+ expand arbitrary as-set and route-set objects into a list of origin ASs and prefixes
43
+ belonging to the ASs. It allows concurrent queries to IRR / Whois Databases for
44
+ performance.
45
+ email:
46
+ - goodies@codeout.net
47
+ executables:
48
+ - irrc
49
+ extensions: []
50
+ extra_rdoc_files: []
51
+ files:
52
+ - ".gitignore"
53
+ - ".rspec"
54
+ - ".travis.yml"
55
+ - Gemfile
56
+ - LICENSE
57
+ - README.md
58
+ - Rakefile
59
+ - bin/irrc
60
+ - irrc.gemspec
61
+ - lib/irrc.rb
62
+ - lib/irrc/cli.rb
63
+ - lib/irrc/cli/client.rb
64
+ - lib/irrc/cli/yaml_printer.rb
65
+ - lib/irrc/client.rb
66
+ - lib/irrc/connecting.rb
67
+ - lib/irrc/irr.rb
68
+ - lib/irrc/irrd.rb
69
+ - lib/irrc/irrd/api.rb
70
+ - lib/irrc/irrd/client.rb
71
+ - lib/irrc/logging.rb
72
+ - lib/irrc/parameter.rb
73
+ - lib/irrc/prefix.rb
74
+ - lib/irrc/query.rb
75
+ - lib/irrc/query_status.rb
76
+ - lib/irrc/runner.rb
77
+ - lib/irrc/socket.rb
78
+ - lib/irrc/subquery.rb
79
+ - lib/irrc/version.rb
80
+ - lib/irrc/whoisd.rb
81
+ - lib/irrc/whoisd/api.rb
82
+ - lib/irrc/whoisd/client.rb
83
+ - spec/features/irr_as_set_resolution_spec.rb
84
+ - spec/features/irr_invalid_object_resolution_spec.rb
85
+ - spec/features/whois_as_set_resolution_spec.rb
86
+ - spec/features/whois_invalid_object_resolution_spec.rb
87
+ - spec/spec_helper.rb
88
+ - spec/support/contexts.rb
89
+ - spec/support/query.rb
90
+ homepage: https://github.com/codeout/irrc
91
+ licenses:
92
+ - MIT
93
+ metadata: {}
94
+ post_install_message:
95
+ rdoc_options: []
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project:
110
+ rubygems_version: 2.2.2
111
+ signing_key:
112
+ specification_version: 4
113
+ summary: IRR / Whois client to expand as-set and route-set into a list of origin ASs
114
+ and prefixes
115
+ test_files:
116
+ - spec/features/irr_as_set_resolution_spec.rb
117
+ - spec/features/irr_invalid_object_resolution_spec.rb
118
+ - spec/features/whois_as_set_resolution_spec.rb
119
+ - spec/features/whois_invalid_object_resolution_spec.rb
120
+ - spec/spec_helper.rb
121
+ - spec/support/contexts.rb
122
+ - spec/support/query.rb
123
+ has_rdoc: