Class: Train::Plugins::Transport::BaseConnection

Inherits:
Object
  • Object
show all
Includes:
Extras
Defined in:
lib/train/plugins/base_connection.rb

Overview

A Connection instance can be generated and re-generated, given new connection details such as connection port, hostname, credentials, etc. This object is responsible for carrying out the actions on the remote host such as executing commands, transferring files, etc.

Author:

Instance Method Summary collapse

Constructor Details

#initialize(options = nil) {|self| ... } ⇒ BaseConnection

Create a new Connection instance.

Parameters:

  • options (Hash) (defaults to: nil)

    connection options

Yields:

  • (self)

    yields itself for block-style invocation



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/train/plugins/base_connection.rb', line 22

def initialize(options = nil)
  @options = options || {}
  @logger = @options.delete(:logger) || Logger.new(STDOUT)
  Train::Platforms::Detect::Specifications::OS.load
  Train::Platforms::Detect::Specifications::Api.load

  # default caching options
  @cache_enabled = {
    file: true,
    command: false,
  }

  @cache = {}
  @cache_enabled.each_key do |type|
    clear_cache(type)
  end
end

Instance Method Details

#cache_enabled?(type) ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
# File 'lib/train/plugins/base_connection.rb', line 40

def cache_enabled?(type)
  @cache_enabled[type.to_sym]
end

#closeObject

Closes the session connection, if it is still active.



58
59
60
# File 'lib/train/plugins/base_connection.rb', line 58

def close
  # this method may be left unimplemented if that is applicable
end

#disable_cache(type) ⇒ Object



51
52
53
54
55
# File 'lib/train/plugins/base_connection.rb', line 51

def disable_cache(type)
  fail Train::UnknownCacheType, "#{type} is not a valid cache type" unless @cache_enabled.keys.include?(type.to_sym)
  @cache_enabled[type.to_sym] = false
  clear_cache(type.to_sym)
end

#enable_cache(type) ⇒ Object

Enable caching types for Train. Currently we support :file and :command types



46
47
48
49
# File 'lib/train/plugins/base_connection.rb', line 46

def enable_cache(type)
  fail Train::UnknownCacheType, "#{type} is not a valid cache type" unless @cache_enabled.keys.include?(type.to_sym)
  @cache_enabled[type.to_sym] = true
end

#family_hierarchy(plat) ⇒ Object



91
92
93
94
95
96
# File 'lib/train/plugins/base_connection.rb', line 91

def family_hierarchy(plat)
  plat.families.each_with_object([]) do |(k, _v), memo|
    memo << k.name
    memo << family_hierarchy(k) unless k.families.empty?
  end
end

#file(path, *args) ⇒ Object

This is the main file call for all connections. This will call the private file_via_connection on the connection with optional caching



117
118
119
120
121
# File 'lib/train/plugins/base_connection.rb', line 117

def file(path, *args)
  return file_via_connection(path, *args) unless cache_enabled?(:file)

  @cache[:file][path] ||= file_via_connection(path, *args)
end

#force_platform!(name, platform_details = nil) ⇒ Object Also known as: direct_platform



80
81
82
83
84
85
86
87
# File 'lib/train/plugins/base_connection.rb', line 80

def force_platform!(name, platform_details = nil)
  plat = Train::Platforms.name(name)
  plat.backend = self
  plat.platform = platform_details unless platform_details.nil?
  plat.family_hierarchy = family_hierarchy(plat).flatten
  plat.add_platform_methods
  plat
end

#load_json(j) ⇒ Object



68
69
70
71
72
73
# File 'lib/train/plugins/base_connection.rb', line 68

def load_json(j)
  require 'train/transports/mock'
  j['files'].each do |path, jf|
    @cache[:file][path] = Train::Transports::Mock::Connection::File.from_json(jf)
  end
end

#local?Boolean

Is this a local transport?

Returns:

  • (Boolean)


76
77
78
# File 'lib/train/plugins/base_connection.rb', line 76

def local?
  false
end

#login_commandLoginCommand

Builds a LoginCommand which can be used to open an interactive session on the remote host.

Returns:



127
128
129
# File 'lib/train/plugins/base_connection.rb', line 127

def 
  fail NotImplementedError, "#{self.class} does not implement #login_command()"
end

#platformPlatform Also known as: os

Get information on the operating system which this transport connects to.

Returns:

  • (Platform)

    system information



101
102
103
# File 'lib/train/plugins/base_connection.rb', line 101

def platform
  @platform ||= Train::Platforms::Detect.scan(self)
end

#run_command(cmd) ⇒ Object

This is the main command call for all connections. This will call the private run_command_via_connection on the connection with optional caching



109
110
111
112
113
# File 'lib/train/plugins/base_connection.rb', line 109

def run_command(cmd)
  return run_command_via_connection(cmd) unless cache_enabled?(:command)

  @cache[:command][cmd] ||= run_command_via_connection(cmd)
end

#to_jsonObject



62
63
64
65
66
# File 'lib/train/plugins/base_connection.rb', line 62

def to_json
  {
    'files' => Hash[@cache[:file].map { |x, y| [x, y.to_json] }],
  }
end

#wait_until_readyObject

Block and return only when the remote host is prepared and ready to execute command and upload files. The semantics and details will vary by implementation, but a round trip through the hosted service is preferred to simply waiting on a socket to become available.



136
137
138
# File 'lib/train/plugins/base_connection.rb', line 136

def wait_until_ready
  # this method may be left unimplemented if that is applicablelog
end