lib/ztk/ssh/private.rb
module ZTK
class SSH
# SSH Private Functionality
module Private
# Builds our core options
def base_options
options = Hash.new
config.encryption.nil? or options.merge!(:encryption => config.encryption)
config.compression.nil? or options.merge!(:compression => config.compression)
config.compression_level.nil? or options.merge!(:compression_level => config.compression_level)
config.timeout.nil? or options.merge!(:timeout => config.timeout)
config.forward_agent.nil? or options.merge!(:forward_agent => config.forward_agent)
config.global_known_hosts_file.nil? or options.merge!(:global_known_hosts_file => config.global_known_hosts_file)
config.auth_methods.nil? or options.merge!(:auth_methods => config.auth_methods)
config.host_key.nil? or options.merge!(:host_key => config.host_key)
config.host_key_alias.nil? or options.merge!(:host_key_alias => config.host_key_alias)
config.keys_only.nil? or options.merge!(:keys_only => config.keys_only)
config.hmac.nil? or options.merge!(:hmac => config.hmac)
config.rekey_limit.nil? or options.merge!(:rekey_limit => config.rekey_limit)
config.user_known_hosts_file.nil? or options.merge!(:user_known_hosts_file => config.user_known_hosts_file)
options
end
# Builds our SSH options hash.
def ssh_options
process_keys
options = base_options
config.port.nil? or options.merge!(:port => config.port)
config.password.nil? or options.merge!(:password => config.password)
config.keys.nil? or options.merge!(:keys => config.keys)
config.ui.logger.debug { "ssh_options(#{options.inspect})" }
options
end
# Builds our SSH gateway options hash.
def gateway_options
process_keys
options = base_options
config.proxy_port.nil? or options.merge!(:port => config.proxy_port)
config.proxy_password.nil? or options.merge!(:password => config.proxy_password)
config.proxy_keys.nil? or options.merge!(:keys => config.proxy_keys)
config.ui.logger.debug { "gateway_options(#{options.inspect})" }
options
end
# Iterate the keys and proxy_keys, converting them as needed.
def process_keys
if (!config.keys.nil? && !config.keys.empty?)
config.keys = [config.keys].flatten.compact.collect do |key|
process_key(key)
end
end
if (!config.proxy_keys.nil? && !config.proxy_keys.empty?)
config.proxy_keys = [config.proxy_keys].flatten.compact.collect do |proxy_key|
process_key(proxy_key)
end
end
end
# Process a individual key, rendering it to a temporary file if needed.
def process_key(key)
if ::File.exists?(key)
key
else
tempfile = ::Tempfile.new('key')
tempfile.write(key)
tempfile.flush
tempfile.path
end
end
# Builds a human readable tag about our connection. Used for internal
# logging purposes.
def tag
tags = Array.new
user_host = "#{config.user}@#{config.host_name}"
port = (config.port ? ":#{config.port}" : nil)
tags << [user_host, port].compact.join
if config.proxy_host_name
tags << " via "
proxy_user_host = "#{config.proxy_user}@#{config.proxy_host_name}"
proxy_port = (config.proxy_port ? ":#{config.proxy_port}" : nil)
tags << [proxy_user_host, proxy_port].compact.join
end
tags.join.strip
end
def log_header(what, char='=')
count = 16
sep = (char * count)
header = [sep, "[ #{tag} >>> #{what} ]", sep].join
"#{header}\n"
end
end
end
end