rconf 0.7.5 → 0.7.6
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.
@@ -0,0 +1,124 @@
|
|
1
|
+
# Copyright (C) 2011 RightScale, Inc, All Rights Reserved Worldwide.
|
2
|
+
#
|
3
|
+
# THIS PROGRAM IS CONFIDENTIAL AND PROPRIETARY TO RIGHTSCALE
|
4
|
+
# AND CONSTITUTES A VALUABLE TRADE SECRET. Any unauthorized use,
|
5
|
+
# reproduction, modification, or disclosure of this program is
|
6
|
+
# strictly prohibited. Any use of this program by an authorized
|
7
|
+
# licensee is strictly subject to the terms and conditions,
|
8
|
+
# including confidentiality obligations, set forth in the applicable
|
9
|
+
# License Agreement between RightScale.com, Inc. and
|
10
|
+
# the licensee
|
11
|
+
|
12
|
+
module RightConf
|
13
|
+
|
14
|
+
class CassandraConfigurator
|
15
|
+
|
16
|
+
SOURCE_BASE_URL = 'http://mirror.metrocast.net/apache//cassandra/VERSION/apache-cassandra-VERSION-bin.tar.gz'
|
17
|
+
DEFAULT_CASSANDRA_INSTALL = ['/opt/cassandra', File.join(ENV['HOME'], 'cassandra')]
|
18
|
+
|
19
|
+
include Configurator
|
20
|
+
|
21
|
+
register :cassandra
|
22
|
+
|
23
|
+
description 'Installs Cassandra'
|
24
|
+
|
25
|
+
settings :version => 'Cassandra version to install',
|
26
|
+
:install_path => 'Path to Cassandra installation directory, uses /opt/cassandra if it ' +
|
27
|
+
'is writable by the current user or ~/cassandra otherwise by default',
|
28
|
+
:abort_on_failure => 'Whether to abort if Cassandra failed to install (false by default)'
|
29
|
+
|
30
|
+
validate_has_settings :version
|
31
|
+
|
32
|
+
# Install Linux Mercurial package
|
33
|
+
#
|
34
|
+
# === Return
|
35
|
+
# true:: Always return true
|
36
|
+
def run
|
37
|
+
install_path(default_install_path) if install_path.nil?
|
38
|
+
abort_on_failure(false) if abort_on_failure.nil?
|
39
|
+
unless cassandra_installed
|
40
|
+
report_check('Installing Cassandra')
|
41
|
+
url = SOURCE_BASE_URL.gsub('VERSION', version)
|
42
|
+
FileUtils.mv(install_path, "#{install_path}_old") if File.exist?(install_path)
|
43
|
+
FileUtils.mkdir_p(install_path)
|
44
|
+
Dir.chdir(install_path) do
|
45
|
+
Command.execute('curl', '-O', '-f', url, abort_option('Failed to download Cassandra'))
|
46
|
+
Command.execute('unzip', File.basename(url), abort_option('Failed to unzip Cassandra'))
|
47
|
+
end
|
48
|
+
bin_path = File.join(install_path, "apache-cassandra-#{version}", 'bin')
|
49
|
+
if EnvironmentUpdater.update("PATH=$PATH:#{bin_path}", ['PATH'])
|
50
|
+
post_note 'Cassandra was installed, please reload your shell to activate it and re-run rconf'
|
51
|
+
aborting(true)
|
52
|
+
end
|
53
|
+
report_success
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Install Windows software
|
58
|
+
#
|
59
|
+
# === Return
|
60
|
+
# true:: Always return true
|
61
|
+
def run_windows
|
62
|
+
# TBD
|
63
|
+
end
|
64
|
+
|
65
|
+
protected
|
66
|
+
|
67
|
+
# Check whether Cassandra is installed
|
68
|
+
#
|
69
|
+
# === Return
|
70
|
+
# true:: If Mercurial is installed
|
71
|
+
# false:: Otherwise
|
72
|
+
def cassandra_installed
|
73
|
+
report_check("Checking for Cassandra")
|
74
|
+
installed = Command.execute('cassandra', '-h').success?
|
75
|
+
report_result(installed)
|
76
|
+
installed
|
77
|
+
end
|
78
|
+
|
79
|
+
# Retrieve default install path
|
80
|
+
# Try /opt/cassandra and revert to ~/cassandra if not writable
|
81
|
+
#
|
82
|
+
# === Return
|
83
|
+
# path:: Default cassandra install path
|
84
|
+
def default_install_path
|
85
|
+
path = if File.exist?('/opt')
|
86
|
+
if File.exist?('/opt/cassandra')
|
87
|
+
pick_default_path(File.writable?('/opt/cassandra'))
|
88
|
+
else
|
89
|
+
res = Command.execute('mkdir', '/opt/cassandra')
|
90
|
+
pick_default_path(res.success?)
|
91
|
+
end
|
92
|
+
else
|
93
|
+
res = Command.execute('mkdir', '-p', '/opt/cassandra')
|
94
|
+
pick_default_path(res.success?)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# First or second choice nginx install path
|
99
|
+
#
|
100
|
+
# === Parameter
|
101
|
+
# first_choice(TrueClass|FalseClass):: Whether to use first or second choice path
|
102
|
+
#
|
103
|
+
# === Return
|
104
|
+
# path(String):: Path
|
105
|
+
def pick_default_path(first_choice)
|
106
|
+
path = DEFAULT_CASSANDRA_INSTALL[first_choice && 0 || 1]
|
107
|
+
end
|
108
|
+
|
109
|
+
# Produce abort on failure option
|
110
|
+
#
|
111
|
+
# === Parameters
|
112
|
+
# message(String):: Abort message to be used in case abort option should be set
|
113
|
+
#
|
114
|
+
# === Return
|
115
|
+
# {}:: Empty hash if 'abort_on_failure' is notset
|
116
|
+
# opts(Hash):: Abort option with give message otherwise
|
117
|
+
def abort_option(message)
|
118
|
+
opts = abort_on_failure && { :abort_on_failure => message } || {}
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# Copyright (C) 2011 RightScale, Inc, All Rights Reserved Worldwide.
|
2
|
+
#
|
3
|
+
# THIS PROGRAM IS CONFIDENTIAL AND PROPRIETARY TO RIGHTSCALE
|
4
|
+
# AND CONSTITUTES A VALUABLE TRADE SECRET. Any unauthorized use,
|
5
|
+
# reproduction, modification, or disclosure of this program is
|
6
|
+
# strictly prohibited. Any use of this program by an authorized
|
7
|
+
# licensee is strictly subject to the terms and conditions,
|
8
|
+
# including confidentiality obligations, set forth in the applicable
|
9
|
+
# License Agreement between RightScale.com, Inc. and
|
10
|
+
# the licensee
|
11
|
+
|
12
|
+
module RightConf
|
13
|
+
|
14
|
+
class GitRepoConfigurator
|
15
|
+
|
16
|
+
include Configurator
|
17
|
+
|
18
|
+
register :git_repo
|
19
|
+
|
20
|
+
description 'Clone git repository and build if needed'
|
21
|
+
|
22
|
+
settings :repo => 'git repo URL',
|
23
|
+
:tag => 'git tag or branch or sha that should be checked out',
|
24
|
+
:install_path => 'Path where git repo should be cloned to',
|
25
|
+
:build_commands => 'Comma separated list of commands to run in repo after clone',
|
26
|
+
:only_if => 'Ruby lambda expression that should return true to proceed ' +
|
27
|
+
'with the cloning / build if defined'
|
28
|
+
|
29
|
+
validate_has_settings :repo, :install_path
|
30
|
+
|
31
|
+
# Clone git repo and run build commands if given
|
32
|
+
#
|
33
|
+
# === Return
|
34
|
+
# true:: Always return true
|
35
|
+
def run
|
36
|
+
if only_if.nil? || only_if.call
|
37
|
+
report_check("Cloning #{repo} into #{install_path}")
|
38
|
+
if File.exist?(install_path)
|
39
|
+
FileUtils.mv(install_path, "#{install_path}_old")
|
40
|
+
post_note "Had to move pre-existing #{install_path} to #{install_path}_old"
|
41
|
+
end
|
42
|
+
Command.execute('git', 'clone', repo, install_path,
|
43
|
+
:abort_on_failure => "Failed to clone #{repo} into #{install_path}")
|
44
|
+
Command.execute('git', 'checkout', tag) if tag
|
45
|
+
report_success
|
46
|
+
if build_commands
|
47
|
+
report_check "Building"
|
48
|
+
Dir.chdir(install_path) do
|
49
|
+
build_commands.split(',').each do |c|
|
50
|
+
c.lstrip!
|
51
|
+
args = c.split(' ') + [ { :abort_on_failure => "#{c} failed" } ]
|
52
|
+
Command.execute(*args)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
report_success
|
56
|
+
end
|
57
|
+
end
|
58
|
+
true
|
59
|
+
end
|
60
|
+
|
61
|
+
# Clone on Windows
|
62
|
+
#
|
63
|
+
# === Return
|
64
|
+
# true:: Always return true
|
65
|
+
def run_windows
|
66
|
+
# TBD
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# Copyright (C) 2011 RightScale, Inc, All Rights Reserved Worldwide.
|
2
|
+
#
|
3
|
+
# THIS PROGRAM IS CONFIDENTIAL AND PROPRIETARY TO RIGHTSCALE
|
4
|
+
# AND CONSTITUTES A VALUABLE TRADE SECRET. Any unauthorized use,
|
5
|
+
# reproduction, modification, or disclosure of this program is
|
6
|
+
# strictly prohibited. Any use of this program by an authorized
|
7
|
+
# licensee is strictly subject to the terms and conditions,
|
8
|
+
# including confidentiality obligations, set forth in the applicable
|
9
|
+
# License Agreement between RightScale.com, Inc. and
|
10
|
+
# the licensee
|
11
|
+
|
12
|
+
module RightConf
|
13
|
+
|
14
|
+
class EnvironmentUpdater
|
15
|
+
|
16
|
+
include ProgressReporter
|
17
|
+
|
18
|
+
# Update bash resource or profile file to define given environment variable
|
19
|
+
# or append to existing environment variable
|
20
|
+
#
|
21
|
+
# === Parameters
|
22
|
+
# code(String):: Code to be inserted in bash resource file
|
23
|
+
# dependencies(Array):: List of environment variables that code will update
|
24
|
+
# (Use to put code after these env var are set in the
|
25
|
+
# existing bash resource file)
|
26
|
+
#
|
27
|
+
# === Return
|
28
|
+
# true:: If bash resource or profile file was updated
|
29
|
+
# false:: Otherwise
|
30
|
+
def self.update(code, dependencies=[])
|
31
|
+
candidates = ['.bashrc', '.bash_profile']
|
32
|
+
candidates.map! { |c| File.join(ENV['HOME'], c) }
|
33
|
+
bashrc_path = candidates.detect { |c| File.exist?(c) }
|
34
|
+
updated = false
|
35
|
+
if bashrc_path
|
36
|
+
content = IO.read(bashrc_path)
|
37
|
+
unless content.include?(code)
|
38
|
+
i = dependencies.inject(nil) do |m, d|
|
39
|
+
index = content.index(/^\s*#{d}=/)
|
40
|
+
m = if m.nil?
|
41
|
+
index
|
42
|
+
else
|
43
|
+
if index.nil?
|
44
|
+
m
|
45
|
+
else
|
46
|
+
[ index, m ].max
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
if i
|
51
|
+
next_line = content.index("\n", i + 1)
|
52
|
+
if next_line
|
53
|
+
content.insert(next_line + 1, code + "\n")
|
54
|
+
else
|
55
|
+
content += "\n" + code
|
56
|
+
end
|
57
|
+
else
|
58
|
+
content = code + "\n" + content
|
59
|
+
end
|
60
|
+
FileUtils.mv(bashrc_path, bashrc_path + '.old')
|
61
|
+
File.open(bashrc_path, 'w') { |f| f.puts content }
|
62
|
+
end
|
63
|
+
updated = true
|
64
|
+
else
|
65
|
+
report_error "Failed to update bash resource or profile: file not found"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
data/lib/rconf/version.rb
CHANGED
@@ -0,0 +1,47 @@
|
|
1
|
+
# Copyright (C) 2011 RightScale, Inc, All Rights Reserved Worldwide.
|
2
|
+
#
|
3
|
+
# THIS PROGRAM IS CONFIDENTIAL AND PROPRIETARY TO RIGHTSCALE
|
4
|
+
# AND CONSTITUTES A VALUABLE TRADE SECRET. Any unauthorized use,
|
5
|
+
# reproduction, modification, or disclosure of this program is
|
6
|
+
# strictly prohibited. Any use of this program by an authorized
|
7
|
+
# licensee is strictly subject to the terms and conditions,
|
8
|
+
# including confidentiality obligations, set forth in the applicable
|
9
|
+
# License Agreement between RightScale.com, Inc. and
|
10
|
+
# the licensee
|
11
|
+
|
12
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
13
|
+
|
14
|
+
describe RightConf::GitRepoConfigurator do
|
15
|
+
|
16
|
+
before(:each) do
|
17
|
+
lang = RightConf::Language.parse('git_repo { repo "git"; install_path "./git" }')
|
18
|
+
@configurator = lang.configurators.first
|
19
|
+
[:report_check, :report_result, :report_success].each do |meth|
|
20
|
+
flexmock(@configurator).should_receive(meth)
|
21
|
+
end
|
22
|
+
flexmock(@configurator).should_receive(:report_fatal).and_return { |*args| raise args.join(' ') }
|
23
|
+
@abf = { :abort_on_failure => 'Failed to clone git into ./git' }
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should clone' do
|
27
|
+
flexmock(RightConf::Command.instance).should_receive(:execute).with('git', 'clone', 'git', './git', @abf).once
|
28
|
+
@configurator.run
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'run the build commands' do
|
32
|
+
@configurator.instance_eval { build_commands('do one, do two') }
|
33
|
+
flexmock(RightConf::Command.instance).should_receive(:execute).with('git', 'clone', 'git', './git', @abf).once
|
34
|
+
flexmock(Dir).should_receive(:chdir).with('./git', Proc).once.and_yield
|
35
|
+
flexmock(RightConf::Command.instance).should_receive(:execute).with('do', 'one', :abort_on_failure => 'do one failed').once
|
36
|
+
flexmock(RightConf::Command.instance).should_receive(:execute).with('do', 'two', :abort_on_failure => 'do two failed').once
|
37
|
+
@configurator.run
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should honor only_if' do
|
41
|
+
@configurator.instance_eval { only_if(lambda { false }) }
|
42
|
+
flexmock(RightConf::Command.instance).should_receive(:execute).and_return { raise "Command should not execute" }
|
43
|
+
@configurator.run
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: rconf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.7.
|
5
|
+
version: 0.7.6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Raphael Simon
|
@@ -75,6 +75,8 @@ files:
|
|
75
75
|
- lib/rconf/configurator.rb
|
76
76
|
- lib/rconf/configurator_registry.rb
|
77
77
|
- lib/rconf/configurators/bundler_configurator.rb
|
78
|
+
- lib/rconf/configurators/cassandra_configurator.rb
|
79
|
+
- lib/rconf/configurators/git_repo_configurator.rb
|
78
80
|
- lib/rconf/configurators/mercurial_configurator.rb
|
79
81
|
- lib/rconf/configurators/packages_configurator.rb
|
80
82
|
- lib/rconf/configurators/passenger_configurator.rb
|
@@ -91,6 +93,7 @@ files:
|
|
91
93
|
- lib/rconf/progress_reporters/stdout_reporter.rb
|
92
94
|
- lib/rconf/ruby_extensions.rb
|
93
95
|
- lib/rconf/support/brew_installer.rb
|
96
|
+
- lib/rconf/support/environment_updater.rb
|
94
97
|
- lib/rconf/support/package_installer.rb
|
95
98
|
- lib/rconf/trollop.rb
|
96
99
|
- lib/rconf/version.rb
|
@@ -99,6 +102,7 @@ files:
|
|
99
102
|
- spec/command_spec.rb
|
100
103
|
- spec/configurator_spec.rb
|
101
104
|
- spec/configurators/bundler_configurator_spec.rb
|
105
|
+
- spec/configurators/git_repo_configurator_spec.rb
|
102
106
|
- spec/configurators/packages_configurator_spec.rb
|
103
107
|
- spec/configurators/passenger_configurator_spec.rb
|
104
108
|
- spec/configurators/ruby_configurator_spec.rb
|
@@ -143,6 +147,7 @@ test_files:
|
|
143
147
|
- spec/command_spec.rb
|
144
148
|
- spec/configurator_spec.rb
|
145
149
|
- spec/configurators/bundler_configurator_spec.rb
|
150
|
+
- spec/configurators/git_repo_configurator_spec.rb
|
146
151
|
- spec/configurators/packages_configurator_spec.rb
|
147
152
|
- spec/configurators/passenger_configurator_spec.rb
|
148
153
|
- spec/configurators/ruby_configurator_spec.rb
|