glusterfs

Форк
0
/
gfid-access.py 
124 строки · 3.7 Кб
1
#
2
# Copyright (c) 2011-2014 Red Hat, Inc. <http://www.redhat.com>
3
# This file is part of GlusterFS.
4

5
# This file is licensed to you under your choice of the GNU Lesser
6
# General Public License, version 3 or any later version (LGPLv3 or
7
# later), or the GNU General Public License, version 2 (GPLv2), in all
8
# cases as published by the Free Software Foundation.
9
#
10

11
from __future__ import print_function
12
import os
13
import sys
14
import stat
15
import time
16
import struct
17
import random
18
import libcxattr
19

20
from errno import EEXIST
21

22
Xattr = libcxattr.Xattr()
23

24
def umask():
25
    return os.umask(0)
26

27
def _fmt_mknod(l):
28
    return "!II%dsI%dsIII" % (37, l+1)
29

30
def _fmt_mkdir(l):
31
    return "!II%dsI%dsII" % (37, l+1)
32

33
def _fmt_symlink(l1, l2):
34
    return "!II%dsI%ds%ds" % (37, l1+1, l2+1)
35

36

37
if sys.version_info > (3,):
38
    def entry_pack_reg(gf, bn, mo, uid, gid):
39
        bn_encoded = bn.encode()
40
        blen = len(bn_encoded)
41
        return struct.pack(_fmt_mknod(blen),
42
                           uid, gid, gf.encode(), mo, bn_encoded,
43
                           stat.S_IMODE(mo), 0, umask())
44

45
    # mkdir
46
    def entry_pack_dir(gf, bn, mo, uid, gid):
47
        bn_encoded = bn.encode()
48
        blen = len(bn_encoded)
49
        return struct.pack(_fmt_mkdir(blen),
50
                           uid, gid, gf.encode(), mo, bn_encoded,
51
                           stat.S_IMODE(mo), umask())
52
    # symlink
53
    def entry_pack_symlink(gf, bn, lnk, st):
54
        bn_encoded = bn.encode()
55
        blen = len(bn_encoded)
56
        lnk_encoded = lnk.encode()
57
        llen = len(lnk_encoded)
58
        return struct.pack(_fmt_symlink(blen, llen),
59
                           st['uid'], st['gid'],
60
                           gf.encode(), st['mode'], bn_encoded,
61
                           lnk_encoded)
62

63
else:
64
    def entry_pack_reg(gf, bn, mo, uid, gid):
65
        blen = len(bn)
66
        return struct.pack(_fmt_mknod(blen),
67
                           uid, gid, gf, mo, bn,
68
                           stat.S_IMODE(mo), 0, umask())
69

70
    def entry_pack_dir(gf, bn, mo, uid, gid):
71
        blen = len(bn)
72
        return struct.pack(_fmt_mkdir(blen),
73
                           uid, gid, gf, mo, bn,
74
                           stat.S_IMODE(mo), umask())
75

76
    def entry_pack_symlink(gf, bn, lnk, mo, uid, gid):
77
        blen = len(bn)
78
        llen = len(lnk)
79
        return struct.pack(_fmt_symlink(blen, llen),
80
                           uid, gid, gf, mo, bn, lnk)
81

82
if __name__ == '__main__':
83
    if len(sys.argv) < 9:
84
        print(("USAGE: %s <mount> <pargfid|ROOT> <filename> <GFID> <file type>"
85
              " <uid> <gid> <file permission(octal str)>" % (sys.argv[0])))
86
        sys.exit(-1) # nothing to do
87
    mtpt       = sys.argv[1]
88
    pargfid    = sys.argv[2]
89
    fname      = sys.argv[3]
90
    randomgfid = sys.argv[4]
91
    ftype      = sys.argv[5]
92
    uid        = int(sys.argv[6])
93
    gid        = int(sys.argv[7])
94
    perm       = int(sys.argv[8], 8)
95

96
    os.chdir(mtpt)
97
    if pargfid == 'ROOT':
98
        pargfid = '.gfid/00000000-0000-0000-0000-000000000001'
99
    else:
100
        pargfid = '.gfid/' + pargfid
101

102
    blob = None
103

104
    # entry op: use non-zero uid/gid (to catch gfid-access xlator bugs)
105
    if ftype == 'file':
106
        mode = stat.S_IFREG | perm
107
        blob = entry_pack_reg(randomgfid, fname, mode, uid, gid)
108
    elif ftype =='dir':
109
        mode = stat.S_IFDIR | perm
110
        blob = entry_pack_dir(randomgfid, fname, mode, uid, gid)
111
    else: # not yet...
112
        sys.exit(-1)
113

114
    if blob == None:
115
        sys.exit(-1)
116
    try:
117
        Xattr.lsetxattr(pargfid, 'glusterfs.gfid.newfile', blob)
118
    except OSError:
119
        ex = sys.exc_info()[1]
120
        if not ex.errno in [EEXIST]:
121
            raise
122
            sys.exit(-1)
123
    print("File creation OK")
124
    sys.exit(0)
125

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.