traquitana 0.0.20 → 0.0.21

Sign up to get free protection for your applications and to get access to all the features.
data/config/default.yml CHANGED
@@ -11,8 +11,11 @@ list:
11
11
  - - config/environments/production.rb
12
12
  - - config/locales/**/*
13
13
  - - config/routes.rb
14
+ - - config/boot.rb
15
+ - - config/database.yml
14
16
  - - app/**/*
15
17
  - - db/migrate/**/*
18
+ - - db/seeds.rb
16
19
  - - public/javascripts/**/*
17
20
  - - public/stylesheets/**/*
18
21
  - - lib/**/*
data/config/nginx.sh CHANGED
@@ -2,5 +2,4 @@ if [ -d tmp ]; then
2
2
  echo -n "Restarting Nginx ... "
3
3
  rm -f tmp/restart.txt
4
4
  touch tmp/restart.txt
5
- echo "done."
6
5
  fi
data/config/passenger.sh CHANGED
@@ -2,5 +2,4 @@ if [ -d tmp ]; then
2
2
  echo -n "Restarting Passenger ... "
3
3
  rm -f tmp/restart.txt
4
4
  touch tmp/restart.txt
5
- echo "done."
6
5
  fi
data/config/proc.sh CHANGED
@@ -1,90 +1,264 @@
1
+ #
2
+ # Show a message
3
+ # msg(message, verbose, newline)
4
+ #
1
5
  function msg() {
2
6
  local str="$1"
3
- local verbose="$2"
4
- local newline="$3"
5
- if [ "$verbose" != "true" ]; then
6
- return 1
7
- fi
8
- if [ "$newline" == "true" ]; then
9
- echo "$str"
7
+
8
+ echo "$str" >> $logfile
9
+ echo -e "$str"
10
+ }
11
+
12
+ #
13
+ # Show usage
14
+ #
15
+ function usage() {
16
+ echo "Usage:"
17
+ echo ""
18
+ echo "proc.sh <traq directory> <id> <verbose>"
19
+ echo ""
20
+ echo "-h Show this message"
21
+ echo "-o Show gem dir owner"
22
+ echo "-r Show gem dir owner, asking RVM"
23
+ echo "-g Show gem dir owner, asking Rubygems"
24
+ echo "-i Show gems provider (Rubygems, RVM, etc)"
25
+ echo "-d Show gems dir"
26
+ }
27
+
28
+ #
29
+ # Gem dir
30
+ #
31
+ function gem_dir() {
32
+ local provider=$(gem_provider)
33
+ if [ -z "${provider}" ]; then
34
+ echo ""
10
35
  else
11
- echo -n "$str"
36
+ echo $(${provider}_gemdir)
12
37
  fi
13
38
  }
14
39
 
15
- # force the production enviroment
16
- export RAILS_ENV=production
40
+ #
41
+ # RVM gem dir
42
+ #
43
+ function rvm_gemdir() {
44
+ echo $(rvm gemdir)
45
+ }
17
46
 
18
- # move to the correct directory
19
- cd $1/..
47
+ #
48
+ # Rubygems gem dir
49
+ #
50
+ function rubygems_gemdir() {
51
+ echo $(gem environment | grep INSTALLATION | cut -f2- -d:)
52
+ }
53
+
54
+ #
55
+ # Return the RVM gems dir owner
56
+ #
57
+ function rvm_owner() {
58
+ echo $(stat --printf=%U $(rvm_gemdir))
59
+ }
20
60
 
21
- # verbose mode
22
- verbose="$3"
61
+ #
62
+ # Return the gems dir owner
63
+ #
64
+ function rubygems_owner() {
65
+ echo $(stat --printf=%U $(rubygems_gemdir))
66
+ }
23
67
 
24
- # make a copy of the old contents
25
- msg "Making a safety copy of the old contents on traq/$2 ... " "$verbose" "false"
26
- zip -q traq/$2.safe.zip `cat traq/$2.list` &> /dev/null
27
- msg "done." "$verbose" "true"
68
+ #
69
+ # Gems provider
70
+ #
71
+ function gem_provider() {
72
+ if [ -n "$(which rvm)" ]; then
73
+ echo "rvm"
74
+ elif [ -n "$(which gem)" ]; then
75
+ echo "rubygems"
76
+ else
77
+ echo ""
78
+ fi
79
+ }
28
80
 
29
- # check the current Gemfile checksum
30
- old_gemfile_md5=$(md5sum Gemfile 2> /dev/null | cut -f1 -d' ')
81
+ #
82
+ # Find the current gem owner
83
+ # If not using RVM, returns the owner of the gem directory
84
+ #
85
+ function gemdir_owner() {
86
+ local provider=$(gem_provider)
87
+ if [ -z "${provider}" ]; then
88
+ echo $(whoami)
89
+ else
90
+ echo $(${provider}_owner)
91
+ fi
92
+ }
31
93
 
32
- # install the new files
33
- msg "Unzipping $2.zip ... " "true" "false"
34
- unzip -o traq/$2.zip &> /dev/null
35
- msg "done." "true" "true"
94
+ #
95
+ # Move to the app directory
96
+ #
97
+ function cd_app_dir() {
98
+ msg "Moving to ${dir} directory ..."
99
+ cd $1/..
100
+ }
36
101
 
37
- # check the new Gemfile checksum
38
- new_gemfile_md5=$(md5sum Gemfile 2> /dev/null | cut -f1 -d' ')
102
+ #
103
+ # Make a copy of the old contents
104
+ #
105
+ function safe_copy() {
106
+ msg "Making a safety copy of the old contents on traq/$1.safe.zip ... "
107
+ zip -q traq/$1.safe.zip `cat traq/$1.list` &> /dev/null
108
+ }
39
109
 
40
- # if the current Gemfile is different, run bundle install
41
- if [ -f Gemfile -a "$old_gemfile_md5" != "$new_gemfile_md5" ]; then
110
+ #
111
+ # Install the new files
112
+ #
113
+ function install_new_files() {
114
+ msg "Unzipping $1.zip ... "
115
+ unzip -o traq/$1.zip &> /dev/null
116
+ }
42
117
 
43
- if [ -f Gemfile.lock ]; then # if there is a Gemfile.lock file ...
44
- if [ -w Gemfile.lock ]; then # ... and it is writable
45
- msg "Running bundle install ..." "true" "true"
46
- bundle install
47
- else
48
- msg "Gemfile.lock exists but it is not writable, not running bundle install." "true" "true"
49
- fi
118
+ #
119
+ # Create database if needed
120
+ #
121
+ function createdb() {
122
+ msg "Creating database if needed ..."
123
+ bundle exec rake db:create &> /dev/null
124
+ }
125
+
126
+ #
127
+ # Run migrations if needed
128
+ #
129
+ function migrate() {
130
+ migrations=$(grep "^db/migrate" traq/${config_id}.list)
131
+ if [ -n "$migrations" ]; then
132
+ msg "Running migrations ... "
133
+ bundle exec rake db:migrate 2> /dev/null
50
134
  fi
135
+ }
51
136
 
52
- if [ ! -f Gemfile.lock ]; then # if there is not a Gemfile.lock file ...
53
- if [ -w . ]; then # ... and current dir is writable
54
- msg "Running bundle install ..." "true" "true"
137
+ #
138
+ # Precompile assets if needed
139
+ #
140
+ function assets() {
141
+ if [ -d app/assets ]; then
142
+ msg "Compiling assets ... "
143
+ bundle exec rake assets:precompile 2> /dev/null
144
+ fi
145
+ }
146
+
147
+ #
148
+ # Change file permissions on public dir
149
+ #
150
+ function permissions() {
151
+ if [ -d public ]; then
152
+ msg "Changing file permissions on public to 0755 ... "
153
+ chmod -R 0755 public/*
154
+ fi
155
+ }
156
+
157
+ #
158
+ # Fix current gems, running bundle
159
+ #
160
+ function fix_gems() {
161
+ msg "Fixing gems ..."
162
+ local basedir=$(gem_dir | cut -f1-3 -d/)
163
+ local owner=$(gemdir_owner)
164
+ local curdir=$(pwd)
165
+ local curuser=$(whoami)
166
+ msg "Gem dir owner is \e[1m${owner}\e[0m"
167
+
168
+ # if gemdir owner and current user is root, try to install gems system wide
169
+ if [ "${owner}" == "root" -a "${curuser}" == "root" ]; then
170
+ msg "Performing a \e[1msystem wide gem install using root\e[0m"
171
+ bundle install
172
+ # install gems on rvm system path or vendor/bundle
173
+ else
174
+ # if gemdir is the current user dir, install there
175
+ if [ "${basedir}" == "/home/${owner}" ]; then
176
+ msg "Performing a \e[1mlocal gem install on home dir\e[0m"
55
177
  bundle install
178
+ # if user is not root and gemdir is not the home dir, install on vendor
56
179
  else
57
- msg "Gemfile.lock does not exists but current dir is not writable, not running bundle install" "true" "true"
180
+ msg "Performing a \e[1mlocal gem install on vendor/bundle\e[0m"
181
+ bundle install --path vendor/bundle
58
182
  fi
59
183
  fi
60
- fi
184
+ }
61
185
 
62
- # run migrations if needed
63
- migrations=$(grep "^db/migrate" traq/$2.list)
64
- if [ -n "$migrations" ]; then
65
- msg "Running migrations ... " "true" "true"
66
- bundle exec rake db:migrate 2> /dev/null
67
- msg "Migrations done." "true" "true"
68
- fi
186
+ #
187
+ # Make a sanity check to see if all the tools needed are available
188
+ #
189
+ function sanity_check() {
190
+ if [ -z "$(which unzip)" ]; then
191
+ msg "\e[31mThere's no \e[1munzip\e[0;31m tool installed on the server. Please install it before proceeding again\e[0m"
192
+ exit 2
193
+ fi
194
+ }
69
195
 
70
- # precompile assets if needed
71
- if [ -d app/assets ]; then
72
- msg "Compiling assets ... " "$verbose" "false"
73
- bundle exec rake assets:precompile 2> /dev/null
74
- msg "done." "$verbose" "true"
75
- fi
196
+ # force the production enviroment
197
+ export RAILS_ENV=production
76
198
 
77
- # change file permissions on public dir
78
- if [ -d public ]; then
79
- msg "Changing file permissions on public to 0755 ... " "$verbose" "false"
80
- chmod -R 0755 public/*
81
- msg "done." "$verbose" "true"
82
- fi
199
+ config_dir="$1" # config dir
200
+ config_id="$2" # config id
201
+ verbose="$3" # verbose mode
202
+ newline="true" # default newline on messages
203
+ logfile="/tmp/traq$$.log" # log file
204
+
205
+ # sanity check
206
+ sanity_check
207
+
208
+ # parse command line options
209
+ while getopts "horgid" OPTION
210
+ do
211
+ case ${OPTION} in
212
+ h)
213
+ usage
214
+ exit 1
215
+ ;;
216
+ o)
217
+ echo "Gem dir owner is: $(gemdir_owner)"
218
+ exit 1
219
+ ;;
220
+ r)
221
+ echo "RVM gem dir owner is: $(rvm_owner)"
222
+ exit 1
223
+ ;;
224
+ g)
225
+ echo "Ruby gems dir owner is: $(rubygems_owner)"
226
+ exit 1
227
+ ;;
228
+ i)
229
+ echo "Gems provider is $(gem_provider)"
230
+ exit 1
231
+ ;;
232
+ d)
233
+ echo "Gems dir is $(gem_dir)"
234
+ exit 1
235
+ ;;
236
+ *)
237
+ usage
238
+ exit 1
239
+ ;;
240
+ esac
241
+ done
242
+
243
+ msg "Log file is ${logfile}"
244
+
245
+ # move to the correct directory
246
+ dir="${1}"
247
+ cd_app_dir "${dir}"
248
+ safe_copy "${config_id}"
249
+
250
+ # here is where things happens on the server
251
+ install_new_files "${config_id}"
252
+ fix_gems
253
+ createdb
254
+ migrate
255
+ assets
256
+ permissions
83
257
 
84
258
  # restart server
85
259
  if [ -x ./traq/server.sh -a -f ./traq/server.sh ]; then
86
260
  ./traq/server.sh
87
- fi
261
+ fi
88
262
 
89
263
  # extra configs
90
264
  if [ -x ./traq/extra.sh -a -f ./traq/extra.sh ]; then
@@ -92,4 +266,4 @@ if [ -x ./traq/extra.sh -a -f ./traq/extra.sh ]; then
92
266
  fi
93
267
 
94
268
  # erase file
95
- rm traq/$2.zip
269
+ rm traq/${config_id}.zip
data/lib/deployer.rb CHANGED
@@ -1,63 +1,63 @@
1
1
  module Traquitana
2
- class Deployer
3
- def initialize(options=nil)
4
- @config = Traquitana::Config.instance
5
- @verbose = !options.nil? && options[:verbose]
6
- @config.filename = options[:filename] if options[:filename]
7
- @config.target = options[:target] if options[:target]
8
- end
9
-
10
- def run
11
- STDOUT.puts "Running Traquitana version #{VERSION}\n"
12
- Traquitana::Migrator.new.run
13
-
14
- if !File.exist?(@config.filename)
15
- STDERR.puts "No config file (#{@config.filename}) found."
16
- STDERR.puts "Did you run traq setup?"
17
- STDERR.puts "Run it and check the configuration before deploying."
18
- exit 1
19
- end
20
-
21
- @config.load
22
-
23
- @options = @config.password.size>1 ? {:password=>@config.password} : {}
24
- @server = @config.server.to_s.size>0 ? @config.server : "none"
25
- @shell = @config.shell ? "#{@config.shell} " : ""
26
- @network = Traquitana::SSH.new(@config.host,@config.user,@options)
27
-
28
- @packager = Traquitana::Packager.new
29
- @packager.verbose = @verbose
30
- all_list_file, all_list_zip = @packager.pack
31
- if !File.exists?(all_list_file) ||
32
- !File.exists?(all_list_zip)
33
- STDERR.puts "Could not create the needed files."
34
- exit 2
35
- end
36
-
37
- # check if the traq destination and config directories exists
38
- @network.execute(["mkdir -p #{@config.directory}/traq"],@verbose)
39
- @updater = Traquitana::Bar.new
40
-
41
- STDOUT.puts "Sending files ..."
42
- @network.send_files([["#{File.dirname(File.expand_path(__FILE__))}/../config/proc.sh","#{@config.directory}/traq/proc.sh"],
43
- ["#{File.dirname(File.expand_path(__FILE__))}/../config/#{@server}.sh","#{@config.directory}/traq/server.sh"],
44
- [all_list_file,"#{@config.directory}/traq/#{File.basename(all_list_file)}"],
45
- [all_list_zip ,"#{@config.directory}/traq/#{File.basename(all_list_zip)}"]],@updater)
46
- STDOUT.puts "All files sent."
47
-
48
- @network.execute(["chmod +x #{@config.directory}/traq/proc.sh"],@verbose)
49
- @network.execute(["chmod +x #{@config.directory}/traq/server.sh"],@verbose)
50
-
51
- cmd = "#{@config.directory}/traq/proc.sh #{@config.directory}/traq #{@packager.id} #{@verbose}"
52
- cmd = "#{@shell} \"#{cmd}\"" if @shell
53
-
54
- STDOUT.puts "Running remote update commands, please wait ..."
55
- STDOUT.puts @network.execute([cmd],@verbose).join
56
-
57
- # clean up
58
- File.unlink(all_list_file)
59
- File.unlink(all_list_zip)
60
- STDOUT.puts "All done. Have fun.\n"
61
- end
62
- end
2
+ class Deployer
3
+ def initialize(options=nil)
4
+ @config = Traquitana::Config.instance
5
+ @verbose = !options.nil? && options[:verbose]
6
+ @config.filename = options[:filename] if options[:filename]
7
+ @config.target = options[:target] if options[:target]
8
+ end
9
+
10
+ def run
11
+ STDOUT.puts "\e[1mRunning Traquitana version #{VERSION}\e[0m\n\n"
12
+ Traquitana::Migrator.new.run
13
+
14
+ if !File.exist?(@config.filename)
15
+ STDERR.puts "\e[31mNo config file (#{@config.filename}) found."
16
+ STDERR.puts "Did you run \e[1mtraq setup\e[0;31m ?"
17
+ STDERR.puts "Run it and check the configuration before deploying.\e[0m"
18
+ exit 1
19
+ end
20
+
21
+ @config.load
22
+
23
+ @options = @config.password.size>1 ? {:password=>@config.password} : {}
24
+ @server = @config.server.to_s.size>0 ? @config.server : "none"
25
+ @shell = @config.shell ? "#{@config.shell} " : ""
26
+ @network = Traquitana::SSH.new(@config.host,@config.user,@options)
27
+
28
+ @packager = Traquitana::Packager.new
29
+ @packager.verbose = @verbose
30
+ all_list_file, all_list_zip = @packager.pack
31
+ if !File.exists?(all_list_file) ||
32
+ !File.exists?(all_list_zip)
33
+ STDERR.puts "\e[31mCould not create the needed files.\e[0m"
34
+ exit 2
35
+ end
36
+
37
+ # check if the traq destination and config directories exists
38
+ @network.execute(["mkdir -p #{@config.directory}/traq"],@verbose)
39
+ @updater = Traquitana::Bar.new
40
+
41
+ STDOUT.puts "Sending files ..."
42
+ @network.send_files([["#{File.dirname(File.expand_path(__FILE__))}/../config/proc.sh","#{@config.directory}/traq/proc.sh"],
43
+ ["#{File.dirname(File.expand_path(__FILE__))}/../config/#{@server}.sh","#{@config.directory}/traq/server.sh"],
44
+ [all_list_file,"#{@config.directory}/traq/#{File.basename(all_list_file)}"],
45
+ [all_list_zip ,"#{@config.directory}/traq/#{File.basename(all_list_zip)}"]],@updater)
46
+ STDOUT.puts "\e[32mAll files sent.\e[0m\n\n"
47
+
48
+ @network.execute(["chmod +x #{@config.directory}/traq/proc.sh"],@verbose)
49
+ @network.execute(["chmod +x #{@config.directory}/traq/server.sh"],@verbose)
50
+
51
+ cmd = "#{@config.directory}/traq/proc.sh #{@config.directory}/traq #{@packager.id} #{@verbose}"
52
+ cmd = "#{@shell} \"#{cmd}\"" if @shell
53
+
54
+ STDOUT.puts "Running remote update commands, please wait ..."
55
+ STDOUT.puts @network.execute([cmd],@verbose).join
56
+
57
+ # clean up
58
+ File.unlink(all_list_file)
59
+ File.unlink(all_list_zip)
60
+ STDOUT.puts "\e[32mAll done. Have fun.\e[0m\n"
61
+ end
62
+ end
63
63
  end
data/lib/ssh.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "net/scp"
2
2
  require "net/ssh"
3
+ require "highline/import"
3
4
 
4
5
  module Traquitana
5
6
  class SSH
@@ -9,22 +10,41 @@ module Traquitana
9
10
  @host = host
10
11
  @user = user
11
12
  @options = options || {}
12
- STDOUT.puts "Connecting to #{@host} using user #{@user}"
13
+ @options[:verbose] = :error
14
+ STDOUT.puts "Connecting to \e[1m#{@host}\e[0m using user \e[1m#{@user}\e[0m"
13
15
  end
14
16
 
15
17
  def execute(cmds,verbose=false)
16
- rst = []
17
- Net::SSH.start(@host,@user,@options) do |ssh|
18
- for cmd in cmds
19
- STDOUT.puts "Executing #{cmd} on remote host ..." if verbose
20
- rst << ssh.exec!(cmd)
21
- end
22
- end
23
- rst
18
+ rst = []
19
+
20
+ Net::SSH.start(@host,@user,@options) do |ssh|
21
+ ssh.open_channel do |channel|
22
+ channel.request_pty do |ch, success|
23
+ raise "Can't get PTY" unless success
24
+ for cmd in cmds
25
+ STDOUT.puts "Executing #{cmd} on remote host ..." if verbose
26
+ rst << ch.exec(cmd)
27
+ end # for
28
+
29
+ ch.on_data do |ch, data|
30
+ msg = data.inspect.to_s.gsub(/^"/,"").gsub(/"$/,"").gsub(/"\\"/,"\\").gsub("\\r","").gsub("\\n","\n").gsub("\\e","\e").strip.chomp
31
+ if data.inspect =~ /sudo/
32
+ pwd = ask("\nNeed password to run as root/sudo: ") {|c| c.echo = "*"}
33
+ channel.send_data("#{pwd}\n")
34
+ sleep 0.1
35
+ else
36
+ puts msg if msg.size > 1
37
+ end
38
+ ch.wait
39
+ end
40
+ end # tty
41
+ end # channel
42
+ end # ssh start
43
+ rst
24
44
  end
25
45
 
26
46
  def send_files(col,updater=nil)
27
- Net::SCP.start(@host,@user,@options) do |scp|
47
+ Net::SCP.start(@host,@user,@options) do |scp|
28
48
  for files in col
29
49
  from, to = *files
30
50
  next if from.nil? || to.nil?
@@ -1,3 +1,3 @@
1
1
  module Traquitana
2
- VERSION = "0.0.20"
2
+ VERSION = "0.0.21"
3
3
  end
data/spec/config/Gemfile CHANGED
@@ -0,0 +1,3 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'memoize'
data/traquitana.gemspec CHANGED
@@ -15,9 +15,10 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Traquitana::VERSION
17
17
 
18
- gem.add_dependency("rubyzip", [">= 1.0.0"])
19
- gem.add_dependency("net-ssh", [">= 0"])
20
- gem.add_dependency("net-scp", [">= 0"])
18
+ gem.add_dependency("rubyzip" , [">= 1.0.0"])
19
+ gem.add_dependency("net-ssh" , [">= 0"])
20
+ gem.add_dependency("net-scp" , [">= 0"])
21
+ gem.add_dependency("highline", [">= 0"])
21
22
 
22
23
  gem.license = "GPL-2"
23
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: traquitana
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.20
4
+ version: 0.0.21
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-04 00:00:00.000000000 Z
12
+ date: 2014-04-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rubyzip
@@ -59,6 +59,22 @@ dependencies:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: highline
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
62
78
  description: Simple tool for deploy Rails apps
63
79
  email:
64
80
  - eustaquiorangel@gmail.com
@@ -153,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
169
  version: '0'
154
170
  requirements: []
155
171
  rubyforge_project:
156
- rubygems_version: 1.8.25
172
+ rubygems_version: 1.8.23
157
173
  signing_key:
158
174
  specification_version: 3
159
175
  summary: Just a simple tool to deploy Rails apps with SSH and some shell scripts