Class: SSHKit::Command

Inherits:
Object
  • Object
show all
Defined in:
lib/sshkit/command.rb

Overview

Author:

  • Lee Hambley

Constant Summary collapse

Failed =
Class.new(SSHKit::StandardError)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Command

Initialize a new Command object

command name, with optional variadaric args nothing in stdin or stdout

Parameters:

  • A (Array)

    list of arguments, the first is considered to be the

Raises:

  • (ArgumentError)


48
49
50
51
52
53
54
55
56
57
# File 'lib/sshkit/command.rb', line 48

def initialize(*args)
  raise ArgumentError, "May not pass no arguments to Command.new" if args.empty?
  @options = default_options.merge(args.extract_options!)
  @command = args.shift.to_s.strip.to_sym
  @args    = args
  @options.symbolize_keys!
  sanitize_command!
  @stdout, @stderr = String.new, String.new
  @full_stdout, @full_stderr = String.new, String.new
end

Instance Attribute Details

#argsObject (readonly)

Returns the value of attribute args.



36
37
38
# File 'lib/sshkit/command.rb', line 36

def args
  @args
end

#commandObject (readonly)

Returns the value of attribute command.



36
37
38
# File 'lib/sshkit/command.rb', line 36

def command
  @command
end

#exit_statusObject

Returns the value of attribute exit_status.



36
37
38
# File 'lib/sshkit/command.rb', line 36

def exit_status
  @exit_status
end

#full_stderrObject

Returns the value of attribute full_stderr.



39
40
41
# File 'lib/sshkit/command.rb', line 39

def full_stderr
  @full_stderr
end

#full_stdoutObject

Returns the value of attribute full_stdout.



39
40
41
# File 'lib/sshkit/command.rb', line 39

def full_stdout
  @full_stdout
end

#optionsObject (readonly)

Returns the value of attribute options.



36
37
38
# File 'lib/sshkit/command.rb', line 36

def options
  @options
end

#startedObject

Returns the value of attribute started.



36
37
38
# File 'lib/sshkit/command.rb', line 36

def started
  @started
end

#started_atObject (readonly)

Returns the value of attribute started_at.



36
37
38
# File 'lib/sshkit/command.rb', line 36

def started_at
  @started_at
end

#stderrObject

Returns the value of attribute stderr.



38
39
40
# File 'lib/sshkit/command.rb', line 38

def stderr
  @stderr
end

#stdoutObject

Returns the value of attribute stdout.



38
39
40
# File 'lib/sshkit/command.rb', line 38

def stdout
  @stdout
end

Instance Method Details

#complete?Boolean Also known as: finished?

Returns:

  • (Boolean)


59
60
61
# File 'lib/sshkit/command.rb', line 59

def complete?
  !exit_status.nil?
end

#environment_hashObject



146
147
148
# File 'lib/sshkit/command.rb', line 146

def environment_hash
  (SSHKit.config.default_env || {}).merge(options[:env] || {})
end

#envivonment_stringObject



150
151
152
153
154
# File 'lib/sshkit/command.rb', line 150

def envivonment_string
  environment_hash.collect do |key,value|
    "#{key.to_s.upcase}=#{value}"
  end.join(' ')
end

#failure?Boolean Also known as: failed?

Returns:

  • (Boolean)


82
83
84
# File 'lib/sshkit/command.rb', line 82

def failure?
  exit_status.to_i > 0
end

#group(&block) ⇒ Object



176
177
178
179
180
181
# File 'lib/sshkit/command.rb', line 176

def group(&block)
  return yield unless options[:group]
  "sg #{options[:group]} -c \\\"%s\\\"" % %Q{#{yield}}
  # We could also use the so-called heredoc format perhaps:
  #"newgrp #{options[:group]} <<EOC \\\"%s\\\" EOC" % %Q{#{yield}}
end

#hostObject



122
123
124
# File 'lib/sshkit/command.rb', line 122

def host
  options[:host]
end

#in_background(&block) ⇒ Object



166
167
168
169
# File 'lib/sshkit/command.rb', line 166

def in_background(&block)
  return yield unless options[:run_in_background]
  "nohup %s > /dev/null &" % yield
end

#runtimeObject



98
99
100
101
# File 'lib/sshkit/command.rb', line 98

def runtime
  return nil unless complete?
  @finished_at - @started_at
end

#should_map?Boolean

Returns:

  • (Boolean)


137
138
139
# File 'lib/sshkit/command.rb', line 137

def should_map?
  !command.match /\s/
end

#started?Boolean

Returns:

  • (Boolean)


64
65
66
# File 'lib/sshkit/command.rb', line 64

def started?
  started
end

#success?Boolean Also known as: successful?

Returns:

  • (Boolean)


77
78
79
# File 'lib/sshkit/command.rb', line 77

def success?
  exit_status.nil? ? false : exit_status.to_i == 0
end

#to_commandObject



183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/sshkit/command.rb', line 183

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_hashObject



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/sshkit/command.rb', line 103

def to_hash
  {
    command:     self.to_s,
    args:        args,
    options:     options,
    exit_status: exit_status,
    stdout:      stdout,
    stderr:      stderr,
    started_at:  @started_at,
    finished_at: @finished_at,
    runtime:     runtime,
    uuid:        uuid,
    started:     started?,
    finished:    finished?,
    successful:  successful?,
    failed:      failed?
  }
end

#to_sObject



200
201
202
# File 'lib/sshkit/command.rb', line 200

def to_s
  [SSHKit.config.command_map[command.to_sym], *Array(args)].join(' ')
end

#umask(&block) ⇒ Object



171
172
173
174
# File 'lib/sshkit/command.rb', line 171

def umask(&block)
  return yield unless SSHKit.config.umask
  "umask #{SSHKit.config.umask} && %s" % yield
end

#user(&block) ⇒ Object



161
162
163
164
# File 'lib/sshkit/command.rb', line 161

def user(&block)
  return yield unless options[:user]
  "sudo su #{options[:user]} -c \"%s\"" % %Q{#{yield}}
end

#uuidObject



73
74
75
# File 'lib/sshkit/command.rb', line 73

def uuid
  @uuid ||= Digest::SHA1.hexdigest(SecureRandom.random_bytes(10))[0..7]
end

#verbosityObject



126
127
128
129
130
131
132
133
134
135
# File 'lib/sshkit/command.rb', line 126

def verbosity
  if vb = options[:verbosity]
    case vb.class.name
    when 'Symbol' then return Logger.const_get(vb.to_s.upcase)
    when 'Fixnum' then return vb
    end
  else
    Logger::INFO
  end
end

#with(&block) ⇒ Object



156
157
158
159
# File 'lib/sshkit/command.rb', line 156

def with(&block)
  return yield unless environment_hash.any?
  "( #{envivonment_string} %s )" % yield
end

#within(&block) ⇒ Object



141
142
143
144
# File 'lib/sshkit/command.rb', line 141

def within(&block)
  return yield unless options[:in]
  "cd #{options[:in]} && %s" % yield
end