Class: RestFtpDaemon::Remote::RemoteSftp

Inherits:
RemoteBase
  • Object
show all
Defined in:
lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(target, job, config) ⇒ RemoteSftp

Returns a new instance of RemoteSftp.



26
27
28
29
# File 'lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb', line 26

def initialize target, job, config
  # Call daddy's initialize() first
  super
end

Instance Attribute Details

#sftpObject (readonly)

Class options



19
20
21
# File 'lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb', line 19

def sftp
  @sftp
end

Class Method Details

.handlesObject

URI schemes handled by this plugin



22
23
24
# File 'lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb', line 22

def self.handles
  [URI::SFTP]
end

Instance Method Details

#chdir_or_create(directory, mkdir = false) ⇒ Object

Raises:

  • (JobTargetShouldBeDirectory)


84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb', line 84

def chdir_or_create directory, mkdir = false
  # Init, extract my parent name and my own name
  log_debug "chdir_or_create mkdir[#{mkdir}] dir[#{directory}]"
  parent, _current = split_path(directory)

  # Access this directory
  begin
    @sftp.opendir! directory

  rescue Net::SFTP::StatusException => _e
    # If not allowed to create path, that's over, we're stuck
    return false unless mkdir

    # Recurse upward
    chdir_or_create parent, mkdir

    # Now I was able to chdir into my parent, create the current directory
    mkdir directory

    # Finally retry the chdir
    retry
  else
    return true
  end

  # We should never get here
  raise JobTargetShouldBeDirectory
end

#closeObject



145
146
147
# File 'lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb', line 145

def close
  log_debug "remote close"
end

#connectObject



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb', line 31

def connect
  super

  # Debug level
  if debug_enabled
    verbosity = Logger::DEBUG 
  else
    verbosity = false
  end

  # Connect remote server
  @sftp = Net::SFTP.start(@target.host.to_s, @target.user.to_s,
      password: @target.password.to_s,
      verbose: verbosity,
      port: @target.port,
      non_interactive: true,
      timeout: DEFAULT_SFTP_TIMEOUT
      )
# rescue NotImplementedError => exception
#   raise RemoteConnectError, "RemoteConnectError: #{exception.class}: #{exception.message}"

rescue Exception => exception
  raise RemoteConnectError, "#{exception.class}: #{exception.message}"
end

#connected?Boolean

Returns:

  • (Boolean)


149
150
151
# File 'lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb', line 149

def connected?
  @sftp && !@sftp.closed?
end

#debug_enabledObject



153
154
155
# File 'lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb', line 153

def debug_enabled
  @config[:debug_sftp]
end

#mkdir(directory) ⇒ Object



76
77
78
79
80
81
82
# File 'lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb', line 76

def mkdir directory
  log_debug "mkdir [#{directory}]"
  @sftp.mkdir! directory

  rescue StandardError => ex
    raise TargetPermissionError, ex.message
end

#move(source, target) ⇒ Object



141
142
143
# File 'lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb', line 141

def move source, target
  @sftp.rename! source.path_abs, target.path_abs, 0x00000001
end

#push(source, target, &callback) ⇒ Object

Raises:

  • (RestFtpDaemon::AssertionFailed)


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
# File 'lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb', line 113

def push source, target, &callback
  # Push init
  raise RestFtpDaemon::AssertionFailed, "push/sftp" if @sftp.nil?

  # Do the transfer
  @sftp.upload! source.path_abs, target.path_abs do |event, _uploader, *args|
    case event
    when :open then
      # args[0] : file metadata
    when :put then
      # args[0] : file metadata
      # args[1] : byte offset in remote file
      # args[2] : data being written (as string)
      # puts "writing #{args[2].length} bytes to #{args[0].remote} starting at #{args[1]}"

      # Update job status after this block transfer
      yield args[2].length, target.name

    when :close then
      # args[0] : file metadata
    when :mkdir
      # args[0] : remote path name
    when :finish
    end

  end
end

#remote_try_delete(target) ⇒ Object



66
67
68
69
70
71
72
73
74
# File 'lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb', line 66

def remote_try_delete target
  log_debug "remote_try_delete [#{target.name}]"
  @sftp.remove target.path_abs

rescue Net::SFTP::StatusException
  log_debug "#{LOG_INDENT}[#{target.name}] file not found"
else
  log_debug "#{LOG_INDENT}[#{target.name}] removed"
end

#size_if_exists(target) ⇒ Object



56
57
58
59
60
61
62
63
64
# File 'lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb', line 56

def size_if_exists target
  log_debug "size_if_exists [#{target.name}]"
  stat = @sftp.stat! target.path_abs

rescue Net::SFTP::StatusException
  return false
else
  return stat.size
end