1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import os
20 import gzip
21 try:
22
23 import cPickle
24 except ImportError:
25
26 import pickle as cPickle
27 import fcntl
28 import sys
29 from stat import ST_MTIME
30 from errno import EEXIST
31
32 from spacewalk.common.rhnLib import timestamp
33
34 from spacewalk.common.usix import raise_with_tb
35 from spacewalk.common.fileutils import makedirs, setPermsPath
36
37
38
39 CACHEDIR = "/var/cache/rhn"
43 """take ~taw/../some/path/$MOUNT_POINT/blah and make it sensible."""
44 if path is None:
45 return None
46 return os.path.normpath(
47 os.path.expanduser(
48 os.path.expandvars(path)))
49
57
60 try:
61 fcntl.lockf(fd, fcntl.LOCK_UN)
62 except IOError:
63
64
65 fcntl.flock(fd, fcntl.LOCK_UN)
66
67
68
69
70 -def get(name, modified=None, raw=None, compressed=None, missing_is_null=1):
77
78
79 -def set(name, value, modified=None, raw=None, compressed=None,
80 user='root', group='root', mode=int('0755', 8)):
85
86
87 -def has_key(name, modified=None):
90
95
105
109
112 """ This function returns a file descriptor for the open file fname
113 If the file is already there, it is truncated
114 otherwise, all the directories up to it are created and the file is created
115 as well.
116 """
117
118
119
120 tries = 5
121 while tries:
122 tries = tries - 1
123
124 if os.access(fname, os.F_OK):
125 if not os.access(fname, os.R_OK | os.W_OK):
126 raise UnreadableFileError()
127
128 fd = os.open(fname, os.O_WRONLY | os.O_TRUNC)
129
130 return fd
131
132
133 dirname = os.path.dirname(fname)
134 if not os.path.isdir(dirname):
135 try:
136
137 makedirs(dirname, mode, user, group)
138 except OSError:
139 e = sys.exc_info()[1]
140
141
142
143 if not (e.errno == EEXIST and os.path.isdir(dirname)):
144
145
146 if os.path.isdir(e.filename):
147 continue
148
149 raise
150 except:
151
152 raise
153
154
155
156
157 try:
158 fd = os.open(fname, os.O_WRONLY | os.O_CREAT | os.O_EXCL, int('0644', 8))
159 except OSError:
160 e = sys.exc_info()[1]
161
162 if e.errno == EEXIST and os.access(fname, os.F_OK):
163
164 continue
165
166 raise
167
168 setPermsPath(fname, user, group, mode)
169 return fd
170
171
172
173
174 raise RuntimeError("Attempt to create file %s failed" % fname)
175
178
179 - def __init__(self, name, modified=None, user='root', group='root',
180 mode=int('0755', 8)):
181 if modified:
182 self.modified = timestamp(modified)
183 else:
184 self.modified = None
185
186 self.fname = _fname(name)
187 self.fd = self.get_fd(name, user, group, mode)
188
189 self.closed = False
190
198
199 - def get_fd(self, name, user, group, mode):
200 raise NotImplementedError
201
203 raise NotImplementedError
204
206 return getattr(self.fd, x)
207
210
211 - def get_fd(self, name, _user, _group, _mode):
212 if not os.access(self.fname, os.R_OK):
213 raise KeyError(name)
214 fd = open(self.fname, "r")
215
216 fcntl.lockf(fd.fileno(), fcntl.LOCK_SH)
217
218 if self.modified:
219 if os.fstat(fd.fileno())[ST_MTIME] != self.modified:
220 fd.close()
221 raise KeyError(name)
222
223 return fd
224
227
230
231 - def get_fd(self, name, user, group, mode):
232 try:
233 fd = _safe_create(self.fname, user, group, mode)
234 except UnreadableFileError:
235 raise_with_tb(OSError("cache entry exists, but is not accessible: %s" % \
236 name), sys.exc_info()[2])
237
238
239 fcntl.lockf(fd, fcntl.LOCK_EX)
240 return os.fdopen(fd, 'w')
241
243
244 self.flush()
245 if self.modified:
246 os.utime(self.fname, (self.modified, self.modified))
247
250
253
254 - def get(self, name, modified=None):
261
262 - def set(self, name, value, modified=None, user='root', group='root',
263 mode=int('0755', 8)):
268
269 @staticmethod
271 fname = _fname(name)
272 if modified is not None:
273 modified = timestamp(modified)
274 if not os.access(fname, os.R_OK):
275 return False
276
277 statinfo = os.stat(fname)
278 if modified is not None and statinfo[ST_MTIME] != modified:
279 return False
280 return True
281
282 @staticmethod
284 fname = _fname(name)
285
286 if not os.access(fname, os.R_OK):
287 raise KeyError("Invalid cache key for delete: %s" % name)
288
289 if not os.access(fname, os.W_OK):
290 raise OSError("Read-Only access for cache entry: %s" % name)
291 os.unlink(fname)
292
293 @staticmethod
297
298 @staticmethod
299 - def set_file(name, modified=None, user='root', group='root',
300 mode=int('0755', 8)):
303
306
307 """ Like a GzipFile, but close closes both files. """
308
310 self.zipfile = gzip.GzipFile(None, mode, 5, io)
311 self.rawfile = io
312
316
318 return getattr(self.zipfile, x)
319
322
325
326 - def get(self, name, modified=None):
338
339 - def set(self, name, value, modified=None, user='root', group='root',
340 mode=int('0755', 8)):
346
347 - def has_key(self, name, modified=None):
349
352
353 - def get_file(self, name, modified=None):
356
357 - def set_file(self, name, modified=None, user='root', group='root',
358 mode=int('0755', 8)):
363
366
369
370 - def get(self, name, modified=None):
371 pickled = self.cache.get(name, modified)
372
373 try:
374 return cPickle.loads(pickled)
375 except cPickle.UnpicklingError:
376 raise_with_tb(KeyError(name), sys.exc_info()[2])
377
378 - def set(self, name, value, modified=None, user='root', group='root',
379 mode=int('0755', 8)):
380 pickled = cPickle.dumps(value, -1)
381 self.cache.set(name, pickled, modified, user, group, mode)
382
383 - def has_key(self, name, modified=None):
385
388
389 @staticmethod
391 raise RuntimeError("Getting a file descriptor for an object makes no sense.")
392
395
396 """ A cache that returns None rather than raises a KeyError. """
397
400
401 - def get(self, name, modified=None):
402 try:
403 return self.cache.get(name, modified)
404 except KeyError:
405 return None
406
407 - def set(self, name, value, modified=None, user='root', group='root',
408 mode=int('0755', 8)):
409 self.cache.set(name, value, modified, user, group, mode)
410
411 - def has_key(self, name, modified=None):
413
416
417 - def get_file(self, name, modified=None):
418 try:
419 return self.cache.get_file(name, modified)
420 except KeyError:
421 return None
422
423 - def set_file(self, name, modified=None, user='root', group='root',
424 mode=int('0755', 8)):
426