module Capitate::Plugins::Script # Run (sh) script. If script has .erb extension it will evaluate it. # # ==== Options # +script+:: Name of sh file (relative to templates dir) # +override_binding++:: Binding to override, otherwise defaults to current (task) context # # ==== Examples # script.sh("ruby/openssl_fix.sh") # def sh(script, override_binding = nil) if File.extname(script) == ".erb" name = script[0...script.length-4] dest = "/tmp/cap/#{name}" run_via "mkdir -p #{File.dirname(dest)}" put template.load(script, override_binding || binding), dest else name = script dest = "/tmp/cap/#{name}" run_via "mkdir -p #{File.dirname(dest)}" put template.load(script), dest end # If want verbose, -v run_all <<-CMDS sh -v #{dest} rm -rf #{File.dirname(dest)} CMDS end # Download and unpack URL. # Yields path to unpacked source. # # ==== Options # +url+:: URL to download # +dest+:: Destination directory # +options+:: # - +clean+:: If true will remove the unpacked directory. _Defaults to true_ # - +unpack_dir+:: Directory that is unpacked from tgz (if not matching the file name) # # ==== Examples # script.unpack("http://rubyforge.org/frs/download.php/29548/rubygems-1.0.1.tgz", "/tmp/rubygems") do # sudo "ruby setup.rb" # end # def unpack(url, dest, options, &block) file = url.split("/").last # TODO: Support other types if file !~ /\.tar\.gz\Z|\.tgz\Z/ raise "Can't unpack this file: #{file}; only support tar.gz and tgz formats" end options[:clean] = true if options[:clean].nil? unpack_dir = options[:unpack_dir] clean = options[:clean] unpack_dir ||= file.gsub(/\.tar\.gz|\.tgz/, "") http_get_method = fetch(:http_get_method, "wget -nv") run_all <<-CMDS sh -c "mkdir -p #{dest} && cd #{dest} && #{http_get_method} #{url}" sh -c "cd #{dest} && tar zxf #{file}" CMDS if block_given? yield("#{dest}/#{unpack_dir}") run_via "rm -f #{dest}/#{file}" run_via "rm -rf #{dest}" if clean end end # Run all commands (separated by newlines). # # Uses run_via to execute, so will use run or sudo # depending on the current :run_method # # ==== Options # +cmds+:: Commands (separated by newlines) # +options+:: See invoke_command options # def run_all(cmds, options = {}, &block) cmds.split("\n").each do |cmd| cmd = cmd.gsub(/^\s+/, "") run_via(cmd, options, &block) end end end Capistrano.plugin :script, Capitate::Plugins::Script