mist_cli 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.
- checksums.yaml +7 -0
- data/bin/mist +209 -0
- data/lib/mist/client.rb +56 -0
- data/lib/mist/services/aws.rb +23 -0
- data/lib/mist/services.rb +28 -0
- data/lib/mist.rb +53 -0
- metadata +108 -0
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
|
+
|
data/lib/mist/client.rb
ADDED
@@ -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:
|