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.
@@ -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