diff options
author | Seth Chisamore <schisamo@opscode.com> | 2012-10-30 10:39:35 -0400 |
---|---|---|
committer | Seth Chisamore <schisamo@opscode.com> | 2012-10-30 10:39:35 -0400 |
commit | 24dc69a9a97e82a6e4207de68d6dcc664178249b (patch) | |
tree | 19bb289c9f88b4bbab066bc56b95d6d222fd5c35 /lib/chef/knife/exec.rb | |
parent | 9348c1c9c80ee757354d624b7dc1b78ebc7605c4 (diff) | |
download | chef-24dc69a9a97e82a6e4207de68d6dcc664178249b.tar.gz |
[OC-3564] move core Chef to the repo root \o/ \m/
The opscode/chef repository now only contains the core Chef library code
used by chef-client, knife and chef-solo!
Diffstat (limited to 'lib/chef/knife/exec.rb')
-rw-r--r-- | lib/chef/knife/exec.rb | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/lib/chef/knife/exec.rb b/lib/chef/knife/exec.rb new file mode 100644 index 0000000000..3e8196c616 --- /dev/null +++ b/lib/chef/knife/exec.rb @@ -0,0 +1,86 @@ +#-- +# Author:: Daniel DeLeo (<dan@opscode.com) +# Copyright:: Copyright (c) 2010 Opscode, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require 'chef/knife' + +class Chef::Knife::Exec < Chef::Knife + + banner "knife exec [SCRIPT] (options)" + + option :exec, + :short => "-E CODE", + :long => "--exec CODE", + :description => "a string of Chef code to execute" + + option :script_path, + :short => "-p PATH:PATH", + :long => "--script-path PATH:PATH", + :description => "A colon-separated path to look for scripts in", + :proc => lambda { |o| o.split(":") } + + deps do + require 'chef/shell/ext' + end + + def run + config[:script_path] ||= Array(Chef::Config[:script_path]) + + # Default script paths are chef-repo/.chef/scripts and ~/.chef/scripts + config[:script_path] << File.join(Chef::Knife.chef_config_dir, 'scripts') if Chef::Knife.chef_config_dir + config[:script_path] << File.join(ENV['HOME'], '.chef', 'scripts') if ENV['HOME'] + + scripts = Array(name_args) + context = Object.new + Shell::Extensions.extend_context_object(context) + if config[:exec] + context.instance_eval(config[:exec], "-E Argument", 0) + elsif !scripts.empty? + scripts.each do |script| + file = find_script(script) + context.instance_eval(IO.read(file), file, 0) + end + else + script = STDIN.read + context.instance_eval(script, "STDIN", 0) + end + end + + def find_script(x) + # Try to find a script. First try expanding the path given. + script = File.expand_path(x) + return script if File.exists?(script) + + # Failing that, try searching the script path. If we can't find + # anything, fail gracefully. + Chef::Log.debug("Searching script_path: #{config[:script_path].inspect}") + + config[:script_path].each do |path| + path = File.expand_path(path) + test = File.join(path, x) + Chef::Log.debug("Testing: #{test}") + if File.exists?(test) + script = test + Chef::Log.debug("Found: #{test}") + return script + end + end + ui.error("\"#{x}\" not found in current directory or script_path, giving up.") + exit(1) + end + +end |