Class: SSHKit::Command
- Inherits:
-
Object
- Object
- SSHKit::Command
- Defined in:
- lib/sshkit/command.rb
Overview
Constant Summary collapse
- Failed =
Class.new(SSHKit::StandardError)
Instance Attribute Summary collapse
-
#args ⇒ Object
readonly
Returns the value of attribute args.
-
#command ⇒ Object
readonly
Returns the value of attribute command.
-
#exit_status ⇒ Object
Returns the value of attribute exit_status.
-
#full_stderr ⇒ Object
readonly
Returns the value of attribute full_stderr.
-
#full_stdout ⇒ Object
readonly
Returns the value of attribute full_stdout.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
-
#started ⇒ Object
Returns the value of attribute started.
-
#started_at ⇒ Object
readonly
Returns the value of attribute started_at.
-
#uuid ⇒ Object
readonly
Returns the value of attribute uuid.
Class Method Summary collapse
-
.shellescape_except_tilde(file) ⇒ Object
allow using home directory but escape everything else like spaces etc.
Instance Method Summary collapse
- #complete? ⇒ Boolean (also: #finished?)
- #environment_hash ⇒ Object
- #environment_string ⇒ Object
- #failure? ⇒ Boolean (also: #failed?)
- #group(&_block) ⇒ Object
- #host ⇒ Object
- #in_background(&_block) ⇒ Object
-
#initialize(*args) ⇒ Command
constructor
Initialize a new Command object.
- #on_stderr(channel, data) ⇒ Object
- #on_stdout(channel, data) ⇒ Object
- #runtime ⇒ Object
- #should_map? ⇒ Boolean
- #started? ⇒ Boolean
- #stderr ⇒ Object
- #stderr=(new_value) ⇒ Object
- #stdout ⇒ Object
- #stdout=(new_value) ⇒ Object
- #success? ⇒ Boolean (also: #successful?)
- #to_command ⇒ Object
- #to_hash ⇒ Object
- #to_s ⇒ Object
- #umask(&_block) ⇒ Object
- #user(&_block) ⇒ Object
- #verbosity ⇒ Object
- #with(&_block) ⇒ Object
- #with_redaction ⇒ Object
- #within(&_block) ⇒ Object
Constructor Details
#initialize(*args) ⇒ Command
Initialize a new Command object
command name, with optional variadaric args nothing in stdin or stdout
22 23 24 25 26 27 28 29 30 |
# File 'lib/sshkit/command.rb', line 22 def initialize(*args) raise ArgumentError, "Must pass arguments to Command.new" if args.empty? @options = .merge(args.) @command = sanitize_command(args.shift) @args = args @options.symbolize_keys! @stdout, @stderr, @full_stdout, @full_stderr = String.new, String.new, String.new, String.new @uuid = Digest::SHA1.hexdigest(SecureRandom.random_bytes(10))[0..7] end |
Instance Attribute Details
#args ⇒ Object (readonly)
Returns the value of attribute args.
13 14 15 |
# File 'lib/sshkit/command.rb', line 13 def args @args end |
#command ⇒ Object (readonly)
Returns the value of attribute command.
13 14 15 |
# File 'lib/sshkit/command.rb', line 13 def command @command end |
#exit_status ⇒ Object
Returns the value of attribute exit_status.
13 14 15 |
# File 'lib/sshkit/command.rb', line 13 def exit_status @exit_status end |
#full_stderr ⇒ Object (readonly)
Returns the value of attribute full_stderr.
13 14 15 |
# File 'lib/sshkit/command.rb', line 13 def full_stderr @full_stderr end |
#full_stdout ⇒ Object (readonly)
Returns the value of attribute full_stdout.
13 14 15 |
# File 'lib/sshkit/command.rb', line 13 def full_stdout @full_stdout end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
13 14 15 |
# File 'lib/sshkit/command.rb', line 13 def @options end |
#started ⇒ Object
Returns the value of attribute started.
13 14 15 |
# File 'lib/sshkit/command.rb', line 13 def started @started end |
#started_at ⇒ Object (readonly)
Returns the value of attribute started_at.
13 14 15 |
# File 'lib/sshkit/command.rb', line 13 def started_at @started_at end |
#uuid ⇒ Object (readonly)
Returns the value of attribute uuid.
13 14 15 |
# File 'lib/sshkit/command.rb', line 13 def uuid @uuid end |
Class Method Details
.shellescape_except_tilde(file) ⇒ Object
allow using home directory but escape everything else like spaces etc
223 224 225 |
# File 'lib/sshkit/command.rb', line 223 def self.shellescape_except_tilde(file) file.shellescape.gsub("\\~", "~") end |
Instance Method Details
#complete? ⇒ Boolean Also known as: finished?
32 33 34 |
# File 'lib/sshkit/command.rb', line 32 def complete? !exit_status.nil? end |
#environment_hash ⇒ Object
149 150 151 |
# File 'lib/sshkit/command.rb', line 149 def environment_hash (SSHKit.config.default_env || {}).merge([:env] || {}) end |
#environment_string ⇒ Object
153 154 155 156 157 158 159 |
# File 'lib/sshkit/command.rb', line 153 def environment_string environment_hash.collect do |key,value| key_string = key.is_a?(Symbol) ? key.to_s.upcase : key.to_s escaped_value = value.to_s.gsub(/"/, '\"') %{#{key_string}="#{escaped_value}"} end.join(' ') end |
#failure? ⇒ Boolean Also known as: failed?
51 52 53 |
# File 'lib/sshkit/command.rb', line 51 def failure? exit_status.to_i > 0 end |
#group(&_block) ⇒ Object
183 184 185 186 187 188 |
# File 'lib/sshkit/command.rb', line 183 def group(&_block) return yield unless [:group] "sg #{[:group].to_s.shellescape} -c #{yield.shellescape}" # We could also use the so-called heredoc format perhaps: #"newgrp #{options[:group]} <<EOC \\\"%s\\\" EOC" % %Q{#{yield}} end |
#host ⇒ Object
125 126 127 |
# File 'lib/sshkit/command.rb', line 125 def host [:host] end |
#in_background(&_block) ⇒ Object
173 174 175 176 |
# File 'lib/sshkit/command.rb', line 173 def in_background(&_block) return yield unless [:run_in_background] "( nohup #{yield} > /dev/null & )" end |
#on_stderr(channel, data) ⇒ Object
82 83 84 85 86 |
# File 'lib/sshkit/command.rb', line 82 def on_stderr(channel, data) @stderr = data @full_stderr += data call_interaction_handler(:stderr, data, channel) end |
#on_stdout(channel, data) ⇒ Object
76 77 78 79 80 |
# File 'lib/sshkit/command.rb', line 76 def on_stdout(channel, data) @stdout = data @full_stdout += data call_interaction_handler(:stdout, data, channel) end |
#runtime ⇒ Object
101 102 103 104 |
# File 'lib/sshkit/command.rb', line 101 def runtime return nil unless complete? @finished_at - @started_at end |
#should_map? ⇒ Boolean
140 141 142 |
# File 'lib/sshkit/command.rb', line 140 def should_map? !command.match(/\s/) end |
#started? ⇒ Boolean
37 38 39 |
# File 'lib/sshkit/command.rb', line 37 def started? started end |
#stderr ⇒ Object
66 67 68 69 |
# File 'lib/sshkit/command.rb', line 66 def stderr log_reader_deprecation('stderr') @stderr end |
#stderr=(new_value) ⇒ Object
71 72 73 74 |
# File 'lib/sshkit/command.rb', line 71 def stderr=(new_value) log_writer_deprecation('stderr') @stderr = new_value end |
#stdout ⇒ Object
56 57 58 59 |
# File 'lib/sshkit/command.rb', line 56 def stdout log_reader_deprecation('stdout') @stdout end |
#stdout=(new_value) ⇒ Object
61 62 63 64 |
# File 'lib/sshkit/command.rb', line 61 def stdout=(new_value) log_writer_deprecation('stdout') @stdout = new_value end |
#success? ⇒ Boolean Also known as: successful?
46 47 48 |
# File 'lib/sshkit/command.rb', line 46 def success? exit_status.nil? ? false : exit_status.to_i == 0 end |
#to_command ⇒ Object
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
# File 'lib/sshkit/command.rb', line 190 def to_command return command.to_s unless should_map? within do umask do with do user do in_background do group do to_s end end end end end end end |
#to_hash ⇒ Object
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/sshkit/command.rb', line 106 def to_hash { command: self.to_s, args: args, options: , exit_status: exit_status, stdout: full_stdout, stderr: full_stderr, started_at: @started_at, finished_at: @finished_at, runtime: runtime, uuid: uuid, started: started?, finished: finished?, successful: successful?, failed: failed? } end |
#to_s ⇒ Object
214 215 216 217 218 219 220 |
# File 'lib/sshkit/command.rb', line 214 def to_s if should_map? [SSHKit.config.command_map[command.to_sym], *Array(args)].join(' ') else command.to_s end end |
#umask(&_block) ⇒ Object
178 179 180 181 |
# File 'lib/sshkit/command.rb', line 178 def umask(&_block) return yield unless SSHKit.config.umask "umask #{SSHKit.config.umask} && #{yield}" end |
#user(&_block) ⇒ Object
167 168 169 170 171 |
# File 'lib/sshkit/command.rb', line 167 def user(&_block) return yield unless [:user] env_string = environment_string "sudo -u #{[:user].to_s.shellescape} #{env_string + " " unless env_string.empty?}-- sh -c #{yield.shellescape}" end |
#verbosity ⇒ Object
129 130 131 132 133 134 135 136 137 138 |
# File 'lib/sshkit/command.rb', line 129 def verbosity if (vb = [:verbosity]) case vb when Symbol then return Logger.const_get(vb.to_s.upcase) when Integer then return vb end else Logger::INFO end end |
#with(&_block) ⇒ Object
161 162 163 164 165 |
# File 'lib/sshkit/command.rb', line 161 def with(&_block) env_string = environment_string return yield if env_string.empty? "( export #{env_string} ; #{yield} )" end |
#with_redaction ⇒ Object
207 208 209 210 211 212 |
# File 'lib/sshkit/command.rb', line 207 def with_redaction new_args = args.map{|arg| arg.is_a?(Redaction) ? '[REDACTED]' : arg } redacted_cmd = dup redacted_cmd.instance_variable_set(:@args, new_args) redacted_cmd end |
#within(&_block) ⇒ Object
144 145 146 147 |
# File 'lib/sshkit/command.rb', line 144 def within(&_block) return yield unless [:in] "cd #{self.class.shellescape_except_tilde([:in])} && #{yield}" end |