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 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: