Class: SSHKit::Backend::Abstract

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/sshkit/backends/abstract.rb

Direct Known Subclasses

Local, Netssh, Printer, Skipper

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(host, &block) ⇒ Abstract

Returns a new instance of Abstract.



36
37
38
39
40
41
42
43
44
45
# File 'lib/sshkit/backends/abstract.rb', line 36

def initialize(host, &block)
  raise "Must pass a Host object" unless host.is_a? Host
  @host  = host
  @block = block

  @pwd   = nil
  @env   = nil
  @user  = nil
  @group = nil
end

Instance Attribute Details

#hostObject (readonly)

Returns the value of attribute host.



27
28
29
# File 'lib/sshkit/backends/abstract.rb', line 27

def host
  @host
end

Class Method Details

.configObject



125
126
127
# File 'lib/sshkit/backends/abstract.rb', line 125

def config
  @config ||= OpenStruct.new
end

.configure {|config| ... } ⇒ Object

Yields:



129
130
131
# File 'lib/sshkit/backends/abstract.rb', line 129

def configure
  yield config
end

Instance Method Details

#as(who, &_block) ⇒ Object



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

def as(who, &_block)
  if who.is_a? Hash
    @user  = who[:user]  || who["user"]
    @group = who[:group] || who["group"]
  else
    @user  = who
    @group = nil
  end
  execute "    if ! sudo -u \#{@user.to_s.shellescape} whoami > /dev/null\n      then echo \"You cannot switch to user '\#{@user.to_s.shellescape}' using sudo, please check the sudoers file\" 1>&2\n      false\n    fi\n  EOTEST\n  yield\nensure\n  remove_instance_variable(:@user)\n  remove_instance_variable(:@group)\nend\n", verbosity: Logger::DEBUG

#background(*args) ⇒ Object



70
71
72
73
74
75
76
# File 'lib/sshkit/backends/abstract.rb', line 70

def background(*args)
  SSHKit.config.deprecation_logger.log(
    'The background method is deprecated. Blame badly behaved pseudo-daemons!'
  )
  options = args.extract_options!.merge(run_in_background: true)
  create_command_and_execute(args, options).success?
end

#capture(*args) ⇒ Object



64
65
66
67
68
# File 'lib/sshkit/backends/abstract.rb', line 64

def capture(*args)
  options = { verbosity: Logger::DEBUG, strip: true }.merge(args.extract_options!)
  result = create_command_and_execute(args, options).full_stdout
  options[:strip] ? result.strip : result
end

#download!(_remote, _local = nil, _options = {}) ⇒ Object



136
# File 'lib/sshkit/backends/abstract.rb', line 136

def download!(_remote, _local=nil, _options = {}) raise MethodUnavailableError end

#execute(*args) ⇒ Object



78
79
80
81
# File 'lib/sshkit/backends/abstract.rb', line 78

def execute(*args)
  options = args.extract_options!
  create_command_and_execute(args, options).success?
end

#make(commands = []) ⇒ Object



51
52
53
# File 'lib/sshkit/backends/abstract.rb', line 51

def make(commands=[])
  execute :make, commands
end

#rake(commands = []) ⇒ Object



55
56
57
# File 'lib/sshkit/backends/abstract.rb', line 55

def rake(commands=[])
  execute :rake, commands
end

#redact(arg) ⇒ Object

Used in execute_command to hide redact() args a user passes in



47
48
49
# File 'lib/sshkit/backends/abstract.rb', line 47

def redact(arg) # Used in execute_command to hide redact() args a user passes in
  arg.to_s.extend(Redaction) # to_s due to our inability to extend Integer, etc
end

#runObject



29
30
31
32
33
34
# File 'lib/sshkit/backends/abstract.rb', line 29

def run
  Thread.current["sshkit_backend"] = self
  instance_exec(@host, &@block)
ensure
  Thread.current["sshkit_backend"] = nil
end

#test(*args) ⇒ Object



59
60
61
62
# File 'lib/sshkit/backends/abstract.rb', line 59

def test(*args)
  options = { verbosity: Logger::DEBUG, raise_on_non_zero_exit: false }.merge(args.extract_options!)
  create_command_and_execute(args, options).success?
end

#upload!(_local, _remote, _options = {}) ⇒ Object

Backends which extend the Abstract backend should implement the following methods:



135
# File 'lib/sshkit/backends/abstract.rb', line 135

def upload!(_local, _remote, _options = {}) raise MethodUnavailableError end

#with(environment, &_block) ⇒ Object



96
97
98
99
100
101
102
# File 'lib/sshkit/backends/abstract.rb', line 96

def with(environment, &_block)
  env_old = (@env ||= {})
  @env = env_old.merge environment
  yield
ensure
  @env = env_old
end

#within(directory, &_block) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/sshkit/backends/abstract.rb', line 83

def within(directory, &_block)
  (@pwd ||= []).push directory.to_s
  execute "    if test ! -d \#{File.join(@pwd).shellescape}\n      then echo \"Directory does not exist '\#{File.join(@pwd).shellescape}'\" 1>&2\n      false\n    fi\n  EOTEST\n  yield\nensure\n  @pwd.pop\nend\n", verbosity: Logger::DEBUG