rhoconnect 3.4.4 → 3.4.5

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
+ ## 3.4.5 (2013-05-14)
2
+ * TK-182435 - Run platform validation in parallel (both nightly tests and release jobs)
3
+ * D-04477 - Rack::Session::Cookie security warning printing on every http request
4
+ * B-106356 - Update nginx package to 1.4.1 (CVE-2013-2028)
5
+
1
6
  ## 3.4.4 (2013-02-27)
2
- * Updated prod. stack to ruby-1.9.3-p392, redis-2.6.10, and nginx-1.3.13.
7
+ * Updated prod. stack to ruby-1.9.3-p392, redis-2.6.10, and nginx-1.3.13.
3
8
 
4
9
  ## 3.4.3 (2013-02-11)
5
10
  * Updated rack gem to latest release with important security fixes. Locked version of 'connection_pool' gem.
data/Gemfile.lock CHANGED
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rhoconnect (3.4.4)
4
+ rhoconnect (3.4.5)
5
5
  bundler (~> 1.0)
6
6
  connection_pool (= 0.9.2)
7
- json (~> 1.6.0)
7
+ json (~> 1.7.7)
8
8
  rack (~> 1.5.2)
9
9
  rake (~> 0.9.2.2)
10
10
  redis (>= 3.0.1)
@@ -20,8 +20,8 @@ GEM
20
20
  remote: https://rubygems.org/
21
21
  specs:
22
22
  SystemTimer (1.2.3)
23
- addressable (2.3.3)
24
- arr-pm (0.0.7)
23
+ addressable (2.3.4)
24
+ arr-pm (0.0.8)
25
25
  cabin (> 0)
26
26
  async-rack (0.5.1)
27
27
  rack (~> 1.1)
@@ -29,48 +29,55 @@ GEM
29
29
  builder
30
30
  mime-types
31
31
  xml-simple
32
- backports (2.6.2)
32
+ backports (3.3.0)
33
33
  builder (3.2.0)
34
34
  cabin (0.6.0)
35
- childprocess (0.3.8)
35
+ childprocess (0.3.9)
36
36
  ffi (~> 1.0, >= 1.0.11)
37
- clamp (0.3.1)
37
+ clamp (0.6.0)
38
38
  coffee-script (2.2.0)
39
39
  coffee-script-source
40
40
  execjs
41
- coffee-script-source (1.5.0)
41
+ coffee-script-source (1.6.2)
42
42
  connection_pool (0.9.2)
43
43
  crack (0.3.2)
44
44
  daemons (1.1.9)
45
45
  diff-lcs (1.1.3)
46
- eventmachine (1.0.0)
47
- excon (0.18.5)
46
+ eventmachine (1.0.3)
47
+ excon (0.21.0)
48
48
  execjs (1.4.0)
49
49
  multi_json (~> 1.0)
50
50
  extlib (0.9.16)
51
51
  ffaker (1.14.0)
52
- ffi (1.4.0)
53
- fog (1.9.0)
52
+ ffi (1.8.1)
53
+ fog (1.11.1)
54
54
  builder
55
- excon (~> 0.14)
55
+ excon (~> 0.20)
56
56
  formatador (~> 0.2.0)
57
+ json (~> 1.7)
57
58
  mime-types
58
- multi_json (~> 1.0)
59
- net-scp (~> 1.0.4)
59
+ net-scp (~> 1.1)
60
60
  net-ssh (>= 2.1.3)
61
61
  nokogiri (~> 1.5.0)
62
62
  ruby-hmac
63
63
  formatador (0.2.4)
64
- fpm (0.4.29)
65
- arr-pm (~> 0.0.7)
66
- backports (= 2.6.2)
64
+ fpm (0.4.35)
65
+ arr-pm (~> 0.0.8)
66
+ backports (>= 2.6.2)
67
67
  cabin (>= 0.6.0)
68
- clamp (= 0.3.1)
69
- json (= 1.6.6)
68
+ clamp (= 0.6.0)
69
+ ftw (~> 0.0.30)
70
+ json (~> 1.7.7)
70
71
  open4
71
- highline (1.6.15)
72
- hike (1.2.1)
73
- jasmine (1.3.1)
72
+ ftw (0.0.33)
73
+ addressable
74
+ backports (>= 2.6.2)
75
+ cabin (> 0)
76
+ http_parser.rb (= 0.5.3)
77
+ highline (1.6.19)
78
+ hike (1.2.2)
79
+ http_parser.rb (0.5.3)
80
+ jasmine (1.3.2)
74
81
  jasmine-core (~> 1.3.1)
75
82
  rack (~> 1.0)
76
83
  rspec (>= 1.3.1)
@@ -82,29 +89,31 @@ GEM
82
89
  multi_json
83
90
  rainbow
84
91
  sprockets (~> 2)
85
- json (1.6.6)
86
- mime-types (1.21)
87
- multi_json (1.6.1)
88
- net-scp (1.0.4)
89
- net-ssh (>= 1.99.1)
90
- net-ssh (2.6.5)
91
- nokogiri (1.5.6)
92
+ json (1.7.7)
93
+ mime-types (1.23)
94
+ mono_logger (1.0.1)
95
+ multi_json (1.7.3)
96
+ net-scp (1.1.1)
97
+ net-ssh (>= 2.6.5)
98
+ net-ssh (2.6.7)
99
+ nokogiri (1.5.9)
92
100
  open4 (1.3.0)
93
101
  rack (1.5.2)
94
- rack-fiber_pool (0.9.2)
95
- rack-protection (1.3.2)
102
+ rack-fiber_pool (0.9.3)
103
+ rack-protection (1.5.0)
96
104
  rack
97
105
  rack-test (0.6.2)
98
106
  rack (>= 1.0)
99
107
  rainbow (1.1.4)
100
108
  rake (0.9.2.2)
101
109
  rcov (1.0.0)
102
- redis (3.0.2)
103
- redis-namespace (1.2.1)
110
+ redis (3.0.4)
111
+ redis-namespace (1.3.0)
104
112
  redis (~> 3.0.0)
105
- resque (1.23.0)
113
+ resque (1.24.1)
114
+ mono_logger (~> 1.0)
106
115
  multi_json (~> 1.0)
107
- redis-namespace (~> 1.0)
116
+ redis-namespace (~> 1.2)
108
117
  sinatra (>= 0.9.2)
109
118
  vegas (~> 0.1.2)
110
119
  rest-client (1.6.7)
@@ -119,7 +128,7 @@ GEM
119
128
  rspec-mocks (2.10.1)
120
129
  ruby-hmac (0.4.0)
121
130
  rubyzip (0.9.9)
122
- selenium-webdriver (2.30.0)
131
+ selenium-webdriver (2.32.1)
123
132
  childprocess (>= 0.2.5)
124
133
  multi_json (~> 1.0)
125
134
  rubyzip
@@ -128,11 +137,11 @@ GEM
128
137
  multi_json (~> 1.0)
129
138
  simplecov-html (~> 0.7.1)
130
139
  simplecov-html (0.7.1)
131
- sinatra (1.3.5)
132
- rack (~> 1.4)
133
- rack-protection (~> 1.3)
134
- tilt (~> 1.3, >= 1.3.3)
135
- sprockets (2.9.0)
140
+ sinatra (1.4.2)
141
+ rack (~> 1.5, >= 1.5.2)
142
+ rack-protection (~> 1.4)
143
+ tilt (~> 1.3, >= 1.3.4)
144
+ sprockets (2.9.3)
136
145
  hike (~> 1.2)
137
146
  multi_json (~> 1.0)
138
147
  rack (~> 1.0)
@@ -142,13 +151,13 @@ GEM
142
151
  diff-lcs (>= 1.1.2)
143
152
  extlib (>= 0.9.5)
144
153
  highline (>= 1.4.0)
145
- thin (1.5.0)
154
+ thin (1.5.1)
146
155
  daemons (>= 1.0.9)
147
156
  eventmachine (>= 0.12.6)
148
157
  rack (>= 1.0.0)
149
158
  thor (0.15.4)
150
- tilt (1.3.3)
151
- uuidtools (2.1.3)
159
+ tilt (1.4.1)
160
+ uuidtools (2.1.4)
152
161
  vegas (0.1.11)
153
162
  rack (>= 1.0.0)
154
163
  webmock (1.8.11)
data/install.sh CHANGED
@@ -46,7 +46,7 @@ checkDeps ()
46
46
  }
47
47
 
48
48
  # determinePkgMgr
49
- # Determines if the system is currently using rpm or
49
+ # Determines if the system is currently using rpm or
50
50
  # debian based pckage management
51
51
  determinePkgMgr ()
52
52
  {
@@ -195,7 +195,7 @@ installRuby ()
195
195
  echo "tar -xzf ${prefix}/${rubyTar} -C ${prefix}" >> $log
196
196
  tar -xzf ${prefix}/${rubyTar} -C ${prefix} > /dev/null 2>&1
197
197
  fi
198
-
198
+
199
199
  echo "Installing ruby. This may take some time..." | tee -a $log
200
200
  echo "pushd ${prefix}/${rubyDir}" | tee -a $log
201
201
  pushd ${prefix}/${rubyDir}
@@ -204,14 +204,14 @@ installRuby ()
204
204
  echo "make && make install" | tee -a $log
205
205
  make >> $log 2>&1
206
206
  make install >> $log 2>&1
207
-
207
+
208
208
  if (( $? )) ; then
209
209
  echo "Some dependencies not installed..." | tee -a $log
210
210
  echo "Please install them and then re-run the installation script." | tee -a $log
211
211
  echo "For troubleshooting see file $log ..." | tee -a $log
212
212
  exit 1
213
213
  fi
214
-
214
+
215
215
  popd
216
216
  echo -e "$rubyDir is successfully installed.\n" | tee -a $log
217
217
  }
@@ -293,7 +293,7 @@ fi
293
293
  # Install redis, sqllite3, nginx, rhoconnect
294
294
  opts=" -d $dist -l $log"
295
295
  ${prefix}/bin/ruby ${INSTALL_DIR}/unix-like/rhoinstaller.rb ${opts}
296
- if (( $? )) ; then
296
+ if (( $? )) ; then
297
297
  echo "Installation failed. For troubleshooting see file $log ..." | tee -a $log
298
298
  exit 1
299
299
  fi
@@ -9,9 +9,9 @@ module Constants
9
9
  "dtach"]
10
10
 
11
11
  RUBY = "ruby-1.9.3-p392"
12
- REDIS = "redis-2.6.10"
12
+ REDIS = "redis-2.6.13"
13
13
  SQLITE3 = "sqlite-autoconf-3071502"
14
- NGINX = "nginx-1.3.13"
14
+ NGINX = "nginx-1.4.1"
15
15
  PASSENGER_ROOT = "/opt/rhoconnect/lib/ruby/gems/1.9.1/gems/passenger"
16
16
 
17
17
  SOFTWARE = [ REDIS, SQLITE3, RUBY, NGINX ]
@@ -3,7 +3,6 @@ $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
3
3
  require 'rhoconnect/version'
4
4
 
5
5
  module Constants
6
-
7
6
  RC_VERSION = Rhoconnect::VERSION
8
7
  REGION = 'us-west-1'
9
8
  SLEEP = 60
@@ -12,21 +11,26 @@ module Constants
12
11
  PEM_FILE = 'jenkinskey.pem'
13
12
  SSH_KEY = "#{HOME_DIR}/.ssh/#{PEM_FILE}"
14
13
  ACCESS_KEY_FILE = "#{HOME_DIR}/.ec2"
15
- UBUNTU_STACK = { :image_id => 'ami-938ed5d6',
14
+ UBUNTU_STACK = { :image_id => 'ami-02d7f547', # jenkins-ubuntu-12.04-test-image
15
+ :tags => {'Name' => 'Ubuntu-12.04'},
16
16
  :flavor_id => 'c1.xlarge',
17
17
  :key_name => 'jenkinskey',
18
18
  :groups => 'load-test',
19
19
  :user => 'ubuntu'}
20
-
21
- CENTOS_STACK = { :image_id => 'ami-178dd652',
20
+ CENTOS5_STACK = { :image_id => 'ami-bed9f5fb', # jenkins-centos-5.9-test-image
21
+ :tags => {'Name' => 'CentOS-5.9'},
22
22
  :flavor_id => 'c1.xlarge',
23
23
  :key_name => 'jenkinskey',
24
24
  :groups => 'load-test',
25
25
  :user => 'root'}
26
-
27
- STACKS = [ UBUNTU_STACK,
28
- CENTOS_STACK ]
29
-
26
+ CENTOS6_STACK = { :image_id => 'ami-02ae8c47', # jenkins-centos-6.3-test-image
27
+ :tags => {'Name' => 'CentOS-6.3'},
28
+ :flavor_id => 'c1.xlarge',
29
+ :key_name => 'jenkinskey',
30
+ :groups => 'load-test',
31
+ :user => 'root'}
32
+ STACKS = [ UBUNTU_STACK, CENTOS5_STACK, CENTOS6_STACK ]
33
+ STACK_SIZE = STACKS.size
30
34
  DEB_DEPS = [ "build-essential",
31
35
  "zlib1g-dev",
32
36
  "libssl-dev",
@@ -34,11 +38,10 @@ module Constants
34
38
  "libreadline5-dev",
35
39
  "libsqlite3-0",
36
40
  "libsqlite3-dev" ]
37
-
38
41
  RPM_DEPS = [ "gcc-c++",
39
42
  "zlib-devel",
40
43
  "curl-devel",
41
44
  "pcre-devel",
42
45
  "openssl-devel",
43
46
  "readline-devel" ]
44
- end #Constants
47
+ end
@@ -1,35 +1,26 @@
1
1
  #!/usr/bin/env ruby
2
-
3
2
  $:.unshift File.expand_path(File.dirname(__FILE__))
4
3
  $:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'installer', 'utils'))
5
4
 
6
5
  require 'rubygems'
6
+ require 'stringio'
7
+ require 'fog'
7
8
  require 'net/http'
9
+
8
10
  require 'constants'
9
- require 'fog'
11
+ include Constants
10
12
 
11
13
  BUCKET = 'rhoconnect'
12
14
 
13
- # METHODS
14
-
15
- # cmd
16
- # easily issue system commands in a clear way
17
- def cmd(cmd)
18
- puts cmd
19
- system(cmd)
20
- exit 1 if !$?.to_i == 0
21
- end #cmd
22
-
23
- # ssh_cmd
24
- # More easily issue commands over the ssh connection.
25
- def ssh_cmd(cmd)
26
- puts cmd
27
- puts @ssh.run(cmd)[0].stdout
28
- exit_code = @ssh.run('echo $?')[0].stdout
29
- exit 1 if exit_code.to_i != 0
30
- end #ssh_cmd
15
+ def run_on_server(server, cmds)
16
+ result = server.ssh(cmds)
17
+ result.each do |r|
18
+ raise "Command #{r.command} failed.\nStdout: #{r.stdout}\nStderr: #{r.stderr}" if r.status != 0
19
+ puts "$ #{r.command}"
20
+ puts r.stdout
21
+ end
22
+ end
31
23
 
32
- # build_type
33
24
  def build_type
34
25
  case ARGV[0]
35
26
  when 'test'
@@ -40,44 +31,39 @@ def build_type
40
31
  'packages'
41
32
  else
42
33
  'packages'
43
- end #case
44
- end #build_type
34
+ end
35
+ end
45
36
 
46
- # compile_stack_info
47
37
  # Fills in all necessary information which is stack specific
48
- def compile_stack_info
38
+ def compile_stack_info(stack)
49
39
  # User is stack specific but not to
50
40
  # be included in the fog creation hash
51
- @user = @stack[:user]
52
- @stack.delete :user
41
+ user = stack[:user]
53
42
 
54
- # This part of the package name will always be the same
55
- local_file = "#{`pwd`.strip}/pkg/"
56
-
43
+ local_file = "#{Dir.pwd}/pkg/"
57
44
  # Determine what channel to pull the packages from
58
45
  channel = build_type
59
46
 
60
47
  # Append the rest of the file name according to distribution
61
- if @user == 'ubuntu'
62
-
63
- @dist = { :flavor => "ubuntu",
48
+ if user == 'ubuntu'
49
+ dist = { :flavor => "ubuntu",
64
50
  :package => "rhoconnect_#{Constants::RC_VERSION}_all.deb",
65
51
  :local_file => "#{local_file}rhoconnect_#{Constants::RC_VERSION}_all.deb",
66
52
  :pkg_mgr => 'dpkg',
67
53
  :pkg_type => 'DEB',
68
- :pkg_repo => 'apt-get',
54
+ :pkg_cmd => 'apt-get',
69
55
  :deps => Constants::DEB_DEPS,
70
56
  :repo_src_file => '/etc/apt/sources.list',
71
57
  :repo_str => '\n' +
72
58
  '# This is the repository for rhoconnect packages\n' +
73
59
  "deb http://#{BUCKET}.s3.amazonaws.com/#{channel}/deb rhoconnect main" }
74
- elsif @user == 'root'
75
- @dist = { :flavor => "centos",
60
+ elsif user == 'root'
61
+ dist = { :flavor => "centos",
76
62
  :package => "rhoconnect-#{Constants::RC_VERSION}.noarch.rpm",
77
63
  :local_file => "#{local_file}rhoconnect-#{Constants::RC_VERSION}.noarch.rpm",
78
64
  :pkg_mgr => 'rpm',
79
65
  :pkg_type => 'RPM',
80
- :pkg_repo => 'yum',
66
+ :pkg_cmd => 'yum -y',
81
67
  :deps => Constants::RPM_DEPS,
82
68
  :repo_src_file => '/etc/yum.repos.d/rhoconnect.repo',
83
69
  :repo_str => '[rhoconnect]\n' +
@@ -85,215 +71,199 @@ def compile_stack_info
85
71
  "baseurl=http://#{BUCKET}.s3.amazonaws.com/#{channel}/rpm" +
86
72
  '\nenabled=1\n' +
87
73
  'gpgcheck=0\n' }
74
+ # else
75
+ # raise "Incorrect user name"
76
+ end
77
+ [user, dist]
78
+ end
88
79
 
89
- else
90
- puts "Incorrect user name"
91
- exit 3
92
- end #i
93
- end #compile_stack_info
94
-
95
- # create_ec2_instance
96
- # Generates the Fog object and creates a new ec2 instance.
97
- def create_ec2_instance
98
- make_fog
99
- start_new_instance
100
- end #create_ec2_instance
101
-
102
- # get_access_keys
103
- # Retrieves the access key and secret access key from the above specified file.
104
- def get_access_keys
80
+ def connect_to_amazon
105
81
  lines = IO.readlines Constants::ACCESS_KEY_FILE
82
+ access_key = lines.first.strip.split("=")[1]
83
+ secret_access_key = lines.last.strip.split("=")[1]
84
+
85
+ Fog::Compute.new(:provider => 'AWS', :region => Constants::REGION,
86
+ :aws_access_key_id => access_key,
87
+ :aws_secret_access_key => secret_access_key)
88
+ end
106
89
 
107
- @access_key = lines.first.strip.split("=")[1]
108
- @secret_access_key = lines.last.strip.split("=")[1]
109
- end #get_access_keys
110
-
111
- # make_fog
112
- # Generates the Fog object used to create the new ec2 instance.
113
- def make_fog
114
- get_access_keys
115
- @fog = Fog::Compute.new(
116
- :provider => 'AWS',
117
- :region => Constants::REGION,
118
- :aws_access_key_id => @access_key,
119
- :aws_secret_access_key => @secret_access_key
120
- )
121
- end #make_fog
122
-
123
- # start_new_instance
124
90
  # Creates a new ec2 instance as per the given stack.
125
- def start_new_instance
91
+ def start_new_instance(connection, params)
126
92
  puts "Creating new instance..."
127
93
 
128
- @server = @fog.servers.create(@stack)
129
- @server.wait_for { print "."; STDOUT.flush; ready? }
130
- puts
131
- if @server.ready?
94
+ server = connection.servers.create(params)
95
+ # Wait for machine to be booted
96
+ server.wait_for { ready? }
97
+ # Wait for machine to get an ip-address
98
+ server.wait_for { !public_ip_address.nil? }
99
+
100
+ if server.ready?
132
101
  # wait for all services to start on remote VM
133
102
  puts "Waiting #{Constants::SLEEP} seconds for services to start on remote VM..."
134
103
  Constants::SLEEP.times do
135
104
  sleep 1
136
105
  print "."
137
106
  STDOUT.flush
138
- end #do
107
+ end
139
108
  puts
140
-
141
- # save important instance information
142
- @host = @server.dns_name
143
- @server_id = @server.id
144
109
  else
145
- puts "Server timed out."
146
- exit 7
147
- end #if
148
- end #start_new_instance
149
-
150
- # establish_ssh_connection
151
- # Establishes the ssh connection needed to issue commands to the remote machine.
152
- def establish_ssh_connection
153
- @ssh = Fog::SSH.new( @host, @user, :keys => Constants::SSH_KEY )
154
- end #establish_ssh_connection
110
+ raise "Server timed out."
111
+ end
112
+ server
113
+ end
155
114
 
156
- # destroy_ec2_instance
157
- # Terminates the current ec2 instance
158
- def destroy_ec2_instance
159
- @server.destroy
160
- puts "Terminating Instance."
161
- end #destroy_ec2_instance
162
-
163
- # prepare_sources
164
- # Prepares the remote machine's repo source list to be able to download rhoconnect
165
- def prepare_sources
166
- puts "preparing sources..."
167
-
168
- ssh_cmd "sudo touch #{@dist[:repo_src_file]}" if @dist[:flavor] == 'centos'
169
- filename = @dist[:repo_src_file]
170
- src_str = @dist[:repo_str]
115
+ def install_package(server, distro_params)
116
+ puts "Preparing sources..."
117
+ run_on_server(server, "sudo touch #{distro_params[:repo_src_file]}") if distro_params[:flavor] == 'centos'
118
+ filename = distro_params[:repo_src_file]
119
+ src_str = distro_params[:repo_str]
171
120
 
172
121
  # Create file for yum rhoconnect sources
173
122
  # Get current permissions of file
174
- perms = @ssh.run("stat --format=%a #{filename}")[0].stdout.strip
175
-
123
+ perms = server.ssh("stat --format=%a #{filename}")[0].stdout.strip
176
124
  # Change permissions so that it can be edited by "others"
177
- ssh_cmd "sudo chmod 0666 #{filename}"
178
-
179
- ssh_cmd "echo -e \"#{src_str}\" >> #{filename}"
180
-
181
- ssh_cmd "sudo chmod 0#{perms} #{filename}"
182
-
183
- ssh_cmd "sudo #{@dist[:pkg_repo]} update" unless @dist[:flavor] == "centos"
184
- end #prepare_sources
185
-
186
- # install_package
187
- # Issues commands to the remote machine to start the installation
188
- def install_package
189
- prepare_sources
190
- puts "Installing rhoconnect package.\n" +
191
- "This may take a while...\n\n"
192
- ssh_cmd "yes | sudo #{@dist[:pkg_repo]} install rhoconnect"
193
- end #install_package
194
-
195
- # start_servers
196
- # Attempts to start redis and nginx servers
197
- def start_servers
198
- max_attempts = 10
125
+ cmds = ["sudo chmod 0666 #{filename}",
126
+ "echo -e \"#{src_str}\" >> #{filename}",
127
+ "sudo chmod 0#{perms} #{filename}"]
128
+ cmds << "sudo #{distro_params[:pkg_cmd]} update" unless distro_params[:flavor] == "centos"
129
+ run_on_server(server, cmds)
130
+
131
+ puts "Installing rhoconnect package.\nThis may take a while...\n\n"
132
+ run_on_server(server, "yes | sudo #{distro_params[:pkg_cmd]} install rhoconnect")
133
+ end
134
+
135
+ def start_services(server)
136
+ puts
137
+ ['redis', 'thin', 'nginx'].each do |program|
138
+ status = -1
139
+ 3.times do
140
+ res = server.ssh("sudo /etc/init.d/#{program} start")
141
+ puts "$ #{res[0].command}"
142
+ puts res[0].stdout
143
+ status = server.ssh("pgrep -f #{program}")[0].status
144
+ break status == 0
145
+ sleep 3
146
+ end
147
+ raise "Service #{program} failed to start." if status != 0
148
+ end
199
149
  puts
200
-
201
- ['Redis', 'Nginx', 'thin'].each do |program|
202
- attempts = 0
203
- while @ssh.run("pgrep -f #{program.downcase}")[0].stdout.strip == "" and
204
- attempts < max_attempts
205
- ssh_cmd "sudo /etc/init.d/#{program.downcase} start"
206
- attempts += 1
207
- sleep 2
208
- end #while
209
- if attempts >= max_attempts
210
- puts "#{program} failed to start."
211
- exit 1
212
- else
213
- puts "#{program} start took #{attempts} attempts." if attempts > 1
214
- end #if
215
- puts
216
- end #do
217
- end # start_servers
150
+ end
218
151
 
219
- # check_rc_service
220
152
  # Makes an HTTP request to check that the rhoconnect service is working
221
- def check_rc_service
222
- puts "Host: #{@host}"
223
-
224
- puts "Checking RC service."
225
- request = nil #Defined outside block as to not limit the scope of request to the do block.
226
- 2.times do
227
- request = Net::HTTP.get_response(@host, '/console/')
228
- end #do
229
-
230
- puts "Code: #{request.code} Message: #{request.message}"
231
-
232
- if request.code.to_s < '400'
233
- puts "Rhoconnect service up!"
234
- else
235
- puts "Failed to connect to rhoconnect service."
236
- exit 13
237
- end #if
238
- end #check_rc_service
239
-
240
- # compute_time
241
- # General time computation method
242
- def compute_time(start_time, end_time)
243
- time_delta = (end_time - start_time).round 3
244
-
245
- if time_delta >= 60
246
- time_delta /= 60
247
- time_units = 'minute'
248
- if time_delta > 1
249
- time_units << 's'
250
- end #if
153
+ def check_rhoconnect_status(server)
154
+ host = server.dns_name
155
+ puts "Testing rhoconnect server on host #{host}"
156
+ uri = URI("http://#{host}/console/")
157
+ response = Net::HTTP.get_response(uri)
158
+ puts "#{response.code} #{response.message}"
159
+ resp_code = response.code.to_i
160
+ if resp_code < 400
161
+ puts "Rhoconnect server up and running!"; puts
251
162
  else
252
- time_units = 'seconds'
253
- end #if
254
-
255
- "\nTest completed in #{time_delta} #{time_units}\n"
256
- end #compute_time
257
-
258
- # SCRIPT
259
-
260
- # Test Package installations
261
- Constants::STACKS.each do |stack|
163
+ puts "Nginx error log:"
164
+ puts server.ssh('cat /opt/nginx/logs/error.log')[0].stdout
165
+ puts "Thin server logs:"
166
+ puts server.ssh('cat /var/log/thin/thin.0.log')[0].stdout
167
+ puts server.ssh('cat /var/log/thin/thin.1.log')[0].stdout
168
+ raise "Failed to connect to rhoconnect service on #{host}" # unless resp_code == 502
169
+ end
170
+ end
171
+
172
+ def ping_remote_host(server)
173
+ status = -1
174
+ 10.times do
175
+ begin
176
+ res = server.ssh(['uptime'])
177
+ status = res[0].status
178
+ break if status == 0
179
+ rescue Exception => e
180
+ sleep 6
181
+ end
182
+ end
183
+ status
184
+ end
185
+
186
+ def test_package(connection, stack)
262
187
  start_time = Time.now
263
188
 
264
- begin
265
- @stack = stack
266
- compile_stack_info
267
-
268
- puts "\n" +
269
- "================================================\n" +
270
- "Now starting test of #{@dist[:pkg_type]} package\n" +
271
- "================================================\n" +
272
- "\n\n"
273
-
274
- create_ec2_instance
275
-
276
- # Establish connections
277
- establish_ssh_connection
278
- @dist[:remote_home] = @ssh.run("echo ~")[0].stdout.strip
279
-
280
- install_package
281
-
282
- # Start the redis and nginx servers on the remote machine
283
- start_servers
284
-
285
- # Check the status of the rhoconnect service
286
- check_rc_service
287
-
288
- end_time = Time.now
289
- puts compute_time(start_time, end_time)
290
- rescue => e
291
- puts e.inspect
292
- puts e.backtrace
293
- exit 15
294
- ensure
295
- if @server != nil
296
- destroy_ec2_instance
297
- end #if
298
- end #begin
299
- end #do
189
+ user, distro_params = compile_stack_info(stack)
190
+ server = start_new_instance(connection, stack)
191
+ host = server.dns_name
192
+ puts "Remote host #{host} is up and running ..."
193
+
194
+ server.username = user
195
+ server.private_key_path = Constants::SSH_KEY
196
+ puts "Establish ssh connection for \"#{user}@#{host}\" ..."
197
+ # For a minute trying to reach remote host
198
+ raise "Cannot establish ssh connection with #{stack[:tags]['Name']} instance." if ping_remote_host(server) != 0
199
+ puts "SSH connection establised!"
200
+
201
+ install_package(server, distro_params)
202
+ # Start the redis and nginx servers on the remote machine
203
+ start_services(server)
204
+ # Check the status of the rhoconnect service
205
+ check_rhoconnect_status(server)
206
+
207
+ elapsed_time = (Time.now - start_time).to_i
208
+ puts "Test for #{stack[:tags]['Name']} completed in #{elapsed_time/60} min. #{elapsed_time - ((elapsed_time/60)*60)} sec."
209
+ 0
210
+ rescue => e
211
+ puts e.inspect
212
+ puts e.backtrace
213
+ -1
214
+ ensure
215
+ if server
216
+ puts "Terminating #{stack[:tags]['Name']} instance ..."
217
+ server.destroy
218
+ end
219
+ end
220
+
221
+ module ThreadOut
222
+ # Writes to Thread.current[:stdout] instead of STDOUT if the thread local is set.
223
+ def self.write(stuff)
224
+ if Thread.current[:stdout] then
225
+ Thread.current[:stdout].write stuff
226
+ else
227
+ STDOUT.write stuff
228
+ end
229
+ end
230
+ end
231
+
232
+ # Connect to Amamzon EC2 cloud
233
+ start_at = Time.now
234
+ connection = connect_to_amazon
235
+
236
+ # Redirect stdout
237
+ $stdout = ThreadOut
238
+
239
+ # Create logs and threads
240
+ logs = []
241
+ threads = []
242
+ STACK_SIZE.times do |i|
243
+ logs << StringIO.new
244
+ threads << Thread.new(i) do |idx|
245
+ puts "Starting test for #{STACKS[idx][:tags]['Name']} ... "
246
+ Thread.current[:stdout] = logs[idx]
247
+ test_package(connection, STACKS[idx])
248
+ end
249
+ end
250
+ # Wait till threads re finished
251
+ threads.each { |thread| thread.join }
252
+
253
+ # Output logs and check resluts
254
+ threads.each_with_index do |thread, i|
255
+ puts "\n#{STACKS[i][:tags]['Name']} installation log:"
256
+ puts logs[i].string
257
+ end
258
+ exit_code = 0
259
+ threads.each_with_index do |thread, i|
260
+ if thread.value != 0
261
+ puts "Package for #{STACKS[i][:tags]['Name']} failed to pass test!"
262
+ exit_code = -1
263
+ end
264
+ end
265
+
266
+ elapsed_time = (Time.now - start_at).to_i
267
+ puts "Elapsed time: #{elapsed_time/60} min. #{elapsed_time - ((elapsed_time/60)*60)} sec."
268
+
269
+ exit exit_code
@@ -1,3 +1,3 @@
1
1
  module Rhoconnect
2
- VERSION = '3.4.4'
2
+ VERSION = '3.4.5'
3
3
  end
@@ -3,27 +3,27 @@ require 'erb'
3
3
  require 'json'
4
4
  require 'rhoconnect/graph_helper'
5
5
 
6
- module RhoconnectConsole
6
+ module RhoconnectConsole
7
7
  class << self
8
8
  ROOT_DIR = File.dirname(File.expand_path(__FILE__)) unless defined? ROOT_DIR
9
9
  def root_path(*args)
10
10
  File.join(ROOT_DIR, *args)
11
11
  end
12
- end
12
+ end
13
13
 
14
14
  class Server < Sinatra::Base
15
15
  set :views, RhoconnectConsole.root_path('templates')
16
16
  set :public_folder, RhoconnectConsole.root_path
17
- set :static, true
18
- use Rack::Session::Cookie
17
+ set :static, true
18
+ use Rack::Session::Cookie, :key => 'rhoconnect.console', :secret => SecureRandom.hex(64)
19
19
  HEROKU_NAV = ENV['INSTANCE_ID'] ? RestClient.get('http://nav.heroku.com/v1/providers/header') : nil
20
20
  before do
21
21
  headers['Expires'] = 'Sun, 19 Nov 1978 05:00:00 GMT'
22
- headers['Cache-Control'] = 'no-store, no-cache, must-revalidate'
22
+ headers['Cache-Control'] = 'no-store, no-cache, must-revalidate'
23
23
  headers['Pragma'] = 'no-cache'
24
24
  end
25
25
  include GraphHelper
26
-
26
+
27
27
  get '/' do
28
28
  #if heroku instance single sign will already have logged in a have token in session
29
29
  @token = session[:token] if ENV['INSTANCE_ID']
@@ -45,7 +45,7 @@ module RhoconnectConsole
45
45
  post '/http_timing' do
46
46
  http_timing(params)
47
47
  end
48
-
48
+
49
49
  post '/http_timing_key' do
50
50
  http_timing_key(params)
51
51
  end
@@ -53,16 +53,16 @@ module RhoconnectConsole
53
53
  post '/device_count' do
54
54
  count_graph('timing/devicecount', "Device Count", "Devices", "clients")
55
55
  end
56
-
56
+
57
57
  get '/get_sources' do
58
58
  sources = App.load(APP_NAME).sources
59
59
  sources.to_json
60
60
  end
61
-
61
+
62
62
  get '/get_http_routes' do
63
63
  # keys = get_user_count("http:*:*")
64
64
  # sources = get_sources('all')
65
- #
65
+ #
66
66
  # #loop through arrays and remove any regex matches
67
67
  # keysf = keys.inject([]) do |keys_final, element|
68
68
  # found = true
@@ -72,11 +72,11 @@ module RhoconnectConsole
72
72
  # keys_final << element.strip if found
73
73
  # keys_final
74
74
  # end
75
-
75
+
76
76
  keysf = get_http_routes()
77
-
77
+
78
78
  keysf.to_json
79
79
  end
80
-
80
+
81
81
  end
82
82
  end
data/rhoconnect.gemspec CHANGED
@@ -14,9 +14,9 @@ Gem::Specification.new do |s|
14
14
  s.description = %q{RhoConnect App Integration Server and related command-line utilities}
15
15
 
16
16
  s.rubyforge_project = nil
17
-
18
- s.files = %w(
19
- CHANGELOG.md CREDITS Gemfile Gemfile.lock install.sh README.md Rakefile LICENSE Rakefile rhoconnect.gemspec
17
+
18
+ s.files = %w(
19
+ CHANGELOG.md CREDITS Gemfile Gemfile.lock install.sh README.md Rakefile LICENSE Rakefile rhoconnect.gemspec
20
20
  )
21
21
  s.files += Dir.glob("bench/**/*")
22
22
  s.files += Dir.glob("commands/**/*")
@@ -42,7 +42,7 @@ Gem::Specification.new do |s|
42
42
  s.add_dependency("rack", '~> 1.5.2')
43
43
  s.add_dependency("sinatra", '~> 1.3')
44
44
  s.add_dependency('rake', '~> 0.9.2.2')
45
- s.add_dependency('json', '~> 1.6.0')
45
+ s.add_dependency('json', '~> 1.7.7')
46
46
  s.add_dependency('rubyzip', '~> 0.9.4')
47
47
  s.add_dependency('uuidtools', '>= 2.1.1')
48
48
  # Locked 'connection_pool' version because latest releases (>= 0.9.3) not compatible with MRI 1.8.7
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rhoconnect
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.4
4
+ version: 3.4.5
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-02-27 00:00:00.000000000 Z
12
+ date: 2013-05-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -82,7 +82,7 @@ dependencies:
82
82
  requirements:
83
83
  - - ~>
84
84
  - !ruby/object:Gem::Version
85
- version: 1.6.0
85
+ version: 1.7.7
86
86
  type: :runtime
87
87
  prerelease: false
88
88
  version_requirements: !ruby/object:Gem::Requirement
@@ -90,7 +90,7 @@ dependencies:
90
90
  requirements:
91
91
  - - ~>
92
92
  - !ruby/object:Gem::Version
93
- version: 1.6.0
93
+ version: 1.7.7
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: rubyzip
96
96
  requirement: !ruby/object:Gem::Requirement
@@ -734,7 +734,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
734
734
  version: '0'
735
735
  segments:
736
736
  - 0
737
- hash: -4478777276868581465
737
+ hash: -3406822103563071743
738
738
  required_rubygems_version: !ruby/object:Gem::Requirement
739
739
  none: false
740
740
  requirements: