Class: Aspera::Cli::Plugins::Server
- Includes:
- SyncActions
- Defined in:
- lib/aspera/cli/plugins/server.rb
Overview
Operations on HSTS with SSH/FASP (ascmd/ascp)
Defined Under Namespace
Classes: LocalExecutor
Constant Summary collapse
- LOCAL_SCHEME =
'local'- HTTPS_SCHEME =
'https'
Constants included from SyncActions
SyncActions::ADMIN_COMMANDS, SyncActions::PATH_AND_INFO_ARGS, SyncActions::STATE_STR
Constants inherited from Base
Instance Attribute Summary
Attributes inherited from Base
Class Method Summary collapse
Instance Method Summary collapse
- #action_df(command_arguments:) ⇒ Object
-
#action_health_transfer ⇒ Object
--- health ---.
-
#action_ls(command_arguments:) ⇒ Object
--- ascmd handlers ---.
-
#ascmd_available? ⇒ Boolean
--- conditions ---.
-
#initialize(**_) ⇒ Server
constructor
A new instance of Server.
-
#options_to_base_transfer_spec ⇒ Hash
Read command line options.
-
#setup_server ⇒ Object
Build the transfer spec and ascmd executor from CLI options.
-
#wizard(wizard, app_url) ⇒ Hash
:preset_value, :test_args.
Methods included from SyncActions
#action_sync_admin_counters, #action_sync_admin_file_info, #action_sync_admin_find, #action_sync_admin_meta, #action_sync_admin_overview, #action_sync_admin_query, #action_sync_admin_status, #async_info_from_args, #db_from_args, included, register_sync_admin_commands, #run_sync_transfer
Methods inherited from BasicAuth
#basic_auth_api, #basic_auth_params
Methods inherited from Base
#action_for, #add_manual_header, application_name, #bulk_result, command, command_registry, commands_under, #config, crud_commands, declare_options, define_action_method, #dispatch_child, #dispatch_from_registry, #dispatch_leaf, #entity_create, #entity_delete, entity_display_name, #entity_list, #entity_modify, #entity_res_path, #entity_show, #execute_action, #execute_leaf, file_matcher, #formatter, #generate_help, #http_config, #invoke_action, option, #options, #persistency, #presets, #progress_bar, #query_read_delete, #resolve_argument, root_setup, #transfer, use_options, used_option_sources
Constructor Details
#initialize(**_) ⇒ Server
Returns a new instance of Server.
79 80 81 82 83 84 85 86 |
# File 'lib/aspera/cli/plugins/server.rb', line 79 def initialize(**_) super @connection_type = :ssh @ascmd_executor = nil @server_transfer_spec = nil . @ssh_opts = .get_option(:ssh_options).symbolize_keys end |
Class Method Details
.detect(address_or_url) ⇒ Hash, NilClass
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/aspera/cli/plugins/server.rb', line 37 def detect(address_or_url) urls = if address_or_url.match?(%r{^[a-z]{1,6}://}) [address_or_url] else [ "#{SSH_SCHEME}://#{address_or_url}:33001", "#{SSH_SCHEME}://#{address_or_url}:22" ] # wss not practical as it requires a token end error = nil urls.each do |base_url| server_uri = URI.parse(base_url) Log.log.debug { "URI=#{server_uri}, host=#{server_uri.hostname}, port=#{server_uri.port}, scheme=#{server_uri.scheme}" } next unless server_uri.scheme.eql?(SSH_SCHEME) socket = TCPSocket.new(server_uri.hostname, server_uri.port) socket.puts('SSH-2.0-Ascli_0.0') version = socket.gets.chomp return {version: version.gsub(/^SSH-2.0-/, ''), url: base_url} if version.match?(/^SSH-2.0-/) rescue StandardError => e error = e Log.log.debug { "detect error: #{e}" } end raise error if error return end |
Instance Method Details
#action_df(command_arguments:) ⇒ Object
278 279 280 281 282 |
# File 'lib/aspera/cli/plugins/server.rb', line 278 def action_df(command_arguments:, **) execute_ascmd(:df, command_arguments) do |result| Result::ObjectList.new(result.map(&:stringify_keys)) end end |
#action_health_transfer ⇒ Object
--- health ---
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 |
# File 'lib/aspera/cli/plugins/server.rb', line 253 def action_health_transfer nagios = Nagios.new probe_ts = @server_transfer_spec.merge({ 'direction' => 'send', 'cookie' => 'aspera.sync', # hide in console 'resume_policy' => 'none', 'paths' => [{'source' => 'faux:///pingfile?1k', 'destination' => '.fasping'}] }) statuses = transfer.start(probe_ts) if statuses.is_a?(Transfer::Result::Success) nagios.add_ok('transfer', 'ok') else nagios.add_critical('transfer', statuses.is_a?(Transfer::Result::Error) ? statuses.exception. : statuses.to_s) end Result::ObjectList.new(nagios.status_list) end |
#action_ls(command_arguments:) ⇒ Object
--- ascmd handlers ---
272 273 274 275 276 |
# File 'lib/aspera/cli/plugins/server.rb', line 272 def action_ls(command_arguments:, **) execute_ascmd(:ls, command_arguments) do |result| Result::ObjectList.new(result.map(&:stringify_keys), fields: %w[zmode zuid zgid size mtime name]) end end |
#ascmd_available? ⇒ Boolean
--- conditions ---
232 233 234 |
# File 'lib/aspera/cli/plugins/server.rb', line 232 def ascmd_available? !@ascmd_executor.nil? end |
#options_to_base_transfer_spec ⇒ Hash
Read command line options
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
# File 'lib/aspera/cli/plugins/server.rb', line 90 def url = .get_option(:url, mandatory: true) server_transfer_spec = {} server_uri = URI.parse(url) Log.log.debug { "URI=#{server_uri}, host=#{server_uri.hostname}, port=#{server_uri.port}, scheme=#{server_uri.scheme}" } server_transfer_spec['remote_host'] = server_uri.hostname unless URI_SCHEMES.include?(server_uri.scheme) Log.log.warn { "Scheme [#{server_uri.scheme}] not supported in #{url}, use one of: #{URI_SCHEMES.join(', ')}. Defaulting to #{SSH_SCHEME}." } server_uri.scheme = SSH_SCHEME end if server_uri.scheme.eql?(LOCAL_SCHEME) # Using local execution (mostly for testing) server_transfer_spec['remote_host'] = 'localhost' # simulate SSH environment, else ascmd will fail ENV['SSH_CLIENT'] = 'local 0 0' @connection_type = :local return server_transfer_spec elsif transfer.user_transfer_spec['token'].is_a?(String) && server_uri.scheme.eql?(HTTPS_SCHEME) server_transfer_spec['wss_enabled'] = true server_transfer_spec['wss_port'] = server_uri.port @connection_type = :wss # Using WSS return server_transfer_spec end if !server_uri.scheme.eql?(SSH_SCHEME) Log.log.warn('URL scheme is https but no token was provided in transfer spec.') Log.log.warn("If you want to access the server, not using WSS for session, then use a URL with scheme \"#{SSH_SCHEME}\" and proper SSH port") assumed_url = "#{SSH_SCHEME}://#{server_transfer_spec['remote_host']}:#{Transfer::Spec::SSH_PORT}" Log.log.warn { "Assuming proper URL is: #{assumed_url}" } server_uri = URI.parse(assumed_url) end # Scheme is SSH if .get_option(:username).nil? .set_option(:username, Transfer::Spec::ACCESS_KEY_TRANSFER_USER) Log.log.info { "No username provided: Assuming default transfer user: #{Transfer::Spec::ACCESS_KEY_TRANSFER_USER}" } end server_transfer_spec['remote_user'] = .get_option(:username, mandatory: true) if !server_uri.port.nil? @ssh_opts[:port] = server_uri.port server_transfer_spec['ssh_port'] = server_uri.port end cred_set = false password = .get_option(:password) if !password.nil? @ssh_opts[:password] = password server_transfer_spec['remote_password'] = password cred_set = true end ssh_key_list = .get_option(:ssh_keys) if !ssh_key_list.nil? Aspera.assert_array_all(ssh_key_list, String) { 'ssh_keys' } ssh_key_list.map! { |p| File.(p) } Log.dump(:ssh_keys, ssh_key_list) if !ssh_key_list.empty? @ssh_opts[:keys] = ssh_key_list # PEM as per RFC 7468 server_transfer_spec['ssh_private_key'] = File.read(ssh_key_list.first).strip Log.log.warn { 'Using only first SSH key for transfers' } unless ssh_key_list.length.eql?(1) cred_set = true end end ssh_passphrase = .get_option(:passphrase) if !ssh_passphrase.nil? @ssh_opts[:passphrase] = ssh_passphrase server_transfer_spec['ssh_private_key_passphrase'] = ssh_passphrase end # if user provided transfer spec has a token, we will use bypass keys cred_set = true if transfer.user_transfer_spec['token'].is_a?(String) Aspera.assert(cred_set, 'Either password, key , or transfer spec token must be provided', type: BadArgument) return server_transfer_spec end |
#setup_server ⇒ Object
Build the transfer spec and ascmd executor from CLI options. Stores results in instance variables; returns empty context hash.
240 241 242 243 244 245 246 247 248 249 |
# File 'lib/aspera/cli/plugins/server.rb', line 240 def setup_server(**) @server_transfer_spec = @ascmd_executor = case @connection_type when :local then LocalExecutor.new when :wss then nil when :ssh then Ssh.new(@server_transfer_spec['remote_host'], @server_transfer_spec['remote_user'], @ssh_opts) else Aspera.error_unexpected_value(@connection_type) { 'connection type' } end {} end |
#wizard(wizard, app_url) ⇒ Hash
Returns :preset_value, :test_args.
68 69 70 71 72 73 74 75 76 77 |
# File 'lib/aspera/cli/plugins/server.rb', line 68 def wizard(wizard, app_url) return { preset_value: { url: app_url, username: .get_option(:username, mandatory: true), password: .get_option(:password, mandatory: true) }, test_args: 'files browse /' } end |