arbor-atlas 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Binary file
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ gem "crack", ">= 0.1.8"
4
+
5
+ # Add dependencies to develop your gem here.
6
+ # Include everything needed to run rake, tests, features, etc.
7
+ group :development do
8
+ gem "shoulda", ">= 0"
9
+ gem "bundler", "~> 1.0.0"
10
+ gem "jeweler", "~> 1.5.2"
11
+ gem "rcov", ">= 0"
12
+ end
@@ -0,0 +1,22 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ crack (0.1.8)
5
+ git (1.2.5)
6
+ jeweler (1.5.2)
7
+ bundler (~> 1.0.0)
8
+ git (>= 1.2.5)
9
+ rake
10
+ rake (0.8.7)
11
+ rcov (0.9.9)
12
+ shoulda (2.11.3)
13
+
14
+ PLATFORMS
15
+ ruby
16
+
17
+ DEPENDENCIES
18
+ bundler (~> 1.0.0)
19
+ crack (>= 0.1.8)
20
+ jeweler (~> 1.5.2)
21
+ rcov
22
+ shoulda
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Chris Lee
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,19 @@
1
+ = arbor-atlas
2
+
3
+ Description goes here.
4
+
5
+ == Contributing to arbor-atlas
6
+
7
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
8
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
9
+ * Fork the project
10
+ * Start a feature/bugfix branch
11
+ * Commit and push until you are happy with your contribution
12
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2011 Chris Lee. See LICENSE.txt for
18
+ further details.
19
+
@@ -0,0 +1,54 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
+ gem.name = "arbor-atlas"
16
+ gem.homepage = "http://github.com/chrislee35/arbor-atlas"
17
+ gem.license = "MIT"
18
+ gem.summary = %Q{A very thin wrapper around Arbor Atlas' web interface}
19
+ gem.description = %Q{https://atlas.arbor.net}
20
+ gem.email = "rubygems@chrislee.dhs.org"
21
+ gem.authors = ["Chris Lee"]
22
+ # Include your dependencies below. Runtime dependencies are required when using your gem,
23
+ # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
24
+ gem.add_runtime_dependency "crack", ">= 0.1.8"
25
+ gem.signing_key = "#{File.dirname(__FILE__)}/../gem-private_key.pem"
26
+ gem.cert_chain = ["#{File.dirname(__FILE__)}/../gem-public_cert.pem"]
27
+ end
28
+ Jeweler::RubygemsDotOrgTasks.new
29
+
30
+ require 'rake/testtask'
31
+ Rake::TestTask.new(:test) do |test|
32
+ test.libs << 'lib' << 'test'
33
+ test.pattern = 'test/**/test_*.rb'
34
+ test.verbose = true
35
+ end
36
+
37
+ require 'rcov/rcovtask'
38
+ Rcov::RcovTask.new do |test|
39
+ test.libs << 'test'
40
+ test.pattern = 'test/**/test_*.rb'
41
+ test.verbose = true
42
+ end
43
+
44
+ task :default => :test
45
+
46
+ require 'rake/rdoctask'
47
+ Rake::RDocTask.new do |rdoc|
48
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
49
+
50
+ rdoc.rdoc_dir = 'rdoc'
51
+ rdoc.title = "arbor-atlas #{version}"
52
+ rdoc.rdoc_files.include('README*')
53
+ rdoc.rdoc_files.include('lib/**/*.rb')
54
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1 @@
1
+ require 'arbor-atlas/arbor-atlas'
@@ -0,0 +1,97 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+ require 'crack'
4
+
5
+ module Arbor
6
+ class Atlas
7
+ @@baseurl = "https://atlas.arbor.net"
8
+
9
+ attr_reader :cookie
10
+ def initialize(username, password)
11
+ params = {'name' => username, 'password' => password, 'referer' => @@baseurl+"/"}
12
+ @cookie = nil
13
+ _post("user/login",params)
14
+ end
15
+
16
+ def _post(path, params)
17
+ url = URI.parse "#{@@baseurl}/#{path}"
18
+ request = Net::HTTP::Post.new(url.path)
19
+ request.add_field("User-Agent", "Ruby/#{RUBY_VERSION} arbor-atlas rubygem (https://github.com/chrislee35/arbor-atlas)")
20
+ request.add_field("Referer", @@baseurl)
21
+ request.add_field("Cookie", @cookie) if @cookie
22
+ request.set_form_data(params)
23
+
24
+ http = Net::HTTP.new(url.host, url.port)
25
+ if url.scheme == 'https'
26
+ http.use_ssl = true
27
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
28
+ http.verify_depth = 5
29
+ end
30
+ resp = http.request(request)
31
+ @cookie = resp.header["set-cookie"] if resp.header["set-cookie"]
32
+ resp.body
33
+ end
34
+
35
+ def _get(path, params)
36
+ url = URI.parse "#{@@baseurl}/#{path}"
37
+ data = params.map { |k,v|
38
+ "#{k}=#{v}".gsub(/([^ a-zA-Z0-9_.-=]+)/) do
39
+ '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
40
+ end.tr(' ', '+')
41
+ }.join("&")
42
+ request = Net::HTTP::Get.new(url.path+"?"+data)
43
+ request.add_field("User-Agent", "Ruby/#{RUBY_VERSION} arbor-atlas rubygem (https://github.com/chrislee35/arbor-atlas)")
44
+ request.add_field("Referer", @@baseurl)
45
+ request.add_field("Cookie", @cookie) if @cookie
46
+
47
+ http = Net::HTTP.new(url.host, url.port)
48
+ if url.scheme == 'https'
49
+ http.use_ssl = true
50
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
51
+ http.verify_depth = 5
52
+ end
53
+ resp = http.request(request)
54
+ @cookie = resp.header["set-cookie"] if resp.header["set-cookie"]
55
+ resp.body
56
+ end
57
+
58
+ def lookup_ip(ip)
59
+ doc = _get("ip/#{ip}",{'out'=>'xml'})
60
+ Crack::XML.parse(doc)
61
+ end
62
+
63
+ def lookup_asn(asn)
64
+ asn = asn.gsub(/[^0-9]/,'')
65
+ doc = _get("asn/#{asn}",{'out'=>'xml'})
66
+ Crack::XML.parse(doc)
67
+ end
68
+
69
+ def lookup_cve(cve)
70
+ doc = _get("vuln/#{cve.upcase}",{'out'=>'xml'})
71
+ Crack::XML.parse(doc)
72
+ end
73
+
74
+ def lookup_cc(cc)
75
+ doc = _get("cc/#{cc.upcase}",{'out'=>'xml'})
76
+ Crack::XML.parse(doc)
77
+ end
78
+
79
+ def lookup_cidr(cidr)
80
+ lookup_ip(cidr)
81
+ end
82
+
83
+ def lookup(item)
84
+ if item =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(\/\d{1,2})?$/
85
+ lookup_ip(item)
86
+ elsif item =~ /^(AS)?\d{1,7}$/i
87
+ lookup_asn(item)
88
+ elsif item =~ /^CVE\-\d{4}-\d+$/i
89
+ lookup_cve(item)
90
+ elsif item =~ /^\w{2}$/i
91
+ lookup_cc(item)
92
+ else
93
+ raise ArgumentError, "unknown query type for item: #{item}"
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'arbor-atlas'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,99 @@
1
+ require 'helper'
2
+
3
+ class TestArborAtlas < Test::Unit::TestCase
4
+ should "return host report on 1.2.3.4" do
5
+ raise "You must set ARBORUSER and ARBORPASS in your environment before running tests" unless ENV['ARBORUSER'] and ENV['ARBORPASS']
6
+ a = Arbor::Atlas.new(ENV['ARBORUSER'], ENV['ARBORPASS'])
7
+ assert_not_nil(a.cookie)
8
+ ipinfo = a.lookup("1.2.3.4")
9
+ assert_not_nil(ipinfo)
10
+ assert_not_nil(ipinfo['report'])
11
+ assert_not_nil(ipinfo['report']['title'])
12
+ assert_equal("ATLAS Host Report: Global 1.2.3.4", ipinfo['report']['title'])
13
+ assert_not_nil(ipinfo['report']['background'])
14
+ assert_not_nil(ipinfo['report']['background']['blacklist'])
15
+ assert_not_nil(ipinfo['report']['background']['blacklist']['dnsbl'])
16
+ assert_not_nil(ipinfo['report']['background']['blacklist']['dnsbl'][0])
17
+ assert_not_nil(ipinfo['report']['background']['blacklist']['dnsbl'][0]['status'])
18
+ assert_equal("OK", ipinfo['report']['background']['blacklist']['dnsbl'][0]['status'])
19
+ assert_not_nil(ipinfo['report']['scans'])
20
+ assert_not_nil(ipinfo['report']['attacks'])
21
+ assert_not_nil(ipinfo['report']['servers'])
22
+ end
23
+
24
+ should "return network report on 1.2.3.0/24" do
25
+ raise "You must set ARBORUSER and ARBORPASS in your environment before running tests" unless ENV['ARBORUSER'] and ENV['ARBORPASS']
26
+ a = Arbor::Atlas.new(ENV['ARBORUSER'], ENV['ARBORPASS'])
27
+ assert_not_nil(a.cookie)
28
+ ipinfo = a.lookup("1.2.3.0/24")
29
+ assert_not_nil(ipinfo)
30
+ assert_not_nil(ipinfo['report'])
31
+ assert_not_nil(ipinfo['report']['title'])
32
+ assert_equal("ATLAS Network Report: Global 1.2.3.0/24", ipinfo['report']['title'])
33
+ assert_not_nil(ipinfo['report']['background'])
34
+ assert_not_nil(ipinfo['report']['background']['blacklist'])
35
+ assert_not_nil(ipinfo['report']['background']['blacklist']['dnsbl'])
36
+ assert_not_nil(ipinfo['report']['background']['blacklist']['dnsbl'][0])
37
+ assert_not_nil(ipinfo['report']['background']['blacklist']['dnsbl'][0]['status'])
38
+ assert_equal("OK", ipinfo['report']['background']['blacklist']['dnsbl'][0]['status'])
39
+ assert_not_nil(ipinfo['report']['scans'])
40
+ assert_not_nil(ipinfo['report']['attacks'])
41
+ assert_not_nil(ipinfo['report']['servers'])
42
+ end
43
+
44
+ should "return network as report for AS701" do
45
+ raise "You must set ARBORUSER and ARBORPASS in your environment before running tests" unless ENV['ARBORUSER'] and ENV['ARBORPASS']
46
+ a = Arbor::Atlas.new(ENV['ARBORUSER'], ENV['ARBORPASS'])
47
+ assert_not_nil(a.cookie)
48
+ ipinfo = a.lookup("AS701")
49
+ assert_not_nil(ipinfo)
50
+ assert_not_nil(ipinfo['report'])
51
+ assert_not_nil(ipinfo['report']['title'])
52
+ assert_equal("ATLAS Network AS Report: Global AS701 (UUNET)", ipinfo['report']['title'])
53
+ assert_not_nil(ipinfo['report']['background'])
54
+ assert_not_nil(ipinfo['report']['background']['peers'])
55
+ assert_not_nil(ipinfo['report']['background']['peers']['peer'])
56
+ assert_not_nil(ipinfo['report']['background']['peers']['peer'].index("AS174 (COGENT)"))
57
+ assert_not_nil(ipinfo['report']['scans'])
58
+ assert_not_nil(ipinfo['report']['attacks'])
59
+ assert_not_nil(ipinfo['report']['servers'])
60
+ assert_not_nil(ipinfo['report']['dos_attacks'])
61
+ end
62
+
63
+ should "return vulnerability report for CVE-2006-4139" do
64
+ raise "You must set ARBORUSER and ARBORPASS in your environment before running tests" unless ENV['ARBORUSER'] and ENV['ARBORPASS']
65
+ a = Arbor::Atlas.new(ENV['ARBORUSER'], ENV['ARBORPASS'])
66
+ assert_not_nil(a.cookie)
67
+ ipinfo = a.lookup("CVE-2006-4139")
68
+ assert_not_nil(ipinfo)
69
+ assert_not_nil(ipinfo['report'])
70
+ assert_not_nil(ipinfo['report']['title'])
71
+ assert_equal("ATLAS Vulnerability Report: Global CVE-2006-4139", ipinfo['report']['title'])
72
+ assert_not_nil(ipinfo['report']['scans'])
73
+ assert_not_nil(ipinfo['report']['background'])
74
+ assert_not_nil(ipinfo['report']['background']['description'])
75
+ assert_equal("Race condition in Sun Solaris 10 allows attackers to cause a denial of service (system panic) via unspecified vectors related to ifconfig and either netstat or SNMP queries.", ipinfo['report']['background']['description'])
76
+ assert_not_nil(ipinfo['report']['attacks'])
77
+ end
78
+
79
+ should "return country report report for US" do
80
+ raise "You must set ARBORUSER and ARBORPASS in your environment before running tests" unless ENV['ARBORUSER'] and ENV['ARBORPASS']
81
+ a = Arbor::Atlas.new(ENV['ARBORUSER'], ENV['ARBORPASS'])
82
+ assert_not_nil(a.cookie)
83
+ ipinfo = a.lookup("US")
84
+ assert_not_nil(ipinfo['report'])
85
+ assert_not_nil(ipinfo['report']['title'])
86
+ assert_equal("ATLAS Country Report: Global United States", ipinfo['report']['title'])
87
+ assert_not_nil(ipinfo['report']['background'])
88
+ assert_not_nil(ipinfo['report']['attacks'])
89
+ assert_not_nil(ipinfo['report']['dos_attacks'])
90
+ assert_not_nil(ipinfo['report']['servers'])
91
+ end
92
+
93
+ should "raise exception on unknown query type" do
94
+ raise "You must set ARBORUSER and ARBORPASS in your environment before running tests" unless ENV['ARBORUSER'] and ENV['ARBORPASS']
95
+ a = Arbor::Atlas.new(ENV['ARBORUSER'], ENV['ARBORPASS'])
96
+ assert_not_nil(a.cookie)
97
+ assert_raise(ArgumentError) do a.lookup("unknown type") end
98
+ end
99
+ end
metadata ADDED
@@ -0,0 +1,190 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: arbor-atlas
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Chris Lee
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain:
17
+ - |
18
+ -----BEGIN CERTIFICATE-----
19
+ MIIDYjCCAkqgAwIBAgIBADANBgkqhkiG9w0BAQUFADBXMREwDwYDVQQDDAhydWJ5
20
+ Z2VtczEYMBYGCgmSJomT8ixkARkWCGNocmlzbGVlMRMwEQYKCZImiZPyLGQBGRYD
21
+ ZGhzMRMwEQYKCZImiZPyLGQBGRYDb3JnMB4XDTExMDIyNzE1MzAxOVoXDTEyMDIy
22
+ NzE1MzAxOVowVzERMA8GA1UEAwwIcnVieWdlbXMxGDAWBgoJkiaJk/IsZAEZFghj
23
+ aHJpc2xlZTETMBEGCgmSJomT8ixkARkWA2RoczETMBEGCgmSJomT8ixkARkWA29y
24
+ ZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALNM1Hjs6q58sf7Jp64A
25
+ vEY2cnRWDdFpD8UWpwaJK5kgSHOVgs+0mtszn+YlYjmx8kpmuYpyU4g9mNMImMQe
26
+ ow8pVsL4QBBK/1Ozgdxrsptk3IiTozMYA+g2I/+WvZSEDu9uHkKe8pvMBEMrg7RJ
27
+ IN7+jWaPnSzg3DbFwxwOdi+QRw33DjK7oFWcOaaBqWTUpI4epdi/c/FE1I6UWULJ
28
+ ZF/Uso0Sc2Pp/YuVhuMHGrUbn7zrWWo76nnK4DTLfXFDbZF5lIXT1w6BtIiN6Ho9
29
+ Rdr/W6663hYUo3WMsUSa3I5+PJXEBKmGHIZ2TNFnoFIRHha2fmm1HC9+BTaKwcO9
30
+ PLcCAwEAAaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQURzsNkZo2rv86Ftc+hVww
31
+ RNICMrwwCwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQBRRw/iNA/PdnvW
32
+ OBoNCSr/IiHOGZqMHgPJwyWs68FhThnLc2EyIkuLTQf98ms1/D3p0XX9JsxazvKT
33
+ W/in8Mm/R2fkVziSdzqChtw/4Z4bW3c+RF7TgX6SP5cKxNAfKmAPuItcs2Y+7bdS
34
+ hr/FktVtT2iAmISRnlEbdaTpfl6N2ZWNT83khV6iOs5xRkX/+0e+GgAv9mE6nqr1
35
+ AkuDXMhposxcnFZUrZ3UtMPEe/JnyP7Vv6pvr3qtZm8FidFZU91+rX/fwdyBU8RP
36
+ /5l8uLWXXNt1wEbtu4N1I66LwTK2iRrQZE8XtlgZGbxYDFUkiurq3OafF2YwRs6W
37
+ 6yhklP75
38
+ -----END CERTIFICATE-----
39
+
40
+ date: 2011-05-07 00:00:00 Z
41
+ dependencies:
42
+ - !ruby/object:Gem::Dependency
43
+ version_requirements: &id001 !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ hash: 11
49
+ segments:
50
+ - 0
51
+ - 1
52
+ - 8
53
+ version: 0.1.8
54
+ requirement: *id001
55
+ prerelease: false
56
+ name: crack
57
+ type: :runtime
58
+ - !ruby/object:Gem::Dependency
59
+ version_requirements: &id002 !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ hash: 3
65
+ segments:
66
+ - 0
67
+ version: "0"
68
+ requirement: *id002
69
+ prerelease: false
70
+ name: shoulda
71
+ type: :development
72
+ - !ruby/object:Gem::Dependency
73
+ version_requirements: &id003 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ hash: 23
79
+ segments:
80
+ - 1
81
+ - 0
82
+ - 0
83
+ version: 1.0.0
84
+ requirement: *id003
85
+ prerelease: false
86
+ name: bundler
87
+ type: :development
88
+ - !ruby/object:Gem::Dependency
89
+ version_requirements: &id004 !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ hash: 7
95
+ segments:
96
+ - 1
97
+ - 5
98
+ - 2
99
+ version: 1.5.2
100
+ requirement: *id004
101
+ prerelease: false
102
+ name: jeweler
103
+ type: :development
104
+ - !ruby/object:Gem::Dependency
105
+ version_requirements: &id005 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ hash: 3
111
+ segments:
112
+ - 0
113
+ version: "0"
114
+ requirement: *id005
115
+ prerelease: false
116
+ name: rcov
117
+ type: :development
118
+ - !ruby/object:Gem::Dependency
119
+ version_requirements: &id006 !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ hash: 11
125
+ segments:
126
+ - 0
127
+ - 1
128
+ - 8
129
+ version: 0.1.8
130
+ requirement: *id006
131
+ prerelease: false
132
+ name: crack
133
+ type: :runtime
134
+ description: https://atlas.arbor.net
135
+ email: rubygems@chrislee.dhs.org
136
+ executables: []
137
+
138
+ extensions: []
139
+
140
+ extra_rdoc_files:
141
+ - LICENSE.txt
142
+ - README.rdoc
143
+ files:
144
+ - .document
145
+ - Gemfile
146
+ - Gemfile.lock
147
+ - LICENSE.txt
148
+ - README.rdoc
149
+ - Rakefile
150
+ - VERSION
151
+ - lib/arbor-atlas.rb
152
+ - lib/arbor-atlas/arbor-atlas.rb
153
+ - test/helper.rb
154
+ - test/test_arbor-atlas.rb
155
+ homepage: http://github.com/chrislee35/arbor-atlas
156
+ licenses:
157
+ - MIT
158
+ post_install_message:
159
+ rdoc_options: []
160
+
161
+ require_paths:
162
+ - lib
163
+ required_ruby_version: !ruby/object:Gem::Requirement
164
+ none: false
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ hash: 3
169
+ segments:
170
+ - 0
171
+ version: "0"
172
+ required_rubygems_version: !ruby/object:Gem::Requirement
173
+ none: false
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ hash: 3
178
+ segments:
179
+ - 0
180
+ version: "0"
181
+ requirements: []
182
+
183
+ rubyforge_project:
184
+ rubygems_version: 1.7.2
185
+ signing_key:
186
+ specification_version: 3
187
+ summary: A very thin wrapper around Arbor Atlas' web interface
188
+ test_files:
189
+ - test/helper.rb
190
+ - test/test_arbor-atlas.rb
@@ -0,0 +1 @@
1
+ �.A�d����>I�e���sS�q���T4L