meroku 2.0.24 → 2.0.25

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f904e491e3b5db4cac84dd8df856e3f261ed524
4
- data.tar.gz: 50bc9918fee760e9023221be2ea2331fc4e3a515
3
+ metadata.gz: 83ad90672b1ba754f3a9d60a73014e33fae3f7a9
4
+ data.tar.gz: c2059ae0f7f906600851aeef0e9ea111005fe434
5
5
  SHA512:
6
- metadata.gz: bd05e025fb8078879f8950ce154d9d2b5d775f5f76cb1cb53aba11c1a6006cf750d5d8b9220eb2390ddc3f3e230b254ff84b831e9f4aa59e1da1e170f50e99a6
7
- data.tar.gz: 38c5f3b0051a55eca784dc970ff02f1e250b7a3f6d7ae5124ac27955c3f5ad40d1d598c8c58a9616ad942a563934af417dd886ffd5c3ce0bfb028972de25c08b
6
+ metadata.gz: 05757a4e2eb0895c4caa7174c48ec415d307c69f25ab55a84e41e59c6edaacd6263c2f0a8a26c3f4294e35a9372c502e5a73d99c2169fe364cf168f9e59c0091
7
+ data.tar.gz: 595532afb78715dc0b3610b841896ddf3845545889834c557c4a31f535c3ca02f66d91049609de7b98eb9cc57aa98dab3dd2377bcae3c723f177a81133af3e40
data/README.md CHANGED
@@ -9,7 +9,9 @@ because hosting 100 apps costs $700 ($7x100) at you-know-where.com
9
9
  [![Dependencies](https://img.shields.io/gemnasium/meroku/meroku.svg?style=flat-square)](https://gemnasium.com/meroku/meroku)
10
10
  [![Issues](https://img.shields.io/github/issues/meroku/meroku.svg?style=flat-square)](https://github.com/meroku/meroku/issues)
11
11
  [![License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](http://opensource.org/licenses/MIT)
12
+ <br>
12
13
  [![Gem Version](https://badge.fury.io/rb/meroku.svg)](https://badge.fury.io/rb/meroku)
14
+ <br>
13
15
  [![Donate](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/meroku/donate)
14
16
 
15
17
 
@@ -27,8 +29,31 @@ And then execute:
27
29
 
28
30
  ## Usage
29
31
 
32
+ When inside a git repository containing a rails application,
33
+ do a single command deployment by running
34
+
35
+ $ git push meroku master
36
+
37
+ Get additional help by doing
38
+
30
39
  $ meroku --help
31
40
 
41
+ Usage: meroku [options]
42
+ --help Prints this help
43
+ --signup EMAIL,PASSWORD
44
+ --unregister EMAIL,PASSWORD
45
+ --login EMAIL,PASSWORD
46
+ --logout
47
+ --keys-add
48
+ --keys List already uploaded keys
49
+ --keys-remove ID
50
+ --create NAME Create an app
51
+ --list-apps
52
+ --delete-app NAME
53
+
54
+ --spawn MEROKU_SECRET Spawn infrastructure
55
+ --despawn MEROKU_SECRET
56
+
32
57
  ## Development
33
58
 
34
59
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/lib/meroku.rb CHANGED
@@ -7,12 +7,14 @@ require 'open-uri'
7
7
  require 'net/ssh'
8
8
  require 'aws-sdk-ec2'
9
9
  require 'meroku/version'
10
+ require 'meroku/response_handler'
10
11
  require 'meroku/user'
12
+ require 'meroku/app'
13
+ require 'meroku/key'
11
14
  require 'meroku/secrets'
12
15
  require 'meroku/shared'
13
16
  require 'meroku/aws'
14
17
  require 'meroku/node'
15
- require 'meroku/api'
16
18
  require 'meroku/options'
17
19
  require 'meroku/error'
18
20
  require 'meroku/cli'
data/lib/meroku/app.rb ADDED
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meroku
4
+ # Logic related to Consumer Apps
5
+ class App
6
+ extend Meroku::User
7
+ extend Meroku::ResponseHandler
8
+
9
+ def self.create(name)
10
+ raise Meroku::Error, 'Not in a git repository' unless Dir.exist?('.git')
11
+ data = { 'token' => saved_token, 'name' => name }.to_json
12
+ result = RestClient.post 'https://www.meroku.com/apps.json',
13
+ data,
14
+ content_type: :json
15
+ process_error(result)
16
+ process_success(result) { add_git_remote(result) }
17
+ end
18
+
19
+ def self.delete_app(name)
20
+ data = { 'name' => name, 'token' => saved_token }
21
+ result = RestClient::Request.execute(
22
+ method: :delete,
23
+ url: 'https://www.meroku.com/apps.json',
24
+ headers: { params: data }
25
+ )
26
+ process_error(result)
27
+ process_success(result)
28
+ end
29
+
30
+ def self.list_apps
31
+ result = RestClient.get 'https://www.meroku.com/apps.json',
32
+ params: { 'token' => saved_token },
33
+ content_type: :json
34
+ process_error(result)
35
+ process_success(result) do
36
+ JSON.parse(result).dig('data', 'apps_names').each do |k|
37
+ puts k
38
+ end
39
+ end
40
+ end
41
+
42
+ def self.add_git_remote(result)
43
+ username = JSON.parse(result).dig('data', 'username')
44
+ appname = JSON.parse(result).dig('data', 'name')
45
+ remote_uri = "#{username}@www.meroku.com:#{appname}.git"
46
+ Kernel.system('git remote remove meroku 2>/dev/null')
47
+ Kernel.system("git remote add meroku #{remote_uri}")
48
+ end
49
+ end
50
+ end
data/lib/meroku/cli.rb CHANGED
@@ -5,7 +5,6 @@ module Meroku
5
5
  # logic.
6
6
  class CLI
7
7
  include Meroku::Shared
8
- include Meroku::Api
9
8
  attr_reader :options
10
9
 
11
10
  def initialize
@@ -14,7 +13,6 @@ module Meroku
14
13
 
15
14
  def run(args = ARGV)
16
15
  @options = Options.new.parse(args)
17
- act_on_user_options
18
16
  act_on_options
19
17
  rescue Meroku::Success
20
18
  return 0
@@ -28,12 +26,31 @@ module Meroku
28
26
  private
29
27
 
30
28
  def act_on_options
31
- if @options[:meroku_secret]
32
- Meroku::Shared.secrets.meroku_secret = @options[:meroku_secret]
33
- end
29
+ act_on_key_options
30
+ act_on_app_options
31
+ act_on_user_options
32
+ act_on_misc_options
33
+ true
34
+ end
35
+
36
+ def act_on_app_options
37
+ App.create(@options[:name]) if @options[:create]
38
+ App.list_apps if @options[:list_apps]
39
+ App.delete_app(@options[:name]) if @options[:delete_app]
40
+ end
41
+
42
+ def act_on_key_options
43
+ Key.upload if @options[:keys_add]
44
+ Key.list if @options[:keys]
45
+ Key.remove(@options[:key_id]) if @options[:keys_remove]
46
+ end
47
+
48
+ def act_on_misc_options
49
+ Meroku::Shared.secrets.meroku_secret = @options[:meroku_secret] \
50
+ if @options[:meroku_secret]
51
+
34
52
  Node.new if @options[:spawn]
35
53
  Meroku::Aws.terminate_all(tag: 'node') if @options[:despawn]
36
- true
37
54
  end
38
55
 
39
56
  def act_on_user_options
data/lib/meroku/key.rb ADDED
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meroku
4
+ # Logic related to Ssh keys
5
+ # eg. Uploading of users public key
6
+ module Key
7
+ extend Meroku::ResponseHandler
8
+ extend Meroku::User
9
+
10
+ def self.list
11
+ result = RestClient.get 'https://www.meroku.com/keys.json',
12
+ params: { 'token' => saved_token },
13
+ content_type: :json
14
+ process_error(result)
15
+ process_success(result) do
16
+ JSON.parse(result).dig('data', 'keys_ids').each do |k|
17
+ puts "Key id: #{k}"
18
+ end
19
+ end
20
+ end
21
+
22
+ def self.upload
23
+ data = {
24
+ 'token' => saved_token,
25
+ 'key_name' => 'id_rsa.pub',
26
+ 'key_data' => IO.read(Dir.home + '/.ssh/id_rsa.pub')
27
+ }.to_json
28
+ result = RestClient.post 'https://www.meroku.com/keys.json',
29
+ data,
30
+ content_type: :json
31
+ process_error(result)
32
+ process_success(result) { true }
33
+ end
34
+
35
+ def self.remove(key_id)
36
+ data = { 'id' => key_id, 'token' => saved_token }
37
+ result = RestClient::Request.execute(
38
+ method: :delete,
39
+ url: 'https://www.meroku.com/keys.json',
40
+ headers: { params: data }
41
+ )
42
+ process_error(result)
43
+ process_success(result)
44
+ end
45
+ end
46
+ end
@@ -17,19 +17,42 @@ module Meroku
17
17
  def define_options(_args)
18
18
  OptionParser.new do |opts|
19
19
  opts.banner = 'Usage: meroku [options]'
20
+ opts.on('--help', 'Prints this help') { puts opts }
21
+ add_user_options(opts)
22
+ add_key_options(opts)
23
+ add_app_options(opts)
24
+ opts.separator ''
25
+ add_maintainer_options(opts)
26
+ end
27
+ end
20
28
 
21
- opts.on('--help', 'Prints this help') do
22
- puts opts
23
- end
29
+ def add_key_options(opts)
30
+ option(opts, '--keys-add') { @options[:keys_add] = true }
31
+ option(opts, '--keys') { @options[:keys] = true }
32
+ option(opts, '--keys-remove ID') do |key_id|
33
+ @options[:keys_remove] = true
34
+ @options[:key_id] = key_id
35
+ end
36
+ end
24
37
 
25
- add_users_registration_options(opts)
26
- add_users_login_options(opts)
27
- opts.separator ''
28
- add_maintainers_options(opts)
38
+ def add_app_options(opts)
39
+ option(opts, '--create NAME') do |name|
40
+ @options[:create] = true
41
+ @options[:name] = name
42
+ end
43
+ option(opts, '--list-apps') { @options[:list_apps] = true }
44
+ option(opts, '--delete-app NAME') do |name|
45
+ @options[:delete_app] = true
46
+ @options[:name] = name
29
47
  end
30
48
  end
31
49
 
32
- def add_users_registration_options(opts)
50
+ def add_user_options(opts)
51
+ add_user_registration_options(opts)
52
+ add_user_login_options(opts)
53
+ end
54
+
55
+ def add_user_registration_options(opts)
33
56
  option(opts, '--signup EMAIL,PASSWORD', Array) do |list|
34
57
  @options[:signup] = true
35
58
  @options[:email] = list[0]
@@ -42,7 +65,7 @@ module Meroku
42
65
  end
43
66
  end
44
67
 
45
- def add_users_login_options(opts)
68
+ def add_user_login_options(opts)
46
69
  option(opts, '--login EMAIL,PASSWORD', Array) do |list|
47
70
  @options[:login] = true
48
71
  @options[:email] = list[0]
@@ -53,7 +76,7 @@ module Meroku
53
76
  end
54
77
  end
55
78
 
56
- def add_maintainers_options(opts)
79
+ def add_maintainer_options(opts)
57
80
  option(opts, '--spawn MEROKU_SECRET') do |meroku_secret|
58
81
  @options[:spawn] = true
59
82
  @options[:meroku_secret] = meroku_secret
@@ -87,7 +110,9 @@ module Meroku
87
110
  module OptionsHelp
88
111
  TEXT = {
89
112
  version: 'Display version.',
90
- spawn: 'Spawn infrastructure'
113
+ spawn: 'Spawn infrastructure',
114
+ keys: 'List already uploaded keys',
115
+ create: 'Create an app'
91
116
  }.freeze
92
117
  end
93
118
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Meroku
4
+ # Logic related to making rest api calls to backend rails server
5
+ module ResponseHandler
6
+ def process_error(result)
7
+ raise Meroku::Error, JSON.parse(result).dig('errors') \
8
+ if JSON.parse(result).dig('errors')
9
+ end
10
+
11
+ def process_success(result)
12
+ id = JSON.parse(result).dig('data', 'id')
13
+ if id
14
+ yield(result) if block_given?
15
+ puts "OK [#{id}]"
16
+ end
17
+ raise Meroku::Success
18
+ end
19
+ end
20
+ end
data/lib/meroku/user.rb CHANGED
@@ -3,6 +3,8 @@
3
3
  module Meroku
4
4
  # Logic related to Users login, logout etc
5
5
  module User
6
+ extend Meroku::ResponseHandler
7
+
6
8
  def self.login(email, password)
7
9
  data = { 'email' => email, 'password' => password }.to_json
8
10
  result = RestClient.post 'https://www.meroku.com/login.json',
@@ -12,22 +14,8 @@ module Meroku
12
14
  process_success(result) { |x| save_token(x) }
13
15
  end
14
16
 
15
- def self.process_error(result)
16
- raise Meroku::Error, JSON.parse(result).dig('errors') \
17
- if JSON.parse(result).dig('errors')
18
- end
19
-
20
- def self.process_success(result)
21
- id = JSON.parse(result).dig('data', 'id')
22
- if id
23
- yield(result) if block_given?
24
- puts "OK [#{id}]"
25
- end
26
- raise Meroku::Success
27
- end
28
-
29
17
  def self.save_token(x)
30
- token = JSON.parse(x).dig('data', 'id')
18
+ token = JSON.parse(x).dig('data', 'token')
31
19
  IO.write("#{Dir.home}/.meroku_token", token) if token
32
20
  end
33
21
 
@@ -62,5 +50,12 @@ module Meroku
62
50
  file = "#{Dir.home}/.meroku_token"
63
51
  File.delete(file) if File.exist?(file)
64
52
  end
53
+
54
+ def saved_token
55
+ token_path = Dir.home + '/.meroku_token'
56
+ IO.read(token_path)
57
+ rescue StandardError => e
58
+ raise Meroku::Error, "Login failed #{e.class}"
59
+ end
65
60
  end
66
61
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Meroku
4
- VERSION = '2.0.24'
4
+ VERSION = '2.0.25'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meroku
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.24
4
+ version: 2.0.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Meroku System
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-11-07 00:00:00.000000000 Z
11
+ date: 2017-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -175,12 +175,14 @@ files:
175
175
  - data/etc_nginx_sites-enabled_template
176
176
  - guard
177
177
  - lib/meroku.rb
178
- - lib/meroku/api.rb
178
+ - lib/meroku/app.rb
179
179
  - lib/meroku/aws.rb
180
180
  - lib/meroku/cli.rb
181
181
  - lib/meroku/error.rb
182
+ - lib/meroku/key.rb
182
183
  - lib/meroku/node.rb
183
184
  - lib/meroku/options.rb
185
+ - lib/meroku/response_handler.rb
184
186
  - lib/meroku/secrets.rb
185
187
  - lib/meroku/shared.rb
186
188
  - lib/meroku/user.rb
data/lib/meroku/api.rb DELETED
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Meroku
4
- # Logic related to making rest api calls to backend rails server
5
- module Api
6
- def post(data)
7
- # response = RestClient.post "https://www.example.net", data.to_json
8
- # puts "DB8 #{response.inspect}"
9
- # true
10
- # response = RestClient.post(url, data.to_json,
11
- # timeout: 1,
12
- # content_type: :json,
13
- # accept: :json)
14
- # r = JSON.parse(response)
15
- # yield(r["data"]) if r.key?("data")
16
- # return unless r.key?("errors") && r["errors"].size.positive?
17
- # puts "error: #{r['errors'].map { |x| x['detail'] }.join('. ')}"
18
- end
19
- end
20
- end