traquitana 0.0.20 → 0.0.21

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