mist_cli 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: df00c0aa1b3c887bb427f5b414cb7b63dfc2a0cd
4
+ data.tar.gz: 101655483367f29c0932a1168818a80a223c2702
5
+ SHA512:
6
+ metadata.gz: 3f792bb46c1f3aaef5b7b4c74680a4d4dd1db24a714a3729c63ff0495c289f7a1fd933ef7067b36f7521cfc6bd104b5ce241f52410fc2bdaaea65ad5833a9e20
7
+ data.tar.gz: 62da4015ca56f5db7023d4accf909306c91be866a77104bbca731719496d6ca13fc299233a08a2dac91502a7c5781d275f7d59638f33db19a8dd840c5f17742e
data/bin/mist ADDED
@@ -0,0 +1,209 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'csv'
4
+ require 'json'
5
+ require 'thor'
6
+ require 'fog'
7
+
8
+ class Mist < Thor
9
+
10
+ desc "config SERVICE", "Creates configuration file for new cloud compute provider in ~/.mist/TITLE"
11
+ def config(service)
12
+
13
+ case service
14
+ when 'aws','AWS','Amazon Web Services'
15
+ @config = $client.get_config
16
+
17
+ say("MIST => Amazon Web Services EC2 Setup")
18
+ public_key = ask("Public Key:")
19
+ private_key = ask("Secret Key:")
20
+
21
+ @config[:services] = {
22
+ :aws => {
23
+ :public_key => public_key,
24
+ :private_key => private_key
25
+ }
26
+ }
27
+
28
+ $client.set_config @config
29
+ else
30
+ puts "MIST: The service schema was not recognized."
31
+ end
32
+
33
+ end
34
+
35
+ desc "boot", "Default cheapest machine of given service"
36
+
37
+ def boot(provider = 'aws')
38
+
39
+ case provider
40
+
41
+ when 'aws','AWS'
42
+ @config = $client.get_config
43
+
44
+ if $provider
45
+ provider = $provider
46
+ else
47
+ provider = Fog::Compute.new(:provider => 'AWS',
48
+ :aws_access_key_id => @config[:services][:aws][:public_key],
49
+ :aws_secret_access_key => @config[:services][:aws][:private_key])
50
+ end
51
+
52
+ # Check to see if there is already a MIST server running. If so, connect to it.
53
+ server = provider.servers.find { |server| server.key_name == 'fog_default' && server.state == 'running' }
54
+ if server
55
+ puts "MIST: #{Time.now} => Found cloud machine at: #{server.public_ip_address}"
56
+ exec("ssh -i ~/.ssh/id_rsa ubuntu@#{server.public_ip_address}")
57
+ else
58
+
59
+ puts "MIST: #{Time.now} => Creating new cloud machine..."
60
+
61
+ t1 = Thread.new {
62
+ server = provider.servers.bootstrap(:private_key_path => '~/.ssh/id_rsa',
63
+ :public_key_path => '~/.ssh/id_rsa.pub',
64
+ :username => 'ubuntu',
65
+ :image_id => 'ami-2ef1b646')
66
+ }
67
+
68
+ t2 = Thread.new {
69
+ i = 0
70
+ rows = ['.','.','.']
71
+ loop do
72
+ sleep 0.1
73
+ print "\rMIST: #{Time.now} => Deploying machine #{rows.join}"
74
+ if rows.length > 3
75
+ rows = ['.']
76
+ else
77
+ rows << '.'
78
+ end
79
+
80
+ end
81
+ }
82
+
83
+ t1.join
84
+ t2.kill
85
+
86
+ puts "\nMIST: #{Time.now} => Success! Machine created at IP: #{server.public_ip_address}"
87
+
88
+
89
+ # t2 = Thread.new {
90
+ # i = 0
91
+ # rows = ['|','-','_','-']
92
+ # loop do
93
+ # sleep 0.2
94
+ # print "\rMIST: #{Time.now} => Installing GoodData Ruby SDK... #{rows[i]}"
95
+ # i += 1
96
+ # if i > 3
97
+ # i = 0
98
+ # end
99
+ #
100
+ # end
101
+ # }
102
+
103
+ #system("ssh-keyscan -H #{server.public_ip_address} >> ~/.ssh/known_hosts")
104
+ #system("ssh-keyscan -H #{server.dns_name} >> ~/.ssh/known_hosts")
105
+
106
+ # puts "MIST: #{Time.now} => Installing JRuby on #{server.public_ip_address}..."
107
+ # exec("ssh -i ~/.ssh/id_rsa ubuntu@#{server.public_ip_address} 'yes | sudo apt-get update; yes | rvm install jruby; rvm --default use jruby; exit'")
108
+
109
+ exec("ssh -t -i ~/.ssh/id_rsa ubuntu@#{server.public_ip_address}")
110
+
111
+ end
112
+
113
+ else
114
+ puts "MIST: Unable to create machine with given provider: \"#{provider}\""
115
+ end
116
+
117
+ end
118
+
119
+ default_task :boot
120
+
121
+ desc "kill", "Destroys default cloud server."
122
+
123
+ def kill
124
+
125
+ if $provider
126
+ provider = $provider
127
+ else
128
+ provider = Fog::Compute.new(:provider => 'AWS',
129
+ :aws_access_key_id => @config[:services][:aws][:public_key],
130
+ :aws_secret_access_key => @config[:services][:aws][:private_key])
131
+
132
+ end
133
+
134
+ puts "MIST: #{Time.now} => Searching for active machines..."
135
+ provider.servers.map { |server|
136
+
137
+ if server.key_name == 'fog_default' && server.state == 'running'
138
+ say("MIST: #{Time.now} => Found running server: #{server.public_ip_address}\n")
139
+ res = ask("Terminate (y/n)?")
140
+ if res == 'y' || res == 'yes' || res == ''
141
+ server.destroy
142
+ end
143
+ end
144
+ }
145
+
146
+ end
147
+
148
+ no_commands {
149
+
150
+ def setup
151
+
152
+ home = Dir.home
153
+ @config_file_path = home+"/.mist"
154
+
155
+ if File.exists? (@config_file_path)
156
+ @config = JSON.parse(IO.read(@config_file_path), :symbolize_names => true)
157
+ else
158
+
159
+ @config = Hash.new
160
+
161
+ @config[:profile] = {
162
+ :global_id => (0...50).map { ('a'..'z').to_a[rand(26)] }.join,
163
+ :installation => Time.now.to_s,
164
+ :config_file_version => 1
165
+ }
166
+
167
+ @config[:services] = {}
168
+
169
+ File.open(@config_file_path,"w") do |f|
170
+ f.write(@config.to_json)
171
+ end
172
+
173
+ end
174
+ end
175
+
176
+ def get_config
177
+ @config
178
+ end
179
+
180
+ def set_config changes
181
+ puts @config.merge(changes)
182
+ File.open(@config_file_path, "w") do |f|
183
+ f.write(@config.to_json)
184
+ end
185
+ end
186
+
187
+ }
188
+
189
+ end
190
+
191
+ $client = Mist.new
192
+ $client.setup
193
+
194
+ config = $client.get_config
195
+ if config[:services] != "" || config[:services] != [] || config[:services] != {}
196
+ $provider = Fog::Compute.new(:provider => 'AWS',
197
+ :aws_access_key_id => config[:services][:aws][:public_key],
198
+ :aws_secret_access_key => config[:services][:aws][:private_key])
199
+ end
200
+
201
+ if ARGV.empty?
202
+ # Perform the default, it doesn't have to be a Thor task
203
+ Mist.new.boot
204
+ else
205
+ # Start Thor as usual
206
+ Mist.start
207
+ end
208
+
209
+
@@ -0,0 +1,56 @@
1
+ require 'csv'
2
+ require 'json'
3
+ require 'fileutils'
4
+ require 'thor'
5
+ require 'fog'
6
+
7
+ require_relative 'services'
8
+ require_relative 'services/aws'
9
+
10
+ module Client
11
+
12
+ attr_accessor :config
13
+
14
+ class << self
15
+
16
+ def setup
17
+
18
+ home = Dir.home
19
+ @config_file_path = home+"/.mist"
20
+
21
+ if File.exists? (@config_file_path)
22
+ @config = JSON.parse(IO.read(@config_file_path), :symbolize_names => true)
23
+ else
24
+
25
+ @config = Hash.new
26
+
27
+ @config[:profile] = {
28
+ :global_id => (0...50).map { ('a'..'z').to_a[rand(26)] }.join,
29
+ :installation => Time.now.to_s,
30
+ :config_file_version => 1
31
+ }
32
+
33
+ @config[:services] = {}
34
+
35
+ File.open(@config_file_path,"w") do |f|
36
+ f.write(@config.to_json)
37
+ end
38
+
39
+ end
40
+ end
41
+
42
+ def get_config
43
+ @config
44
+ end
45
+
46
+ def set_config changes
47
+ @config.merge(changes)
48
+ File.open(@config_file_path, "w") do |f|
49
+ f.write(@config.to_json)
50
+ end
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
@@ -0,0 +1,23 @@
1
+ class Services::Aws < Thor
2
+
3
+ desc "start MACHINE", "Starts a machine."
4
+
5
+ def initialize(config = {})
6
+
7
+ if config[:new]
8
+
9
+
10
+ end
11
+
12
+ if config[:boot]
13
+ self.boot(config[:boot])
14
+ end
15
+
16
+ end
17
+
18
+ def boot(image)
19
+
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,28 @@
1
+ class Services
2
+
3
+ def initialize(config = {})
4
+ self.create(config[:new]) if config[:new]
5
+ self.boot(config[:boot]) if config[:boot]
6
+ end
7
+
8
+ def create(service)
9
+ case service
10
+ when 'aws','AWS','Amazon Web Services'
11
+ Services::Aws.new(:new => true)
12
+ else
13
+ puts "That service schema was not recognized."
14
+ end
15
+ end
16
+
17
+ def boot(service)
18
+ case service
19
+ when 'aws','AWS','Amazon Web Services'
20
+ Services::Aws.new(:boot => service)
21
+ else
22
+ puts "That service schema was not recognized."
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ require_relative 'services/aws'
data/lib/mist.rb ADDED
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'thor'
4
+ require 'json'
5
+
6
+ require_relative 'mist/services'
7
+ require_relative 'mist/client'
8
+
9
+ class Mist < Thor
10
+
11
+ desc "start SERVICE", "Default cheapest machine of given service"
12
+ desc "config SERVICE", "Creates configuration file for new cloud compute provider in ~/.mist/TITLE"
13
+
14
+ def config(service)
15
+ case service
16
+ when 'aws','AWS','Amazon Web Services'
17
+ @config = Client.get_config
18
+
19
+ say("MIST => Amazon Web Services EC2 Setup")
20
+ public_key = ask("Public Key: ")
21
+ private_key = ask("Secret Key: ")
22
+
23
+ puts @config
24
+
25
+ @config[:services] = {
26
+ :aws => {
27
+ :public_key => public_key,
28
+ :private_key => private_key
29
+ }
30
+ }
31
+
32
+ Client.set_config @config
33
+ else
34
+ puts "That service schema was not recognized."
35
+ end
36
+ end
37
+
38
+ def start(machine)
39
+ Services.new(:boot => machine)
40
+ end
41
+
42
+ def cheapest
43
+ # Scan for cheapest available machine (EC2 market)
44
+ end
45
+
46
+ end
47
+
48
+ Mist.start
49
+
50
+ Client.setup
51
+
52
+
53
+
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mist_cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Patrick McConlogue
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: aws-sdk
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.61'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.61'
41
+ - !ruby/object:Gem::Dependency
42
+ name: thor
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.19'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.19'
55
+ - !ruby/object:Gem::Dependency
56
+ name: fog
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.28'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.28'
69
+ description: A wrapper for the current cheapest cloud machine from AWS, Rackspace,
70
+ and Digital Ocean.
71
+ email: p@tricks.email
72
+ executables:
73
+ - mist
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - bin/mist
78
+ - lib/mist.rb
79
+ - lib/mist/client.rb
80
+ - lib/mist/services.rb
81
+ - lib/mist/services/aws.rb
82
+ homepage: https://github.com/thnkr/mist
83
+ licenses:
84
+ - MIT
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 1.9.3
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 2.2.2
103
+ signing_key:
104
+ specification_version: 4
105
+ summary: A wrapper for the current cheapest cloud machine from AWS, Rackspace, and
106
+ Digital Ocean.
107
+ test_files: []
108
+ has_rdoc: