class Net::SFTP::Protocol::V01::Base

  1. lib/net/sftp/protocol/01/base.rb
Parent: V01

Wraps the low-level SFTP calls for version 1 of the SFTP protocol. Also implements the packet parsing as defined by version 1 of the protocol.

None of these protocol methods block--all of them return immediately, requiring the SSH event loop to be run while the server response is pending.

You will almost certainly never need to use this driver directly. Please see Net::SFTP::Session for the recommended interface.

Public Instance methods

block (handle, offset, length, mask)

Not implemented in version 1 of the SFTP protocol. Raises a NotImplementedError if called.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 218
def block(handle, offset, length, mask)
  not_implemented! :block
end
close (handle)

Sends a FXP_CLOSE packet to the server for the given handle (such as would be returned via a FXP_HANDLE packet). Returns the new packet id.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 95
def close(handle)
  send_request(FXP_CLOSE, :string, handle)
end
fsetstat (handle, attrs)

Sends a FXP_FSETSTAT packet to the server, to update the attributes for the file represented by the given handle (which must have been obtained from a FXP_HANDLE packet). The attrs parameter is a hash that defines the attributes to set.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 142
def fsetstat(handle, attrs)
  send_request(FXP_FSETSTAT, :string, handle, :raw, attribute_factory.new(attrs).to_s)
end
fstat (handle, flags=nil)

Sends a FXP_FSTAT packet to the server, requesting a FXP_ATTR response for the file represented by the given handle (which must have been obtained from a FXP_HANDLE packet). The flags parameter is ignored in this version of the protocol.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 127
def fstat(handle, flags=nil)
  send_request(FXP_FSTAT, :string, handle)
end
lstat (path, flags=nil)

Sends a FXP_LSTAT packet to the server, requesting a FXP_ATTR response for the file at the given remote path (a string). The flags parameter is ignored in this version of the protocol. lstat will not follow symbolic links; see stat for a version that will.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 119
def lstat(path, flags=nil)
  send_request(FXP_LSTAT, :string, path)
end
mkdir (path, attrs)

Sends a FXP_MKDIR packet to the server, to request that a new directory at path on the remote server be created, and with attrs (a hash) describing the attributes of the new directory.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 168
def mkdir(path, attrs)
  send_request(FXP_MKDIR, :string, path, :raw, attribute_factory.new(attrs).to_s)
end
open (path, flags, options)

Sends a FXP_OPEN packet to the server and returns the packet identifier. The flags parameter is either an integer (in which case it must be a combination of the IO constants) or a string (in which case it must be one of the mode strings that IO::open accepts). The options parameter is a hash that is used to construct a new Attribute object, to pass as part of the FXP_OPEN request.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 73
def open(path, flags, options)
  flags = normalize_open_flags(flags)

  if flags & (IO::WRONLY | IO::RDWR) != 0
    sftp_flags = FV1::WRITE
    sftp_flags |= FV1::READ if flags & IO::RDWR != 0
    sftp_flags |= FV1::APPEND if flags & IO::APPEND != 0
  else
    sftp_flags = FV1::READ
  end

  sftp_flags |= FV1::CREAT if flags & IO::CREAT != 0
  sftp_flags |= FV1::TRUNC if flags & IO::TRUNC != 0
  sftp_flags |= FV1::EXCL  if flags & IO::EXCL  != 0

  attributes = attribute_factory.new(options)

  send_request(FXP_OPEN, :string, path, :long, sftp_flags, :raw, attributes.to_s)
end
opendir (path)

Sends a FXP_OPENDIR packet to the server, to request a handle for manipulating the directory at the given remote path.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 148
def opendir(path)
  send_request(FXP_OPENDIR, :string, path)
end
parse_attrs_packet (packet)

Parses the given FXP_ATTRS packet and returns a hash with one key, :attrs, which references an Attributes object.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 48
def parse_attrs_packet(packet)
  { :attrs => attribute_factory.from_buffer(packet) }
end
parse_data_packet (packet)

Parses the given FXP_DATA packet and returns a hash with one key, :data, which references the data returned in the packet.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 42
def parse_data_packet(packet)
  { :data => packet.read_string }
end
parse_handle_packet (packet)

Parses the given FXP_HANDLE packet and returns a hash with one key, :handle, which references the handle.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 30
def parse_handle_packet(packet)
  { :handle => packet.read_string }
end
parse_name_packet (packet)

Parses the given FXP_NAME packet and returns a hash with one key, :names, which references an array of Name objects.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 54
def parse_name_packet(packet)
  names = []

  packet.read_long.times do
    filename = packet.read_string
    longname = packet.read_string
    attrs    = attribute_factory.from_buffer(packet)
    names   << name_factory.new(filename, longname, attrs)
  end

  { :names => names }
end
parse_status_packet (packet)

Parses the given FXP_STATUS packet and returns a hash with one key, :code, which references the status code returned by the server.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 36
def parse_status_packet(packet)
  { :code => packet.read_long }
end
read (handle, offset, length)

Sends a FXP_READ packet to the server, requesting that length bytes be read from the file identified by handle, starting at offset bytes within the file. The handle must be one that was returned via a FXP_HANDLE packet. Returns the new packet id.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 103
def read(handle, offset, length)
  send_request(FXP_READ, :string, handle, :int64, offset, :long, length)
end
readdir (handle)

Sends a FXP_READDIR packet to the server, to request a batch of directory name entries in the directory identified by handle (which must have been obtained via a FXP_OPENDIR request).

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 155
def readdir(handle)
  send_request(FXP_READDIR, :string, handle)
end
realpath (path)

Sends a FXP_REALPATH packet to the server, to request that the given path be canonicalized, taking into account path segments like "..".

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 180
def realpath(path)
  send_request(FXP_REALPATH, :string, path)
end
remove (filename)

Sends a FXP_REMOTE packet to the server, to request that the given file be deleted from the remote server.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 161
def remove(filename)
  send_request(FXP_REMOVE, :string, filename)
end
rename (name, new_name, flags=nil)

Not implemented in version 1 of the SFTP protocol. Raises a NotImplementedError if called.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 194
def rename(name, new_name, flags=nil)
  not_implemented! :rename
end
rmdir (path)

Sends a FXP_RMDIR packet to the server, to request that the directory at path on the remote server be deleted.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 174
def rmdir(path)
  send_request(FXP_RMDIR, :string, path)
end
setstat (path, attrs)

Sends a FXP_SETSTAT packet to the server, to update the attributes for the file at the given remote path (a string). The attrs parameter is a hash that defines the attributes to set.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 134
def setstat(path, attrs)
  send_request(FXP_SETSTAT, :string, path, :raw, attribute_factory.new(attrs).to_s)
end
stat (path, flags=nil)

Sends a FXP_STAT packet to the server, requesting a FXP_ATTR response for the file at the given remote path (a string). The flags parameter is ignored in this version of the protocol. stat will follow symbolic links; see lstat for a version that will not.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 188
def stat(path, flags=nil)
  send_request(FXP_STAT, :string, path)
end
unblock (handle, offset, length)

Not implemented in version 1 of the SFTP protocol. Raises a NotImplementedError if called.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 224
def unblock(handle, offset, length)
  not_implemented! :unblock
end
version ()

Returns the protocol version implemented by this driver. (1, in this case)

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 24
def version
  1
end
write (handle, offset, data)

Sends a FXP_WRITE packet to the server, requesting that data (a string), be written to the file identified by handle, starting at offset bytes from the beginning of the file. The handle must be one that was returned via a FXP_HANDLE packet. Returns the new packet id.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 111
def write(handle, offset, data)
  send_request(FXP_WRITE, :string, handle, :int64, offset, :string, data)
end

Protected Instance methods

attribute_factory ()

Returns the Attributes class used by this version of the protocol (Net::SFTP::Protocol::V01::Attributes, in this case)

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 257
def attribute_factory
  V01::Attributes
end
name_factory ()

Returns the Name class used by this version of the protocol (Net::SFTP::Protocol::V01::Name, in this case)

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 263
def name_factory
  V01::Name
end
normalize_open_flags (flags)

Normalizes the given flags parameter, converting it into a combination of IO constants.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 239
def normalize_open_flags(flags)
  if String === flags
    case flags.tr("b", "")
    when "r"  then IO::RDONLY
    when "r+" then IO::RDWR
    when "w"  then IO::WRONLY | IO::TRUNC | IO::CREAT
    when "w+" then IO::RDWR | IO::TRUNC | IO::CREAT
    when "a"  then IO::APPEND | IO::CREAT | IO::WRONLY
    when "a+" then IO::APPEND | IO::CREAT | IO::RDWR
    else raise ArgumentError, "unsupported flags: #{flags.inspect}"
    end
  else
    flags.to_i
  end
end
not_implemented! (operation)

A helper method for implementing wrappers for operations that are not implemented by the current SFTP protocol version. Simply raises NotImplementedError with a message based on the given operation name.

[show source]
# File lib/net/sftp/protocol/01/base.rb, line 233
def not_implemented!(operation)
  raise NotImplementedError, "the #{operation} operation is not available in the version of the SFTP protocol supported by your server"
end