awsam 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 +43 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +20 -0
- data/README.md +292 -0
- data/Rakefile +1 -0
- data/awsam.gemspec +26 -0
- data/bashrc/rc.scr +370 -0
- data/bin/ascp +65 -0
- data/bin/assh +73 -0
- data/bin/raem +260 -0
- data/lib/awsam.rb +46 -0
- data/lib/awsam/account.rb +139 -0
- data/lib/awsam/accounts.rb +61 -0
- data/lib/awsam/ec2.rb +95 -0
- data/lib/awsam/key.rb +53 -0
- data/lib/awsam/utils.rb +50 -0
- data/lib/awsam/version.rb +3 -0
- data/test/helper.rb +18 -0
- data/test/test_awsem.rb +7 -0
- metadata +140 -0
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
require 'account'
|
4
|
+
require 'utils'
|
5
|
+
|
6
|
+
module Awsam
|
7
|
+
module Accounts
|
8
|
+
|
9
|
+
@@accounts = {}
|
10
|
+
|
11
|
+
def self.load!
|
12
|
+
accts = Hash.new
|
13
|
+
accts_dir = Awsam::get_accts_dir
|
14
|
+
Utils::confdir_scan(accts_dir) do |name|
|
15
|
+
acct = Account::load_from_disk(File.join(accts_dir, name))
|
16
|
+
accts[name] = acct if acct
|
17
|
+
end
|
18
|
+
|
19
|
+
@@accounts = accts
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.active
|
23
|
+
active = ENV['AWSAM_ACTIVE_ACCOUNT']
|
24
|
+
return nil unless active
|
25
|
+
|
26
|
+
acct = find(active)
|
27
|
+
unless acct
|
28
|
+
puts "No account named '#{active}' found."
|
29
|
+
return nil
|
30
|
+
end
|
31
|
+
|
32
|
+
acct
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.get
|
36
|
+
return @@accounts
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.find(name)
|
40
|
+
@@accounts[name]
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.set_default(name)
|
44
|
+
unless find(name)
|
45
|
+
$stderr.puts "Failed to find account #{name}"
|
46
|
+
return false
|
47
|
+
end
|
48
|
+
|
49
|
+
Utils::set_default(Awsam::get_accts_dir, name)
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.get_default
|
53
|
+
dflt = Utils::get_default(Awsam::get_accts_dir)
|
54
|
+
dflt ? find(dflt) : nil
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.remove_default
|
58
|
+
Utils::remove_default(Awsam::get_accts_dir)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/awsam/ec2.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
module Awsam
|
2
|
+
module Ec2
|
3
|
+
|
4
|
+
LOOKUP_TAGS = ["Name", "aws:autoscaling:groupName"].freeze
|
5
|
+
|
6
|
+
def self.find_instance(acct, instance_id)
|
7
|
+
logger = Logger.new(File.open("/dev/null", "w"))
|
8
|
+
ec2 = RightAws::Ec2.new(acct.access_key, acct.secret_key, :logger => logger)
|
9
|
+
|
10
|
+
unless ec2
|
11
|
+
puts "Unable to connect to EC2"
|
12
|
+
return nil
|
13
|
+
end
|
14
|
+
|
15
|
+
find(ec2, instance_id)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.find(ec2, instance_id)
|
19
|
+
if instance_id =~ /^i-[0-9a-f]{7,9}$/
|
20
|
+
find_by_instance_id(ec2, instance_id)
|
21
|
+
else
|
22
|
+
find_by_tag(ec2, instance_id)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.find_by_instance_id(ec2, instance_id)
|
27
|
+
begin
|
28
|
+
ec2.describe_instances(instance_id).first
|
29
|
+
rescue RightAws::AwsError
|
30
|
+
puts "instance_id does not exist"
|
31
|
+
exit 1
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.find_by_tag(ec2, instance_id)
|
36
|
+
results = []
|
37
|
+
|
38
|
+
ec2.describe_tags(:filters => {
|
39
|
+
"resource-type" => "instance"
|
40
|
+
}).each do |tag|
|
41
|
+
if LOOKUP_TAGS.include?(tag[:key]) &&
|
42
|
+
tag[:value].downcase.include?(instance_id.downcase)
|
43
|
+
results << tag
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
if !results || results.length == 0
|
48
|
+
puts "No tags by this name are available in your account"
|
49
|
+
exit 1
|
50
|
+
end
|
51
|
+
|
52
|
+
results.uniq! { |a| a[:resource_id] }
|
53
|
+
results.sort! { |a,b| a[:value] <=> b[:value] }
|
54
|
+
|
55
|
+
rmap = {}
|
56
|
+
ec2.describe_instances(results.map{|a| a[:resource_id]},
|
57
|
+
:filters => {
|
58
|
+
"instance-state-name" => "running"
|
59
|
+
}).each do |inst|
|
60
|
+
rmap[inst[:aws_instance_id]] = inst
|
61
|
+
end
|
62
|
+
|
63
|
+
results.reject! { |a| rmap[a[:resource_id]].nil? }
|
64
|
+
|
65
|
+
if results.length == 0
|
66
|
+
puts "No running instances by that tag name are available"
|
67
|
+
exit 1
|
68
|
+
end
|
69
|
+
|
70
|
+
if $opts[:first_node] || results.length == 1
|
71
|
+
node = results.first
|
72
|
+
else
|
73
|
+
puts "Please select which node you wish to use:"
|
74
|
+
puts
|
75
|
+
|
76
|
+
results.each_with_index do |elem, i|
|
77
|
+
inst = rmap[elem[:resource_id]]
|
78
|
+
puts "%d) %s (%s, %s, %s)" %
|
79
|
+
[i, elem[:value], inst[:aws_instance_id],
|
80
|
+
inst[:aws_instance_type], inst[:aws_launch_time]]
|
81
|
+
end
|
82
|
+
puts "q) Quit"
|
83
|
+
puts
|
84
|
+
|
85
|
+
print "> "
|
86
|
+
input = $stdin.gets
|
87
|
+
puts
|
88
|
+
exit unless input =~ /^\d+$/
|
89
|
+
node = results[input.to_i]
|
90
|
+
end
|
91
|
+
|
92
|
+
return rmap[node[:resource_id]]
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
data/lib/awsam/key.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Awsam
|
4
|
+
class Key
|
5
|
+
KEYFILE = "key.pem"
|
6
|
+
|
7
|
+
attr_reader :name
|
8
|
+
|
9
|
+
def initialize(keydir)
|
10
|
+
@name = File.basename(keydir)
|
11
|
+
@dir = keydir
|
12
|
+
if @name == Awsam::DEFAULT_LINK_NAME
|
13
|
+
# This is required for the default link
|
14
|
+
raise "Can not name a key: #{Awsam::DEFAULT_LINK_NAME}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def path
|
19
|
+
File.join(@dir, KEYFILE)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.import(acctdir, key_name, key_file)
|
23
|
+
dir = File.join(Key::keys_dir(acctdir), key_name)
|
24
|
+
FileUtils.mkdir(dir) unless File.exist?(dir)
|
25
|
+
|
26
|
+
File.open(File.join(dir, KEYFILE), "w", 0400) do |f|
|
27
|
+
f << File.read(key_file)
|
28
|
+
end
|
29
|
+
|
30
|
+
Key.new(dir)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.keys_dir(base)
|
34
|
+
dir = File.join(base, "keys")
|
35
|
+
FileUtils.mkdir(dir) unless File.exist?(dir)
|
36
|
+
dir
|
37
|
+
end
|
38
|
+
|
39
|
+
def print_environ
|
40
|
+
envs = {
|
41
|
+
"AMAZON_SSH_KEY_NAME" => @name,
|
42
|
+
"AMAZON_SSH_KEY_FILE" => self.path
|
43
|
+
}
|
44
|
+
|
45
|
+
Utils::bash_environ(envs)
|
46
|
+
end
|
47
|
+
|
48
|
+
def remove
|
49
|
+
FileUtils.rm(self.path)
|
50
|
+
FileUtils.rmdir(@dir)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/awsam/utils.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
module Awsam
|
3
|
+
module Utils
|
4
|
+
# Scan a directory yielding for each file
|
5
|
+
def self.confdir_scan(dir)
|
6
|
+
Dir.entries(dir).each do |name|
|
7
|
+
next if name == '.' || name == '..' || name == Awsam::DEFAULT_LINK_NAME
|
8
|
+
yield(name)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# Print the appropriate environment variables set commands for bash
|
13
|
+
def self::bash_environ(envs)
|
14
|
+
envs.each_pair do |k, v|
|
15
|
+
puts "export #{k}=\"#{v}\""
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Set the default resource with link directory and target
|
20
|
+
def self.set_default(basedir, target)
|
21
|
+
link = File.join(basedir, Awsam::DEFAULT_LINK_NAME)
|
22
|
+
if File.exist?(link)
|
23
|
+
begin
|
24
|
+
FileUtils.rm(link)
|
25
|
+
rescue => err
|
26
|
+
$stderr.puts "Failed to remove link #{link}: #{err.message}"
|
27
|
+
return false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
begin
|
31
|
+
FileUtils.ln_s(target, link)
|
32
|
+
rescue => err
|
33
|
+
$stderr.puts "Failed to create symlink: #{err.message}"
|
34
|
+
return false
|
35
|
+
end
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
# Get the target of the default link
|
40
|
+
def self.get_default(basedir)
|
41
|
+
link = File.join(basedir, Awsam::DEFAULT_LINK_NAME)
|
42
|
+
File.exist?(link) ? File.readlink(link) : nil
|
43
|
+
end
|
44
|
+
|
45
|
+
# Remove the default link
|
46
|
+
def self.remove_default(basedir)
|
47
|
+
FileUtils.rm File.join(basedir, Awsam::DEFAULT_LINK_NAME)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/test/helper.rb
ADDED
@@ -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 'awsam'
|
16
|
+
|
17
|
+
class Test::Unit::TestCase
|
18
|
+
end
|
data/test/test_awsem.rb
ADDED
metadata
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: awsam
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Mike Heffner
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2015-02-12 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: right_aws
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - '='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.1.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - '='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.1.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: trollop
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - '='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '2.0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - '='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '2.0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: bundler
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '1.7'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.7'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rake
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '10.0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '10.0'
|
78
|
+
description: Amazon Web Services Account Manager (modeled after 'rvm')
|
79
|
+
email:
|
80
|
+
- mikeh@fesnel.com
|
81
|
+
executables:
|
82
|
+
- ascp
|
83
|
+
- assh
|
84
|
+
- raem
|
85
|
+
extensions: []
|
86
|
+
extra_rdoc_files: []
|
87
|
+
files:
|
88
|
+
- .gitignore
|
89
|
+
- Gemfile
|
90
|
+
- LICENSE.txt
|
91
|
+
- README.md
|
92
|
+
- Rakefile
|
93
|
+
- awsam.gemspec
|
94
|
+
- bashrc/rc.scr
|
95
|
+
- bin/ascp
|
96
|
+
- bin/assh
|
97
|
+
- bin/raem
|
98
|
+
- lib/awsam.rb
|
99
|
+
- lib/awsam/account.rb
|
100
|
+
- lib/awsam/accounts.rb
|
101
|
+
- lib/awsam/ec2.rb
|
102
|
+
- lib/awsam/key.rb
|
103
|
+
- lib/awsam/utils.rb
|
104
|
+
- lib/awsam/version.rb
|
105
|
+
- test/helper.rb
|
106
|
+
- test/test_awsem.rb
|
107
|
+
homepage: ''
|
108
|
+
licenses:
|
109
|
+
- MIT
|
110
|
+
post_install_message:
|
111
|
+
rdoc_options: []
|
112
|
+
require_paths:
|
113
|
+
- lib
|
114
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
116
|
+
requirements:
|
117
|
+
- - ! '>='
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
segments:
|
121
|
+
- 0
|
122
|
+
hash: 4361486896786609133
|
123
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
|
+
none: false
|
125
|
+
requirements:
|
126
|
+
- - ! '>='
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '0'
|
129
|
+
segments:
|
130
|
+
- 0
|
131
|
+
hash: 4361486896786609133
|
132
|
+
requirements: []
|
133
|
+
rubyforge_project:
|
134
|
+
rubygems_version: 1.8.23.2
|
135
|
+
signing_key:
|
136
|
+
specification_version: 3
|
137
|
+
summary: Amazon Web Services Account Manager
|
138
|
+
test_files:
|
139
|
+
- test/helper.rb
|
140
|
+
- test/test_awsem.rb
|