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).
Methods
Public Class
Public Instance
Constants
F_ACMODTIME | = | 0x00000008 | ||
F_EXTENDED | = | 0x80000000 | ||
F_PERMISSIONS | = | 0x00000004 | ||
F_SIZE | = | 0x00000001 | ||
F_UIDGID | = | 0x00000002 | ||
T_BLOCK_DEVICE | = | 8 | ||
T_CHAR_DEVICE | = | 7 | ||
T_DIRECTORY | = | 2 | ||
T_FIFO | = | 9 | ||
T_REGULAR | = | 1 | ||
T_SOCKET | = | 6 | ||
T_SPECIAL | = | 4 | ||
T_SYMLINK | = | 3 | ||
T_UNKNOWN | = | 5 |
Attributes
atime | [RW] |
The last access time of the file |
attributes | [R] |
The hash of name/value pairs that backs this Attributes instance |
extended | [RW] |
The hash of name/value pairs identifying extended information about the file |
gid | [W] |
The group-id of the user that owns the file |
mtime | [RW] |
The modification time of the file |
permissions | [RW] |
The permissions on the file |
size | [RW] |
The size of the file. |
uid | [W] |
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
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