ec2-signature 0.0.1
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.
- data/.gitignore +3 -0
- data/Gemfile +4 -0
- data/README +31 -0
- data/Rakefile +2 -0
- data/ec2-signature.gemspec +21 -0
- data/lib/ec2-signature.rb +58 -0
- data/lib/ec2-signature/version.rb +5 -0
- metadata +69 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
Code borrowed from fog (https://github.com/geemus/fog).
|
2
|
+
|
3
|
+
This gem will simply generate the AWS EC2 signature so that you can use your own HTTP methods and libraries to POST to your choice of AWS/EC2 compatible API servers such as Eucalyptus, OpenNebula, OpenAuth. Apparently, most of the AWS/EC2 API gems out there are not compatible with the aforementioned cloud frameworks, due to running on a custom port they do not account for that when generating the signature. Fog had implemented a compatible signature method, however, I did not want to use the EXCON http library implemented in it so I extracted the signature method only for use with my own choice of HTTP library.
|
4
|
+
|
5
|
+
##############################
|
6
|
+
#### OpenStack Example 1 ####
|
7
|
+
##############################
|
8
|
+
|
9
|
+
require 'ec2-signature'
|
10
|
+
# pass a hash containing your aws auth params to new obj
|
11
|
+
mysig = EC2Signature.new( {
|
12
|
+
:access_id => ,
|
13
|
+
:secret_key => ,
|
14
|
+
:ec2_url => 'http://myec2server:8773/services/Cloud'
|
15
|
+
} )
|
16
|
+
# generate the signature provided the query action you want to issue to your ec2 provider
|
17
|
+
signature = mysig.sign( {'Action' => 'DescribeImages'} )
|
18
|
+
# use the example net/http post method to post your signature to the ec2_url specified above
|
19
|
+
mysig.post signature
|
20
|
+
|
21
|
+
|
22
|
+
##############################
|
23
|
+
#### OpenStack Example 2 ####
|
24
|
+
##############################
|
25
|
+
mysig.path = '/services/Admin'
|
26
|
+
# opennebula's aws/ec2 api implementation has a diff path for admin cmds
|
27
|
+
signature = mysig.sign( {
|
28
|
+
'Action' => 'DescribeUser',
|
29
|
+
'Name' => 'jsmith',
|
30
|
+
} )
|
31
|
+
mysig.post signature
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "ec2-signature/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "ec2-signature"
|
7
|
+
s.version = Ec2::Signature::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["John Tran"]
|
10
|
+
s.email = ["jtran@attinteractive.com"]
|
11
|
+
s.homepage = "http://rubygems.org/gems/ec2-signature"
|
12
|
+
s.summary = %q{generate a signature to be posted to any EC2 compatible API}
|
13
|
+
s.description = %q{AWS EC2 API generates signatures to authenticate. This will generate one that is compatible even with Eucalyptus, OpenNebula & OpenStack.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "ec2-signature"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'openssl'
|
3
|
+
require 'base64'
|
4
|
+
require 'cgi'
|
5
|
+
|
6
|
+
class Ec2Signature
|
7
|
+
|
8
|
+
attr_accessor :accessid, :secretkey, :ec2url, :host, :port, :path, :scheme
|
9
|
+
|
10
|
+
def initialize creds
|
11
|
+
raise "Need a hash of AWS/EC2 credential info" unless creds.kind_of? Hash
|
12
|
+
[:accessid, :secretkey, :ec2url].each do |a|
|
13
|
+
raise "Credential hash requires :accessid, :secretkey & :ec2url" unless creds[a]
|
14
|
+
end
|
15
|
+
self.accessid = creds[:accessid]
|
16
|
+
self.secretkey = creds[:secretkey]
|
17
|
+
self.ec2url = creds[:ec2url]
|
18
|
+
uri = URI.parse creds[:ec2url]
|
19
|
+
self.host = uri.host
|
20
|
+
self.scheme = uri.scheme
|
21
|
+
self.path = uri.path
|
22
|
+
self.port = uri.port
|
23
|
+
end
|
24
|
+
|
25
|
+
def sign actionparams={'Action'=>'DescribeInstances'}
|
26
|
+
raise "hash of AWS EC2 web params action required" unless actionparams.kind_of? Hash
|
27
|
+
raise "hash missing 'Action' key/value" unless actionparams['Action']
|
28
|
+
|
29
|
+
actionparams.merge!({
|
30
|
+
'AWSAccessKeyId' => accessid,
|
31
|
+
'SignatureMethod' => 'HmacSHA256',
|
32
|
+
'SignatureVersion' => '2',
|
33
|
+
'Timestamp' => Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ"),
|
34
|
+
'Version' => '2010-08-31'
|
35
|
+
})
|
36
|
+
|
37
|
+
body = ''
|
38
|
+
for key in actionparams.keys.sort
|
39
|
+
unless (value = actionparams[key]).nil?
|
40
|
+
body << "#{key}=#{CGI.escape(value.to_s).gsub(/\+/, '%20')}&"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
string_to_sign = "POST\n#{host}:#{port}\n#{path}\n" << body.chop
|
44
|
+
digest = OpenSSL::Digest::Digest.new('sha256')
|
45
|
+
signed_string = OpenSSL::HMAC.digest(digest, secretkey, string_to_sign)
|
46
|
+
body << "Signature=#{CGI.escape(Base64.encode64(signed_string).chomp!).gsub(/\+/, '%20')}"
|
47
|
+
|
48
|
+
body
|
49
|
+
end
|
50
|
+
|
51
|
+
def post signature=sign
|
52
|
+
require 'net/http'
|
53
|
+
http = Net::HTTP.new host, port
|
54
|
+
resp = http.post path, signature
|
55
|
+
resp.body
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ec2-signature
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- John Tran
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-02-10 00:00:00 -08:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: AWS EC2 API generates signatures to authenticate. This will generate one that is compatible even with Eucalyptus, OpenNebula & OpenStack.
|
22
|
+
email:
|
23
|
+
- jtran@attinteractive.com
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files: []
|
29
|
+
|
30
|
+
files:
|
31
|
+
- .gitignore
|
32
|
+
- Gemfile
|
33
|
+
- README
|
34
|
+
- Rakefile
|
35
|
+
- ec2-signature.gemspec
|
36
|
+
- lib/ec2-signature.rb
|
37
|
+
- lib/ec2-signature/version.rb
|
38
|
+
has_rdoc: true
|
39
|
+
homepage: http://rubygems.org/gems/ec2-signature
|
40
|
+
licenses: []
|
41
|
+
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
segments:
|
52
|
+
- 0
|
53
|
+
version: "0"
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
requirements: []
|
62
|
+
|
63
|
+
rubyforge_project: ec2-signature
|
64
|
+
rubygems_version: 1.3.6
|
65
|
+
signing_key:
|
66
|
+
specification_version: 3
|
67
|
+
summary: generate a signature to be posted to any EC2 compatible API
|
68
|
+
test_files: []
|
69
|
+
|