94 lines
3.1 KiB
Ruby
94 lines
3.1 KiB
Ruby
action :run do
|
|
# Package install
|
|
if node['redisio']['package_install']
|
|
package_resource = package 'redisio_package_name' do
|
|
package_name node['redisio']['package_name']
|
|
version node['redisio']['version']
|
|
action :nothing
|
|
end
|
|
|
|
package_resource.run_action(:install)
|
|
new_resource.updated_by_last_action(true) if package_resource.updated_by_last_action?
|
|
|
|
# freeBSD does not support from source since ports does not support versioning (without a lot of hassle)
|
|
elsif platform_family?('freebsd')
|
|
raise 'Source install not supported for freebsd'
|
|
# Tarball install
|
|
else
|
|
@tarball = "#{new_resource.base_name}#{new_resource.version}.#{new_resource.artifact_type}"
|
|
|
|
unless current_resource.version == new_resource.version || (redis_exists? && new_resource.safe_install)
|
|
Chef::Log.info("Installing Redis #{new_resource.version} from source")
|
|
download
|
|
unpack
|
|
build
|
|
install
|
|
new_resource.updated_by_last_action(true)
|
|
end
|
|
end
|
|
end
|
|
|
|
def download
|
|
Chef::Log.info("Downloading redis tarball from #{new_resource.download_url}")
|
|
remote_file "#{new_resource.download_dir}/#{@tarball}" do
|
|
source new_resource.download_url
|
|
end
|
|
end
|
|
|
|
def unpack
|
|
install_dir = "#{new_resource.base_name}#{new_resource.version}"
|
|
case new_resource.artifact_type
|
|
when 'tar.gz', '.tgz'
|
|
execute %(cd #{new_resource.download_dir} ; mkdir -p '#{install_dir}' ; tar zxf '#{@tarball}' --strip-components=1 -C '#{install_dir}' --no-same-owner)
|
|
else
|
|
raise Chef::Exceptions::UnsupportedAction, "Current package type #{new_resource.artifact_type} is unsupported"
|
|
end
|
|
end
|
|
|
|
def build
|
|
execute "cd #{new_resource.download_dir}/#{new_resource.base_name}#{new_resource.version} && make clean && make"
|
|
end
|
|
|
|
def install
|
|
install_prefix = if new_resource.install_dir
|
|
"PREFIX=#{new_resource.install_dir}"
|
|
else
|
|
''
|
|
end
|
|
execute "cd #{new_resource.download_dir}/#{new_resource.base_name}#{new_resource.version} && make #{install_prefix} install"
|
|
new_resource.updated_by_last_action(true)
|
|
end
|
|
|
|
def redis_exists?
|
|
bin_path = if node['redisio']['install_dir']
|
|
::File.join(node['redisio']['install_dir'], 'bin')
|
|
else
|
|
node['redisio']['bin_path']
|
|
end
|
|
redis_server = ::File.join(bin_path, 'redis-server')
|
|
::File.exist?(redis_server)
|
|
end
|
|
|
|
def version
|
|
if redis_exists?
|
|
bin_path = if node['redisio']['install_dir']
|
|
::File.join(node['redisio']['install_dir'], 'bin')
|
|
else
|
|
node['redisio']['bin_path']
|
|
end
|
|
redis_server = ::File.join(bin_path, 'redis-server')
|
|
redis_version = Mixlib::ShellOut.new("#{redis_server} -v")
|
|
redis_version.run_command
|
|
version = redis_version.stdout[/version (\d*.\d*.\d*)/, 1] || redis_version.stdout[/v=(\d*.\d*.\d*)/, 1]
|
|
Chef::Log.info("The Redis server version is: #{version}")
|
|
return version.delete("\n")
|
|
end
|
|
nil
|
|
end
|
|
|
|
def load_current_resource
|
|
@current_resource = Chef::Resource.resource_for_node(:redisio_install, node).new(new_resource.name)
|
|
@current_resource.version(version)
|
|
@current_resource
|
|
end
|