diff options
author | Harshavardhana <harsha@harshavardhana.net> | 2014-08-23 02:14:36 -0700 |
---|---|---|
committer | Harshavardhana <harsha@harshavardhana.net> | 2014-09-05 10:04:20 -0700 |
commit | fd500d4396f910e4cf759e0fffa4daf4ed24745a (patch) | |
tree | 2e52c1b64659efc3cf98fed31a8a2fc6f8a4bc26 /tests/utils | |
parent | 88159becd90d40323ecfc24cf40813538c9204cc (diff) | |
download | glusterfs-fd500d4396f910e4cf759e0fffa4daf4ed24745a.tar.gz glusterfs-fd500d4396f910e4cf759e0fffa4daf4ed24745a.tar.xz glusterfs-fd500d4396f910e4cf759e0fffa4daf4ed24745a.zip |
porting: Provide setfattr/getfattr implementation
- Use 'getfattr' properly avoid redundant options during xattr query
- Untabify certain parts of tests (remove tabs)
- Avoid backtick evaluation for certain values to make code more portable.
- Use awk on FreeBSD/Darwin, since 'wc' implementation is broken and adds
spurious spaces in its output.
Change-Id: I7dcc0b70874e43b4cda8c306ed18a31b7a3f990a
BUG: 1131713
Signed-off-by: Harshavardhana <harsha@harshavardhana.net>
Reviewed-on: http://review.gluster.org/8520
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Emmanuel Dreyfus <manu@netbsd.org>
Tested-by: Emmanuel Dreyfus <manu@netbsd.org>
Diffstat (limited to 'tests/utils')
-rwxr-xr-x | tests/utils/getfattr.py | 133 | ||||
-rwxr-xr-x | tests/utils/setfattr.py | 78 |
2 files changed, 211 insertions, 0 deletions
diff --git a/tests/utils/getfattr.py b/tests/utils/getfattr.py new file mode 100755 index 0000000000..1a8369af7c --- /dev/null +++ b/tests/utils/getfattr.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python2 + +import os +import sys +from optparse import OptionParser + +import xattr + +def handle_textencoding(attr): + ### required for Python's handling of NULL strings. + attr_null_replace = (attr.encode('hex').decode('hex')).replace('\x00', + '\\000') + return attr_null_replace + +def getfattr(path, option): + attr = xattr.getxattr(path, option.name) + encoded_attr = attr + + if option.encoding == "text": + ## special case handle it. + encoded_attr = handle_textencoding(attr) + else: + encoded_attr = attr.encode(option.encoding) + + if option.onlyvalues: + print (encoded_attr) + return + + print_getfattr (path, option, encoded_attr) + return + +def print_getfattr (path, option, encoded_attr=None): + if encoded_attr: + if option.encoding == "hex": + print ("%s=0x%s" % (option.name, encoded_attr)) + elif option.encoding == "base64": + print ("%s=0s%s" % (option.name, encoded_attr)) + else: + print ("%s=\"%s\"" % (option.name, encoded_attr)) + else: + print option.name + + return + +def print_header (path, absnames): + if absnames: + print ("# file: %s" % path) + else: + print ("getfattr: Removing leading '/' from absolute path names") + print ("# file: %s" % path[1:]) + +if __name__ == '__main__': + usage = "usage: %prog [-n name|-d] [-e en] [-m pattern] path...." + parser = OptionParser(usage=usage) + parser.add_option("-n", action="store", dest="name", type="string", + help="Dump the value of the named extended attribute" + " extended attribute.") + parser.add_option("-d", action="store_true", dest="dump", + help="Dump the values of all extended attributes" + " associated with pathname.") + parser.add_option("-e", action="store", dest="encoding", type="string", + default="base64", + help="Encode values after retrieving" + " them. Valid values of [en] are `text`, `hex`," + " and `base64`. Values encoded as text strings are" + " enclosed in double quotes (\"), while strings" + " encoded as hexidecimal and base64 are prefixed with" + " 0x and 0s, respectively.") + parser.add_option("-m", action="store", dest="pattern", type="string", + help="Only include attributes with names matching the" + " regular expression pattern. The default value for" + " pattern is \"^user\\.\", which includes all the" + " attributes in the user namespace. Specify \"-\" for" + " including all attributes. Refer to attr(5) for a more" + " detailed discussion of namespaces.") + parser.add_option("--absolute-names", action="store_true", dest="absnames", + help="Do not strip leading slash characters ('/')." + " The default behaviour is to strip leading slash characters.") + parser.add_option("--only-values", action="store_true", dest="onlyvalues", + help="Dump out the raw extended attribute value(s)" + " without encoding them.") + + (option, args) = parser.parse_args() + if not args: + print ("Usage: getfattr [-hRLP] [-n name|-d] [-e en] [-m pattern]" + " path...") + print ("Try `getfattr --help' for more information.") + sys.exit(1) + + if option.dump and option.name: + print ("-d and -n are mutually exclusive...") + sys.exit(1) + + if option.pattern and option.name: + print ("-m and -n are mutually exclusive...") + sys.exit(1) + + if option.encoding: + if (not (option.encoding.strip() == "hex" or + option.encoding.strip() == "base64" or + option.encoding.strip() == "text")): + print ("unrecognized encoding parameter... %s, please use" + " `text`, `base64` or `hex`" % option.encoding) + sys.exit(1) + + args[0] = os.path.abspath(args[0]) + + if option.name: + print_header(args[0], option.absnames) + try: + getfattr(args[0], option) + except KeyError as err: + print ("Invalid key %s" % err) + sys.exit(1) + except IOError as err: + print (err) + sys.exit(1) + + if option.pattern: + print_header(args[0], option.absnames) + try: + xattrs = xattr.listxattr(args[0]) + for attr in xattrs: + if option.dump: + option.name = attr.encode('utf-8') + getfattr(args[0], option) + else: + option.name = attr.encode('utf-8') + print_getfattr(args[0], option, None) + + except IOError as err: + print (err) + sys.exit(1) diff --git a/tests/utils/setfattr.py b/tests/utils/setfattr.py new file mode 100755 index 0000000000..d714d05edf --- /dev/null +++ b/tests/utils/setfattr.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python2 + +import os +import sys +from optparse import OptionParser + +import xattr + +def convert(string): + tmp_string = string + if (string[0] == '0' and + (string[1] == 's' or + string[1] == 'S')): + tmp_string = string.strip('%s%s' % + (string[0], + string[1])) + return tmp_string.decode('base64') + + if (string[0] == '0' and + (string[1] == 'x' or + string[1] == 'X')): + tmp_string = string.split('%s%s' % + (string[0], + string[1])) + return tmp_string[1].decode('hex') + + return tmp_string + +if __name__ == '__main__': + usage = "usage: %prog [-n name] [-v value] [-x name]" + parser = OptionParser(usage=usage) + parser.add_option("-n", action="store", dest="name", type="string", + help="Specifies the name of the extended attribute to set.") + parser.add_option("-v", action="store", dest="value", type="string", + help="Specifies the new value of the extended attribute." + " There are three methods available for encoding the value." + " If the given string is enclosed in double quotes, the" + " inner string is treated as text. In that case," + " backslashes and double quotes have special meanings" + " and need to be escaped by a preceding backslash. Any" + " control characters can be encoded as a backslash" + " followed by three digits as its ASCII code in octal." + " If the given string begins with 0x or 0X, it expresses" + " a hexadecimal number. If the given string begins with" + " 0s or 0S, base64 encoding is expected.") + parser.add_option("-x", action="store", dest="xname", type="string", + help="Remove the named extended attribute entirely.") + + (option,args) = parser.parse_args() + if not args: + print ("Usage: setfattr {-n name} [-v value] file...") + print (" setfattr {-x name} file...") + print ("Try `setfattr --help' for more information.") + sys.exit(1) + + if option.name and option.xname: + print ("-n and -x are mutually exclusive...") + sys.exit(1) + + if option.name: + if option.value is None: + print ("-n option requires -v value...") + + args[0] = os.path.abspath(args[0]) + + if option.name and option.value: + try: + xattr.setxattr(args[0], option.name, convert(option.value)) + except Exception as err: + print (err) + sys.exit(1) + + if option.xname: + try: + xattr.removexattr(args[0], option.xname) + except Exception as err: + print (err) + sys.exit(1) |