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:
the size of the file
the user-id that owns the file (integer)
the group-id that owns the file (integer)
the name of the user that owns the file (string)
the name of the group that owns the file (string)
the permissions on the file (integer, e.g. 0755)
the access time of the file (integer, seconds since epoch)
the modification time of the file (integer, seconds since epoch)
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).
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
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:
the size of the file
the user-id that owns the file (integer)
the group-id that owns the file (integer)
the name of the user that owns the file (string)
the name of the group that owns the file (string)
the permissions on the file (integer, e.g. 0755)
the access time of the file (integer, seconds since epoch)
the modification time of the file (integer, seconds since epoch)
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
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