meroku 0.1.36 → 2.0.0

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.
@@ -1,12 +0,0 @@
1
- module Meroku
2
-
3
- class App < Meroku::ApplicationRecord
4
- include Meroku::Util
5
- validates_uniqueness_of :name
6
- has_many :domains, class_name: "Meroku::Domain"
7
- has_many :configs, class_name: "Meroku::Config"
8
- end
9
-
10
-
11
- end
12
-
@@ -1,18 +0,0 @@
1
- class Meroku::App::Collaborator < Meroku::ApplicationRecord
2
- include Meroku::Util
3
- self.table_name = "meroku_app_collaborators"
4
-
5
- validates :user_id, presence: true, allow_nil: false
6
- validates :app_id, presence: true, allow_nil: false
7
- validates_uniqueness_of :user_id, :scope => "app_id"
8
-
9
- after_create :setup_repo
10
- after_create :add_mysql_user
11
- after_create :create_empty_mysql_db
12
- after_create :add_mysql_grants
13
- after_create :add_pg_user
14
- after_create :create_empty_pg_db
15
- after_create :add_pg_grants
16
- end
17
-
18
-
@@ -1,8 +0,0 @@
1
- module Meroku
2
-
3
- # This class was auto generated by rails 5
4
- class ApplicationRecord < ActiveRecord::Base
5
- self.abstract_class = true
6
- end
7
-
8
- end
@@ -1,112 +0,0 @@
1
- module Meroku
2
-
3
- class AppsController < ApplicationController
4
- #before_action :set_app, only: [:show, :edit, :update, :destroy]
5
- skip_before_action :verify_authenticity_token, only: [:create, :update, :additional_env_vars]
6
- before_action :authenticate, only: [:create, :update, :additional_env_vars]
7
-
8
- ## GET /apps
9
- ## GET /apps.json
10
- #def index
11
- # @apps = App.all
12
- #end
13
- #
14
- ## GET /apps/1
15
- ## GET /apps/1.json
16
- #def show
17
- #end
18
- #
19
- ## GET /apps/new
20
- #def new
21
- # @app = App.new
22
- #end
23
- #
24
- ## GET /apps/1/edit
25
- #def edit
26
- #end
27
- #
28
- # POST /apps
29
- # POST /apps.json
30
- def create
31
- @app = Meroku::App.new(app_params)
32
- app_saved = @app.save
33
- collaborator_saved = nil
34
- if app_saved
35
- @collaborator = Meroku::App::Collaborator.new(
36
- app_id: @app.id,
37
- user_id: @user.id
38
- )
39
- collaborator_saved = @collaborator.save
40
- Meroku::Util.nginx_rebuild()
41
- end
42
-
43
- respond_to do |format|
44
- if app_saved && collaborator_saved
45
- format.json { render json: @app }
46
- else
47
- format.json {
48
- if @app.errors
49
- render json: { :errors => @app.errors }, :status => :unprocessable_entity
50
- elsif @collaborator.errors
51
- render json: { :errors => @collaborator.errors }, :status => :unprocessable_entity
52
- end
53
- }
54
- end
55
- end
56
- end
57
- #
58
- # PATCH/PUT /apps/1
59
- # PATCH/PUT /apps/1.json
60
- def update
61
- respond_to do |format|
62
- if @app_.update(app_params)
63
- format.json {
64
- Meroku::Util.nginx_rebuild()
65
- render json: @app_
66
- }
67
- else
68
- format.json { render json: @app_.errors, status: :unprocessable_entity }
69
- end
70
- end
71
- end
72
- #
73
- ## DELETE /apps/1
74
- ## DELETE /apps/1.json
75
- #def destroy
76
- # @app.destroy
77
- # respond_to do |format|
78
- # format.html { redirect_to apps_url, notice: 'App was successfully destroyed.' }
79
- # format.json { head :no_content }
80
- # end
81
- #end
82
-
83
-
84
- # POST /?
85
- def additional_env_vars
86
- if params[:dbtype] == "mysql"
87
- database_url = %Q[export DATABASE_URL=mysql2://u#{@user.id}:#{@user.database_password}@localhost/#{@app_.name}?socket=/opt/bitnami/mysql/tmp/mysql.sock]
88
- else
89
- database_url = %Q[export DATABASE_URL=postgres://u#{@user.id}:#{@user.database_password}@localhost/#{@app_.name}]
90
- end
91
-
92
- respond_to do |format|
93
- Rails.logger.debug "DB8 #{"export RAILS_ENV=production export PORT=#{3000+@app_.id} #{database_url}"}"
94
- format.json { render json: { :data => "export RAILS_ENV=production export PORT=#{3000+@app_.id} #{database_url} "} }
95
- end
96
- end
97
-
98
- private
99
- # Use callbacks to share common setup or constraints between actions.
100
- #def set_app
101
- # @app = App.find(params[:id])
102
- #end
103
-
104
- # Never trust parameters from the scary internet, only allow the white list through.
105
- def app_params
106
- params.fetch(:app, {}).permit(:name, :server_crt, :server_key)
107
- end
108
-
109
- end
110
-
111
- end
112
-
@@ -1,8 +0,0 @@
1
- require 'thor'
2
- module Meroku
3
-
4
- module CLI
5
-
6
- end
7
-
8
- end
@@ -1,30 +0,0 @@
1
- module Meroku
2
- module CLI
3
- require 'action_view'
4
- include ActionView::Helpers::TextHelper
5
-
6
- class Certs < Thor
7
- include Meroku::Util
8
-
9
- desc "add server.crt server.key", "Upload domain certificate and key"
10
- def add(cert, key)
11
- require 'rest-client'
12
- require 'active_support/all'
13
- require 'rack'
14
- require 'action_view'
15
- server_crt = IO.read(cert)
16
- server_key = IO.read(key)
17
- resp = RestClient.put 'https://www.meroku.com/meroku/apps/0.json', { app: { server_crt: server_crt, server_key: server_key }, authentication: { token: cli_token, app_name: app_name } }
18
- puts "Added. (#{resp.code} #{Rack::Utils::HTTP_STATUS_CODES[resp.code]})"
19
- rescue RestClient::Exception => e
20
- abort e.to_s if e.response.code != 200
21
- out_str = "ERROR"
22
- if valid_json?(e.response) && JSON.parse(e.response)["errors"].size >= 1
23
- out_str += " "
24
- out_str += JSON.parse(e.response)["errors"].map { |e| e.join(' ') }.to_sentence
25
- end
26
- end
27
- end
28
- end
29
- end
30
-
@@ -1,14 +0,0 @@
1
- module Meroku
2
- module CLI
3
- require 'action_view'
4
- include ActionView::Helpers::TextHelper
5
-
6
- class Certs < Thor
7
- include Meroku::Util
8
-
9
- desc "add 'DOMAIN'", "Remove DOMAIN"
10
- def remove(domain)
11
- require 'rest-client'
12
- require 'active_support/all'
13
- require 'rack'
14
- require 'action_view'
@@ -1,97 +0,0 @@
1
- module Meroku
2
- module CLI
3
- require 'action_view'
4
- include ActionView::Helpers::TextHelper
5
-
6
- class Cli < Thor
7
- include Meroku::Util
8
- register(Meroku::CLI::Server, 'server', 'server <command>', 'Administer infrastructure')
9
- register(Remote, 'remote', 'remote <command>', '')
10
- register(Keys, 'keys', 'keys <command>', '')
11
- register(Domains,'domains','domains <command>', '')
12
- register(Certs ,'certs','certs <command>', '')
13
- register(Config ,'config','config <command>', '')
14
-
15
- desc "_run 'COMMAND'", "Run a command on the server"
16
- def _run(command)
17
- user_id = `cat /tmp/meroku.id`.chomp
18
- server = "u#{user_id}@www.meroku.com"
19
- name = app_name
20
- if IO.read("Gemfile") =~ /^[^\#]*gem ["']mysql/
21
- dbtype="mysql"
22
- else
23
- dbtype="postgres"
24
- end
25
-
26
- _additional_env_vars = additional_env_vars(name,dbtype)
27
- if command == "bash"
28
- exec "ssh -t -o StrictHostKeyChecking=no #{server} '#{_additional_env_vars} ;echo INFO: Type exit quit this remote shell; cd #{name}; bash --login'"
29
- end
30
- abort "ERROR: Unexpected output for \"git remote -v\"" if name.blank?
31
- require 'open3'
32
- stdout, stderr, exit_status = Open3.capture3(%Q[ssh -o 'StrictHostKeyChecking=no' #{server} 'export PATH=$PATH:/opt/bitnami/nodejs/bin; source ~/.rvm/scripts/rvm; cd #{name}; #{_additional_env_vars} ; #{command}'])
33
- puts stdout if !stdout.empty?
34
- puts stderr if !stderr.empty?
35
- puts "meroku run finished with exit code #{exit_status.exitstatus}" if exit_status.exitstatus != 0
36
- end
37
-
38
- desc "create NAME", "Create an app named NAME on meroku"
39
- def create(name)
40
- require 'rest-client'
41
- require 'rack'
42
-
43
- return if !cli_logged_in?
44
- resp = RestClient.post 'https://www.meroku.com/meroku/apps.json', { :"app[name]" => name, authentication: { app: name, token: cli_token} }
45
- puts "Created #{JSON.parse(resp)["name"]}! (#{resp.code} #{Rack::Utils::HTTP_STATUS_CODES[resp.code]})"
46
- `git remote remove meroku 2>&1 >/dev/null`
47
- `git remote add meroku u#{cli_user_id}@www.meroku.com:#{name}.git 2>&1 >/dev/null`
48
- puts "Added git remote meroku ( u#{cli_user_id}@www.meroku.com:#{name}.git )"
49
- rescue RestClient::Exception => e
50
- abort e.to_s if e == RestClient::ServerBrokeConnection
51
- out_str = "ERROR"
52
- if valid_json?(e.response) && JSON.parse(e.response)["errors"].size >= 1
53
- out_str += " "
54
- out_str += JSON.parse(e.response)["errors"].map { |e| e.join(' ') }.to_sentence
55
- end
56
- out_str += " (#{e.to_s}) "
57
- puts out_str
58
- end
59
-
60
- option :email, :required => true
61
- option :password, :required => true
62
- desc "login", "Login to meroku"
63
- def login()
64
- require 'rest-client'
65
- require 'rack'
66
- resp = RestClient.post 'https://www.meroku.com/users/sign_in.json', {:"user[email]" => options[:email], :"user[password]" => options[:password] }
67
- puts "Logged in! (#{resp.code} #{Rack::Utils::HTTP_STATUS_CODES[resp.code]})"
68
- IO.write("/tmp/meroku.token", JSON.parse(resp)["encrypted_password"])
69
- IO.write("/tmp/meroku.id", JSON.parse(resp)["id"])
70
- rescue RestClient::Exception => e
71
- abort e.to_s if e.response.code == 500 || e.response.code == 404
72
- out_str = "ERROR"
73
- if JSON.parse(e.response)["errors"].is_a? Array
74
- out_str += " "
75
- out_str += JSON.parse(e.response)["errors"].map { |e| e.join(' ') }.to_sentence
76
- end
77
- out_str += " (#{e.to_s}) "
78
- puts out_str
79
- end
80
-
81
- option :email, :required => true
82
- option :password, :required => true
83
- desc "signup", "Sign up for a free meroku account"
84
- def signup()
85
- require 'rest-client'
86
- require 'rack'
87
- resp = RestClient.post 'https://www.meroku.com/users.json', {:"user[email]" => options[:email], :"user[password]" => options[:password], :"user[password_confirmation]" => options[:password] }
88
- puts "Signed up #{JSON.parse(resp)["email"]}! (#{resp.code} #{Rack::Utils::HTTP_STATUS_CODES[resp.code]})"
89
- rescue RestClient::Exception => e
90
- abort e.to_s if e.response.code == 500 || e.response.code == 404
91
- puts "ERROR " +
92
- JSON.parse(e.response)["errors"].map { |e| e.join(' ') }.to_sentence +
93
- " (#{e.to_s})"
94
- end
95
- end
96
- end
97
- end
@@ -1,111 +0,0 @@
1
- module Meroku
2
- module CLI
3
- require 'action_view'
4
- include ActionView::Helpers::TextHelper
5
-
6
- class Config < Thor
7
- include Meroku::Util
8
-
9
- desc "list", "List environment variables"
10
- def list
11
- require 'rest-client'
12
- #require 'active_support/all'
13
- require 'rack'
14
- require 'action_view'
15
- resp = RestClient.get "https://www.meroku.com/meroku/configs.json?authentication_token=#{cli_token}&authentication_app_name=#{app_name}"
16
- puts "#{JSON.parse(resp)["data"]}. (#{resp.code} #{Rack::Utils::HTTP_STATUS_CODES[resp.code]})"
17
- rescue RestClient::Exception => e
18
- out_str = "ERROR"
19
- if valid_json?(e.response) && JSON.parse(e.response)["errors"].size >= 1
20
- out_str += " "
21
- out_str += JSON.parse(e.response)["errors"].map { |e| e.join(' ') }.to_sentence
22
- end
23
- out_str += " (#{e.to_s}) "
24
- puts out_str
25
- end
26
-
27
- #desc "remove 'DOMAIN'", "Remove DOMAIN"
28
- #def remove(domain)
29
- # require 'rest-client'
30
- # require 'active_support/all'
31
- # require 'rack'
32
- # require 'action_view'
33
- # resp = RestClient.delete "https://www.meroku.com/meroku/domains/0.json?domain=#{domain}&authentication_token=#{cli_token}&authentication_app_name=#{app_name}"
34
- # puts "Removed #{truncate(JSON.parse(resp)["data"]["domain"])}. (#{resp.code} #{Rack::Utils::HTTP_STATUS_CODES[resp.code]})"
35
- #rescue RestClient::Exception => e
36
- # abort e.to_s if e.response.code != 200
37
- # out_str = "ERROR"
38
- # if valid_json?(e.response) && JSON.parse(e.response)["errors"].size >= 1
39
- # out_str += " "
40
- # out_str += JSON.parse(e.response)["errors"].map { |e| e.join(' ') }.to_sentence
41
- # end
42
- # out_str += " (#{e.to_s}) "
43
- # puts out_str
44
- #end
45
- #
46
- #desc "list", "List domains associated with your app"
47
- #def list
48
- # require 'rest-client'
49
- # require 'active_support/all'
50
- # require 'rack'
51
- # require 'action_view'
52
- # resp = RestClient.get "https://www.meroku.com/meroku/domains.json?authentication_token=#{cli_token}&authentication_app_name=#{app_name}"
53
- # puts "#{JSON.parse(resp)["data"]}. (#{resp.code} #{Rack::Utils::HTTP_STATUS_CODES[resp.code]})"
54
- #rescue RestClient::Exception => e
55
- # out_str = "ERROR"
56
- # if valid_json?(e.response) && JSON.parse(e.response)["errors"].size >= 1
57
- # out_str += " "
58
- # out_str += JSON.parse(e.response)["errors"].map { |e| e.join(' ') }.to_sentence
59
- # end
60
- # out_str += " (#{e.to_s}) "
61
- # puts out_str
62
- #end
63
-
64
-
65
-
66
-
67
- desc "unset FOO", "Set environment variable FOO"
68
- def unset(name)
69
- require 'rest-client'
70
- require 'rack'
71
- require 'action_view'
72
- resp = RestClient.delete "https://www.meroku.com/meroku/configs/0.json?name=#{name}&authentication_token=#{cli_token}&authentication_app_name=#{app_name}"
73
- puts "Removed #{truncate(JSON.parse(resp)["data"]["name"])}. (#{resp.code} #{Rack::Utils::HTTP_STATUS_CODES[resp.code]})"
74
- rescue RestClient::Exception => e
75
- abort e.to_s if e == RestClient::ServerBrokeConnection
76
- out_str = "ERROR"
77
- puts e.to_s
78
- if valid_json?(e.response) && JSON.parse(e.response)["errors"].size >= 1
79
- out_str += " "
80
- out_str += JSON.parse(e.response)["errors"].map { |e| e.join(' ') }.to_sentence
81
- end
82
- out_str += " (#{e.to_s}) "
83
- puts out_str
84
- end
85
-
86
-
87
-
88
-
89
- desc "set FOO baa", "Set environment variable FOO to baa"
90
- def set(name, value)
91
- require 'rest-client'
92
- #require 'active_support/all'
93
- require 'rack'
94
- require 'action_view'
95
-
96
- resp = RestClient.post 'https://www.meroku.com/meroku/configs.json', { name: name, value: value, authentication: { token: cli_token, app_name: app_name } }
97
- puts "Added/Updated #{truncate(JSON.parse(resp)["data"]["name"])}. (#{resp.code} #{Rack::Utils::HTTP_STATUS_CODES[resp.code]})"
98
- rescue RestClient::Exception => e
99
- abort e.to_s if e == RestClient::ServerBrokeConnection
100
- out_str = "ERROR"
101
- puts e.to_s
102
- if valid_json?(e.response) && JSON.parse(e.response)["errors"].size >= 1
103
- out_str += " "
104
- out_str += JSON.parse(e.response)["errors"].map { |e| e.join(' ') }.to_sentence
105
- end
106
- out_str += " (#{e.to_s}) "
107
- puts out_str
108
- end
109
- end
110
- end
111
- end
@@ -1,69 +0,0 @@
1
- module Meroku
2
- module CLI
3
- require 'action_view'
4
- include ActionView::Helpers::TextHelper
5
-
6
- class Domains < Thor
7
- include Meroku::Util
8
-
9
- desc "remove 'DOMAIN'", "Remove DOMAIN"
10
- def remove(domain)
11
- require 'rest-client'
12
- require 'active_support/all'
13
- require 'rack'
14
- require 'action_view'
15
- resp = RestClient.delete "https://www.meroku.com/meroku/domains/0.json?domain=#{domain}&authentication_token=#{cli_token}&authentication_app_name=#{app_name}"
16
- puts "Removed #{truncate(JSON.parse(resp)["data"]["domain"])}. (#{resp.code} #{Rack::Utils::HTTP_STATUS_CODES[resp.code]})"
17
- rescue RestClient::Exception => e
18
- abort e.to_s if e.response.code != 200
19
- out_str = "ERROR"
20
- if valid_json?(e.response) && JSON.parse(e.response)["errors"].size >= 1
21
- out_str += " "
22
- out_str += JSON.parse(e.response)["errors"].map { |e| e.join(' ') }.to_sentence
23
- end
24
- out_str += " (#{e.to_s}) "
25
- puts out_str
26
- end
27
-
28
- desc "list", "List domains associated with your app"
29
- def list
30
- require 'rest-client'
31
- require 'active_support/all'
32
- require 'rack'
33
- require 'action_view'
34
- resp = RestClient.get "https://www.meroku.com/meroku/domains.json?authentication_token=#{cli_token}&authentication_app_name=#{app_name}"
35
- puts "#{JSON.parse(resp)["data"]}. (#{resp.code} #{Rack::Utils::HTTP_STATUS_CODES[resp.code]})"
36
- rescue RestClient::Exception => e
37
- out_str = "ERROR"
38
- if valid_json?(e.response) && JSON.parse(e.response)["errors"].size >= 1
39
- out_str += " "
40
- out_str += JSON.parse(e.response)["errors"].map { |e| e.join(' ') }.to_sentence
41
- end
42
- out_str += " (#{e.to_s}) "
43
- puts out_str
44
- end
45
-
46
- desc "add 'DOMAIN'", "Associate DOMAIN with your app"
47
- def add(domain)
48
- require 'rest-client'
49
- require 'active_support/all'
50
- require 'rack'
51
- require 'action_view'
52
-
53
- resp = RestClient.post 'https://www.meroku.com/meroku/domains.json', { domain: domain, authentication: { token: cli_token, app_name: app_name } }
54
- puts "Added #{truncate(JSON.parse(resp)["data"]["domain"])}. (#{resp.code} #{Rack::Utils::HTTP_STATUS_CODES[resp.code]})"
55
- rescue RestClient::ServerBrokeConnection
56
- raise
57
- rescue RestClient::Exception => e
58
- abort e.to_s if e == RestClient::ServerBrokeConnection
59
- out_str = "ERROR"
60
- if valid_json?(e.response) && JSON.parse(e.response)["errors"].size >= 1
61
- out_str += " "
62
- out_str += JSON.parse(e.response)["errors"].map { |e| e.join(' ') }.to_sentence
63
- end
64
- out_str += " (#{e.to_s}) "
65
- puts out_str
66
- end
67
- end
68
- end
69
- end