Class: OctocatalogDiff::CatalogUtil::ENC::Script
- Inherits:
-
Object
- Object
- OctocatalogDiff::CatalogUtil::ENC::Script
- Defined in:
- lib/octocatalog-diff/catalog-util/enc/script.rb
Overview
Support an ENC that executes a script on this system which returns the ENC data on STDOUT.
Instance Attribute Summary collapse
-
#content ⇒ Object
readonly
Returns the value of attribute content.
-
#error_message ⇒ Object
readonly
Returns the value of attribute error_message.
-
#script ⇒ Object
readonly
Returns the value of attribute script.
Instance Method Summary collapse
-
#execute(logger) ⇒ Object
Executor.
-
#initialize(options) ⇒ Script
constructor
Constructor.
Constructor Details
#initialize(options) ⇒ Script
Constructor
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/octocatalog-diff/catalog-util/enc/script.rb', line 17 def initialize() # Make sure the node is in the options raise ArgumentError, 'OctocatalogDiff::CatalogUtil::ENC::Script#new requires :node' unless .key?(:node) @node = [:node] # Determine path to ENC and make sure it exists raise ArgumentError, 'OctocatalogDiff::CatalogUtil::ENC::Script#new requires :enc' unless .key?(:enc) @script = script_path([:enc], [:tempdir]) # Other options we may recognize @pass_env_vars = .fetch(:pass_env_vars, []) # Initialize the content and error message @content = nil @error_message = 'The execute method was never run' end |
Instance Attribute Details
#content ⇒ Object (readonly)
Returns the value of attribute content.
13 14 15 |
# File 'lib/octocatalog-diff/catalog-util/enc/script.rb', line 13 def content @content end |
#error_message ⇒ Object (readonly)
Returns the value of attribute error_message.
13 14 15 |
# File 'lib/octocatalog-diff/catalog-util/enc/script.rb', line 13 def @error_message end |
#script ⇒ Object (readonly)
Returns the value of attribute script.
13 14 15 |
# File 'lib/octocatalog-diff/catalog-util/enc/script.rb', line 13 def script @script end |
Instance Method Details
#execute(logger) ⇒ Object
Executor
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/octocatalog-diff/catalog-util/enc/script.rb', line 36 def execute(logger) logger.debug "Beginning OctocatalogDiff::CatalogUtil::ENC::Script#execute for #{@node} with #{@script}" logger.debug "Passing these extra environment variables: #{@pass_env_vars}" if @pass_env_vars.any? # Copy the script and make it executable # Then run the command in the restricted environment raise Errno::ENOENT, "ENC #{@script} wasn't found" unless File.file?(@script) file = Tempfile.open('enc.sh') file.close begin FileUtils.cp @script, file.path FileUtils.chmod 0o755, file.path env = { 'HOME' => ENV['HOME'], 'PATH' => ENV['PATH'], 'PWD' => File.dirname(@script) } @pass_env_vars.each { |var| env[var] ||= ENV[var] } command = [file.path, @node].map { |x| Shellwords.escape(x) }.join(' ') out, err, status = Open3.capture3(env, command, unsetenv_others: true, chdir: File.dirname(@script)) logger.debug "ENC exited #{status.exitstatus}: #{out.length} bytes to STDOUT, #{err.length} bytes to STDERR" ensure file.unlink end # Analyze the output if status.exitstatus.zero? @content = out @error_message = nil logger.warn "ENC STDERR: #{err}" unless err.empty? else @content = nil @error_message = "ENC failed with status #{status.exitstatus}: #{out} #{err}" logger.error "ENC failed - Status #{status.exitstatus}" logger.error "Failed ENC printed this to STDOUT: #{out}" unless out.empty? logger.error "Failed ENC printed this to STDERR: #{err}" unless err.empty? end end |