class Net::SFTP::Protocol::V01::Attributes
A class representing the attributes of a file or directory on the server. It may be used to specify new attributes, or to query existing attributes.
To specify new attributes, just pass a hash as the argument to the constructor. The following keys are supported:
- :size
-
the size of the file
- :uid
-
the user-id that owns the file (integer)
- :gid
-
the group-id that owns the file (integer)
- :owner
-
the name of the user that owns the file (string)
- :group
-
the name of the group that owns the file (string)
- :permissions
-
the permissions on the file (integer, e.g. 0755)
- :atime
-
the access time of the file (integer, seconds since epoch)
- :mtime
-
the modification time of the file (integer, seconds since epoch)
- :extended
-
a hash of name/value pairs identifying extended info
Likewise, when the server sends an Attributes object, all of the above attributes are exposed as methods (though not all will be set with non-nil values from the server).
Constants
- F_ACMODTIME
- F_EXTENDED
- F_PERMISSIONS
- F_SIZE
- F_UIDGID
- T_BLOCK_DEVICE
- T_CHAR_DEVICE
- T_DIRECTORY
- T_FIFO
- T_REGULAR
- T_SOCKET
- T_SPECIAL
- T_SYMLINK
- T_UNKNOWN
Attributes
The last access time of the file
The hash of name/value pairs that backs this Attributes instance
The hash of name/value pairs identifying extended information about the file
The group-id of the user that owns the file
The modification time of the file
The permissions on the file
The size of the file.
The user-id of the user that owns the file
Public Class Methods
Parses the given buffer and returns an Attributes object compsed from the data extracted from it.
# File lib/net/sftp/protocol/01/attributes.rb, line 59 def from_buffer(buffer) flags = buffer.read_long data = {} elements.each do |name, type, condition| if flags & condition == condition if type == :special data[name] = send("parse_#{name}", buffer) else data[name] = buffer.send("read_#{type}") end end end new(data) end
Create a new Attributes instance with the given attributes. The following keys are supported:
- :size
-
the size of the file
- :uid
-
the user-id that owns the file (integer)
- :gid
-
the group-id that owns the file (integer)
- :owner
-
the name of the user that owns the file (string)
- :group
-
the name of the group that owns the file (string)
- :permissions
-
the permissions on the file (integer, e.g. 0755)
- :atime
-
the access time of the file (integer, seconds since epoch)
- :mtime
-
the modification time of the file (integer, seconds since epoch)
- :extended
-
a hash of name/value pairs identifying extended info
# File lib/net/sftp/protocol/01/attributes.rb, line 152 def initialize(attributes={}) @attributes = attributes end
Private Class Methods
Parse the hash of extended data from the buffer.
# File lib/net/sftp/protocol/01/attributes.rb, line 107 def parse_extended(buffer) extended = Hash.new buffer.read_long.times do extended[buffer.read_string] = buffer.read_string end extended end
Public Instance Methods
Returns true if these attributes appear to describe a directory.
# File lib/net/sftp/protocol/01/attributes.rb, line 244 def directory? case type when T_DIRECTORY then true when T_UNKNOWN then nil else false end end
Returns true if these attributes appear to describe a regular file.
# File lib/net/sftp/protocol/01/attributes.rb, line 262 def file? case type when T_REGULAR then true when T_UNKNOWN then nil else false end end
Returns the group-id of the group that owns the file, or nil
if that information is not available. If a :group key exists, but not a
:gid key, the Etc module will be used to reverse lookup the id from the
name. This might fail on some systems (e.g., Windows).
# File lib/net/sftp/protocol/01/attributes.rb, line 172 def gid if attributes[:group] && !attributes.key?(:gid) require 'etc' attributes[:gid] = Etc.getgrnam(attributes[:group]).gid end attributes[:gid] end
Returns the group name of the group that owns the file, or nil
if that information is not available. If the :gid is given, but not the
:group, the Etc module will be used to lookup the name from the id. This
might fail on some systems (e.g. Windows).
# File lib/net/sftp/protocol/01/attributes.rb, line 196 def group if attributes[:gid] && !attributes[:group] require 'etc' attributes[:group] = Etc.getgrgid(attributes[:gid].to_i).name end attributes[:group] end
Returns the username of the user that owns the file, or nil
if
that information is not available. If the :uid is given, but not the
:owner, the Etc module will be used to lookup the name from the id. This
might fail on some systems (e.g. Windows).
# File lib/net/sftp/protocol/01/attributes.rb, line 184 def owner if attributes[:uid] && !attributes[:owner] require 'etc' attributes[:owner] = Etc.getpwuid(attributes[:uid].to_i).name end attributes[:owner] end
Returns the type as a symbol, rather than an integer, for easier use in Ruby programs.
# File lib/net/sftp/protocol/01/attributes.rb, line 228 def symbolic_type case type when T_SOCKET then :socket when T_SYMLINK then :symlink when T_REGULAR then :regular when T_BLOCK_DEVICE then :block_device when T_DIRECTORY then :directory when T_CHAR_DEVICE then :char_device when T_FIFO then :fifo when T_SPECIAL then :special when T_UNKNOWN then :unknown else raise NotImplementedError, "unknown file type #{type} (bug?)" end end
Returns true if these attributes appear to describe a symlink.
# File lib/net/sftp/protocol/01/attributes.rb, line 253 def symlink? case type when T_SYMLINK then true when T_UNKNOWN then nil else false end end
Convert the object to a string suitable for passing in an SFTP packet. This is the raw representation of the attribute packet payload, and is not intended to be human readable.
# File lib/net/sftp/protocol/01/attributes.rb, line 273 def to_s prepare_serialization! flags = 0 self.class.elements.each do |name, type, condition| flags |= condition if attributes[name] end buffer = Net::SSH::Buffer.from(:long, flags) self.class.elements.each do |name, type, condition| if flags & condition == condition if type == :special send("encode_#{name}", buffer) else buffer.send("write_#{type}", attributes[name]) end end end buffer.to_s end
Inspects the permissions bits to determine what type of entity this attributes object represents. If will return one of the T_ constants.
# File lib/net/sftp/protocol/01/attributes.rb, line 206 def type if permissions & 0140000 == 0140000 then T_SOCKET elsif permissions & 0120000 == 0120000 then T_SYMLINK elsif permissions & 0100000 == 0100000 then T_REGULAR elsif permissions & 060000 == 060000 then T_BLOCK_DEVICE elsif permissions & 040000 == 040000 then T_DIRECTORY elsif permissions & 020000 == 020000 then T_CHAR_DEVICE elsif permissions & 010000 == 010000 then T_FIFO else T_UNKNOWN end end
Returns the user-id of the user that owns the file, or nil
if
that information is not available. If an :owner key exists, but not a :uid
key, the Etc module will be used to reverse lookup the id from the name.
This might fail on some systems (e.g., Windows).
# File lib/net/sftp/protocol/01/attributes.rb, line 160 def uid if attributes[:owner] && !attributes.key?(:uid) require 'etc' attributes[:uid] = Etc.getpwnam(attributes[:owner]).uid end attributes[:uid] end
Private Instance Methods
Encodes information about the extended info onto the end of the given buffer.
# File lib/net/sftp/protocol/01/attributes.rb, line 308 def encode_extended(buffer) buffer.write_long extended.size extended.each { |k,v| buffer.write_string k, v } end
Perform protocol-version-specific preparations for serialization.
# File lib/net/sftp/protocol/01/attributes.rb, line 299 def prepare_serialization! # force the uid/gid to be translated from owner/group, if those keys # were given on instantiation uid gid end