class Inprovise::Infrastructure::Node

Attributes

host[R]
user[R]

Public Class Methods

json_create(o) click to toggle source
# File lib/inprovise/node.rb, line 235
def self.json_create(o)
  data = o['data']
  new(data['name'], Inprovise::Infrastructure.symbolize_keys(data['config']))
end
new(name, config={}) click to toggle source
Calls superclass method Inprovise::Infrastructure::Target::new
# File lib/inprovise/node.rb, line 11
def initialize(name, config={})
  @host = config[:host] || name
  @user = config[:user] || 'root'
  @channel = nil
  @helper = nil
  @history = []
  @user_nodes = {}
  super(name, config)
end

Public Instance Methods

binary_exists?(bin) click to toggle source
# File lib/inprovise/node.rb, line 170
def binary_exists?(bin)
  log.execute("BINARY_EXISTS?: #{bin}") if Inprovise.verbosity > 0
  rc = helper.binary_exists?(bin)
  log.execute("BINARY_EXISTS?: #{rc}") if Inprovise.verbosity > 0
  rc
end
cat(path) click to toggle source
# File lib/inprovise/node.rb, line 84
def cat(path)
  log.execute("CAT: #{path}") if Inprovise.verbosity > 0
  out = helper.cat(path)
  log.execute("CAT: #{out}") if Inprovise.verbosity > 0
  out
end
channel() click to toggle source
# File lib/inprovise/node.rb, line 21
def channel
  @channel ||= Inprovise::CmdChannel.open(self, config[:channel])
end
copy(from, to) click to toggle source
# File lib/inprovise/node.rb, line 124
def copy(from, to)
  log.execute("COPY: #{from} #{to}") if Inprovise.verbosity > 0
  helper.copy(from, to)
end
delete(path) click to toggle source
# File lib/inprovise/node.rb, line 134
def delete(path)
  log.execute("DELETE: #{path}") if Inprovise.verbosity > 0
  helper.delete(path)
end
directory?(path) click to toggle source
# File lib/inprovise/node.rb, line 117
def directory?(path)
  log.execute("DIRECTORY?: #{path}") if Inprovise.verbosity > 0
  rc = helper.directory?(path)
  log.execute("DIRECTORY?: #{rc}") if Inprovise.verbosity > 0
  rc
end
disconnect!() click to toggle source
# File lib/inprovise/node.rb, line 29
def disconnect!
  @user_nodes.each_value {|n| n.disconnect! }
  @channel.close if @channel
  self
end
download(from, to) click to toggle source
# File lib/inprovise/node.rb, line 63
def download(from, to)
  log.execute("DOWLOAD: #{to} <= #{from}") if Inprovise.verbosity > 0
  helper.download(from, to)
end
echo(arg) click to toggle source

basic commands

# File lib/inprovise/node.rb, line 70
def echo(arg)
  log.execute("ECHO: #{arg}") if Inprovise.verbosity > 0
  out = helper.echo(arg)
  log.execute("ECHO: #{out}") if Inprovise.verbosity > 0
  out
end
env(var) click to toggle source
# File lib/inprovise/node.rb, line 77
def env(var)
  log.execute("ENV: #{var}") if Inprovise.verbosity > 0
  val = helper.env(var)
  log.execute("ENV: #{val}") if Inprovise.verbosity > 0
  val
end
exists?(path) click to toggle source
# File lib/inprovise/node.rb, line 103
def exists?(path)
  log.execute("EXISTS?: #{path}") if Inprovise.verbosity > 0
  rc = helper.exists?(path)
  log.execute("EXISTS?: #{rc}") if Inprovise.verbosity > 0
  rc
end
file?(path) click to toggle source
# File lib/inprovise/node.rb, line 110
def file?(path)
  log.execute("FILE?: #{path}") if Inprovise.verbosity > 0
  rc = helper.file?(path)
  log.execute("FILE?: #{rc}") if Inprovise.verbosity > 0
  rc
end
for_dir(path) click to toggle source
# File lib/inprovise/node.rb, line 196
def for_dir(path)
  user_key = "#{self.user}:#{path}"
  return @user_nodes[user_key] if @user_nodes[user_key]
  new_node = self.dup
  new_node.prepare_connection_for_user!(self.user)
end
for_user(new_user, user_key=nil) click to toggle source
# File lib/inprovise/node.rb, line 185
def for_user(new_user, user_key=nil)
  new_user = new_user.to_s
  return self if self.user == new_user
  user_key ||= new_user
  return @user_nodes[user_key] if @user_nodes[user_key]
  new_node = self.dup
  new_node.prepare_connection_for_user!(new_user)
  @user_nodes[user_key] = new_node
  new_node
end
group(path) click to toggle source
# File lib/inprovise/node.rb, line 158
def group(path)
  log.execute("GROUP: #{path}") if Inprovise.verbosity > 0
  group = helper.group(path)
  log.execute("OWNER: #{group}") if Inprovise.verbosity > 0
  group
end
hash_for(path) click to toggle source
# File lib/inprovise/node.rb, line 91
def hash_for(path)
  log.execute("HASH_FOR: #{path}") if Inprovise.verbosity > 0
  hsh = helper.hash_for(path)
  log.execute("HASH_FOR: #{hsh}") if Inprovise.verbosity > 0
  hsh
end
helper() click to toggle source
# File lib/inprovise/node.rb, line 25
def helper
  @helper ||= Inprovise::CmdHelper.get(self, config[:helper])
end
log() click to toggle source
# File lib/inprovise/node.rb, line 177
def log
  @log ||= Inprovise::Logger.new(self, nil)
end
log_to(log) click to toggle source
# File lib/inprovise/node.rb, line 181
def log_to(log)
  @log = log
end
mkdir(path) click to toggle source
# File lib/inprovise/node.rb, line 98
def mkdir(path)
  log.execute("MKDIR: #{path}") if Inprovise.verbosity > 0
  helper.mkdir(path)
end
move(from, to) click to toggle source
# File lib/inprovise/node.rb, line 129
def move(from, to)
  log.execute("MOVE: #{from} #{to}") if Inprovise.verbosity > 0
  helper.move(from, to)
end
owner(path) click to toggle source
# File lib/inprovise/node.rb, line 151
def owner(path)
  log.execute("OWNER: #{path}") if Inprovise.verbosity > 0
  owner = helper.owner(path)
  log.execute("OWNER: #{owner}") if Inprovise.verbosity > 0
  owner
end
permissions(path) click to toggle source
# File lib/inprovise/node.rb, line 139
def permissions(path)
  log.execute("PERMISSIONS: #{path}") if Inprovise.verbosity > 0
  perm = helper.permissions(path)
  log.execute("PERMISSIONS: #{'%o' % perm}") if Inprovise.verbosity > 0
  perm
end
prepare_connection_for_user!(new_user) click to toggle source
# File lib/inprovise/node.rb, line 203
def prepare_connection_for_user!(new_user)
  @user = new_user
  @channel = nil
  @helper = nil
  @user_nodes = {}
  @history = []
  @log = Inprovise::Logger.new(self, @log.task) if @log
end
run(cmd, opts={}) click to toggle source

generic command execution

# File lib/inprovise/node.rb, line 37
def run(cmd, opts={})
  log.execute("RUN: #{cmd}") if Inprovise.verbosity > 0
  if should_run?(cmd, opts)
    really_run(cmd, opts)
  else
    cached_run(cmd, opts)
  end
end
set_owner(path, user, group=nil) click to toggle source
# File lib/inprovise/node.rb, line 165
def set_owner(path, user, group=nil)
  log.execute("SET_OWNER: #{path} #{user}#{group ? " #{group}" : ''}") if Inprovise.verbosity > 0
  helper.set_owner(path, user, group)
end
set_permissions(path, perm) click to toggle source
# File lib/inprovise/node.rb, line 146
def set_permissions(path, perm)
  log.execute("SET_PERMISSIONS: #{path} #{'%o' % perm}") if Inprovise.verbosity > 0
  helper.set_permissions(path, perm)
end
sudo(cmd, opts={}) click to toggle source
# File lib/inprovise/node.rb, line 46
def sudo(cmd, opts={})
  log.execute("SUDO: #{cmd}") if Inprovise.verbosity > 0
  opts = opts.merge({:sudo => true})
  if should_run?(cmd, opts)
    really_run(cmd, opts)
  else
    cached_run(cmd, opts)
  end
end
to_json(*a) click to toggle source
# File lib/inprovise/node.rb, line 225
def to_json(*a)
  {
    JSON.create_id  => self.class.name,
    :data => {
      :name => name,
      :config => safe_config
    }
  }.to_json(*a)
end
to_s() click to toggle source
# File lib/inprovise/node.rb, line 212
def to_s
  "#{name}(#{user}@#{host})"
end
upload(from, to) click to toggle source

file management

# File lib/inprovise/node.rb, line 58
def upload(from, to)
  log.execute("UPLOAD: #{from} => #{to}") if Inprovise.verbosity > 0
  helper.upload(from, to)
end

Protected Instance Methods

safe_config() click to toggle source
# File lib/inprovise/node.rb, line 216
def safe_config
  scfg = config.dup
  scfg.delete :passphrase
  scfg.delete :password
  scfg.delete :credentials
  scfg
end

Private Instance Methods

cached_run(cmd, opts={}) click to toggle source
# File lib/inprovise/node.rb, line 242
def cached_run(cmd, opts={})
  cmd = "sudo #{cmd}" if opts[:sudo]
  log.cached(cmd)
  last_output(cmd)
end
last_output(cmd) click to toggle source
# File lib/inprovise/node.rb, line 266
def last_output(cmd)
  results = @history.select {|h| h[:cmd] == cmd }
  return nil unless results && results.size > 0
  results.last[:output]
end
prefixed_command(cmd) click to toggle source
# File lib/inprovise/node.rb, line 272
def prefixed_command(cmd)
  return cmd unless config[:prefix]
  config[:prefix] + cmd
end
really_run(cmd, opts={}) click to toggle source
# File lib/inprovise/node.rb, line 248
def really_run(cmd, opts={})
  exec = opts[:sudo] ? helper.sudo : helper
  cmd = prefixed_command(cmd)
  begin
    output = exec.run(cmd, opts[:log])
    @history << {cmd:cmd, output:output}
    output
  rescue Inprovise::CmdChannel::Exception => ex
    raise RuntimeError, "Failed to communicate with [#{self}] : #{ex.message}"
  end
end
should_run?(cmd, opts) click to toggle source
# File lib/inprovise/node.rb, line 260
def should_run?(cmd, opts)
  return true unless opts[:once]
  cmd = "sudo #{cmd}" if opts[:sudo]
  last_output(cmd).nil?
end