meroku 0.0.0 → 0.1.28
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 +4 -4
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/meroku +5 -0
- data/lib/meroku/app/collaborator.rb +18 -0
- data/lib/meroku/app.rb +12 -0
- data/lib/meroku/application_record.rb +8 -0
- data/lib/meroku/apps_controller.rb +112 -0
- data/lib/meroku/cli/certs.rb +30 -0
- data/lib/meroku/cli/certs.rb~ +14 -0
- data/lib/meroku/cli/cli.rb +97 -0
- data/lib/meroku/cli/config.rb +111 -0
- data/lib/meroku/cli/domains.rb +69 -0
- data/lib/meroku/cli/keys.rb +38 -0
- data/lib/meroku/cli/remote.rb +13 -0
- data/lib/meroku/cli/remote.rb~ +12 -0
- data/lib/meroku/cli/server.rb +159 -0
- data/lib/meroku/cli/server.rb~ +4 -0
- data/lib/meroku/cli.rb +8 -0
- data/lib/meroku/config.rb +6 -0
- data/lib/meroku/configs_controller.rb +62 -0
- data/lib/meroku/core_ext.rb +30 -0
- data/lib/meroku/domain.rb +6 -0
- data/lib/meroku/domains_controller.rb +83 -0
- data/lib/meroku/error.rb +6 -0
- data/lib/meroku/key.rb +11 -0
- data/lib/meroku/keys_controller.rb +82 -0
- data/lib/meroku/sanitychecks.rb +19 -0
- data/lib/meroku/user.rb +23 -0
- data/lib/meroku/util.rb +416 -0
- data/lib/meroku/version.rb +3 -0
- data/lib/meroku.rb +20 -4
- metadata +170 -46
@@ -0,0 +1,159 @@
|
|
1
|
+
module Meroku
|
2
|
+
module CLI
|
3
|
+
require 'action_view'
|
4
|
+
include ActionView::Helpers::TextHelper
|
5
|
+
|
6
|
+
class Server < Thor
|
7
|
+
include Meroku::Sanitychecks
|
8
|
+
include Meroku::Util
|
9
|
+
|
10
|
+
desc "_downall", "Wip"
|
11
|
+
def _downall()
|
12
|
+
admin_secrets_required
|
13
|
+
ec2_client.terminate_instances({ instance_ids: [ production_servers.first ] }) if !production_servers.empty?
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "revert", "Puts server in state it was in when it was started and installed"
|
17
|
+
def revert()
|
18
|
+
puts `ssh -o 'StrictHostKeyChecking=no' -i ~/crypto/meroku/meroku.id_rsa ubuntu@34.239.241.218 'cd ~/meroku/ && git pull'`
|
19
|
+
puts `ssh -o 'StrictHostKeyChecking=no' -i ~/crypto/meroku/meroku.id_rsa ubuntu@34.239.241.218 'sudo ~/meroku/rails_app/script/revert'`
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "backup", "Backup databases in production server"
|
23
|
+
def backup()
|
24
|
+
admin_secrets_required
|
25
|
+
timestamp=Time.now.to_i
|
26
|
+
aws_exports="AWS_DEFAULT_REGION=us-east-1 AWS_ACCESS_KEY_ID=#{ENV['AWS_ACCESS_KEY_ID']} AWS_SECRET_ACCESS_KEY=#{ENV['AWS_SECRET_ACCESS_KEY']}"
|
27
|
+
|
28
|
+
if production_servers.empty?
|
29
|
+
puts "Not doing backup - No production servers"
|
30
|
+
return
|
31
|
+
end
|
32
|
+
|
33
|
+
# DBs
|
34
|
+
ssh3("34.239.241.218","PGPASSWORD=bitnami pg_dumpall -U postgres -f /tmp/#{timestamp}.postgres")
|
35
|
+
ssh3("34.239.241.218","mysqldump -uroot -pbitnami --all-databases > /tmp/#{timestamp}.mysql")
|
36
|
+
ssh3("34.239.241.218","gzip -fv -9 /tmp/#{timestamp}.postgres /tmp/#{timestamp}.mysql")
|
37
|
+
ssh("34.239.241.218","#{aws_exports} aws s3 cp /tmp/#{timestamp}.postgres.gz s3://meroku-database-backups/")
|
38
|
+
ssh("34.239.241.218","#{aws_exports} aws s3 cp /tmp/#{timestamp}.postgres.gz s3://meroku-database-backups/postgres.gz")
|
39
|
+
ssh("34.239.241.218","#{aws_exports} aws s3 cp /tmp/#{timestamp}.mysql.gz s3://meroku-database-backups/")
|
40
|
+
ssh("34.239.241.218","#{aws_exports} aws s3 cp /tmp/#{timestamp}.mysql.gz s3://meroku-database-backups/mysql.gz")
|
41
|
+
|
42
|
+
# HOME DIRS
|
43
|
+
ssh3("34.239.241.218","sudo rm -f /tmp/home_dirs.tgz || true; sudo tar --exclude='/home/bitnami' -zcvf /tmp/home_dirs.gz /home/*")
|
44
|
+
ssh("34.239.241.218","#{aws_exports} aws s3 cp /tmp/home_dirs.gz s3://meroku-database-backups/")
|
45
|
+
ssh("34.239.241.218","#{aws_exports} aws s3 cp s3://meroku-database-backups/home_dirs.gz s3://meroku-database-backups/#{timestamp}.home_dirs.gz")
|
46
|
+
# CLEANUP
|
47
|
+
ssh("34.239.241.218","sudo rm -f /tmp/*.mysql.gz /tmp/*.postgres.gz /tmp/home_dirs.gz")
|
48
|
+
end
|
49
|
+
|
50
|
+
desc "activate", "Assigns production elastic ip to standby node"
|
51
|
+
def activate()
|
52
|
+
admin_secrets_required
|
53
|
+
# Terminate server with production ip
|
54
|
+
if !production_servers.empty?
|
55
|
+
ec2_client.terminate_instances({ instance_ids: [ production_servers.first ] })
|
56
|
+
end
|
57
|
+
|
58
|
+
standby_servers = unused_servers
|
59
|
+
abort "Too many unused servers (#{standby_servers.size})" if standby_servers.size > 1
|
60
|
+
|
61
|
+
ec2_client.associate_address(
|
62
|
+
{
|
63
|
+
allocation_id: 'eipalloc-139f7823', # this is eip 34.239.241.218
|
64
|
+
instance_id: standby_servers.first
|
65
|
+
}
|
66
|
+
)
|
67
|
+
puts "Associated 34.239.241.218 with #{standby_servers.first}"
|
68
|
+
puts 'ping 34.239.241.218 -c 20'
|
69
|
+
puts `ping 34.239.241.218 -c 20`
|
70
|
+
puts `ssh -i ~/crypto/meroku/meroku.id_rsa -o "StrictHostKeyChecking=no" -v ubuntu@34.239.241.218 pwd`
|
71
|
+
# remove the next 3 lines later
|
72
|
+
ssh3("34.239.241.218","cat meroku/rails_app/tmp/pids/server.pid")
|
73
|
+
ssh3("34.239.241.218","kill -9 `cat meroku/rails_app/tmp/pids/server.pid`")
|
74
|
+
ssh3("34.239.241.218","cd meroku/rails_app; RAILS_SERVE_STATIC_FILES=1 SECRET_KEY_BASE=fixme rails s -e production -d -b 0.0.0.0 && sleep 5")
|
75
|
+
ssh3("34.239.241.218","sudo ls -la /opt/bitnami/nginx/conf/vhosts/") # for debugging
|
76
|
+
end
|
77
|
+
|
78
|
+
desc "install", "installs software needed to meroku work"
|
79
|
+
def install()
|
80
|
+
admin_secrets_required
|
81
|
+
ip = server_being_built
|
82
|
+
|
83
|
+
ssh2(ip,"sudo apt-add-repository ppa:git-core/ppa -y")
|
84
|
+
ssh2(ip,"sudo apt-get update -y")
|
85
|
+
ssh2(ip,"sudo apt-get install -yqq libyaml-dev libsqlite3-dev sqlite3 libgmp-dev libgdbm-dev")
|
86
|
+
ssh2(ip,"sudo apt-get install -yqq libncurses5-dev bison pkg-config libffi-dev")
|
87
|
+
ssh2(ip,"sudo apt-get install -yqq libgmp-dev libreadline6-dev libssl-dev libpq-dev libmysqlclient-dev jq awscli")
|
88
|
+
#ssh2(ip,"sudo apt-get install -yqq nodejs")
|
89
|
+
ssh2(ip,"sudo npm install -g yarn")
|
90
|
+
|
91
|
+
ssh2(ip,"sudo apt-get install git-core -y")
|
92
|
+
ssh2(ip,"sudo rm /opt/bitnami/git/bin/git")
|
93
|
+
ssh2(ip,"sudo ln -s /usr/bin/git /opt/bitnami/git/bin/git")
|
94
|
+
|
95
|
+
ssh2(ip,"sudo addgroup meroku;")
|
96
|
+
ssh2(ip,"sudo apt-get install emacs24-nox -y")
|
97
|
+
ssh2(ip,"git clone --quiet https://github.com/meroku/meroku.git")
|
98
|
+
|
99
|
+
ssh2(ip,"sudo mkdir /opt/githooks; sudo chmod 777 /opt/githooks")
|
100
|
+
ssh2(ip,'cp ~/meroku/misc/githook_post-receive /opt/githooks/post-receive')
|
101
|
+
ssh2(ip,'cp ~/meroku/misc/app_id_by_name /opt/githooks/app_id_by_name')
|
102
|
+
ssh2(ip,'cp ~/meroku/misc/user_id_by_name /opt/githooks/user_id_by_name')
|
103
|
+
|
104
|
+
ssh2(ip,"sudo chmod 777 /opt/githooks/* ")
|
105
|
+
ssh2(ip,"sudo ln -s /usr/bin/install /bin/install")
|
106
|
+
|
107
|
+
aws_exports="AWS_DEFAULT_REGION=us-east-1 AWS_ACCESS_KEY_ID=#{ENV['AWS_ACCESS_KEY_ID']} AWS_SECRET_ACCESS_KEY=#{ENV['AWS_SECRET_ACCESS_KEY']}"
|
108
|
+
|
109
|
+
# postgres / mysql restore happens here
|
110
|
+
ssh3(ip,"#{aws_exports} aws s3 cp s3://meroku-database-backups/postgres.gz /tmp/")
|
111
|
+
ssh3(ip,"#{aws_exports} aws s3 cp s3://meroku-database-backups/mysql.gz /tmp/")
|
112
|
+
ssh3(ip,"cd /tmp/ && gunzip postgres.gz && gunzip mysql.gz")
|
113
|
+
ssh3(ip,"PGPASSWORD=bitnami psql -U postgres -f /tmp/postgres")
|
114
|
+
ssh3(ip,"mysql -uroot -pbitnami < /tmp/mysql")
|
115
|
+
ssh3(ip,"sudo rm -f /tmp/mysql /tmp/postgres")
|
116
|
+
|
117
|
+
ssh2(ip,"sudo mkdir /opt/bitnami/nginx/keys/; ")
|
118
|
+
puts `scp -i ~/crypto/meroku/meroku.id_rsa ~/crypto/meroku/meroku_site_fullchain.pem ubuntu@#{ip}:/home/bitnami/`
|
119
|
+
ssh2(ip, 'sudo mv ~/meroku_site_fullchain.pem /opt/bitnami/nginx/keys/; ')
|
120
|
+
puts `scp -i ~/crypto/meroku/meroku.id_rsa ~/crypto/meroku/meroku_site_privkey.pem ubuntu@#{ip}:/home/bitnami/`
|
121
|
+
ssh2(ip,'sudo mv ~/meroku_site_privkey.pem /opt/bitnami/nginx/keys/; ')
|
122
|
+
|
123
|
+
ssh2(ip,"sudo cp meroku/misc/gemrc /etc/gemrc")
|
124
|
+
ssh2(ip,"cd meroku/rails_app; NOKOGIRI_USE_SYSTEM_LIBRARIES=1 bundle install")
|
125
|
+
|
126
|
+
ssh3(ip,"cd meroku/rails_app; RAILS_ENV=production rake nginx:rebuild")
|
127
|
+
|
128
|
+
# create unix users
|
129
|
+
ssh3(ip,"cd meroku/rails_app; RAILS_ENV=production rake unix_users:rebuild")
|
130
|
+
# create unix users directories
|
131
|
+
ssh3(ip,"#{aws_exports} aws s3 cp s3://meroku-database-backups/home_dirs.gz /tmp/")
|
132
|
+
ssh3(ip,"#{aws_exports} cd /; sudo tar xzvf /tmp/home_dirs.gz")
|
133
|
+
ssh3(ip,"sudo rm -f /tmp/home_dirs.gz")
|
134
|
+
|
135
|
+
ssh3(ip,"cd meroku/rails_app; SECRET_KEY_BASE=fixme rake assets:precompile")
|
136
|
+
ssh3(ip,"cd meroku/rails_app; RAILS_SERVE_STATIC_FILES=1 SECRET_KEY_BASE=fixme rails s -e production -d -b 0.0.0.0 && sleep 5")
|
137
|
+
|
138
|
+
# start customer rails apps here wipwip
|
139
|
+
|
140
|
+
ssh3(ip,"sudo /opt/bitnami/ctlscript.sh stop apache")
|
141
|
+
ssh3(ip,"sudo /opt/bitnami/ctlscript.sh restart nginx")
|
142
|
+
ssh3(ip,"sudo ls -la /opt/bitnami/nginx/conf/vhosts/")
|
143
|
+
end
|
144
|
+
|
145
|
+
desc "start", "spins up an ubuntu server"
|
146
|
+
long_desc <<-LONGDESC
|
147
|
+
Spins up an ubuntu server with name tag "meroku",
|
148
|
+
with the production ip not yet assigned
|
149
|
+
LONGDESC
|
150
|
+
def start()
|
151
|
+
admin_secrets_required
|
152
|
+
terminate_unused_servers
|
153
|
+
instance_id = ec2_start_instance
|
154
|
+
ec2_tag_instance(instance_id)
|
155
|
+
ec2_await_boot(instance_id)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
data/lib/meroku/cli.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
|
2
|
+
module Meroku
|
3
|
+
|
4
|
+
class ConfigsController < ApplicationController
|
5
|
+
skip_before_action :verify_authenticity_token, only: [:create, :destroy]
|
6
|
+
before_action :authenticate, only: [ :create, :index, :destroy ]
|
7
|
+
|
8
|
+
def index
|
9
|
+
configs = Meroku::App.last.configs.map { |x| "#{x.name}: #{x.value || 'nil'}" }.join("\n")
|
10
|
+
render json: {
|
11
|
+
"data": "#{configs}\n"
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def create
|
16
|
+
@config = Meroku::Config.where(name: params["name"], app_id: @app_.id).try(:first)
|
17
|
+
if @config
|
18
|
+
# if variable exists, update its value
|
19
|
+
@config.update_attributes(value: params["value"])
|
20
|
+
else
|
21
|
+
# if it doesn't exist, create record
|
22
|
+
@config = Meroku::Config.new(
|
23
|
+
name: params["name"],
|
24
|
+
value: params["value"],
|
25
|
+
app_id: @app_.id
|
26
|
+
)
|
27
|
+
end
|
28
|
+
respond_to do |format|
|
29
|
+
if @config.save
|
30
|
+
format.json { render json: { data: @config } }
|
31
|
+
else
|
32
|
+
format.json { render json: { :errors => @config.errors }, status: :unprocessable_entity }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
## PATCH/PUT /keys/1
|
38
|
+
## PATCH/PUT /keys/1.json
|
39
|
+
#def update
|
40
|
+
# respond_to do |format|
|
41
|
+
# if @key.update(key_params)
|
42
|
+
# format.html { redirect_to @key, notice: 'Key was successfully updated.' }
|
43
|
+
# format.json { render :show, status: :ok, location: @key }
|
44
|
+
# else
|
45
|
+
# format.html { render :edit }
|
46
|
+
# format.json { render json: @key.errors, status: :unprocessable_entity }
|
47
|
+
# end
|
48
|
+
# end
|
49
|
+
#end
|
50
|
+
|
51
|
+
# DELETE /keys/1
|
52
|
+
# DELETE /keys/1.json
|
53
|
+
def destroy
|
54
|
+
@config = Meroku::Config.find_by_name(params["name"])
|
55
|
+
@config.destroy
|
56
|
+
respond_to do |format|
|
57
|
+
format.json { render json: { data: @config } }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Array
|
2
|
+
# File activesupport/lib/active_support/core_ext/array/conversions.rb, line 59
|
3
|
+
def to_sentence(options = {})
|
4
|
+
options.assert_valid_keys(:words_connector, :two_words_connector, :last_word_connector, :locale)
|
5
|
+
|
6
|
+
default_connectors = {
|
7
|
+
:words_connector => ', ',
|
8
|
+
:two_words_connector => ' and ',
|
9
|
+
:last_word_connector => ', and '
|
10
|
+
}
|
11
|
+
if defined?(I18n)
|
12
|
+
i18n_connectors = I18n.translate(:'support.array', locale: options[:locale], default: {})
|
13
|
+
default_connectors.merge!(i18n_connectors)
|
14
|
+
end
|
15
|
+
options = default_connectors.merge!(options)
|
16
|
+
|
17
|
+
case length
|
18
|
+
when 0
|
19
|
+
''
|
20
|
+
when 1
|
21
|
+
self[0].to_s.dup
|
22
|
+
when 2
|
23
|
+
"#{self[0]}#{options[:two_words_connector]}#{self[1]}"
|
24
|
+
else
|
25
|
+
"#{self[0...-1].join(options[:words_connector])}#{options[:last_word_connector]}#{self[-1]}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
@@ -0,0 +1,83 @@
|
|
1
|
+
|
2
|
+
module Meroku
|
3
|
+
|
4
|
+
class DomainsController < ApplicationController
|
5
|
+
#before_action :set_domain, only: [:show, :edit, :update, :destroy]
|
6
|
+
skip_before_action :verify_authenticity_token, only: [:create, :destroy]
|
7
|
+
before_action :authenticate, only: [ :create, :index, :destroy ]
|
8
|
+
|
9
|
+
## GET /keys
|
10
|
+
## GET /keys.json
|
11
|
+
def index
|
12
|
+
@domain_names = @app_.domains.pluck(:domain)
|
13
|
+
render json: { "data": @domain_names }
|
14
|
+
end
|
15
|
+
|
16
|
+
## GET /keys/1
|
17
|
+
## GET /keys/1.json
|
18
|
+
#def show
|
19
|
+
#end
|
20
|
+
#
|
21
|
+
## GET /keys/new
|
22
|
+
#def new
|
23
|
+
# @key = Key.new
|
24
|
+
#end
|
25
|
+
#
|
26
|
+
## GET /keys/1/edit
|
27
|
+
#def edit
|
28
|
+
#end
|
29
|
+
#
|
30
|
+
# POST /keys
|
31
|
+
# POST /keys.json
|
32
|
+
def create
|
33
|
+
@domain = Meroku::Domain.new(
|
34
|
+
domain: params["domain"],
|
35
|
+
app_id: @app_.id
|
36
|
+
)
|
37
|
+
respond_to do |format|
|
38
|
+
if @domain.save
|
39
|
+
Meroku::Util.nginx_rebuild()
|
40
|
+
format.json { render json: { data: @domain } }
|
41
|
+
else
|
42
|
+
format.json { render json: { :errors => @domain.errors }, status: :unprocessable_entity }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
#
|
47
|
+
## PATCH/PUT /keys/1
|
48
|
+
## PATCH/PUT /keys/1.json
|
49
|
+
#def update
|
50
|
+
# respond_to do |format|
|
51
|
+
# if @key.update(key_params)
|
52
|
+
# format.html { redirect_to @key, notice: 'Key was successfully updated.' }
|
53
|
+
# format.json { render :show, status: :ok, location: @key }
|
54
|
+
# else
|
55
|
+
# format.html { render :edit }
|
56
|
+
# format.json { render json: @key.errors, status: :unprocessable_entity }
|
57
|
+
# end
|
58
|
+
# end
|
59
|
+
#end
|
60
|
+
|
61
|
+
# DELETE /keys/1
|
62
|
+
# DELETE /keys/1.json
|
63
|
+
def destroy
|
64
|
+
@domain = Meroku::Domain.find_by_domain(params["domain"])
|
65
|
+
@domain.destroy
|
66
|
+
Meroku::Util.nginx_rebuild()
|
67
|
+
respond_to do |format|
|
68
|
+
format.json { render json: { data: @domain } }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
## Use callbacks to share common setup or constraints between actions.
|
74
|
+
#def set_key
|
75
|
+
# @key = Key.find(params[:id])
|
76
|
+
#end
|
77
|
+
#
|
78
|
+
## Never trust parameters from the scary internet, only allow the white list through.
|
79
|
+
#def key_params
|
80
|
+
# params.require(:key).permit(:key, :original_filename, :user_id)
|
81
|
+
#end
|
82
|
+
end
|
83
|
+
end
|
data/lib/meroku/error.rb
ADDED
data/lib/meroku/key.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
|
2
|
+
module Meroku
|
3
|
+
|
4
|
+
class KeysController < ApplicationController
|
5
|
+
before_action :set_key, only: [:show, :edit, :update, :destroy]
|
6
|
+
skip_before_action :verify_authenticity_token, only: [:create]
|
7
|
+
before_action :authenticate, only: [ :create ]
|
8
|
+
|
9
|
+
## GET /keys
|
10
|
+
## GET /keys.json
|
11
|
+
#def index
|
12
|
+
# @keys = Meroku::Key.allxb
|
13
|
+
# render json: { "data": @keys }
|
14
|
+
#end
|
15
|
+
|
16
|
+
## GET /keys/1
|
17
|
+
## GET /keys/1.json
|
18
|
+
#def show
|
19
|
+
#end
|
20
|
+
#
|
21
|
+
## GET /keys/new
|
22
|
+
#def new
|
23
|
+
# @key = Key.new
|
24
|
+
#end
|
25
|
+
#
|
26
|
+
## GET /keys/1/edit
|
27
|
+
#def edit
|
28
|
+
#end
|
29
|
+
#
|
30
|
+
# POST /keys
|
31
|
+
# POST /keys.json
|
32
|
+
def create
|
33
|
+
@key = Meroku::Key.new(
|
34
|
+
key: params["key"],
|
35
|
+
user_id: @user.id
|
36
|
+
)
|
37
|
+
respond_to do |format|
|
38
|
+
if @key.save
|
39
|
+
format.json { render json: { data: @key } }
|
40
|
+
else
|
41
|
+
|
42
|
+
format.json { render json: { :errors => @key.errors }, status: :unprocessable_entity }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
#
|
47
|
+
## PATCH/PUT /keys/1
|
48
|
+
## PATCH/PUT /keys/1.json
|
49
|
+
#def update
|
50
|
+
# respond_to do |format|
|
51
|
+
# if @key.update(key_params)
|
52
|
+
# format.html { redirect_to @key, notice: 'Key was successfully updated.' }
|
53
|
+
# format.json { render :show, status: :ok, location: @key }
|
54
|
+
# else
|
55
|
+
# format.html { render :edit }
|
56
|
+
# format.json { render json: @key.errors, status: :unprocessable_entity }
|
57
|
+
# end
|
58
|
+
# end
|
59
|
+
#end
|
60
|
+
#
|
61
|
+
## DELETE /keys/1
|
62
|
+
## DELETE /keys/1.json
|
63
|
+
#def destroy
|
64
|
+
# @key.destroy
|
65
|
+
# respond_to do |format|
|
66
|
+
# format.html { redirect_to keys_url, notice: 'Key was successfully destroyed.' }
|
67
|
+
# format.json { head :no_content }
|
68
|
+
# end
|
69
|
+
#end
|
70
|
+
|
71
|
+
private
|
72
|
+
# Use callbacks to share common setup or constraints between actions.
|
73
|
+
def set_key
|
74
|
+
@key = Key.find(params[:id])
|
75
|
+
end
|
76
|
+
|
77
|
+
# Never trust parameters from the scary internet, only allow the white list through.
|
78
|
+
def key_params
|
79
|
+
params.require(:key).permit(:key, :original_filename, :user_id)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Meroku
|
2
|
+
module Sanitychecks
|
3
|
+
|
4
|
+
def admin_secrets_required
|
5
|
+
secrets_dir = "#{Dir.home}/crypto/meroku/"
|
6
|
+
IO.read("#{secrets_dir}/meroku_secrets")
|
7
|
+
require 'dotenv'
|
8
|
+
Dotenv.load("#{secrets_dir}/meroku_secrets")
|
9
|
+
IO.read("#{secrets_dir}/meroku.id_rsa")
|
10
|
+
#IO.read("#{secrets_dir}/meroku.id_rsa.pub")
|
11
|
+
#IO.read("#{secrets_dir}/meroku_site_cert.pem")
|
12
|
+
#IO.read("#{secrets_dir}/meroku_site_chain.pem")
|
13
|
+
#IO.read("#{secrets_dir}/meroku_site_fullchain.pem")
|
14
|
+
#IO.read("#{secrets_dir}/meroku_site_privkey.pem")
|
15
|
+
#IO.read("#{secrets_dir}/meroku_ssh_host_keys.tgz")
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
data/lib/meroku/user.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module Meroku
|
2
|
+
|
3
|
+
class User < Meroku::ApplicationRecord
|
4
|
+
include Meroku::Util
|
5
|
+
|
6
|
+
# Include default devise modules. Others available are:
|
7
|
+
# :confirmable, :lockable, :timeoutable and :omniauthable
|
8
|
+
devise :database_authenticatable, :registerable,
|
9
|
+
:recoverable, :rememberable, :trackable, :validatable
|
10
|
+
|
11
|
+
has_many :keys
|
12
|
+
|
13
|
+
after_create :add_unix_user
|
14
|
+
after_create :install_rvm_for_user
|
15
|
+
|
16
|
+
def database_password
|
17
|
+
encrypted_password[7..20].gsub(/[^0-9a-z ]/i, '')
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|