awsam 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,3 @@
1
+ module Awsam
2
+ VERSION = "0.0.1"
3
+ 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 'awsam'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestAwsam < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
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