git-svn-id: https://s3tools.svn.sourceforge.net/svnroot/s3tools/s3py/trunk@65 830e0280-6d2a-0410-9c65-932aecc39d9d
Michal Ludvig authored on 2007/01/26 12:42:34... | ... |
@@ -10,41 +10,60 @@ import pickle |
10 | 10 |
|
11 | 11 |
class S3fs(object): |
12 | 12 |
_sync_attrs = [ "tree" ] |
13 |
- fsname = None |
|
14 |
- tree = None |
|
13 |
+ |
|
14 |
+ ## These are instance variables - we must |
|
15 |
+ ## catch when they are used uninitialized |
|
16 |
+ ### _object_name = ... |
|
17 |
+ ### fsname = ... |
|
18 |
+ ### tree = ... |
|
19 |
+ |
|
15 | 20 |
def __init__(self, fsname = None): |
16 | 21 |
self.n = S3fsObjectName() |
17 | 22 |
if fsname: |
18 | 23 |
self.openfs(fsname) |
19 | 24 |
|
20 | 25 |
def mkfs(self, fsname): |
26 |
+ self.fsname = fsname |
|
21 | 27 |
self._object_name = self.n.fs(fsname) |
22 | 28 |
if self.object_exists(self._object_name): |
23 |
- raise S3fsError("Filesystem already exists", errno.EEXIST) |
|
24 |
- self.fsname = fsname |
|
29 |
+ raise S3fsError("Filesystem '%s' already exists" % fsname, errno.EEXIST) |
|
25 | 30 |
root_inode = S3fsInode(self) |
26 | 31 |
S3fsSync.store(self, root_inode) |
27 | 32 |
self.tree = { "/" : root_inode.inode_id } |
28 | 33 |
S3fsSync.store(self, self) |
34 |
+ self.openfs(fsname) |
|
29 | 35 |
|
30 | 36 |
def openfs(self, fsname): |
31 |
- raise S3fsError("Not implemented", errno.ENOSYS) |
|
37 |
+ self.fsname = fsname |
|
38 |
+ self._object_name = self.n.fs(fsname) |
|
39 |
+ if not self.object_exists(self._object_name): |
|
40 |
+ raise S3fsError("Filesystem '%s' does not exist" % fsname, errno.ENOENT) |
|
41 |
+ S3fsSync.load(self, self) |
|
42 |
+ print self.tree |
|
43 |
+ |
|
44 |
+ def syncfs(self): |
|
45 |
+ S3fsSync.store(self, self) |
|
32 | 46 |
|
47 |
+ def get_inode(self, path): |
|
48 |
+ inode_id = self.tree[path] |
|
49 |
+ inode = S3fsInode(self, inode_id) |
|
50 |
+ return inode |
|
51 |
+ |
|
33 | 52 |
class S3fsInode(object): |
34 | 53 |
_fs = None |
35 | 54 |
|
36 | 55 |
## Interface for S3fsSync |
37 | 56 |
_sync_attrs = [ "properties" ] |
38 |
- _object_name = None |
|
57 |
+ # _object_name = |
|
39 | 58 |
|
40 | 59 |
## Properties |
41 | 60 |
inode_id = None |
42 | 61 |
properties = { |
43 |
- "ctime" : None, |
|
44 |
- "mtime" : None, |
|
45 |
- "uid" : None, |
|
46 |
- "gid" : None, |
|
47 |
- "mode" : None, |
|
62 |
+ "ctime" : 0, |
|
63 |
+ "mtime" : 0, |
|
64 |
+ "uid" : 0, |
|
65 |
+ "gid" : 0, |
|
66 |
+ "mode" : 0, |
|
48 | 67 |
} |
49 | 68 |
|
50 | 69 |
def __init__(self, fs, inode_id = None): |
... | ... |
@@ -53,6 +72,7 @@ class S3fsInode(object): |
53 | 53 |
self.inode_id = inode_id |
54 | 54 |
self._object_name = fs.n.inode(fs.fsname, inode_id) |
55 | 55 |
self._fs = fs |
56 |
+ S3fsSync.try_load(self._fs, self) |
|
56 | 57 |
|
57 | 58 |
def setprop(self, property, value): |
58 | 59 |
self.assert_property_name(property) |
... | ... |
@@ -68,18 +88,14 @@ class S3fsInode(object): |
68 | 68 |
raise ValueError("Property '%s' not known to S3fsInode") |
69 | 69 |
|
70 | 70 |
class S3fsLocalDir(S3fs): |
71 |
- def __init__(self, directory): |
|
72 |
- S3fs.__init__(self) |
|
71 |
+ def __init__(self, directory, fsname = None): |
|
73 | 72 |
if not os.path.isdir(directory): |
74 |
- raise S3fsError("Directory %s does not exist" % directory, errno.ENOENT) |
|
73 |
+ raise IOError("Directory %s does not exist" % directory, errno.ENOENT) |
|
75 | 74 |
self._dir = directory |
76 |
- |
|
77 |
- def lock(self): |
|
78 |
- pass |
|
79 |
- |
|
80 |
- def unlock(self): |
|
81 |
- pass |
|
82 | 75 |
|
76 |
+ ## SubClass must be set to go before calling parent constructor! |
|
77 |
+ S3fs.__init__(self, fsname) |
|
78 |
+ |
|
83 | 79 |
def object_exists(self, object_name): |
84 | 80 |
real_path = os.path.join(self._dir, object_name) |
85 | 81 |
if os.path.isfile(real_path): ## Is file, all good |
... | ... |
@@ -139,10 +155,19 @@ class S3fsSync(object): |
139 | 139 |
object_name = instance._object_name |
140 | 140 |
from_sync = pickle.loads(fs.object_read(object_name)) |
141 | 141 |
for attr in instance._sync_attrs: |
142 |
- if from_sync.has_key[attr]: |
|
142 |
+ if from_sync.has_key(attr): |
|
143 | 143 |
setattr(instance, attr, from_sync[attr]) |
144 | 144 |
print "Loaded object: %s" % (object_name) |
145 | 145 |
|
146 |
+ @staticmethod |
|
147 |
+ def try_load(fs, instance, object_name = None): |
|
148 |
+ if not object_name: |
|
149 |
+ object_name = instance._object_name |
|
150 |
+ if fs.object_exists(object_name): |
|
151 |
+ S3fsSync.load(fs, instance, object_name) |
|
152 |
+ else: |
|
153 |
+ print "Nonexist object: %s" % (object_name) |
|
154 |
+ |
|
146 | 155 |
class S3fsError(Exception): |
147 | 156 |
def __init__(self, message, errno = -1): |
148 | 157 |
Exception.__init__(self, message) |
... | ... |
@@ -150,13 +175,22 @@ class S3fsError(Exception): |
150 | 150 |
|
151 | 151 |
if __name__ == "__main__": |
152 | 152 |
local_dir = "/tmp/s3fs" |
153 |
+ fsname = "testFs" |
|
154 |
+ if not os.path.isdir(local_dir): |
|
155 |
+ os.mkdir(local_dir) |
|
156 |
+ |
|
153 | 157 |
try: |
154 |
- fs = S3fsLocalDir(local_dir) |
|
158 |
+ fs = S3fsLocalDir(local_dir, fsname) |
|
159 |
+ print "Filesystem '%s' opened." % fsname |
|
155 | 160 |
except S3fsError, e: |
156 | 161 |
if e.errno == errno.ENOENT: |
157 |
- os.mkdir(local_dir) |
|
162 |
+ print "Filesystem %s does not exist -> mkfs()" % fsname |
|
163 |
+ fs = S3fsLocalDir(local_dir) |
|
164 |
+ fs.mkfs(fsname) |
|
158 | 165 |
else: |
159 | 166 |
raise |
160 |
- print "RandomStrings = %s %s" % (fs.n.rndstr(5), fs.n.rndstr(10)) |
|
161 |
- |
|
162 |
- fs.mkfs("testFs") |
|
167 |
+ root_inode = fs.get_inode("/") |
|
168 |
+ print "root_inode(%s).mode = 0%o" % (root_inode.inode_id, root_inode.getprop("mode")) |
|
169 |
+ if root_inode.getprop("mode") == 0: |
|
170 |
+ root_inode.setprop("mode", 0755) |
|
171 |
+ S3fsSync.store(fs, root_inode) |